1. @Component annotation is the Stereotype πŸ‘©β€πŸ’»

Spring μ—μ„œ IoC μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ μ œμ–΄λ˜λŠ” Bean μ΄λΌλŠ” 것을 λͺ…μ‹œν•˜λŠ” λ°©λ²•μœΌλ‘œλŠ”, @Bean annotation 을 λΆ™μ΄λŠ” 것과 @Component annotation 을 λΆ™μ΄λŠ” 것 두 가지 방법이 μžˆλ‹€.

μš°μ„  @Component λŠ” Class level 에 λ“±λ‘ν•˜λ©°, @Bean 은 Method level 에 λ“±λ‘ν•œλ‹€λŠ” 차이점이 μžˆλ‹€. 즉, @Component λŠ” Java Class 와 1:1 관계λ₯Ό κ°–μ§€λ§Œ @Bean 은 1:n 관계λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

그리고 이 @Component 의 ν•˜μœ„ κ΄€κ³„μ—λŠ” @Controller, @RestController, @Service, @Repository annotation 이 μΆ”κ°€λ‘œ μ‘΄μž¬ν•œλ‹€.

Component Tree

@Component λŠ” μ΄λ“€μ˜ General-purpose Stereotype annotation 인 μ…ˆμ΄λ‹€. λ”°λΌμ„œ @Component κ°€ ν•  수 μžˆλŠ” 것은 ν•˜μœ„ annotation μ—μ„œλ„ κ°€λŠ₯ν•˜λ‹€λŠ” μ˜λ―Έκ°€ λœλ‹€.

1. Controller

Presentation Layerλ₯Ό μœ„ν•΄ νŠΉν™”λœ Component λ‹€. 즉, API λ₯Ό μ»¨νŠΈλ‘€ν•˜κΈ° μœ„ν•΄ νŠΉλ³„ν•œ κΈ°λŠ₯이 μΆ”κ°€λœ Component 인 μ…ˆμ΄λ‹€. Dispatcher servletμœΌλ‘œλΆ€ν„° μš”μ²­μ„ μˆ˜μ‹ ν•˜κ³ , @RequestMapping annotation 을 μ΄μš©ν•΄ λΌμš°νŒ… ν•˜λŠ” 것은 Component 쀑 Controller annotation 으둜 λ“±λ‘λœ Bean μ—μ„œλ§Œ κ°€λŠ₯ν•œ νŠΉν™”λœ κΈ°λŠ₯이닀.

그리고 RESTful API κ°€ 주된 톡신 λ°©μ‹μœΌλ‘œ 자리 μž‘μœΌλ©΄μ„œ Spring Boot μ—μ„œ 많이 μ‚¬μš©ν•˜λŠ” 것이 Controller 에 RESTful API λ₯Ό μœ„ν•œ ν†΅μ‹ μ—μ„œ 많이 μ‚¬μš©λ˜λŠ” @ResponseBody annotation 등을 μžλ™μœΌλ‘œ μΆ”κ°€ν•˜λ„λ‘ μ •μ˜ν•΄λ†“μ€ 것이 @RestControllerλ‹€.

2. Service

Service Layerλ₯Ό μœ„ν•΄ νŠΉν™”λœ Component λ‹€. 즉, μ•±μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 닀루고 μžˆμŒμ„ μ˜λ―Έν•œλ‹€. 이 annotation 도 Database ν˜ΈμΆœμ„ ν•  수 μžˆλ‹€κ³  ν•œλ‹€. 그리고 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 닀루고 μžˆμŒμ„ λͺ…μ‹œν•˜λŠ” 것 외에 μƒμœ„ 레벨인 @Component annotation κ³Ό 큰 μ°¨μ΄λŠ” μ—†λŠ” κ²ƒμœΌλ‘œ ν™•μΈλœλ‹€.

Exception Handling 을 ν•˜λŠ” 일뢀 κΈ°λŠ₯도 μžˆλ‹€κ³ λŠ” ν•˜μ§€λ§Œ 이것은 AOPλ‚˜ λ‹¨μˆœ μ½”λ“œμƒμœΌλ‘œ μΆ©λΆ„νžˆ λŒ€μ²΄κ°€ κ°€λŠ₯ν•œ 뢀뢄이닀. 였히렀 이μͺ½μ΄ μ½”λ“œλ₯Ό κ΄€λ¦¬ν•˜κΈ°κ°€ 더 μˆ˜μ›”ν•˜λ‹€. κ·ΈλŸΌμ—λ„ λ§Žμ€ κ°œλ°œμžκ°€ @Service annotation 으둜 λͺ…μ‹œν•˜λŠ” 것 쀑 κ°€μž₯ 큰 μ΄μœ λŠ” Service λΌλŠ” annotation μ΄λ¦„λ§Œ 보고도 이 Class κ°€ μ•± λ‚΄μ—μ„œ μ–΄λ–€ κΈ°λŠ₯을 ν•˜λŠ” Layer 에 ν•΄λ‹Ήν•˜λŠ”μ§€λ₯Ό 즉각 μ•Œμ•„μ±Œ 수 있기 λ•Œλ¬ΈμœΌλ‘œ 보인닀.

3. Repository

Presentation Layerλ₯Ό μœ„ν•΄ νŠΉν™”λœ Component λ‹€. 이것이 μ„ μ–Έλ˜μ—ˆλ‹€λŠ” 것은 이 Class λŠ” DAO/Persistent/Data access layer μž„μ„ μ˜λ―Έν•œλ‹€. 그리고 이 annotation 만이 κ°–λŠ” νŠΉμ§•μ€ Automatic exception translation 을 μ§€μ›ν•˜λŠ” 것이닀.

μ‰½κ²Œ 말해 low-level exceptionsλ₯Ό high-level Spring exceptions둜 λ°”κΏ” Database 와 ν†΅μ‹ ν•˜λ©° λ°œμƒν•  수 μžˆλŠ” λ‹€μ–‘ν•œ μ—λŸ¬λ₯Ό Spring μ΄μ΄ν•΄ν•˜κ³  관리할 수 있게 ν•΄μ€€λ‹€.




Reference

  1. Prasad Thilakarathne. β€œWhat is the difference between @Component, @Repository, @Service, and @Controller annotations in Spring?.” Medium. Jul. 04, 2020, About Component Annotation.