Search

์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ

์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ

โ€ข
์˜์กด์„ฑ ์–ด๋…ธํ…Œ์ด์…˜
โ—ฆ
@Component
โ—ฆ
@Autowired
โ—ฆ
@Controller
โ—ฆ
@RestController
โ—ฆ
@Service
โ—ฆ
@Repository
โ€ข
์š”์ฒญ ๊ฒฝ๋กœ ๋งคํ•‘ ์–ด๋…ธํ…Œ์ด์…˜
โ—ฆ
@Controller or @RestController
โ—ฆ
@RequestMapping
โ–ช
@GetMapping
โ–ช
@PostMapping
โ–ช
@PutMapping
โ–ช
@DeleteMapping
โ€ข
์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ์–ด๋…ธํ…Œ์ด์…˜
โ—ฆ
@RequestParam
โ—ฆ
@PathVaiable
โ—ฆ
@RequestBody
โ—ฆ
@ModelAttribute

@Component

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์ปดํฌ๋„ŒํŠธ์ž„์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๋ณดํ†ต ์ผ๋ฐ˜์ ์ธ ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋˜๋ฉฐ, ์ž๋™์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜์—ฌ Bean์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
@Data @Component public class User { private String username; private String password; public User() { this.username = "ALOHA"; this.password = "123456"; } }
Java
๋ณต์‚ฌ

@Autowired

์Šคํ”„๋ง์—์„œ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š” ํ•„๋“œ๋‚˜ ๋ฉ”์†Œ๋“œ์— ํ•ด๋‹นํ•˜๋Š” Bean์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.
public class Test { @Autowired private User user; }
Java
๋ณต์‚ฌ

@Controller

MVC ๊ตฌ์กฐ์—์„œ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค์ž„์„ ์ง€์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
@Controllerย ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์•ผย @RequestMapping์ด๋‚˜ย @GetMapping,ย @PostMappingย ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Spring Boot์—์„œย @Controller๋Š” ์Šคํ”„๋ง MVC์—์„œ ์ด ํด๋ž˜์Šค๊ฐ€ ์›น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š”ย ์ปจํŠธ๋กค๋Ÿฌย ์—ญํ• ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œย @Controller๋ฅผ ์„ ์–ธํ•ด์•ผ ์Šคํ”„๋ง์ด ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์š”์ฒญ ์ฒ˜๋ฆฌ์šฉ ๋นˆ(Bean)์œผ๋กœ ์ธ์‹ํ•˜๊ณ ,ย @RequestMappingย ๋“ฑ์œผ๋กœ ์ง€์ •ํ•œ ์š”์ฒญ ๋งคํ•‘์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ™œ์„ฑํ™”๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

์–ด๋…ธํ…Œ์ด์…˜
์„ค๋ช…
@RequestMapping
ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ์— URL ํŒจํ„ด์„ ๋งคํ•‘ํ•˜์—ฌ ํŠน์ • ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
@GetMapping
GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ URL ๊ฒฝ๋กœ๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
@PostMapping
POST ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ URL ๊ฒฝ๋กœ๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
@PutMapping
PUT ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ URL ๊ฒฝ๋กœ๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
@DeleteMapping
DELETE ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ URL ๊ฒฝ๋กœ๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
@PatchMapping
PATCH ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ URL ๊ฒฝ๋กœ๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
@ResponseBody
๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜ ๊ฐ’์„ JSON ๋˜๋Š” XML๋กœ ๋ณ€ํ™˜ํ•ด HTTP ์‘๋‹ต ๋ณธ๋ฌธ์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
@PathVariable
URL ๊ฒฝ๋กœ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ถ”์ถœํ•˜์—ฌ ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
@RequestParam
์š”์ฒญ URL์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
@RequestBody
HTTP ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
@ModelAttribute
์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉํ•˜๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
@RequestHeader
HTTP ์š”์ฒญ ํ—ค๋” ๊ฐ’์„ ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
@CookieValue
ํŠน์ • ์ฟ ํ‚ค ๊ฐ’์„ ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
@SessionAttributes
์„ธ์…˜์— ํŠน์ • ์†์„ฑ ๊ฐ’์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
@InitBinder
์ปค์Šคํ…€ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๋ฐฉ์‹์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
@Controller public class HomeController { @GetMapping({"/", ""}) public String home() { return "index"; } }
Java
๋ณต์‚ฌ

@RestController

