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
볡사