2 λΆ„ μ†Œμš”

μŠ€ν”„λ§ μ• λ…Έν…Œμ΄μ…˜μ— λŒ€ν•΄μ„œβ€¦

μŠ€ν”„λ§μ—λŠ” μ• λ…Έν…Œμ΄μ…˜μ΄λΌλŠ”κ²Œ μžˆλ‹€.
이게 뭘까?
Annotation: μ£Όμ„μ˜ λœ»μ„ 가지고 μžˆμ§€λ§Œ, μ–΄λ–€ 역할을 ν•˜λŠ”μ§€ λͺ…μ‹œν•˜λŠ” κΈ°λŠ₯ 이외에 λ‹€μ–‘ν•œ κΈ°λŠ₯듀이 μžˆλ‹€.
μ•žμœΌλ‘œ 곡뢀λ₯Ό ν•˜λ‹€κ°€ μ²˜μŒλ³΄κ±°λ‚˜ λͺ¨λ₯΄λŠ” μ• λ…Έν…Œμ΄μ…˜μ€ 여기에 μˆ˜μ‹œλ‘œ μ—…λ‘œλ“œν•˜μ—¬ κΈ°λ‘ν• κ±°μž„!

자주 μ‚¬μš©ν•˜λŠ” μ• λ…Έν…Œμ΄μ…˜

@Component

객체λ₯Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μŠ€ν”„λ§ 빈으둜 등둝할 λ•Œ μ‚¬μš©ν•œλ‹€.
μŠ€ν”„λ§μ€ λ™μž‘ μ‹œμ— @Componentμ• λ…Έν…Œμ΄μ…˜μ„ 보고 μžλ™μœΌλ‘œ μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•œλ‹€.

λ‹€μ–‘ν•œ μ• λ…Έν…Œμ΄μ…˜λ“€μ΄ @Componentλ₯Ό μƒμ†λ°›λŠ”λ‹€.

μ°Έκ³ : μžλ°”μ—λŠ” μ›λž˜ μ• λ…Έν…Œμ΄μ…˜ κ°„μ˜ 상속 κΈ°λŠ₯을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. μ΄λŠ” μŠ€ν”„λ§μ—μ„œ μ§€μ›ν•˜λŠ” κΈ°λŠ₯이닀!

  • @Component
    • @Service
    • @Repository
    • @Controller
    • @Configuration μƒμ†λ°›λŠ”μ§€ 확인해보고 μ‹ΆμœΌλ©΄ μœ„ μ• λ…Έν…Œμ΄μ…˜μ˜ μΈν„°νŽ˜μ΄μŠ€μ— λ“€μ–΄κ°€μ„œ ν™•μΈν•΄λ³΄μž!

@ComponentScan

μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ€ μœ„μ—μ„œ ν™•μΈν•œ μ»΄ν¬λ„ŒνŠΈ μ• λ…Έν…Œμ΄μ…˜ ν˜Ήμ€ 상속받은 μ• λ…Έν…Œμ΄μ…˜λ“€ 쀑 1κ°œλΌλ„ λ“±λ‘λœ 클래슀λ₯Ό 찾으면 Context에 빈으둜 λ“±λ‘ν•œλ‹€.
말 κ·ΈλŒ€λ‘œ μ»΄ν¬λ„ŒνŠΈ μ• λ…Έν…Œμ΄μ…˜μ΄ 뢙은 클래슀λ₯Ό μŠ€μΊ”ν•˜κ³  빈으둜 등둝해쀀닀.

@Bean

@Beanμ• λ…Έν…Œμ΄μ…˜μ€ 객체λ₯Ό μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

@Controller

이 μ• λ…Έν…Œμ΄μ…˜μ΄ 뢙은 ν΄λž˜μŠ€κ°€ β€œμ»¨νŠΈλ‘€λŸ¬μ˜ 역할을 ν•œλ‹€β€λΌκ³  λͺ…μ‹œν•΄μ€Œ.

@Autowired