@Controller์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ JSON ๋˜๋Š” XML๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” RESTful ์›น ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
= @Controller + @ResponseBody
ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ ํ•˜์œ„์˜ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ ๋“ค์€ @ResponseBody ๋ฅผ ๋ถ™์ด์ง€ ์•Š์•„๋„, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ทฐ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ(JSON, XML)๋ฅผ ์‘๋‹ตํ•œ๋‹ค.

@RestController์—๋งŒ ํ™œ์„ฑํ™”๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ๋ชฉ๋ก

์–ด๋…ธํ…Œ์ด์…˜
์„ค๋ช…
@ResponseBody
@RestController๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ์ž๋™ ์ ์šฉ๋˜์–ด, ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜ ๊ฐ’์„ HTTP ์‘๋‹ต ๋ณธ๋ฌธ์œผ๋กœ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ย @Controller์—์„œ๋Š” ๋ณ„๋„๋กœย @ResponseBody๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•˜์ง€๋งŒ,ย @RestController์—์„œ๋Š” ์ด๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
@RestControllerAdvice
@ControllerAdvice์™€ ๋™์ผํ•˜์ง€๋งŒ,ย @RestController์— ํŠนํ™”๋œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ์ „์—ญ ์„ค์ •์„ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ REST API์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (@ExceptionHandler์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋จ)
@ResponseStatus
@RestController์—์„œ HTTP ์ƒํƒœ ์ฝ”๋“œ์™€ ์‘๋‹ต ๋ณธ๋ฌธ์„ ํ•จ๊ป˜ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ ํด๋ž˜์Šค์—์„œ ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ์— ๋Œ€ํ•ด ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ์ž๋™์œผ๋กœ 404 ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@JsonView
ํŠน์ • ๋ทฐ(View)๋ฅผ ์ •์˜ํ•˜์—ฌ JSON ์‘๋‹ต ์‹œ ๋ฐ˜ํ™˜ํ•  ํ•„๋“œ๋ฅผ ๋™์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. REST API์—์„œ ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ์‘๋‹ตํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Slf4j @RestController @RequestMapping("/rest") public class TestRestController { /** * โญ @RestController = @Controller + @ResponseBody * - @ResponseBody ๊ฐ€ ์—†์–ด๋„, ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ต ๋ณธ๋ฌธ(body)์— ๋‹ด์•„์„œ ์ „์†กํ•œ๋‹ค. * @return */ @GetMapping("/body") public String restBody() { return "REST"; } }
Java
๋ณต์‚ฌ
@RestController public class TestRestController { @Autowired private User user; @GetMapping("/user") public User user() { return user; } }
Java
๋ณต์‚ฌ
Userย ํด๋ž˜์Šค์˜ ํ•„๋“œ๊ฐ€ย privateย ์ ‘๊ทผ ์ œ์–ด์ž๋กœ ๋˜์–ด ์žˆ์–ด, ์ด๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉดย getter ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Spring์€ย Userย ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•  ๋•Œ Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, Jackson์€ ๊ธฐ๋ณธ์ ์œผ๋กœย getterย ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค.

@Service

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค ํด๋ž˜์Šค์ž„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

ํ™œ์„ฑํ™”๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

์–ด๋…ธํ…Œ์ด์…˜
์„ค๋ช…
@Autowired
์˜์กด์„ฑ ์ฃผ์ž…์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.ย @Serviceย ํด๋ž˜์Šค ๋‚ด์—์„œ ๋‹ค๋ฅธ ๋นˆ(์˜ˆ: ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋˜๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค)์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@Transactional
์„œ๋น„์Šค ๋ฉ”์„œ๋“œ์— ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์ž‘์—…์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  ์ข…๋ฃŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
@PostConstruct
์„œ๋น„์Šค ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์˜์กด์„ฑ ์ฃผ์ž… ํ›„ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
@PreDestroy
์„œ๋น„์Šค ํด๋ž˜์Šค๊ฐ€ ์†Œ๋ฉธ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ข…๋ฃŒ ์ž‘์—…์„ ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Value
Spring ์„ค์ • ํŒŒ์ผ์—์„œ ๊ฐ’์„ ์ฃผ์ž…๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ดย application.properties์—์„œ ์„ค์ •ํ•œ ๊ฐ’์„ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@Qualifier
๋™์ผํ•œ ํƒ€์ž…์˜ ๋นˆ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ, ํŠน์ • ๋นˆ์„ ์„ ํƒํ•˜์—ฌ ์ฃผ์ž…๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.ย @Autowired์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Async
๋ฉ”์„œ๋“œ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ž‘์—…์„ ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Bean
@Serviceย ํด๋ž˜์Šค ๋‚ด์—์„œย @Bean์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋นˆ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ์„œ๋น„์Šค ๋‚ด์—์„œ ํŠน์ • ๊ฐ์ฒด๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Scope
๋นˆ์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์‹ฑ๊ธ€ํ†ค(singleton)์ด๋ฉฐ, ์š”์ฒญ(request), ์„ธ์…˜(session) ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@Profile
ํŠน์ • ํ™˜๊ฒฝ(์˜ˆ: ๊ฐœ๋ฐœ, ๋ฐฐํฌ)์— ๋”ฐ๋ผ ๋นˆ์„ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

