public @interface Component - 201211211yj/Spring-Boot-Start GitHub Wiki

public @interface Component
์ฃผ์„์ด ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๊ฐ€ "์ปดํฌ๋„ŒํŠธ"์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋Š” ์ฃผ์„ ๊ธฐ๋ฐ˜ ๊ตฌ์„ฑ ๋ฐ ํด๋ž˜์Šค ๊ฒฝ๋กœ ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•  ๋•Œ ์ž๋™ ๊ฐ์ง€์˜ ํ›„๋ณด๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ํด๋ž˜์Šค ์ˆ˜์ค€ ์ฃผ์„์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ˆ˜ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. (@Repository ์ฃผ์„ ๋˜๋Š” AspectJ์˜ @Aspect ์ฃผ์„.)


public @interface Repository
์–ด๋…ธํ…Œ์ด์…˜์ด์žˆ๋Š” ํด๋ž˜์Šค๋Š” ์›๋ž˜ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„ (Evans, 2003)์— ์˜ํ•ด "๊ฐœ์ฒด ์ฝœ๋ ‰์…˜์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€, ๊ฒ€์ƒ‰ ๋ฐ ๊ฒ€์ƒ‰ ๋™์ž‘์„ ์บก์Аํ™”ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜"์œผ๋กœ ์ •์˜ ๋œ "Repository"์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. "Data Access Object"์™€ ๊ฐ™์€ ์ „ํ†ต์ ์ธ Java EE ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ํŒ€๋„ ์ด ์Šคํ…Œ๋ ˆ์˜ค ํƒ€์ž…์„ DAO ํด๋ž˜์Šค์— ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒํ•˜๊ธฐ ์ „์— Data Access Object์™€ DDD ์Šคํƒ€์ผ repository์˜ ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๋„๋ก ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฃผ์„์€ ๋ฒ”์šฉ ๊ณ ์ • stereotype์ด๋ฉฐ ํŒ€์€ ์˜๋ฏธ๋ฅผ ์ขํžˆ๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋Š” PersistenceExceptionTranslationPostProcessor์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๋•Œ Spring DataAccessException ๋ณ€ํ™˜์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋Š” tooling, aspects ๋“ฑ์„ ๋ชฉ์ ์œผ๋กœ ์ „์ฒด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์•„ํ‚คํ…์ฒ˜์—์„œ์˜ ์—ญํ• ์— ๋Œ€ํ•ด์„œ๋„ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.
Spring 2.5๋ถ€ํ„ฐ ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ @Component์˜ ํŠน์ • ์—ญํ• ์„ํ•˜์—ฌ ํด๋ž˜์Šค ๊ฒฝ๋กœ ์Šค์บ”์„ ํ†ตํ•ด ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ž๋™ ๊ฐ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • public class PersistenceExceptionTranslationPostProcessor extends AbstractBeanFactoryAwareAdvisingPostProcessor
    ์ง€์†์ ์ธ ์˜ˆ์™ธ ๋ณ€ํ™˜์„ Spring์˜ @Repository ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ํ‘œ์‹œ๋œ Bean์— ์ž๋™์œผ๋กœ ์ ์šฉํ•˜์—ฌ ๋…ธ์ถœ ๋œ ํ”„๋ก์‹œ (๊ธฐ์กด AOP ํ”„๋ก์‹œ ๋˜๋Š” ๋ชจ๋“  ๋Œ€์ƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ ๋œ ํ”„๋ก์‹œ)์— ํ•ด๋‹น PersistenceExceptionTranslationAdvisor๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” Bean ํฌ์ŠคํŠธ ํ”„๋กœ์„ธ์„œ. ๋„ค์ดํ‹ฐ๋ธŒ ๋ฆฌ์†Œ์Šค ์˜ˆ์™ธ๋ฅผ Spring์˜ DataAccessException ๊ณ„์ธต์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. PersistenceExceptionTranslator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” Bean์„ ์ž๋™ ๊ฐ์ง€ํ•˜๋ฉฐ, ์ดํ›„ ํ›„๋ณด ์˜ˆ์™ธ๋ฅผ ๋ณ€ํ™˜ํ•˜๋„๋ก ์š”์ฒญ๋ฉ๋‹ˆ๋‹ค.
    ๋ชจ๋“  Spring์˜ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์ž์› ํŒฉํ† ๋ฆฌ (์˜ˆ : LocalContainerEntityManagerFactoryBean)๋Š” PersistenceExceptionTranslator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฆ‰์‹œ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ, ์ž๋™ ์˜ˆ์™ธ ๋ณ€ํ™˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์€ @Repository ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์˜ํ–ฅ์„๋ฐ›๋Š” ๋ชจ๋“  Bean (์˜ˆ : Repositories ๋˜๋Š” DAO)์„ ํ‘œ์‹œํ•˜๊ณ  ์ด ํฌ์ŠคํŠธ ํ”„๋กœ์„ธ์„œ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์—์„œ Bean์œผ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • public abstract class DataAccessException extends NestedRuntimeException
    Expert One-On-One J2EE ์„ค๊ณ„ ๋ฐ ๊ฐœ๋ฐœ(์ฑ… ์ด๋ฆ„)์—์„œ ๋…ผ์˜ ๋œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์˜ˆ์™ธ ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๊ทผ๋ณธ. (์ด ํŒจํ‚ค์ง€์˜ ๋™๊ธฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•ด๋‹น ์ฑ…์˜ 9 ์žฅ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.) ์ด ์˜ˆ์™ธ ๊ณ„์ธต์€ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๊ฐ€ ์‚ฌ์šฉ์ค‘์ธ ํŠน์ • ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค API (์˜ˆ : JDBC)์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋ชฐ๋ผ๋„ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜ ์ข…๋ฅ˜๋ฅผ ์ฐพ์•„์„œ ์ฒ˜๋ฆฌํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ JDBC๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ชฐ๋ผ๋„ Optimistic Locking ์‹คํŒจ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ด ํด๋ž˜์Šค๋Š” ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ์ด๋ฏ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ์น˜๋ช…์ ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ๊ฒฝ์šฐ (์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ) ์‚ฌ์šฉ์ž ์ฝ”๋“œ๊ฐ€ ํด๋ž˜์Šค ๋˜๋Š” ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ์žก์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.


