[Spring] @Controller VS @RestController

μ‘°λ―Όκ²½Β·2025λ…„ 3μ›” 13일
0

Spring

λͺ©λ‘ 보기
10/13

πŸ’‘ κ°œλ°œμ—μ„œ μš°μ„ μˆœμœ„λŠ” 항상 μžμ„Ένžˆ μ„ μ–Έλœκ²ƒμ΄ μš°μ„ μˆœμœ„κ°€ λ†’λ‹€.



βœ”οΈ @Controller


πŸ“Œ μ£Όμš” νŠΉμ§•

βœ… Spring MVCμ—μ„œ 컨트둀러 역할을 ν•˜λŠ” ν΄λž˜μŠ€μž„μ„ λͺ…μ‹œν•œλ‹€.

βœ… λ·°(View)와 μ—°κ²°λ˜λŠ” 컨트둀러둜 μ‚¬μš©λœλ‹€.

βœ… @Componentκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ–΄ Spring Bean으둜 λ“±λ‘λ˜λ©°, μ‹±κΈ€ν†€μœΌλ‘œ κ΄€λ¦¬λœλ‹€.

βœ… 주둜 HTML을 λ°˜ν™˜ν•˜λŠ” 경우 μ‚¬μš©λœλ‹€.


πŸ“Œ μ–΄λ…Έν…Œμ΄μ…˜ μ„€λͺ…

πŸ’‘ μ•„λž˜μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ— λŒ€ν•œ μžμ„Έν•œ μ„€λͺ… πŸ‘‰ [Spring] Annotation

  • @Target(ElementType.Type)

    • Class, Interface, Annotation, Enum, Record Declaration(Java16) 에 μ μš©ν•  수 μžˆλ‹€.
  • @Retention(RetentionPolicy.RUNTIME)

    • 클래슀 파일(.class)에 μ €μž₯되고, JVM에 μ˜ν•΄ λŸ°νƒ€μž„ μ‹œμ μ— 읽을 수 μžˆλ‹€.
  • @Document

    • Javadoc λ“±μ˜ λ¬Έμ„œν™” 도ꡬ에 μ˜ν•΄ λ¬Έμ„œν™”λ˜μ–΄μ•Ό 함을 λ‚˜νƒ€λ‚Έλ‹€.
  • @Component

    • Spring Bean에 λ“±λ‘ν•œλ‹€.

    • μ‹±κΈ€ν†€μœΌλ‘œ κ΄€λ¦¬λœλ‹€.

    πŸ‘€ Q. 싱글톀이 λ¬΄μ—‡μΈκ°€μš”?

    πŸ’¬ A. 싱글톀은 객체λ₯Ό ν•˜λ‚˜λ§Œ μƒμ„±ν•˜μ—¬ μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό κ³΅μœ ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것을 의미gν•œλ‹€. νŠΉμ • 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μ—¬λŸ¬κ°œ μƒμ„±λ˜μ§€ μ•Šλ„λ‘ ν•˜μ—¬ μžμ›μ˜ λ‚­λΉ„λ₯Ό λ°©μ§€ν•˜κ³ , μΈμŠ€ν„΄μŠ€λ₯Ό κ³΅μœ ν•¨μœΌλ‘œμ¨ μƒνƒœλ₯Ό μΌκ΄€λ˜κ²Œ μœ μ§€ν•˜κΈ° μœ„ν•¨μ΄λ‹€. ν•˜μ§€λ§Œ, 곡유 λ³€μˆ˜ μ‚¬μš©μ„ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.




βœ”οΈ @RestController


πŸ“Œ μ£Όμš” νŠΉμ§•

βœ… @Controller에 @ResponseBodyκ°€ κ²°ν•©λœ μ–΄λ…Έν…Œμ΄μ…˜

βœ… @RestControllerλŠ” @Controller와 달리 각 λ©”μ„œλ“œλ§ˆλ‹€ @ResponseBodyλ₯Ό μΆ”κ°€ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.