UserService.java

public interface UserService { public void test(User user) throws Exception; }
Java
๋ณต์‚ฌ

UserServiceImpl.java

@Slf4j @Service public class UserServiceImpl implements UserService { @Override public void test(User user) throws Exception { log.info("UserServceImpl - test()"); } }
Java
๋ณต์‚ฌ

@Repository

๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์˜ DAO(Data Access Object) ํด๋ž˜์Šค์ž„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

ํ™œ์„ฑํ™” ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

์–ด๋…ธํ…Œ์ด์…˜
์„ค๋ช…
@Autowired
์˜์กด์„ฑ ์ฃผ์ž…์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.ย @Repositoryย ํด๋ž˜์Šค ๋‚ด์—์„œ ๋‹ค๋ฅธ ๋นˆ(์˜ˆ: ์„œ๋น„์Šค ํด๋ž˜์Šค ๋˜๋Š” ๋‹ค๋ฅธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ)์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@PersistenceContext
EntityManager๋ฅผ ์ฃผ์ž…๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JPA๋ฅผ ์‚ฌ์šฉํ•  ๋•Œย @Repositoryย ํด๋ž˜์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
@Transactional
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.ย @Repositoryย ํด๋ž˜์Šค ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์ž‘์—…์„ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๊ฐ์‹ธ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Query
์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.ย @Repository์—์„œ JPQL, ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ ๋“ฑ์„ ์ •์˜ํ•˜์—ฌ ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@Modifying
@Query์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,ย UPDATE๋‚˜ย DELETEย ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Transactional (readOnly=true)
ํŠธ๋žœ์žญ์…˜์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ , ๋ฐ์ดํ„ฐ ์ˆ˜์ • ์—†์ด ์กฐํšŒ๋งŒ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
@EnableJpaRepositories
@Repository๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JPA ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค. JPA ์„ค์ •์„ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
@QueryHints
JPA ์ฟผ๋ฆฌ์—์„œ ์ถ”๊ฐ€์ ์ธ ํžŒํŠธ๋ฅผ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ฑฐ๋‚˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๋ฐฉ์‹์„ ์ œ์–ดํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

@RequestMapping

์š”์ฒญ ๋งคํ•‘์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ๋Š” ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๊ณ , ๋ฉ”์†Œ๋“œ ๋ ˆ๋ฒจ์—์„œ๋Š” ๊ฒฝ๋กœ์™€ HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์†์„ฑ
โ—ฆ
value
โ—ฆ
method
โ—ฆ
headers
โ—ฆ
consumes
โ—ฆ
produces
โ—ฆ
name
์†์„ฑ์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ์ƒ๋žตํ•ด์„œ ์“ฐ๋ฉด, ๊ธฐ๋ณธ URL ๊ฒฝ๋กœ๋งŒ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
@RequestMapping("/path/sub")
Java
๋ณต์‚ฌ
์†์„ฑ
์„ค๋ช…
์˜ˆ์‹œ
value ๋˜๋Š” path
์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
@RequestMapping(value = "/example")
method
์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
@RequestMapping(value = "/example", method = RequestMethod.GET)
params
์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์กด์žฌ ์—ฌ๋ถ€ ๋ฐ ๊ฐ’์— ๋”ฐ๋ผ ๋งคํ•‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
@RequestMapping(value = "/example", params = "id=1")
headers
์š”์ฒญ ํ—ค๋”์˜ ์†์„ฑ์— ๋”ฐ๋ผ ๋งคํ•‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
@RequestMapping(value = "/example", headers = "content-type=application/json")
consumes
์†Œ๋น„ํ•  ๋ฏธ๋””์–ด ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
@RequestMapping(value = "/example", consumes = MediaType.APPLICATION_JSON_VALUE)
produces
์ƒ์„ฑํ•  ๋ฏธ๋””์–ด ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
@RequestMapping(value = "/example", produces = MediaType.APPLICATION_JSON_VALUE)
name
๋งคํ•‘์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
@RequestMapping(value = "/example", name = "exampleMapping")

