๐[Spring] Controller, DTO, API ๋ช
์ธ, @GetMapping
, MIME, @RequestParam
, ํผ ๋ฐ์ดํฐ, @RestController
1๏ธโฃ Controller.
- Controller ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํต์ฌ ๊ตฌ์ฑ ์์๋ก, ์ฌ์ฉ์ ์์ฒญ(URL ์์ฒญ)์ ๋ฐ์ ์ด๋ฅผ ์ฒ๋ฆฌํ ํ ์ ์ ํ ์๋ต(๋ทฐ ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ)์ ์ ๊ณตํ๋ ์ญํ ์ ํฉ๋๋ค.
- ์ด๋ ๋ณดํต MVC(Model-View-Controller) ํจํด์์ Controller ์ ํด๋นํ๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์ ๋ ฅ์ ๋ฐ์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ์ํธ์์ฉํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํ๋ฆ์ ๋ด๋นํฉ๋๋ค.
- Controller๋ ์ฃผ๋ก
@Controller
๋๋@RestController
์ ๋ํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ ์ ๋ฉ๋๋ค.
1. @Controller
์ @RestController
์ ๋ํ
์ด์
์ ์ฐจ์ด์ .
-
1.
@Controller
- ์ผ๋ฐ์ ์ผ๋ก ๋ทฐ(View) ๋ฅผ ๋ฐํํฉ๋๋ค.
- Thymeleaf์ ๊ฐ์ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ ๋ HTML ํ์ผ์ ๋ฐํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ์: ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ HTML ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ ๊ฒฝ์ฐ.
-
2.
@RestController
- ์ฃผ๋ก JSON, XML ๋ฑ ๋ฐ์ดํฐ ํฌ๋งท์ผ๋ก ์๋ต์ ๋ฐํํฉ๋๋ค.
-
@Controller
์@ResponseBody
๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ์ญํ ์ ํฉ๋๋ค. - RESTful API๋ฅผ ๊ตฌํํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
2. ๊ธฐ๋ณธ ์์.
- 1.
@Controller
๋ฅผ ์ด์ฉํ HTML ํ์ด์ง ๋ฐํ
@Controller
public class HomeController {
@GetMapping("/home")
public String homePage(Model model) {
model.attribute("message", "Welcome to the home page!");
return "home"; // resource/templates/home.html๋ก ์ฐ๊ฒฐ๋จ(Thymeleaf์ ๊ฐ์ ํ
ํ๋ฆฟ ์์ง ์ฌ์ฉ)
}
}
- 2.
@RestController
๋ฅผ ์ด์ฉํ JSON ์๋ต ๋ฐํ
@RestController
public class ApiController {
@GetMapping("/api/data")
public ResponseEntity<String> getData() {
return new ResponseEntity<>("Hello, this is JSON data!", HttpStatus.OK);
}
}
3. Controller์ ์ฃผ์ ์ญํ .
-
์์ฒญ ๋งคํ
- URL์ ํน์ ๋ฉ์๋์ ๋งคํํ์ฌ ์ ์ ํ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ก ํฉ๋๋ค.(
@GetMapping
,@PostMapping
,@RequestMapping
๋ฑ ์ฌ์ฉ)
- URL์ ํน์ ๋ฉ์๋์ ๋งคํํ์ฌ ์ ์ ํ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ก ํฉ๋๋ค.(
-
๋น์ฆ๋์ค ๋ก์ง ํธ์ถ
- ์๋น์ค ๊ณ์ธต๊ณผ ์ํธ์์ฉํ์ฌ ํ์ํ ์์ ์ ์ํํฉ๋๋ค.
-
๋ชจ๋ธ๊ณผ ๋ทฐ ์ฒ๋ฆฌ
- ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ํ ๋ทฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ JSON ๋ฑ์ ํ์์ผ๋ก ์๋ตํฉ๋๋ค.
Spring Boot์ Controller๋ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ํ๋ฆ์ ์ ์ดํ๋ฉฐ, ์น ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ค์ํ ์ญํ ์ ๋ด๋นํฉ๋๋ค.
2๏ธโฃ DTO(Data Transfer Object)
- DTO(Data Transfer Object) ๋ ๊ณ์ธต ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด์ ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก, ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฌ๋ฌ ๊ณ์ธต(Controller, Service, Repository ๋ฑ) ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ฒ ๋๋๋ฐ, ์ด๋ ์ฌ์ฉ์๊ฐ ์ ๋ฌํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ฑฐ๋ ๊ฐ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด DTO๋ฅผ ์ฌ์ฉํฉ๋๋ค.
1. DTO์ ์ฃผ์ ๋ชฉ์ .
-
1. ๋ฐ์ดํฐ ์บก์ํ
- DTO๋ ํน์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์บก์ํํ์ฌ ์ธ๋ถ์ ๋ ธ์ถ๋ฉ๋๋ค.
- ์ด๋ก ์ธํด ๋ถํ์ํ ๋ฐ์ดํฐ ๋ ธ์ถ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
-
2. ์ฑ๋ฅ ์ต์ ํ
- ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ ์กํ๋ ๊ฒ๋ณด๋ค๋, ํ์ํ ๋ฐ์ดํฐ๋ง DTO๋ฅผ ํตํด ์ ์กํ๋ ๊ฒ์ด ๋คํธ์ํฌ ํธ๋ํฝ ๋ฐ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
-
3. ๊ณ์ธต ๋ถ๋ฆฌ
- DTO๋ ์ฃผ๋ก ์๋น์ค ๊ณ์ธต์์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๊ณ , ์ด๋ฅผ ์ปจํธ๋กค๋ฌ ๊ณ์ธต์ผ๋ก ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ ๊ณ์ธต์ด ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋๋ฉฐ, ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ด ํ์ฑ๋ฉ๋๋ค.
2. DTO์ ์ํฐํฐ์ ์ฐจ์ด์ .
-
์ํฐํฐ(Entity)
- ์ํฐํฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ 1:1๋ก ๋งคํ๋๋ฉฐ, ์ฃผ๋ก ์์์ฑ(Persistence)์ ๋ด๋นํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ฉฐ, ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํ์ง ์๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
-
DTO
- DTO๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐ ์ค์ ์ ๋๋ฉฐ, ๋ณดํต ์ํฐํฐ๋ฅผ ๋ณํํ๊ฑฐ๋ ํน์ ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- ์ํฐํฐ์๋ ๋ค๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ ์ผ๋ก ๋งคํ๋์ง ์์ผ๋ฉฐ, ์ ์กํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ง์ ํฌํจํฉ๋๋ค.
3. ์ฌ์ฉ ์์.
-
๋ค์์ ๊ฐ๋จํ User ์ํฐํฐ์ UserDTO์ ์์์ ๋๋ค.
-
User ์ํฐํฐ
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// getters and setters
}
- UserDTO
public class UserDTO {
private String name;
private String email;
// ์์ฑ์, getters, setters
}
์ด์ฒ๋ผ ์ํฐํฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ๋ ๊ฐ์ฒด์ด๊ณ , DTO๋ ์ฌ์ฉ์์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ ์์ฒญ์ ๋ฐ์์ฌ ๋ ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ ๋๋ค.
3๏ธโฃ API ๋ช ์ธ(API Specification)
- API ๋ช ์ธ(API Specification) ๋ API(Application Programming Interface)์ ๋์ ๋ฐฉ์, ์์ฒญ ๋ฐ ์๋ต ํ์, ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ์๋, ํ๋ผ๋ฏธํฐ ๋ฑ์ ๋ช ํํ ์ค๋ช ํ ๋ฌธ์์ ๋๋ค.
- API ๋ช ์ธ๋ API ์ฌ์ฉ์(์ฃผ๋ก ๊ฐ๋ฐ์)๋ค์ด API๋ฅผ ์ ํํ ์ดํดํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ์ค์ํ ๋ฌธ์์ ๋๋ค.
1. API ๋ช ์ธ์ ์ฃผ์ ๋ด์ฉ.
-
1. API ๊ฐ์.
- API๊ฐ ์ด๋ค ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์๋์ง, ์ฃผ๋ก ์ด๋ค ๊ธฐ๋ฅ์ ์ํํ๋์ง ๊ฐ๋จํ ์ค๋ช ์ ํฌํจํฉ๋๋ค.
-
2. ์๋ํฌ์ธํธ(Endpoint)
- API์ ์ ๊ทผ ๊ฒฝ๋ก๋ฅผ ์๋ฏธํ๋ฉฐ, ๊ฐ ์๋ํฌ์ธํธ๋ ํน์ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด
GET /users
๋ ์ฌ์ฉ์์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ API ์๋ํฌ์ธํธ์ผ ์ ์์ต๋๋ค.
-
3. HTTP ๋ฉ์๋
- ๊ฐ ์๋ํฌ์ธํธ์ ์ฌ์ฉํ ์ ์๋ HTTP ๋ฉ์๋(GET, POST, PUT, DELETE ๋ฑ)๊ฐ ๋ช ์๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด,
GET /users
๋ ์ฌ์ฉ์ ๋ชฉ๋ก์ ์กฐํํ๊ณ ,POST /users
๋ ์ ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ API๋ฅผ ์๋ฏธํ ์ ์์ต๋๋ค.
-
4. ์์ฒญ(Request) ํ๋ผ๋ฏธํฐ
- API ์์ฒญ ์ ํฌํจํ ์ ์๋ ํ๋ผ๋ฏธํฐ๋ ๋ฐ์ดํฐ ํ์์ ๋ช ์ํฉ๋๋ค.
- ํ๋ผ๋ฏธํฐ๋ ๊ฒฝ๋ก ๋ณ์(Path Variables), ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ(Query Parameters), ํค๋(Headers), ๋๋ ๋ฐ๋(Body)์ ํฌํจ๋ ์ ์์ต๋๋ค.
-
๊ฒฝ๋ก ๋ณ์ :
GET /users/{id}
์์{id}
๊ฐ ๊ฒฝ๋ก ๋ณ์ ์ ๋๋ค. -
์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ :
GET /users?status=active
์์status
๊ฐ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ๋๋ค.
-
๊ฒฝ๋ก ๋ณ์ :
-
5. ์์ฒญ ๋ณธ๋ฌธ(Request Body)
- ์ฃผ๋ก POST๋ PUT ๊ฐ์ ์์ฒญ์์ ์ฌ์ฉ๋๋ฉฐ, JSON, XML ๋๋ ํผ ๋ฐ์ดํฐ ๋ฑ์ผ๋ก ์ ์กํ ๋ฐ์ดํฐ๋ฅผ ์ ์ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ API์์๋ ๋ค์๊ณผ ๊ฐ์ JSON ์์ฒญ์ด ๋ณธ๋ฌธ์ด ์์ ์ ์์ต๋๋ค.
{
"name": "Jhon Doe",
"email": "jhon@example.com"
}
-
6. ์๋ต(Response)
- API ์์ฒญ์ ๋ํ ์๋ต ํ์์ ์ค๋ช ํฉ๋๋ค.
- ์ฑ๊ณต์ ์ธ ์์ฒญ์ด๋ ์คํจํ์ ๋์ ์๋ต ์ฝ๋(์: 200 OK, 404 Not Found)์ ํจ๊ป ์๋ต ๋ณธ๋ฌธ(Response Body) ํ์๋ ๋ช ์๋ฉ๋๋ค.
{
"id": 1,
"name": "Jhon Doe",
"email" "jhon@example.com"
}
-
7. ์ํ ์ฝ๋(Status Code)
- ๊ฐ ์๋ต์ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ HTTP ์ํ ์ฝ๋๋ฅผ ํฌํจํฉ๋๋ค.
- ์ผ๋ฐ์ ์ธ ์ํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- 200 OK : ์ฑ๊ณต์ ์ธ ์์ฒญ.
- 201 Created : ๋ฆฌ์์ค ์์ฑ ์ฑ๊ณต.
- 400 Bad Request : ์๋ชป๋ ์์ฒญ.
- 401 Unauthorized : ์ธ์ฆ ์คํจ.
- 404 Not Found : ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ์ ์์
- 500 Internet Server Error : ์๋ฒ์์ ๋ฐ์ํ ์ค๋ฅ
-
8. ์์(Examples)
- ์ค์ ๋ก ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ๋ฒ๊ณผ ๊ทธ์ ๋ํ ์๋ต์ ๋ณด์ฌ์ฃผ๋ ์์๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด,
curl
๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ HTTP ์์ฒญ ๋ฐฉ๋ฒ ๋ฑ์ ๋ช ์ํฉ๋๋ค.
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "John Doe", "email": "john.doe@example.com"}'
2. API ๋ช ์ธ์ ์ค์์ฑ.
-
๊ฐ๋ฐ์ ๊ฐ์ ์์ฌ์ํต
- API ๋ช ์ธ๋ API๋ฅผ ์ ๊ณตํ๋ ์ธก๊ณผ ์ฌ์ฉํ๋ ์ธก ๊ฐ์ ์ํํ ์์ฌ์ํต์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ๋ช ์ธ๊ฐ ์ ํํ ์๋ก API๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํ ์ ์๋ ํผ๋์ด๋ ์ค๋ฅ๊ฐ ์ค์ด๋ญ๋๋ค.
-
์ผ๊ด์ฑ
- ๋ชจ๋ ์๋ํฌ์ธํธ์ ์์ฒญ/์๋ต ํ์์ด ์ผ๊ด๋๊ฒ ์ค๊ณ๋๊ณ ๊ตฌํ๋ ์ ์๋๋ก ๋์์ค๋๋ค.
-
์ ์ง๋ณด์
- ๋ช ์ธ๋ฅผ ๊ธฐ์ค์ผ๋ก API๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ํ์ฅํ ๋, ์ด๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ธฐ์กด ์ฌ์ฉ์๋ค์๊ฒ ์ํฅ์ ์ต์ํํ๋ฉด์ ์์คํ ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
3. API ๋ช ์ธ ๋๊ตฌ.
API ๋ช ์ธ๋ ๋ค์ํ ํ์์ผ๋ก ์์ฑ๋ ์ ์์ผ๋ฉฐ, ๋ํ์ ์ธ ๋๊ตฌ์ ํ์ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
OpenAPI(Swagger)
- ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ API ๋ช ์ธ ํ์ค์ผ๋ก, Swagger UI๋ฅผ ํตํด ์๊ฐํ์ ํ ์คํธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
-
Postman
- API ํ ์คํธ ๋ฐ ๋ช ์ธ ์์ฑ์ ์ํ ๋๊ตฌ๋ก, ๋ค์ํ HTTP ๋ฉ์๋๋ฅผ ํ ์คํธํ๊ณ ๋ช ์ธ๋ฅผ ์๋์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
-
RAML
- RESTful API Modeling LAnguage์ ์ฝ์๋ก, REST API ๋ช ์ธ ์์ฑ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
API ๋ช ์ธ๋ API๋ฅผ ์ฌ์ฉํ๋ ค๋ ๋ชจ๋ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ธ ๊ฐ์ด๋ ์ญํ ์ ํ๋ฉฐ, ์ ํํ๊ณ ๋ช ํํ๊ฒ ์์ฑํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
4๏ธโฃ @GetMapping
์ ๋ํ
์ด์
.
-
@GetMapping
์ ๋ํ ์ด์ ์ Spring Framework์์ HTTP GET ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ ๋ํ ์ด์ ์ ๋๋ค. - ์ฃผ๋ก Spring MVC์์ ์ปจํธ๋กค๋ฌ์ ๋ฉ์๋์ ๋ถ์ฌ์ ํน์ URL๋ก ๋ค์ด์ค๋ GET ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋งคํํฉ๋๋ค.
1. @GetMapping
์ ๊ธฐ๋ณธ ๋์.
- Spring Boot ์ ํ๋ฆฌ์ผ์ด์
์์๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก GET ์์ฒญ์ ๋ณด๋ผ ๋ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ฅผ ์ง์ ํ๊ธฐ ์ํด
@GetMapping
์ ์ฌ์ฉํฉ๋๋ค. - ์ด ์ ๋ํ
์ด์
์ ๋ด๋ถ์ ์ผ๋ก
@RequestMapping(method = RequestMethod.GET)
๊ณผ ๋์ผํ ์ญํ ์ ํฉ๋๋ค.
2. ์ฌ์ฉ ์์.
๋ค์์ @GetMapping
์ ์ฌ์ฉํ์ฌ ํน์ URL์์ GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฐ๋จํ ์์์
๋๋ค.
@RestController
public class UserController {
// '/users' ๊ฒฝ๋ก์ ๋ํ GET ์์ฒญ ์ฒ๋ฆฌ
@GetMapping("/users")
public List<User> getAllUsers() {
// ์๋น์ค ๊ณ์ธต์์ ์ฌ์ฉ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ ๋ฐํํ๋ ๋ฉ์๋
return userService.getAllUsers();
}
}
์์ ์ฝ๋์์
-
@GetMapping("/users")
๋/users
๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ GET ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค. - ๋ฉ์๋
getAllUsers()
๋ GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ฉฐ, ๋ณดํต ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.- ์ด๋ ๋ฐํํ๋ ๋ฐ์ดํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก JSON ํ์์ผ๋ก ๋ฐํ๋ฉ๋๋ค(Spring Boot์์๋
@RestController
์ฌ์ฉ ์).
- ์ด๋ ๋ฐํํ๋ ๋ฐ์ดํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก JSON ํ์์ผ๋ก ๋ฐํ๋ฉ๋๋ค(Spring Boot์์๋
3. ์ฃผ์ ํน์ง.
-
1. HTTP GET ์์ฒญ ์ฒ๋ฆฌ.
-
@GetMapping
์ GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ๋ง ์ฌ์ฉ๋๋ฉฐ, ๋ค๋ฅธ HTTP ๋ฉ์๋(POST, PUT, DELETE ๋ฑ) ์์ฒญ์ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค.
-
-
2. ๊ฒฝ๋ก ์ง์ .
-
@GetMapping("/path")
ํ์์ผ๋ก ๋งคํ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. - ๊ฒฝ๋ก์ ๊ณ ์ ๋ URL๋ฟ๋ง ์๋๋ผ ๊ฒฝ๋ก ๋ณ์, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๋ฑ๋ ํฌํจ๋ ์ ์์ต๋๋ค.
-
-
3. ๊ฒฝ๋ก ๋ณ์ ์ฌ์ฉ.
- ๊ฒฝ๋ก ๋ณ์(Path Variable)๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก URL์ ์ฒ๋ฆฌํ ์๋ ์์ต๋๋ค.
@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getUserById(id);
}
- ์ ์ฝ๋์์
@PathVariable
์ ์ฌ์ฉํ์ฌ URL ๊ฒฝ๋ก์ ํฌํจ๋id
๊ฐ์ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ์ต๋๋ค.- ์๋ฅผ ๋ค์ด,
/users/1
์ด ์์ฒญ๋๋ฉดid
๊ฐ 1๋ก ์ค์ ๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด,
-
4. ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์ฌ์ฉ.
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ(Query Parameter)๋ฅผ ์ฒ๋ฆฌํ ๋๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@GetMapping("/users")
public List<User> getUsersByStatus(@RequestParam String status) {
return userService.getUsersByStatus(status);
}
- ์ ์์์์
@RequestParam
์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐstatus
๋ฅผ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ์ต๋๋ค.- ์๋ฅผ ๋ค์ด,
/users?status=active
๋ก ์์ฒญํ๋ฉดstatus
๊ฐ์ โactiveโ๊ฐ ๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด,
4. @GetMapping
๊ณผ ๊ด๋ จ๋ ์ฃผ์ ์ต์
.
-
produces
- ์๋ต์ผ๋ก ์ ๊ณตํ๋ ๋ฐ์ดํฐ์ MIME ํ์
์ ์ง์ ํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, JSON, XML ํ์์ ์๋ต์ ์ง์ ํ ์ ์์ต๋๋ค.
- ์๋ต์ผ๋ก ์ ๊ณตํ๋ ๋ฐ์ดํฐ์ MIME ํ์
์ ์ง์ ํ ์ ์์ต๋๋ค.
@GetMapping(value = "/users", produces = "application/json")
public List<User> getAllUsers() {
return userService.getAllUsers();
}
-
params
- ํน์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ง ํด๋น ๋ฉ์๋๊ฐ ๋งคํ๋๋๋ก ์ ํํ ์ ์์ต๋๋ค.
@GetMapping(value = "/users", params = "active")
public List<User> getActiveUsers() {
return userService.getActiveUsers();
}
- ์ ์์์์
active
๋ผ๋ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๊ฐ ์์ด์ผ๋ง ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
5. @GetMapping
VS @RequestMapping
-
@RequestMapping
์ ์ฌ์ฉํ๋ฉด HTTP ๋ฉ์๋๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
// @RequestMapping
@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<User> getAllUsers() {
return userService.getAllUsers();
}
// @GetMapping
@GetMapping("/users")
public List<User> getAllUsers() {
return userService.getAllUsers();
}
-
@GetMapping
์ GET ์์ฒญ ์ ์ฉ์ผ๋ก ๋ณด๋ค ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ฆฌํฉํ ๋ง ํฌ์ธํธ
-
1.
@RequestMapping
์ ๋ค์ํ HTTP ๋ฉ์๋(GET, POST, PUT, DELETE ๋ฑ)๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋ ๋ฒ์ฉ ์ ๋ํ ์ด์ ์ ๋๋ค. ๊ทธ๋ฌ๋GET
์์ฒญ๋ง์ ์ฒ๋ฆฌํ ๋๋@GetMapping
์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. -
2.
method = RequestMethod.GET
๋์@GetMapping
์ ์ฌ์ฉํจ์ผ๋ก์จ ๋ ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํ๊ฒ GET ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. -
3.
@GetMapping
์ ๊ธฐ๋ณธ์ ์ผ๋กGET
์์ฒญ์ ์ฒ๋ฆฌํ๋ฏ๋กvalue
์์ฑ์ ๊ฒฝ๋ก๋ง ๋ช ์ํ๋ฉด ๋ฉ๋๋ค.
6. ์์ฝ.
-
์ฃผ์ ์ญํ
- HTTP GET ์์ฒญ์ ํน์ ๋ฉ์๋์ ๋งคํํ์ฌ ์์ฒญ ์ฒ๋ฆฌ.
-
๊ฐ๊ฒฐํ ๋ฌธ๋ฒ
-
@RequestMapping
์ GET ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๋์ฒด.
-
-
์ฃผ๋ก ์ฌ์ฉ๋๋ ๊ณณ
- ๋ฆฌ์์ค ์กฐํ, ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฑ์ ์ญํ ์ ์ํํ ๋ ์ฌ์ฉ.
5๏ธโฃ MIME(Mutipurpose Internet Mail Extensions) ํ์ .
- MIME(Mutipurpose Internet Mail Extensions) ํ์ ์ ์ธํฐ๋ท์์ ์ ์ก๋๋ ๋ฐ์ดํฐ์ ํ์์ ๋ํ๋ด๋ ํ์ค์ ๋๋ค.
- MIME ํ์ ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ํ์์ธ์ง ์ ์ํ์ฌ, ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ ๋ฑ)๋ ๋ฐ์ดํฐ์ ์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํด์ผ ํ์ง ์ ์ ์์ต๋๋ค.
1. MIME ํ์ ์ ๊ตฌ์ฑ.
MIME ํ์ ์ ํฌ๊ฒ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค.
-
ํ์
(Type)
- ๋ฐ์ดํฐ์ ์ผ๋ฐ์ ์ธ ๋ฒ์ฃผ๋ฅผ ๋ํ๋
๋๋ค.(์:
text
,image
,application
๋ฑ).
- ๋ฐ์ดํฐ์ ์ผ๋ฐ์ ์ธ ๋ฒ์ฃผ๋ฅผ ๋ํ๋
๋๋ค.(์:
-
์๋ธํ์
(Subtype)
- ๋ฐ์ดํฐ์ ๊ตฌ์ฒด์ ์ธ ํ์์ ๋ํ๋
๋๋ค.(์:
html
,plain
,json
,jpeg
๋ฑ).
- ๋ฐ์ดํฐ์ ๊ตฌ์ฒด์ ์ธ ํ์์ ๋ํ๋
๋๋ค.(์:
ํ์์ /
(์ฌ๋์)๋ก ๊ตฌ๋ถ๋๋ฉฐ, ์๋ฅผ ๋ค์ด text/html
์ HTML ๋ฌธ์๋ผ๋ ์๋ฏธ์
๋๋ค.
2. MIME ํ์ ์ ์์.
-
1. ํ
์คํธ ํ์.
-
text/plain
- ์ผ๋ฐ ํ ์คํธ(ASCII ๋๋ UTF-8๋ก ์ธ์ฝ๋ฉ๋ ํ ์คํธ).
-
text/html
- HTML ๋ฌธ์.
-
text/css
- CSS ํ์ผ.
-
text/javascript
- JavaScript ํ์ผ.
-
-
2. ์ด๋ฏธ์ง ํ์.
-
image/jpeg
- JPEG ์ด๋ฏธ์ง.
-
image/png
- PNG ์ด๋ฏธ์ง.
-
image/gif
- GIF ์ด๋ฏธ์ง.
-
-
3. ์์ฉ ํ๋ก๊ทธ๋จ ํ์.
-
application/json
- JSON ํ์์ ๋ฐ์ดํฐ.
-
application/xml
- XML ๋ฌธ์.
-
appliccation/pdf
- PDF ํ์ผ.
-
application/octet-stream
- ์ผ๋ฐ์ ์ธ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ.
- ํ์ผ ๋ค์ด๋ก๋ ์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
-
-
4. ๋ฉํฐ๋ฏธ๋์ด ํ์.
-
audio/mpeg
- MP3 ์ค๋์ค ํ์ผ.
-
video/mp4
- MP4 ๋น๋์ค ํ์ผ.
-
-
5. ๊ธฐํ ํ์.
-
multipart/form-data
- ์ฃผ๋ก ํ์ผ ์ ๋ก๋๋ ํผ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ฌ์ฉ๋๋ ํ์.
-
3. MIME ํ์ ์ ์ญํ .
MIME ํ์ ์ ์น ๋ธ๋ผ์ฐ์ ์ ๊ฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ์ ํ์์ ์ดํดํ๊ณ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด
-
text/html
- ๋ธ๋ผ์ฐ์ ๋ ์ด MIME ํ์ ์ ๋ฐ์ผ๋ฉด ์ด๋ฅผ HTML ๋ฌธ์๋ก ํด์ํ๊ณ ํ๋ฉด์ ๋ ๋๋งํฉ๋๋ค.
-
application/json
- ๋ธ๋ผ์ฐ์ ๋ ์ด MIME ํ์ ์ ๋ฐ์ผ๋ฉด ์ด๋ฅผ JSON ํ์์ ๋ฐ์ดํฐ๋ก ์ธ์ํ๊ณ , ๋ณดํต ๊ฐ๋ฐ์ ๋๊ตฌ์์ ๊ตฌ์กฐํ๋ ํ์์ผ๋ก ๋ณด์ฌ์ค๋๋ค.
-
application/octet=stream
- ๋ฐ์ด๋๋ฆฌ ํ์ผ(์: ํ๋ก๊ทธ๋จ ํ์ผ, ์์ถ ํ์ผ)์ ๋ค์ด๋ก๋ํ ๋ ์ฌ์ฉ๋๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ์ด ๋ฐ์ดํฐ๋ฅผ ํ์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
4. MIME ํ์ ์ง์ .
- ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ MIME ํ์
์ ์ง์ ํ๋๋ฐ, HTTP ์๋ต ํค๋์
Content-Type
ํ๋๋ฅผ ํตํด MIME ํ์ ์ด ์ ์๋ฉ๋๋ค.
์์: Content-Type
ํค๋
HTTP/1.1 200OK
Content=Type: application/json
{
"name": "John",
"age": 30
}
- ์ ์์์์๋ ์๋ฒ๊ฐ JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ ์๋ตํ๋ฉฐ,
Content-Type: application/json
์ ํตํด MIME ํ์ ์ ๋ช ์ํ๊ณ ์์ต๋๋ค.
5. Spring์์์ MIME ํ์ ์ง์ .
- Spring์์๋
@GetMapping
๋๋@PostMaping
๊ณผ ๊ฐ์ ์ ๋ํ ์ด์ ์ ์ฌ์ฉํ ๋produces
์์ฑ์ ํตํด MIME ํ์ ์ ์ง์ ํ ์ ์์ต๋๋ค.
์์ : JSON ํ์์ ์๋ต ์ง์ .
@GetMapping(value = "/users", produces = "application/json")
public List<User> getAllUsers() {
return userService.getAllUsers();
}
- ์ ์ฝ๋์์๋
/users
๋ก ๋ค์ด์ค๋ GET ์์ฒญ์ ๋ํด JSON ํ์ (application/json
)์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์๋ตํ๋๋ก ์ง์ ํ๊ณ ์์ต๋๋ค.
6. ์์ฝ.
- MIME ํ์ ์ ์ธํฐ๋ท์์ ์ ์ก๋๋ ๋ฐ์ดํฐ์ ํ์์ ๋ํ๋ด๋ ํ์ค.
- ์ฃผ๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ๋ฐ์ดํฐ ํ์์ ์ง์ ํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฅผ ์ ์ ํ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ค
-
ํ์ ์
ํ์ /์๋ธํ์
์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์๋ฅผ ๋ค์ดtext/html
์ HTML ๋ฌธ์๋ฅผ ๋ํ๋. - Spring๊ณผ ๊ฐ์ ํ๋ ์์ํฌ์์๋ ์๋ต ํ์์ ๋ฐ๋ผ ์ ์ ํ MIME ํ์ ์ ์ง์ ํ ์ ์์.
6๏ธโฃ @RequestParam
์ ๋ํ
์ด์
.
-
@RequestParam
์ ๋ํ ์ด์ ์ Spring MVC์์ HTTP ์์ฒญ์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, ํผ ๋ฐ์ดํฐ ๋๋ URL์ ํฌํจ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ ๋ฐ์ธ๋ฉํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. - ์ฃผ๋ก GET ์์ฒญ์์ ๋ญ๋ฆฌ ์คํธ๋ง์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋, POST ์์ฒญ์์ ํผ ๋ฐ์ดํฐ๋ก ์ ๋ฌ๋ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
1. ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ.
-
@RequestParam
์ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ URL์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ฉ์๋์ ์ธ์๋ก ๋ฐ์ ์ ์์ต๋๋ค.- ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ
GET /users?name=Jhon
๊ณผ ๊ฐ์ด ์์ฒญํ๋ฉดname
ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ฉ์๋์์ ๋ฐ์ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ
์์ 1: ๋จ์ผ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๋ฐ๊ธฐ.
@GetMapping("/users")
public String getUserByName(@RequestParam String name) {
return "Requested user: " + name;
}
์ ์ฝ๋์์
-
@RequestParam String name
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ
name
์ ๊ฐ์ ๋ฐ์์ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํฉ๋๋ค.- ์๋ฅผ ๋ค์ด
/users?name=Jhon
์ผ๋ก ์์ฒญํ๋ฉดname
์"John"
๊ฐ์ด ๋ค์ด๊ฐ๋๋ค.
- ์๋ฅผ ๋ค์ด
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ
์์ 2: ์ฌ๋ฌ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๋ฐ๊ธฐ.
@GetMapping("/users")
public String getUser(@RequestParam String name, @RequestParam int age) {
return "User: " + name + ", Age: " + age;
}
- ์ด ์ฝ๋๋ ๋ ๊ฐธ์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ(
name
๊ณผage
)๋ฅผ ๋ฐ์ต๋๋ค. - ํด๋ผ์ด์ธํธ๊ฐ
/users?name=Jhon&age=25
๋ก ์์ฒญํ๋ฉดname
์"Jhon"
,age
๋25
๊ฐ ๋ฉ๋๋ค.
3. ์ ํ์ ํ๋ผ๋ฏธํฐ์ ๊ธฐ๋ณธ๊ฐ.
-
@RequestParam
์ ์์ฑ์ ์ด์ฉํ๋ฉด ์ ํ์ ์ธ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. - ํ๋ผ๋ฏธํฐ๊ฐ ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
์์ 3: ๊ธฐ๋ณธ๊ฐ ์ค์ .
@GetMapping("/users")
pulbic String getUser(@RequestParam(defaultValue = "Unknown") String name) {
return "Requested user: " + name;
}
- ์ ์ฝ๋์์ ํด๋ผ์ด์ธํธ๊ฐ
/users
๋ก๋ง ์์ฒญ์ ๋ณด๋ด๋ฉด,name
์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก"Unknown"
์ด ์ค์ ๋ฉ๋๋ค. -
/users?name=John
์ผ๋ก ์์ฒญํ๋ฉดname
์"John"
๊ฐ์ด ๋ฉ๋๋ค.
์์ 4: ํ์ ์ฌ๋ถ ์ค์ .
-
required
์์ฑ์ ์ฌ์ฉํ๋ฉด ํ๋ผ๋ฏธํฐ๊ฐ ํ์์ธ์ง ์ ํ์ ์ธ์ง ์ค์ ํ ์ ์์ต๋๋ค.- ๊ธฐ๋ณธ์ ์ผ๋ก
@RequestParam
์ ํ์์ ๋๋ค. - ํ์ง๋ง,
required = false
๋ก ์ค์ ํ๋ฉด ํ๋ผ๋ฏธํฐ๊ฐ ์์ด๋ ์์ธ๋ฅผ ๋ฐ์์ํค์ง ์์ต๋๋ค.@GetMapping("/users") public String getUser(@RequestParam(required = false) String name) { return "Requested user: " + (name != null ? name : "Guest"); }
- ๊ธฐ๋ณธ์ ์ผ๋ก
- ์ด ๊ฒฝ์ฐ, ํด๋ผ์ด์ธํธ๊ฐ
name
ํ๋ผ๋ฏธํฐ๋ฅผ ํฌํจํ์ง ์๊ณ ์์ฒญํ ๊ฒฝ์ฐname
๊ฐ์null
์ด ๋๊ณ ,Guest
๋ก ๋์ฒด ๋ ์ ์์ต๋๋ค.
4. ๋ฐฐ์ด ๋๋ ๋ฆฌ์คํธ ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ.
-
@RequestParam
์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ ํ ๋ฒ์ ๋ฐ์ ์๋ ์์ต๋๋ค.
์์ 5: ๋ฐฐ์ด๋ก ํ๋ผ๋ฏธํฐ ๋ฐ๊ธฐ.
@GetMapping("/users")
public String getUsersByNames(@RequestParam List<String> names) {
return "Requested users: " + String.join(", ", names);
}
- ์ ์ฝ๋์์
/users?names=John&names=Jane
๊ณผ ๊ฐ์ด ์์ฒญํ๋ฉดnames
๋["John", "Jane"]
๋ฆฌ์คํธ๋ก ์ ๋ฌ๋ฉ๋๋ค.
5. ์์ฝ.
-
@RequestParam
์ URL ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ ํผ ๋ฐ์ดํฐ๋ฅผ ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ๋งคํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. - ํ์ ์ฌ๋ถ(
required
), ๊ธฐ๋ณธ๊ฐ(defaultValue
) ์ค์ ์ ํตํด ์ ์ฐํ๊ฒ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. - ์ฌ๋ฌ ํ๋ผ๋ฏธํฐ๋ ๋ฐฐ์ด/๋ฆฌ์คํธ ํํ์ ํ๋ผ๋ฏธํฐ๋ ๋ฐ์ ์ ์์ต๋๋ค.
7๏ธโฃ ํผ ๋ฐ์ดํฐ(Form Data).
- ํผ ๋ฐ์ดํฐ(Form Data) ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์๋ฒ๋ก ์ ์ถํ๋ ๋ฐ์ดํฐ๋ฅผ ๋งํฉ๋๋ค.
- ์ฃผ๋ก HTML
<form>
์์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ ฅ์ ์๋ฒ๋ก ์ ์กํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ํ ์คํธ, ํ์ผ, ์ ํํ ์ต์ ๋ฑ์ ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
1. ํผ ๋ฐ์ดํฐ์ ๊ตฌ์ฑ.
- ํผ ๋ฐ์ดํฐ๋ ์ฌ๋ฌ ์ข ๋ฅ์ ์ ๋ ฅ ํ๋๋ฅผ ํตํด ์์ฑ๋๋ฉฐ, ์ ์ก ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค.
- HTML
<form>
ํ๊ทธ๋ฅผ ์ด์ฉํ์ฌ ์ ๋ ฅ ํผ์ ๋ง๋ค๊ณ , ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ์ ์กํ ์ ์์ต๋๋ค.
HTML ํผ์ ์์.
<form action="/submit" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name">
<label for="age">Age:</label>
<input type="number" id="age" name="age">
<label for="file">Profile Picture:</label>
<input type="file" id="file" name="profilePicture">
<button type="submit">Submit</button>
</form>
- ์ด ํผ์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ์ ์กํ ์ ์์ต๋๋ค.
- Name : ํ ์คํธ ์ ๋ ฅ.
- Age : ์ซ์ ์ ๋ ฅ.
- Profile Picture : ํ์ผ ์ ๋ก๋.
2. ํผ ๋ฐ์ดํฐ์ ์ ์ก ๋ฐฉ์.
1. GET ๋ฉ์๋
- ํผ์ด
GET
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋๋ ๋ฐ์ดํฐ๊ฐ URL์ ์ฟผ๋ฆฌ ์คํธ๋ง(Query String)์ผ๋ก ์ ๋ฌ ๋ฉ๋๋ค. - URL์ ๋ณดํต ๋ค์๊ณผ ๊ฐ์ ํ์์ ๊ฐ์ง๋๋ค.
example.com/submit?name=Jhon&age=30
- ๋ฐ์ดํฐ๋ URL์ ํฌํจ๋๊ธฐ ๋๋ฌธ์ ๋ณด์์ ์ทจ์ฝํ๊ณ , ์ ์ก ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ์์ด ์ ํ์ ์
๋๋ค.
- ๋ฐ๋ผ์ ๊ฒ์ ์ฟผ๋ฆฌ๋ ํํฐ์ ๊ฐ์ ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
<form action="/submit" method="get">
<!-- ์
๋ ฅ ํ๋ -->
<button type="submit">Submit</button>
</form>
2. POST ๋ฉ์๋
-
POST
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๊ฐ HTTP ์์ฒญ ๋ณธ๋ฌธ(Body)์ ํฌํจ๋์ด ์ ์ก๋ฉ๋๋ค.- ์ด ๋ฐฉ์์ URL์ ๋ฐ์ดํฐ๋ฅผ ๋ ธ์ถํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ ์์ ํ๋ฉฐ, ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์์ต๋๋ค.
- ํ์ผ ์ ๋ก๋๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ์กํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
<form action="/submit" method="post">
<!-- ์
๋ ฅ ํ๋ -->
<button type="submit">Submit</button>
</form>
3. ์ ์ก๋๋ ๋ฐ์ดํฐ ํ์.
ํผ ๋ฐ์ดํฐ๊ฐ ์ ์ก๋ ๋, ๋ธ๋ผ์ฐ์ ๋ Content-Type
ํค๋๋ฅผ ํตํด ์๋ฒ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ธ์ฝ๋ฉํ๋์ง ์๋ ค์ค๋๋ค.
ํผ ๋ฐ์ดํฐ์ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ๋ฐ๋ผ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋๋ค.
-
1.
application/x-www.form-urlencoded
- ๊ธฐ๋ณธ ํผ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ๋๋ค.
- ํผ ๋ฐ์ดํฐ๋ฅผ URL ์ธ์ฝ๋ฉํ์ฌ ํค-๊ฐ ์์ผ๋ก ์ ์กํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด,
name=John&age=30
์ฒ๋ผ ํค์ ๊ฐ์&
๋ก ๊ตฌ๋ถํ์ฌ ์๋ฒ๋ก ์ ์กํฉ๋๋ค. -
POST
์์ฒญ์ ๋ณธ๋ฌธ์ ์ด ํ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค. - ์์
name=Jhon&age=30
-
2.
multipart/form-data
- ํ์ผ ์ ๋ก๋๊ฐ ํฌํจ๋ ํผ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ฌ์ฉ๋๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ๋๋ค.
- ๋ฐ์ดํฐ์ ํ์ผ์ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋๋์ด ์๋ฒ๋ก ์ ์กํฉ๋๋ค.
- ํ์ผ๋ฟ๋ง ์๋๋ผ ํ ์คํธ ํ๋๋ ํจ๊ป ์ ์กํ ์ ์์ต๋๋ค.
- ์์: ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์ผ๊ณผ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์ ์กํฉ๋๋ค.
```plaintext
โboundary
Content-Disposition: form-data; name=โnameโ
John
โboundary
Content-Disposition: form-data; name=โprofilePictureโ; filename=โprofile.jpgโ
Content-Type: image/jpeg[๋ฐ์ด๋๋ฆฌ ํ์ผ ๋ฐ์ดํฐ]
โboundaryโ
``` -
3.
text/plain
- ๋ฐ์ดํฐ๋ฅผ ๋จ์ํ ํ ์คํธ ํ์์ผ๋ก ์ ์กํฉ๋๋ค.
- ์ฃผ๋ก API์์ ๊ฐ๋จํ ํ ์คํธ ์ ์ก์ ์ฌ์ฉ๋๋ฉฐ, ํผ ๋ฐ์ดํฐ๋ก๋ ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
4. ์๋ฒ์์ ํผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ.
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ์กํ ํผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, Spring Boot์์๋
@RequestParam
๋๋@ModelAttribute
๋ฑ์ ์ฌ์ฉํ์ฌ ํผ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, Spring Boot์์๋
์์: Spring์์ ํผ ๋ฐ์ดํฐ ๋ฐ๊ธฐ.
@PostMapping("/submit")
public String handleForm(@RequestParam String name, @RequestParam int age) {
// ํผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
return "Name: " + name + ", Age: " + age;
}
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ํผ ๋ฐ์ดํฐ์์
name
๊ณผage
๊ฐ์ ์ถ์ถํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
5. ์์ฝ.
- ํผ ๋ฐ์ดํฐ๋ ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ์ ํผ์ ํตํด ์๋ฒ๋ก ์ ์กํ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
- ํผ ๋ฐ์ดํฐ๋ GET ๋๋ POST ๋ฉ์๋๋ฅผ ํตํด ์ ์ก๋๋ฉฐ, URL ์ธ์ฝ๋ฉ ๋ฐฉ์์ด๋
multipart/form-data
๋ฐฉ์์ผ๋ก ์๋ฒ์ ์ ๋ฌ๋ฉ๋๋ค. - ์๋ฒ๋ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ์ฌ ์ฌ์ฉ์ ์์ฒญ์ ๋ง๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
8๏ธโฃ @RestController
์ ๋ํ
์ด์
.
-
@RestController
์ ๋ํ ์ด์ ์ Spring Framework์์ RESTful ์น ์๋น์ค์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ ์ ๋ํ ์ด์ ์ ๋๋ค. - ์ด ์ ๋ํ ์ด์ ์ ์ปจํธ๋กค๋ฌ ํด๋์ค์ ๋ถ์ด๋ฉฐ, ์ด ํด๋์ค๊ฐ JSON์ด๋ XML๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ HTTP ์๋ต ๋ณธ๋ฌธ์ผ๋ก ์ง์ ๋ฐํํ๋๋ก ํด์ค๋๋ค.
1. @RestController
์ ํน์ง.
1. @Controller
+ @ResponseBody
์ ๊ฒฐํฉ.
-
@RestController
๋ ๋ด๋ถ์ ์ผ๋ก@Controller
์@ResponseBody
์ ๋ํ ์ด์ ์ ๊ฒฐํฉํ ๊ฒ์ ๋๋ค. -
@Controller
๋ Spring MVC์์ View๋ฅผ ๋ฐํํ๋ ์ ํต์ ์ธ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋์ง๋ง,@RestController
๋ View๋ฅผ ๋ฐํํ์ง ์๊ณ , ๊ฐ์ฒด๋ ๋ฐ์ดํฐ๋ฅผ ์ง์ HTTP ์๋ต ๋ณธ๋ฌธ์ผ๋ก ๋ฐํํฉ๋๋ค. -
@ResponseBody
๋ ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด๋ฅผ JSON์ด๋ XML๋ก ์ง๋ ฌํํ์ฌ HTTP ์๋ต์ ๋ณธ๋ฌธ์ผ๋ก ๋ฐํํ๋๋ก ํ๋ ์ญํ ์ ํฉ๋๋ค. -
@RestController
๋ ํด๋์ค ๋ ๋ฒจ์์ ๋ชจ๋ ๋ฉ์๋์@ResponseBody
๊ฐ ์๋์ผ๋ก ์ ์ฉ๋ฉ๋๋ค.
2. RESTful ์น ์๋น์ค์ ์ ํฉ.
-
@RestController
๋ ์ฃผ๋ก RESTful ์น ์๋น์ค ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก๋ถํฐ JSON, XML ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค. - ์ ํต์ ์ธ MVC ํจํด์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ทฐ ํ์ด์ง(HTML ๋ฑ)๋ก ์ ๋ฌํ์ง๋ง, RESTful ์น ์๋น์ค์์๋ ๋ฐ์ดํฐ ์์ฒด(JSON, XML ๋ฑ)๋ฅผ ์๋ต์ผ๋ก ์ ๋ฌํฉ๋๋ค.
2. ์์ ์ฝ๋.
@RestController
public class UserController {
@GetMapping("/users")
public List<User> getAllUsers() {
// ์ฌ์ฉ์ ๋ชฉ๋ก์ ๋ฐํํ๋ ์์
return userService.getAllUsers();
}
@PostMapping("/users")
public User createUser(@RequestBody User user) {
// ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ ์์
return userService.saveUser(user);
}
}
-
@RestController
- ์ด ํด๋์ค๋ RESTful ์ปจํธ๋กค๋ฌ์ด๋ฉฐ, ๋ชจ๋ ๋ฉ์๋๋ JSON ๋๋ XML๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ HTTP ์๋ต ๋ณธ๋ฌธ์ผ๋ก ๋ฐํํฉ๋๋ค.
-
@GetMapping("/users")
- GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ฉฐ,
List<User>
๊ฐ์ฒด๋ฅผ JSON ํ์์ผ๋ก ๋ฐํํฉ๋๋ค.
- GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ฉฐ,
-
@PostMapping("/users")
- POST ์์ฒญ์ ์ฒ๋ฆฌํ๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ
User
๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์์ฑํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ JSON ํ์์ผ๋ก ๋ฐํํฉ๋๋ค.
- POST ์์ฒญ์ ์ฒ๋ฆฌํ๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ
3. @RestController
์ ์ผ๋ฐ ์ปจํธ๋กค๋ฌ(@Controller
)์ ์ฐจ์ด.
-
1. ์ฃผ๋ ๋ชฉ์ .
-
@RestController
๋ ๋ฐ์ดํฐ(์ฃผ๋ก JSON, XML)๋ฅผ ์ง์ ๋ฐํํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, API ์๋ฒ๋ฅผ ๊ตฌ์ถํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. -
@Controller
๋ ๋ทฐ(HTML, JSP ํ์ด์ง ๋ฑ)๋ฅผ ๋ฐํํ๋ ๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ฉด์ ๋ณด์ฌ์ค ๋ ์ ํฉํฉ๋๋ค.
-
-
2. View ํด์.
-
@RestController
๋ ๋ฐ์ดํฐ๋ฅผ ์๋ต ๋ณธ๋ฌธ์ ๋ฐ๋ก ์ ๋ฌํ๋ฉฐ, JSP๋ Thymeleaf ๊ฐ์ ๋ทฐ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ์ง ์์ต๋๋ค. -
@Controller
๋ ๋ทฐ ์ด๋ฆ์ ๋ฐํํ๊ณ , Spring MVC๋ ์ด ๋ทฐ ์ด๋ฆ์ ํด์ํ์ฌ JSP๋ Thymeleaf ๊ฐ์ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํด ํ๋ฉด์ ๋ ๋๋งํฉ๋๋ค.
-
-
3.
@ResponseBody
ํ์ ์ฌ๋ถ.-
@RestController
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ์๋๋ง๋ค@ResponseBody
๋ฅผ ๋ถ์ผ ํ์๊ฐ ์์ต๋๋ค.- ํด๋์ค ๋ ๋ฒจ์์ ์๋์ผ๋ก ์ ์ฉ๋ฉ๋๋ค.
-
@Controller
๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ค๋ฉด ๋ฉ์๋๋ง๋ค@ResponseBody
๋ฅผ ๋ถ์ฌ์ ์๋ต ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋๋ก ๋ช ์ํด์ผ ํฉ๋๋ค.-
์ผ๋ฐ ์ปจํธ๋กค๋ฌ(
@Controller
) ์์@Controller public class ViewController { @GetMapping("/home") public String home() { // "home.html"์ด๋ผ๋ ๋ทฐ๋ฅผ ๋ฐํํจ return "home"; } }
- ์ด ์ฝ๋๋ โhomeโ์ด๋ผ๋ ๋ทฐ ์ด๋ฆ์ ๋ฐํํ๋ฉฐ, Spring์
home.html
๋๋home.jsp
๋ฅผ ์ฐพ์์ ๋ ๋๋งํ๊ฒ ๋ฉ๋๋ค.
-
์ผ๋ฐ ์ปจํธ๋กค๋ฌ(
-
4. ์์ฝ.
-
@RestController
๋ RESTful ์น ์๋น์ค ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ JSON์ด๋ XML ๋ฑ์ ํ์์ผ๋ก ๋ฐํํฉ๋๋ค. -
@RestController
๋@Controller
์@ResponseBody
์ ๊ฒฐํฉ์ผ๋ก, ๋ฐ์ดํฐ๋ฅผ ์๋ต ๋ณธ๋ฌธ์ ๋ฐ๋ก ๋ฐํํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. - Spring MVC์์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ทฐ๋ฅผ ๋ ๋๋งํ๋
@Controller
์ ๋ฌ๋ฆฌ,@RestController
๋ API ๊ฐ๋ฐ์ ๋ ์ ํฉํฉ๋๋ค.