μŠ€ν”„λ§μ—μ„œ 빈 객체λ₯Ό μ£Όμž…λ°›κΈ° μœ„ν•œ 방식이 3가지가 μ‘΄μž¬ν•œλ‹€.

  1. @Autowired
  2. μƒμ„±μž
  3. setter

μœ„ 3가지 방법 쀑 ν•˜λ‚˜λ‘œ, @Autowiredκ°€ 뢙은 클래슀λ₯Ό νƒ€μž…μ„ ν™•μΈν•˜κ³ (μ—†μœΌλ©΄ 빈 이름을 확인) λΉˆμ„ μ£Όμž…ν•œλ‹€.

@GetMapping

RequestMapping(Method=RequestMethod.GET)κ³Ό λ˜‘κ°™μ€ 역할이닀.

@Controller                   // 이 ClassλŠ” Controller 역할을 ν•©λ‹ˆλ‹€
@RequestMapping("/user")      // 이 ClassλŠ” /user둜 λ“€μ–΄μ˜€λŠ” μš”μ²­μ„ λͺ¨λ‘ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
public class UserController {
    @GetMapping("/")
    public String getUser(Model model) {
        //  GET method, /user μš”μ²­μ„ 처리
    }
    // μƒλž΅
}

μœ„μ™€ 같이 λ™μž‘ν•˜κ³ , Flaskμ—μ„œ @app.route(β€˜/’, methods=[β€˜GET’])κ³Ό μœ μ‚¬ν•œ 것 κ°™λ‹€.

@PostMapping

RequestMapping(Method=RequestMethod.POST)κ³Ό λ˜‘κ°™μ€ 역할이닀.

@Controller                   // 이 ClassλŠ” Controller 역할을 ν•©λ‹ˆλ‹€
@RequestMapping("/user")      // 이 ClassλŠ” /user둜 λ“€μ–΄μ˜€λŠ” μš”μ²­μ„ λͺ¨λ‘ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
public class UserController {
    @RequestMapping(method = RequestMethod.POST)
    public String addUser(Model model) {
        //  POST method, /user μš”μ²­μ„ 처리
    }
    // μƒλž΅
}

μœ„μ™€ 같이 λ™μž‘ν•˜λ©°, Flaskμ—μ„œ @app.route(β€˜/’, methods=[β€˜POST’])와 λΉ„μŠ·ν•œ 것 κ°™λ‹€.

@Test

JUnitμ—μ„œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ μ‚¬μš©ν•œλ‹€.

@RequestBody

이 μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 νŒŒλΌλ―Έν„°μ—λŠ” httpμš”μ²­μ˜ λ³Έλ¬Έ(body)이 κ·ΈλŒ€λ‘œ μ „λ‹¬λœλ‹€.
일반적인 GET/POST의 μš”μ²­ νŒŒλΌλ―Έν„°λΌλ©΄ @RequestBodyλ₯Ό μ‚¬μš©ν•  일이 없을 것이닀.
λ°˜λ©΄μ— xmlμ΄λ‚˜ json기반의 λ©”μ‹œμ§€λ₯Ό μ‚¬μš©ν•˜λŠ” μš”μ²­μ˜ κ²½μš°μ— 이 방법이 맀우 μœ μš©ν•˜λ‹€. HTTP μš”μ²­μ˜ λ°”λ””λ‚΄μš©μ„ ν†΅μ§Έλ‘œ μžλ°”κ°μ²΄λ‘œ λ³€ν™˜ν•΄μ„œ λ§€ν•‘λœ λ©”μ†Œλ“œ νŒŒλΌλ―Έν„°λ‘œ 전달해쀀닀.

즉, ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„λ‘œ ν•„μš”ν•œ 데이터λ₯Ό μš”μ²­ν•˜κΈ° μœ„ν•΄ JSON 데이터λ₯Ό μš”μ²­ 본문에 λ‹΄μ•„μ„œ μ„œλ²„λ‘œ 보내면, μ„œλ²„μ—μ„œλŠ” @RequestBody μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ HTTP μš”μ²­ 본문에 λ‹΄κΈ΄ 값듀을 μžλ°”κ°μ²΄λ‘œ λ³€ν™˜μ‹œμΌœ, 객체에 μ €μž₯ν•œλ‹€.