@GetMapping, @PostMapping @PutMapping, @DeleteMapping

๊ฐ๊ฐ GET, POST, PUT, DELETE HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ๋งคํ•‘์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
@RequsetMapping ์˜ ์†์„ฑ๋“ค์„ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (method ์ œ์™ธ)

@RequestParam

HTTP ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์š”์ฒญ URL
http://localhost:8080/example?A=100&B=200
Java
๋ณต์‚ฌ
@RequsetMapping("/test") public void method( @RequestParam("A") String a, @RequestParam("B") String b ) { ... }
Java
๋ณต์‚ฌ
์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ ๋ฉ”์†Œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ๊ฐ™์€ ๊ฒฝ์šฐ
@RequsetMapping("/test") public void method( @RequestParam String A, @RequestParam String B ) { ... }
Java
๋ณต์‚ฌ
@RequsetMapping("/test") public void method( String A, String B ) { ... }
Java
๋ณต์‚ฌ

@PathVariable

URI ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
http://localhost:8080/example/{A}/{B}
Java
๋ณต์‚ฌ
@RequsetMapping("/test") public void method(@PathVariable("A") String a, @PathVariable("B") String b ) { ... }
Java
๋ณต์‚ฌ

@RequestBody

HTTP ์š”์ฒญ ๋ณธ๋ฌธ์„ ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
ํด๋ผ์ด์–ธํŠธ๊ฐ€ POST ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญํ•  ๋•Œ, ์š”์ฒญ ๋ฉ”์‹œ์ง€์˜ body ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด ๋˜๋Š” ์ปฌ๋ ‰์…˜์— ๋งคํ•‘ํ•ด์ค๋‹ˆ๋‹ค.
JSON, XML [POST] @RequestBody
form-data [POST] @ReqeustParam
form ์˜ POST ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญํ•ด๋„ ์—ญ์‹œ ์š”์ฒญ ๋ฉ”์‹œ์ง€์˜ body์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ธฐ๋Š”๋ฐ, ์Šคํ”„๋ง์ด ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋‹ด์•„์ค๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ @RequestParam ์œผ๋กœ ๊ฐ์ฒด๋‚˜ ์ปฌ๋ ‰์…˜์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ง์ ‘ ์ •์˜ํ•œ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ. ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜๋ช…์ด ์ผ์น˜ํ•˜๋ฉด @RequestParam ์„ ์“ฐ์ง€ ์•Š์•„๋„ ์ž๋™ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
@Slf4j @Controller @RequestMapping("/test") public class TestController { /** * [POST] - /test/json * data : (BODY) > (JSON) > { "data1" : "value1", "data2" : "value2" } * @param map * @return * โญ @RequestBody * : HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€์˜ ๋ณธ๋ฌธ(BODY) ๋ฅผ ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ * โœ… ์ฃผ๋กœ JSON, XML ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ * โŒ FORM[POST] ์š”์ฒญ์ผ ๋•Œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. * - FORM ์š”์ฒญ์ผ ๋•Œ๋Š”, ๊ฐ์ฒด๋‚˜ ์ปฌ๋ ‰์…˜์œผ๋กœ ์ž๋™ ๋งคํ•‘๋œ๋‹ค. */ @PostMapping("/json") public String jsonTest(@RequestBody Map<String, String> map) { log.info("[POST] - /test"); log.info("map : " + map); Set<String> set = map.keySet(); for (String key : set) { String value = map.get(key); log.info("key : "+ key + ", value : " + value); } return "test"; } /** * /test/form * data : (BODY) > (FORM) > formData * โœ… * ๐Ÿ’Œ(์š”์ฒญ)[POST]/test/form * body : formData * - POST ๋กœ ์š”์ฒญ ์‹œ, formData ๋„ body ์— ๋‹ด๊ฒจ์ ธ์„œ ๋ณด๋‚ด์ง„๋‹ค. * ๐Ÿƒ(Spring) * - ํผ์œผ๋กœ ์ „์†ก๋œ ์š”์ฒญ body์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์ง€๋งŒ, * ์Šคํ”„๋ง๐Ÿƒ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด, * ๋‚ด๋ถ€์ ์œผ๋กœ body์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. * โžก ๊ทธ๋ž˜์„œ, ํผ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋Š” @RequestParam ์œผ๋กœ ๋งคํ•‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. * @param map * @return */ @PostMapping("/form") public String formTest(@RequestParam Map<String, String> map) { log.info("[POST] - /test"); log.info("map : " + map); Set<String> set = map.keySet(); for (String key : set) { String value = map.get(key); log.info("key : "+ key + ", value : " + value); } return "test"; } /** * /test/form/user * data : (BODY) > (FORM) > formData * โœ… ( @RequestParam ) User user * - @RequestParam ์ƒ๋žต ๊ฐ€๋Šฅ - ์Šคํ”„๋ง์ด ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜๋ฅผ ๋ถ„์„ํ•ด์„œ * ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ณ€์ˆ˜์— ์ž๋™ ๋งคํ•‘ํ•œ๋‹ค. * @param user * @return */ @PostMapping("/form/user") public String user(User user) { log.info("[POST] - /test/user"); log.info("user : " + user); return "test"; } /** * /test/json/user * data : (BODY) > (JSON) > { "name" : "joeun", "age" : "20" } * โญ @RequestBody * - ์š”์ฒญ ๋ณธ๋ฌธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•œ๋‹ค. * โœ… ์ƒ๋žตํ•˜๋ฉด ์ž๋™ ๋งคํ•‘ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค. * @param user * @return */ @PostMapping("/json/user") public String jsonUser(@RequestBody User user) { log.info("[POST] - /test/json/user"); log.info("user : " + user); return "test"; } }
Java
๋ณต์‚ฌ

