μ΅κ·Ό Claude AI Proλ₯Ό ꡬ맀νλ©΄μ AIμ λν κ΄μ¬μ΄ λμ± λ§μμ‘λ€. κΈ°μ‘΄μλ AIλ₯Ό κ·Έλ₯ μ νΈνμ§ μμμ§λ§, μΈμμ΄ λμκ°λ λͺ¨μ΅μ 보면 AIλ₯Ό μ¬μ©νμ§ μμ μ μλ€. κ·Έλμ μ΄λ² κΈ°νμ λ©΄μ μ€λΉκ²Έ νμ΅μΌλ‘ Claude AIλ₯Ό μ κ·Ήμ μΌλ‘ νμ©ν΄λ³΄κΈ°λ‘ νλ€.
κ°μ₯ λ¨Όμ ν΄λ³Έ κ²μ μ€νλ§μ λν κΈ°λ³Έ μ§μ νμ΅μ΄ μλμ΄μλμ§ νμΈνλ κ²!
κ°λ¨νκ² ν둬ννΈλ "μ€νλ§μ λν κΈ°μ΄μ μΈ μ§μμ νμ΅νλλ°, μ΄λ₯Ό ν
μ€νΈνκ³ μΆμ΄. λκ° ν λ¬Έμ μ© λ΄λ©΄ λ΄κ° κ·Έκ±Έ λ΅νλ μμΌλ‘ μ§νν΄λ³΄μ"λ‘ μμνλ€.
첫 λ²μ§Έ λ¬Έμ :
μ€νλ§μ ν΅μ¬ κ°λ
μ€ νλμΈ IoC(Inversion of Control)μ DI(Dependency Injection)μ κ°λ
μ λν΄ μ€λͺ
ν΄μ£ΌμΈμ. κ·Έλ¦¬κ³ μ€νλ§μμ μμ‘΄μ± μ£Όμ
μ νλ λ°©λ²μλ μ΄λ€ κ²λ€μ΄ μλμ?
IoCλ μ μ΄μ μμ μ΄λΌλ λ»μΌλ‘ κ°μ²΄μ μμ±κ³Ό μλͺ
μ£ΌκΈ°μ κ΄λ¦¬λ₯Ό κ°λ°μκ° μλ μΈλΆμμ λ΄λΉνλ κ°λ
μ
λλ€. μ΄λ¬ν νΉμ§μ κ°μ§ μ€νλ§μ IoC 컨ν
μ΄λλ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μ€νλ§ λΉμΌλ‘ κ΄λ¦¬ν©λλ€.
DIλ μμ‘΄μ± μ£Όμ
μΌλ‘ κ°μ²΄κ° μμ±λ λ νμν μμ‘΄μ±λ€μ κ°μ²΄ λ΄λΆμμ μμ±νμ§ μκ³ , μΈλΆμμ μ£Όμ
λ°μ κ°μ²΄λ₯Ό μμ±νλ κ°λ
μ
λλ€. μ€νλ§μμ μ΄ κ°λ
μ IoC 컨ν
μ΄λλ₯Ό ν΅ν΄ μμ‘΄μ±μ ν΄λΉνλ λΉμ μ°Ύμ μ£Όμ
ν΄μ£Όλ ννλ‘ λμν©λλ€.
μμ‘΄μ±μ μ£Όμ
νλ λ°©λ²μλ
1. `@Autowired` μ΄λ
Έν
μ΄μ
μ νλμ μ μ©νμ¬ μ£Όμ
νλ λ°©λ² (νλ μ£Όμ
)
2. μμ±μλ₯Ό ν΅ν΄ μ£Όμ
νλ λ°©λ² (μμ±μ μ£Όμ
)
3. `@Autowired` μ΄λ
Έν
μ΄μ
μ Setterμ μ μ©νμ¬ μ£Όμ
νλ λ°©λ² (Setter μ£Όμ
)
μ΄λ κ² μΈ κ°μ§κ° μμ΅λλ€.
λ λ²μ§Έ λ¬Έμ :
μ€νλ§ λΉμ μλͺ
μ£ΌκΈ°(Lifecycle)μ λν΄ μ€λͺ
ν΄μ£ΌμΈμ. λΉμ΄ μμ±λκ³ μλ©Έλ λκΉμ§ μ΄λ€ κ³Όμ μ κ±°μΉλμ? κ·Έλ¦¬κ³ κ°λ°μκ° λΉμ μλͺ
μ£ΌκΈ°μ κ°μ
ν μ μλ λ°©λ²μλ 무μμ΄ μμκΉμ?
μ€νλ§ λΉμ μλͺ
μ£ΌκΈ°λ 5λ¨κ³λ‘ μ΄λ€μ§λλ€. κ° λ¨κ³λ `μ€νλ§ λΉ μμ±` -> `μμ‘΄μ± μ£Όμ
` -> `μ΄κΈ°ν μ½λ°±` -> `λΉ μ¬μ©` -> `μλ©Έ μ μ½λ°±` μ
λλ€.
μ€νλ§ λΉ μμ±μ μ€νλ§ IoC 컨ν
μ΄λμμ μμ±λμ΄μΌ ν κ°μ²΄λ€μ΄ μ€νλ§ λΉμΌλ‘ μμ±λλ κ³Όμ μ΄λ©°, μμ‘΄μ± μ£Όμ
μ μ΄λ¬ν λΉ μμ± κ³Όμ μμ νμν μμ‘΄μ±λ€μ΄ μ£Όμ
λλ κ³Όμ μ
λλ€. κ·Έλ¦¬κ³ μ΄κΈ°ν μ½λ°±μ μ€νλ§ λΉμ΄ μμ±λ ν μ΄κΈ°ν λ©μλλ₯Ό νΈμΆνλ κ³Όμ μ
λλ€. μ΄λ, μ΄κΈ°ν λ©μλλ `@PostConstruct`λ `InitializingBean` μΈν°νμ΄μ€ ꡬν, `@Bean(initMethod="init", destroyMethod="close")` μ΄λ
Έν
μ΄μ
νμ©μ ν΅ν΄ μμ±ν μ μμ΅λλ€.
μ΄ ν, λΉμ΄ μ¬μ©λκ³ μλ²κ° μ’
λ£λκ±°λ λ μ΄μ λΉμ μ¬μ©νμ§ μμ λ λΉμ μ κ±°νκΈ° μ μ μλ©Έ μ λ©μλλ₯Ό νΈμΆνκ³ λΉμ΄ μ΅μ’
μ μΌλ‘ μλ©Έλ©λλ€.
μλ©Έ μ λ©μλ λν, `@PreDestroy`, `DisposableBean`, `@Bean(initMethod="init", destroyMethod="close")`λ₯Ό ν΅ν΄ μμ±ν μ μμ΅λλ€.
μΈ λ²μ§Έ λ¬Έμ :
μ€νλ§μμ `@Component`, `@Service`, `@Repository`, `@Controller` μ΄λ
Έν
μ΄μ
μ μ°¨μ΄μ μ 무μμΈκ°μ? κ·Έλ¦¬κ³ μ΄λ€μ μ ꡬλΆν΄μ μ¬μ©ν κΉμ?
κ° μ΄λ
Έν
μ΄μ
μ κΈ°λ₯μ μΌλ‘ λΉμ·ν©λλ€. λ΄λΆμ μΌλ‘ `@Component`λ₯Ό κ°κ³ μκΈ° λλ¬Έμ
λλ€. λ€λ§, μν μ ꡬλΆνλ€λ μ μμ μ°¨μ΄κ° μμ΅λλ€.
- `@Repository`λ μμμ± κ³μΈ΅μμ νμ©νλ©°, λ°μ΄ν° μ κ·Ό μμΈλ₯Ό μ€νλ§μ `DataAccessException`μΌλ‘ μλ λ³ν ν΄μ€λλ€.
- `@Controller`λ μΈλΆμ μμ² λ° μλ΅μ μ²λ¦¬νλ νλ μ ν
μ΄μ
κ³μΈ΅μμ νμ©ν©λλ€.
- `@Service`λ λΉμ¦λμ€ λ‘μ§μ μ²λ¦¬νλ μ ν리μΌμ΄μ
κ³μΈ΅μμ νμ©ν©λλ€.
- `@Component`λ μμ κ³μΈ΅μΌλ‘ λΆλ₯νκΈ° μ΄λ €μ΄ μΌλ°μ μΈ κ°μ²΄λ€μ ν΄λΉν©λλ€.
μ¬κΈ°μ μ μ μλ― κ°μ₯ ν° μ°¨μ΄μ μ μλ―Έλ‘ μ μΈ μν ꡬλΆμ
λλ€.
λ€ λ²μ§Έ λ¬Έμ :
`@Autowired`λ₯Ό μ¬μ©ν λ κ°μ νμ
μ λΉμ΄ μ¬λ¬ κ° μμΌλ©΄ μ΄λ»κ² λ κΉμ? κ·Έλ¦¬κ³ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μλ 무μμ΄ μλμ?
κ°μ νμ
μ λΉμ΄ μ¬λ¬ κ° μμΌλ©΄ μ€νλ§μ μ΄λ€ λΉμ μ£Όμ
ν΄μΌ ν μ§ λͺ°λΌ `NoUniqueBeanDefinitionException` μμΈκ° λ°μν©λλ€. μ΄λ° κ²½μ° `@Primary` νΉμ `@Qualifier("λΉμ΄λ¦")` μ΄λ
Έν
μ΄μ
, νλλͺ
νΉμ νλΌλ―Έν°λͺ
μ λΉ μ΄λ¦κ³Ό λκ°μ΄ μ§μ νκΈ°, List νΉμ Mapμ ν΅ν΄ λͺ¨λ λΉμ λ°λ λ°©λ²μΌλ‘ ν΄κ²°μ΄ κ°λ₯ν©λλ€.
`@Primary` μ΄λ
Έν
μ΄μ
μ ν΄λΉ μ΄λ
Έν
μ΄μ
μ΄ λΆμ κ°μ²΄λ₯Ό μ°μ μ μΌλ‘ μ¬μ©νκ² λ€κ³ μ§μ νλ κ²μ΄κ³ , `@Qualifier` μ΄λ
Έν
μ΄μ
μ νΉμ λΉμ λͺ
μμ μΌλ‘ μ§μ νμ¬ μ£Όμ
μ λ°κ² λ€λ μλ―Έμ
λλ€.
νλλͺ
, νλΌλ―Έν°λͺ
μ λΉ μ΄λ¦μΌλ‘ μ§μ νλ©΄ ν΄λΉ μ΄λ¦κ³Ό λκ°μ λΉμ μ°Ύμμ μ£Όμ
ν΄μ£Όκ³ , μ£Όμ
λ°κ³ μ νλ νλλ₯Ό List λλ MapμΌλ‘ μ μΈ μ ν΄λΉ νμ
κ³Ό κ°μ λΉλ€μ λͺ¨λ μ£Όμ
ν΄μ€λλ€.
λ€μ― λ²μ§Έ λ¬Έμ :
μ€νλ§μμ νΈλμμ
(@Transactional)μ μ΄λ»κ² λμνλμ? κ·Έλ¦¬κ³ @Transactionalμ μ¬μ©ν λ μ£Όμν΄μΌ ν μ μ 무μμΈκ°μ?
μ€νλ§μμ `@Transactinal` μ΄λ
Έν
μ΄μ
μ μ€νλ§ AOPλ‘ λμν©λλ€. μ€νλ§μ΄ `@Transactinal` λΆμ΄μλ λ©μλ λ° ν΄λμ€κ° μμΌλ©΄ μ΄λ₯Ό νλ‘μ κ°μ²΄λ‘ λ§λ€λ©΄μ νΈλμμ
μ μ¬μ©νλ μ½λλ€μ μ΄λ
Έν
μ΄μ
μ΄ λΆμ λ©μλμ μΆκ°ν©λλ€. μ΄λ, μ£Όμν μ μ private λ©μλμλ μ μ©μ΄ μλλ μ κ³Ό νΈλμμ
μ΄ μλ μΈλΆ λ©μλμμ λ΄λΆ λ©μλ νΈμΆ μ νΈλμμ
μ΄ μ μ©λμ§ μλλ€λ μ μ
λλ€. λν, μ²΄ν¬ μμΈλ κΈ°λ³Έμ μΌλ‘ λ‘€λ°± λμ§ μλλ€λ μ μ΄ μμ΅λλ€.
μ¬μ― λ²μ§Έ λ¬Έμ :
μ€νλ§μμ νν°(Filter)μ μΈν°μ
ν°(Interceptor)μ μ°¨μ΄μ μ 무μμΈκ°μ? κ°κ° μ΄λ€ μν©μμ μ¬μ©νλμ?
νν°μ μΈν°μ
ν°μ κ°μ₯ ν° μ°¨μ΄μ μ μ΄λ μ§μ μμ μνλλλ?μ μ°¨μ΄κ° μμ΅λλ€.
νν°μ κ²½μ°μλ Spring DispatchServlet μ λ¨μΈ ν°μΊ£ μΈ‘μμ μνλλ©°, μΈν°μ
ν°λ Spring DispatchServlet λ· λ¨μΈ μ€νλ§ νκ²½ λ΄μμ μνλ©λλ€. μ΄λ¬ν μ°¨μ΄λ‘ μΈν°μ
ν°λ μ€νλ§ λΉ μ£Όμ
μ΄ κ°λ₯νλ, νν°λ μ€μ μ΄ νμν©λλ€.
μ΄λ¬ν μ°¨μ΄λ‘ μΈν΄ νν°μ κ²½μ°μλ μ€νλ§ μν리ν°μ κ°μ λΌμ΄λΈλ¬λ¦¬μ μΈμ¦/μΈκ°, XSS λ°©μ΄λ μμ²/μλ΅ λ‘κΉ
λ±μ νμ©λ©λλ€. μΈν°μ
ν°λ μΈλΆμ μΈ κΆν 체ν¬, λ‘κ·ΈμΈ μ²΄ν¬μ κ°μ κ²λ€μ νμ©λ©λλ€.
μΌκ³± λ²μ§Έ λ¬Έμ :
λ§μ§λ§ λ¬Έμ μ
λλ€! `@Configuration`κ³Ό `@Bean`μ μν μ 무μμ΄κ³ , μ μ¬μ©νλμ?
`@Configuration`κ³Ό `@Bean` μ μ€νλ§ Beanμ λ±λ‘νκΈ° μν λ°©λ²μ
λλ€.
Configuration μ΄λ
Έν
μ΄μ
μ ν΅ν΄μ μ¬μ©μκ° μ§μ μ€νλ§ λΉμ λ±λ‘νλ ν΄λμ€λ₯Ό μ μν μ μλλ°μ. λ΄λΆμ μΌλ‘ Bean μ΄λ
Έν
μ΄μ
μ μ¬μ©ν΄μ μλ‘μ΄ μ€νλ§ λΉμ λ±λ‘ν μ μμ΅λλ€. μ€νλ§μμλ Configuration μ΄λ
Έν
μ΄μ
μ΄ λΆμ ν΄λΉ ν΄λμ€λ₯Ό νλ‘μ κ°μ²΄λ‘ λ§λ€μ΄ Bean μ΄λ
Έν
μ΄μ
λ©μλ κ° νΈμΆ μ μ±κΈν€μ 보μ₯ν΄μ€λλ€.
μ΄λ₯Ό μ¬μ©νλ κ°μ₯ ν° μ΄μ λ μΈλΆ λΌμ΄λΈλ¬λ¦¬μ κ²½μ° μ€νλ§ λΉμΌλ‘ μλ λ±λ‘λμ§ μλ κ²½μ°κ° μκΈ° λλ¬Έμ μ΄λ₯Ό ν΅ν΄ μΈλΆ λΌμ΄λΈλ¬λ¦¬μ κ°μ²΄λ₯Ό λΉμΌλ‘ λ±λ‘νκ³ μ ν λ μ¬μ©ν©λλ€. μ΄μΈμλ 볡μ‘ν λΉ μ€μ μ΄ νμνκ±°λ νκ²½λ³λ‘ λ€λ₯Έ λΉμ λ±λ‘ν λ νμ©ν©λλ€.
μ¬κΈ°κΉμ§κ° Claude AIκ° λ΄μ€ λ¬Έμ μλ€. μ€νλ§μ μ²μ μ νλ©΄ μκ²λλ μ©μ΄λ€μ΄μ§λ§ μκ°λ³΄λ€ λͺ
ννκ² λ΅νκΈ°κ° μ΄λ €μ λ€. λ§μ λΆλΆλ€μ κΉλ¨Ήκ³ μ§λ΄κ³ μμꡬλ. ν΄λΉ μ¨μ΄λΈλ₯Ό ν μ°¨λ‘ μ§λ΄κ³ λλ μ’ λ λ§μ κ²λ€μ μλν΄λ³Ό μ μμ κ² κ°λ€κ³ μκ°νλ€. μ¬κΈ°μλ ν΄λΉ λ¬Έμ λ€μ κΈ°λ°μΌλ‘ ν μ€μ΅ λ¬Έμ , λμ± κΉμ μ€νλ§ μ§μ λ¬Έμ νΉμ ν΄λΉ μ§λ¬Έμμμ 꼬리 μ§λ¬Έ λ±μ΄ μμ κ±° κ°λ€.
μ΄μΈμλ λ€μν λ°©μμΌλ‘ AIλ₯Ό νμ©νλ μκ°μ κ°μ Έλ΄μΌκ² λ€.
'κ°λ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| λ¨μΌ μΈμ€ν΄μ€μμ EBSκ° μλλ°, S3λ₯Ό μ μ¬μ©ν΄μΌ ν κΉ? (1) | 2026.01.18 |
|---|---|
| κ³΅κ° μΈλ±μ€ (0) | 2025.12.07 |
| μμ ν΄μ μ€κ³ (0) | 2025.11.17 |
| ν λΉμ ν΄λ¦° μ€νλ§ κ°μ° μμ½ (0) | 2025.11.01 |
| μ°μμ½ 2025λ₯Ό ν΅ν κ°μΈμ νκ³ (6) | 2025.10.29 |