@ResponseBody

μžλ°”κ°μ²΄λ₯Ό HTTPμš”μ²­μ˜ λ°”λ””λ‚΄μš©μœΌλ‘œ λ§€ν•‘ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ „μ†‘ν•œλ‹€.
@ResponseBody κ°€ 뢙은 νŒŒλΌλ―Έν„°κ°€ 있으면 HTTPμš”μ²­μ˜ λ―Έλ””μ–΄νƒ€μž…κ³Ό νŒŒλΌλ―Έν„°μ˜ νƒ€μž…μ„ λ¨Όμ € ν™•μΈν•œλ‹€.
즉, @Responsebody μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ httpμš”μ²­ bodyλ₯Ό μžλ°” 객체둜 전달받을 수 μžˆλ‹€.

μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ 응닡 데이터λ₯Ό μ „μ†‘ν•˜κΈ° μœ„ν•΄ @ResponseBody μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μžλ°” 객체λ₯Ό HTTP 응닡 본문의 객체둜 λ³€ν™˜ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ „μ†‘ν•œλ‹€.

@RestController

@Controller + @ResponseBody와 같은 κ°œλ…μ΄λ‹€.
또, @RestControllerκ°€ 있으면 return "λ¬Έμžμ—΄";둜 ν•˜λ©΄ μ›ΉλΈŒλΌμš°μ €μ— λ¬Έμžμ—΄μ΄ 좜λ ₯λœλ‹€.
Flaskμ—μ„œ @app.route(β€˜/’)이 뢙은 ν•¨μˆ˜ 리턴값에 return β€œhello”λ₯Ό μž…λ ₯ν•˜λ©΄ μ›Ή λΈŒλΌμš°μ €μ— β€œhello”가 좜λ ₯λ˜λŠ” 것과 λΉ„μŠ·ν•΄λ³΄μž„.

@RequestParam

@ReuqestParam μ–΄λ…Έν…Œμ΄μ…˜μ€ HttpServletRequest 객체와 같은 역할을 ν•œλ‹€.
HttpServletRequestμ—μ„œλŠ” getParameter() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν–ˆμ§€λ§Œ, @RequestParam을 μ΄μš©ν•΄μ„œ λ°›μ•„μ˜€λŠ” 방법도 μžˆλ‹€.

[ν˜•μ‹]

@RequestParam("κ°€μ Έμ˜¬ λ°μ΄ν„°μ˜ 이름") [λ°μ΄ν„°νƒ€μž…] [κ°€μ Έμ˜¨λ°μ΄ν„°λ₯Ό 담을 λ³€μˆ˜]

LomBok μ‚¬μš© μ‹œ, μ• λ…Έν…Œμ΄μ…˜

@RequiredArgsConstructor

final이 λΆ™κ±°λ‚˜ @NotNull 이 뢙은 ν•„λ“œμ˜ μƒμ„±μžλ₯Ό μžλ™ μƒμ„±ν•΄μ£ΌλŠ” 둬볡 μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‹€.
이 μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄, μƒμ„±μž μ£Όμž… μ½”λ“œλ₯Ό 직접 μž‘μ„±ν•΄μ•Ό ν•˜λŠ”λ° μ’€ λ²ˆκ±°λ‘­λ‹€.

    @Service
    @RequiredArgsConstructor
    public class BannerServiceImpl implements BannerService {
    
        private final BannerRepository bannerRepository;
    
        private final CommonFileUtils commonFileUtils;
        // μƒλž΅

μœ„μ™€ 같이 λ™μž‘ν•˜κ³ , final이 뢙은 ν•„λ“œμ˜ μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ 생성해쀀닀.

참고자료

@RequestParam

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°