public @interface Service
์ฃผ์„์ด ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋Š” "Service"์ด๋ฉฐ ์›๋ž˜ DDD(๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋””์ž์ธ (Evans, 2003))์— ์˜ํ•ด "์บก์Аํ™” ๋œ ์ƒํƒœ๊ฐ€์—†๋Š” ๋ชจ๋ธ์—์„œ ๋…๋ฆฝ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ๊ณต๋˜๋Š” ์ž‘์—…"์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.
ํด๋ž˜์Šค๊ฐ€ "๋น„์ฆˆ๋‹ˆ์Šค ์„œ๋น„์Šค ์™ธ๊ด€"(ํ•ต์‹ฌ J2EE ํŒจํ„ด ์˜๋ฏธ) ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์„์€ ๋ฒ”์šฉ ๊ณ ์ • ๊ด€๋…์ด๋ฉฐ ๊ฐœ๋ณ„ ํŒ€์€ ์˜๋ฏธ๋ฅผ ์ขํžˆ๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ฃผ์„์€ @Component์˜ ์ „๋ฌธํ™” ์—ญํ• ์„ํ•˜์—ฌ ํด๋ž˜์Šค ๊ฒฝ๋กœ ์Šค์บ”์„ ํ†ตํ•ด ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ž๋™ ๊ฐ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


public @interface Controller
์ฃผ์„์ด ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๊ฐ€ "์ปจํŠธ๋กค๋Ÿฌ"(์˜ˆ : ์›น ์ปจํŠธ๋กค๋Ÿฌ)์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
์ด ์ฃผ์„์€ @Component์˜ ์ „๋ฌธํ™” ์—ญํ• ์„ํ•˜์—ฌ ํด๋ž˜์Šค ๊ฒฝ๋กœ ์Šค์บ”์„ ํ†ตํ•ด ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ž๋™ ๊ฐ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ RequestMapping ์ฃผ์„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์–ด๋…ธํ…Œ์ด์…˜์ด์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์†Œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.