@ModelAttribute

์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋ชจ๋ธ์— ๋“ฑ๋กํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜
/** * โญ @ModelAttribute * ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋ชจ๋ธ์— ๋“ฑ๋กํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜ * โœ… name ์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, ๋ณ€์ˆ˜๋ช…์„ name์œผ๋กœ ์ง€์ •ํ•œ๋‹ค. * @param user * @return */ @GetMapping("/model") public String testModel(@ModelAttribute User user) { user.setName("๊น€์กฐ์€"); user.setAge(30); return "user"; }
Java
๋ณต์‚ฌ
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>user</title> </head> <body> <h1>user</h1> <h3 th:text="${ user.name }" ></h3> <h3 th:text="${ user.age }" ></h3> </body> </html>
HTML
๋ณต์‚ฌ

@ResponseBody

์‘๋‹ต ๋ฉ”์‹œ์ง€์˜ ๋ณธ๋ฌธ(body)์— ๋ฐ์ดํ„ฐ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
ํ…œํ”Œ๋ฆฟ ์—”์ง„(thymeleaf, jsp)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, String ๋ฐ˜ํ™˜ํƒ€์ž…์œผ๋กœ โ€œ๋ทฐํŒŒ์ผ ๊ฒฝ๋กœโ€ ๋ฅผ ์ง€์ •ํ•˜๋ฉด, ํ•ด๋‹น ๋ทฐ ํŒŒ์ผ์„ html ๋กœ ๋ Œ๋”๋งํ•˜์—ฌ ์‘๋‹ตํ•œ๋‹ค.
์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ์— @ResponseBody ๋ฅผ ๋ถ™์ด๋ฉด, ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ํ†ตํ•ด์„œ ๋ทฐ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉ ์•Š๊ณ , ์ง€์ •ํ•œ ๋ฌธ์ž์—ด์„ ์‘๋‹ต ๋ฉ”์‹œ์ง€ ๋ณธ๋ฌธ์— ๋‹ด์•„์„œ ์ „์†กํ•œ๋‹ค.
/** * โญ @ResponseBody * : ์‘๋‹ต ๋ฉ”์‹œ์ง€ ๋ณธ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์„œ ์ „์†กํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜ * โœ… ๋ทฐ ํŽ˜์ด์ง€๋ฅผ ์‘๋‹ตํ•˜์ง€ ์•Š๊ณ , ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์‘๋‹ตํ•œ๋‹ค. * @return */ @ResponseBody @GetMapping("/body") public String testBody() { return "TEST"; }
Java
๋ณต์‚ฌ