πŸ“Œ μ–΄λ…Έν…Œμ΄μ…˜ μ„€λͺ…

  • @Target(ElementType.Type)

    • Class, Interface, Annotation, Enum, Record Declaration(Java16) 에 μ μš©ν•  수 μžˆλ‹€.
  • @Retention(RetentionPolicy.RUNTIME)

    • 클래슀 파일(.class)에 μ €μž₯되고, JVM에 μ˜ν•΄ λŸ°νƒ€μž„ μ‹œμ μ— 읽을 수 μžˆλ‹€.
  • @Document

    • Javadoc λ“±μ˜ λ¬Έμ„œν™” 도ꡬ에 μ˜ν•΄ λ¬Έμ„œν™”λ˜μ–΄μ•Ό 함을 λ‚˜νƒ€λ‚Έλ‹€.
  • @Controller

    • Spring의 컨트둀러 역할을 μˆ˜ν–‰
  • @ResponseBody

    • λͺ¨λ“  λ©”μ„œλ“œμ˜ λ°˜ν™˜κ°’μ„ HTTP 응닡 바디에 직접 μ‚½μž…




βœ”οΈ @ResponseBody


πŸ“Œ μ£Όμš” νŠΉμ§•

βœ… 컨트둀러의 λ°˜ν™˜ 값을 λ·°κ°€ μ•„λ‹ˆλΌ, HTTP 응닡 바디에 직접 μ‚½μž…ν•œλ‹€.

βœ… @Controllerμ—μ„œ νŠΉμ • λ©”μ„œλ“œλ§Œ REST API 응닡을 ν•˜κ²Œ ν•˜κ³  μ‹Άλ‹€λ©΄, ν•΄λ‹Ή λ©”μ„œλ“œμ— @ResponseBodyλ₯Ό μΆ”κ°€ν•˜λ©΄ λœλ‹€.


πŸ“Œ μ–΄λ…Έν…Œμ΄μ…˜ μ„€λͺ…

  • @Target{ElementType.TYPE, ElementType.METHOD}

    • class λ ˆλ²¨μ—λ„ , Method λ ˆλ²¨μ—λ„ 적용 κ°€λŠ₯ν•˜λ‹€.

    ❓ @Controller에 λ™μΌν•œ Target이 μ„ μ–Έλ˜μ–΄ μžˆλŠ”λ° μ™œ μ€‘λ³΅μœΌλ‘œ 선언이 λ˜μ–΄μžˆλ‚˜μš”?

    πŸ’‘ @ResponseBodyλŠ” @Target{ElementType.TYPE, ElementType.METHOD} μ΄μ§€λ§Œ, @RestController은 @Target(ElementType.TYPE)이기 λ•Œλ¬Έμ— 더 μžμ„Έν•˜κ²Œ μ„ μ–Έλœ @RestController의 @Target(ElementType.TYPE)이 μ μš©λœλ‹€. λ”°λΌμ„œ TYPE λ²”μœ„μ—λ§Œ @ResponseBodyκ°€ μ μš©λœλ‹€.

    즉, @RestcontrollerλŠ” TYPE인 Class Levelμ—λ§Œ μ μš©ν•  수 μžˆλ‹€!

    βœ”οΈ 이 λ•Œ, "더 μžμ„Ένžˆ μ„ μ–Έλœ 것이 μš°μ„ μˆœμœ„κ°€ λ†’λ‹€"μ—μ„œ, @Target{ElementType.TYPE, ElementType.METHOD}κ°€ @Target(ElementType.TYPE)보닀 더 포괄적인 λ²”μœ„λ₯Ό κ°€μ§€λŠ” κ²ƒμ²˜λŸΌ 보인닀. ν•˜μ§€λ§Œ μ—¬κΈ°μ„œ "더 μžμ„Ένžˆ μ„ μ–Έλœ 것이 μš°μ„ μˆœμœ„κ°€ λ†’λ‹€" λŠ” μ˜λ―ΈλŠ” 적용 λ²”μœ„κ°€ 더 쒁은 것(더 ꡬ체적인 μ œν•œ)이 μš°μ„  μ μš©λœλ‹€λŠ” 것이닀.

0개의 λŒ“κΈ€