๐[Spring] ๊ณ์ธตํ ์ํคํ ์ฒ์์ Controller์ ์ญํ .
Java ๋ฐฑ์ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ธตํ ์ํคํ ์ฒ(Layerd Architecture) ์์ Controller๋ ์ฌ์ฉ์(ํด๋ผ์ด์ธํธ)๋ก๋ถํฐ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ์ ๋ํ ์๋ต์ ๋ฐํํ๋ ์ญํ ์ ๋ด๋นํ๋ ์ค์ํ ๊ณ์ธต์ ๋๋ค.
Controller๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ธ๋ถ ์ธํฐํ์ด์ค๋ก ์๋ํ๋ฉฐ, ์ฃผ๋ก ์น ์์ฒญ๊ณผ ์๋ต์ ํ๋ฆ์ ์ ์ดํ๋ ์ญํ ์ ์ํํฉ๋๋ค.
1๏ธโฃ Controller์ ์ฃผ์ ์ญํ .
1. ์์ฒญ ์์ ๋ฐ ์๋ต ๋ฐํ.
- Controller๋ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ , ๋ชจ๋ฐ์ผ ์ฑ ๋ฑ)๋ก ๋ถํฐ HTTP ์์ฒญ์ ์์ ํฉ๋๋ค.
- ๊ฐ ์์ฒญ์ URL ๊ฒฝ๋ก ๋ฐ HTTP ๋ฉ์๋(GET, POST, PUT, DELETE ๋ฑ)์ ๋ฐ๋ผ Controller์ ํน์ ๋ฉ์๋์ ๋งคํ๋ฉ๋๋ค.
- ์ด ๋ฉ์๋๋ ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถํ๊ณ , ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ผ๋ก ๋ฐํํฉ๋๋ค.
2. ์์ฒญ ๊ฒ์ฆ.
- Controller๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ๋ฌ๋ ์์ฒญ ๋ฐ์ดํฐ(์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, ํผ ๋ฐ์ดํฐ, JSON ๋ฑ)๋ฅผ ๊ฒ์ฆํ๋ ์ญํ ์ ํฉ๋๋ค.
- ์ด ๊ฒ์ฆ ์์ ์ ์ผ๋ฐ์ ์ผ๋ก ์์ฒญ์ด ๋น์ฆ๋์ค ๋ก์ง์ผ๋ก ์ ๋ฌ๋๊ธฐ ์ ์ ์ํ๋ฉ๋๋ค.
- ๊ฒ์ฆ ์คํจ ์, ์๋ฌ ๋ฉ์์ง๋ ์ํ ์ฝ๋๋ฅผ ํด๋ผ์ด์ธํธ์ ๋ฐํํฉ๋๋ค.
3. ๋น์ฆ๋์ค ๋ก์ง ํธ์ถ.
- Controller๋ ์ง์ ์ ์ผ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ์ง ์๊ณ , Service ๊ณ์ธต์ ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
- ์ด ๋ฐฉ์์ ์ญํ ์ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์์ฑ์ ๋์ด๊ณ , ์ฝ๋๊ฐ ๋์ฑ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- Service ๊ณ์ธต์ด ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ฉด, Controller๋ ์ด๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํฉ๋๋ค.
4. ๋ทฐ์์ ํต์ (View์ ์ฐ๋)
- Controller๋ View์ ํต์ ํ์ฌ ์ ์ ํ ์๋ต์ ์์ฑํฉ๋๋ค.
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์์๋ HTML์ด๋ JSON ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
- ์๋ฅผ ๋ค์ด, ํ ํ๋ฆฟ ์์ง(Thymeleaf ๋ฑ)์ ์ฌ์ฉํด ๋์ ์ธ HTML ํ์ด์ง๋ฅผ ๋ ๋๋งํ๊ฑฐ๋, API ์๋ฒ์ ๊ฒฝ์ฐ JSON ํฌ๋งท์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
5. HTTP ์ํ ์ฝ๋ ๊ด๋ฆฌ.
- Controller๋ ์์ฒญ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ ์ ํ HTTP ์ํ ์ฝ๋(์: 200 OK, 400 Bad Request, 404 Not Found, 500 Internal Server Error ๋ฑ) ๋ฅผ ์ค์ ํ์ฌ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํฉ๋๋ค.
- ์ด๋ก์จ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ ์ฒ๋ฆฌ ์ํ๋ฅผ ์ ์ ์๋๋ก ํฉ๋๋ค.
6. ์์ธ ์ฒ๋ฆฌ
- Controller๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋, ์ ์ญ์ ์ธ ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํด ์์ธ๋ฅผ ๋ค๋ฃน๋๋ค.
- ์ด๋ฅผ ํตํด ์ ์ ํ ์๋ฌ ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ๊ณ , ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋์ง ์๋๋ก ํฉ๋๋ค.
2๏ธโฃ ์์ ์ฝ๋
Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์์์ Controller ์์๋ฅผ ํตํด ๊ทธ ์ญํ ์ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {
UserDTO user = userService.getUserById(id);
return ResponseEntity.ok(user);
}
@PostMapping
public ResponseEntity<UserDTO> createUser(@RequestBody @Valid UserDTO userDTO) {
UserDTO createdUser = userService.createUser(userDTO);
return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);
}
}
3๏ธโฃ ์ค๋ช .
-
@RestController
- Spring์์ RESTful ์น ์๋น์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
- JSON ๋๋ XML ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ์ํฉ๋๋ค.
-
@RequestMapping
- ์ด ์ปจํธ๋กค๋ฌ๊ฐ
\users
๊ฒฝ๋ก์ ๋ํ ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ก ์ค์ ํฉ๋๋ค.
- ์ด ์ปจํธ๋กค๋ฌ๊ฐ
-
@GetMapping
- HTTP GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ก,
id
๊ฒฝ๋ก ๋ณ์์ ํด๋นํ๋ ์ฌ์ฉ์๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- HTTP GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ก,
-
@PostMapping
- HTTP POST ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ก, ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์์ฑํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
-
@RequestBody
,@Valid
- ์์ฒญ ๋ณธ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋งคํํ๊ณ , ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
-
ResponseEntity
- ์๋ต ๋ณธ๋ฌธ๊ณผ ์ํ ์ฝ๋๋ฅผ ํฌํจํด ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ ๋ฐํํฉ๋๋ค.
4๏ธโฃ ๊ฒฐ๋ก
Contoller๋ ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ์ Service ๊ณ์ธต๊ณผ ํต์ ํ๋ฉฐ, ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ๋ ์ญํ ์ ํฉ๋๋ค.
์ด๋ฌํ ์ญํ ๋ถ๋ฆฌ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์ ๋์ฑ ์ ์ฐํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๊ตฌ์กฐ๋ฅผ ๊ฐ์ถ๊ฒ ๋ฉ๋๋ค.