DevLog ๐ถ
[Spring] IoC Container์ ์๋ช ์ฃผ๊ธฐ์ DI, ๋น ์ค์ฝํ, ๋น๊ณผ ์คํํฑ ๋ฉ์๋ ๋ณธ๋ฌธ
[Spring] IoC Container์ ์๋ช ์ฃผ๊ธฐ์ DI, ๋น ์ค์ฝํ, ๋น๊ณผ ์คํํฑ ๋ฉ์๋
dolmeng2 2023. 5. 7. 18:19๐ฑ ๋ค์ด๊ฐ๊ธฐ ์
์คํฐ๋์์ ๋ฐํ ์๋ฃ๋ก ์ค๋นํ๋ ๋ด์ฉ์ธ๋ฐ, ๋ธ๋ก๊ทธ์๋ ์ฎ๊ฒจ๋๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ์ ๋ฆฌํ๋ ๊ธ ๐
ํ๋กค๋ก๊ทธ ๋ก๋๋งต์ ํค์๋ ์์ฃผ๋ก ์ ๋ฆฌํ์์ต๋๋ค!
๐ฑ DI (์์กด๊ด๊ณ ์ฃผ์ )
โ๏ธ ์์กดํ๋ค?
A๊ฐ B๋ฅผ ์ฌ์ฉํ๊ณ , B๋ฅผ ๋ณ๊ฒฝํ๋ฉด A์ ์ํฅ์ ๋ผ์น๋ ๊ด๊ณ.
์์กด๊ด๊ณ ์ฃผ์ ์ ๋ค์ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ์์ ์ ์๋ฏธํ๋ค.
- ํด๋์ค ๋ชจ๋ธ์ด๋ ์ฝ๋์๋ ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๊ฐ ๋๋ฌ๋์ง ์๋๋ก, ์ธํฐํ์ด์ค๋ง ์์กดํด์ผ ํ๋ค.
- ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๋ ์ปจํ ์ด๋๋ ํฉํฐ๋ฆฌ์ ๊ฐ์ ์ 3์ ์กด์ฌ (ex. IoC container)๊ฐ ๊ฒฐ์ ํ๋ค.
- ์์กด๊ด๊ณ๋ ์ฌ์ฉํ ์ค๋ธ์ ํธ์ ๋ํ ๋ ํผ๋ฐ์ค๋ฅผ ์ธ๋ถ์์ ์ ๊ณตํด์ค์ผ๋ก์ ๋ง๋ค์ด์ง๋ค.
โ๏ธ DI๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌด์์ด ์ข์๊ฐ?
- ๊ฐ์ฒด๊ฐ์ ๊ฒฐํฉ๋ ๊ฐ์ → ์ฌ์ฌ์ฉ์ฑ, ์ ์ง๋ณด์์ฑ ์ฆ๊ฐ
- ์ธ๋ถ์์ ์ฃผ์ ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ ์ ์ฉ์ดํจ
- ๊ฐ๋ ์ฑ ์ฆ๊ฐ
๐ฑ ์์กด์ฑ์ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์๋ ๋ฌด์์ด ์๋๊ฐ?
์์กด ๊ด๊ณ ์ฃผ์ ์ ํฌ๊ฒ 4๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋๋์ด์ง๋ค.
โญ๏ธ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ ์คํ๋ง ๋น์ด์ด์ผ๋ง ์์กด๊ด๊ณ ์ฃผ์ ์ด ๋์ํ๋ค. (์ปดํ์ผ ์์ ์ ํด๋นํ๋ ํ์ ์ด ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค)
๐ฌ ์์ฑ์ ์ฃผ์
์์ฑ์๋ฅผ ํตํด์ ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์ ๋ฐ๋ ๋ฐฉ๋ฒ. ์์ฑ์ ํธ์ถ ์์ ์ ๋ฑ 1๋ฒ๋ง ํธ์ถ๋๋ค.
๋ง์ฝ ํ๋๋ฅผ private final๋ก ์ ์ธํ๋ค๋ฉด (์ผ๋ฐ์ ) ๋ถ๋ณ ๋ฐ ์์ฑ์ ๋ํ ๋ณด์ฅ์ ํด์ค ์ ์๋ค. (Spring ํ์์ ๊ถ์ฅํ๋ ์ฃผ์ ๋ฐฉ์)
์ปดํ์ผ ์์ ์ ๊ฐ์ด ์ค์ ๋์ง ์์๋ค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํด์ ๋ง์์ค๋ค.
๋ง์ฝ ์์ฑ์๊ฐ 1๊ฐ๋ผ๋ฉด ์๋์ผ๋ก @Autowired๊ฐ ๋ถ์ ๊ฒ๊ณผ ๋์ผํ ํจ๊ณผ๋ฅผ ์ฃผ๊ธฐ ๋๋ฌธ์ ์๋ต์ด ๊ฐ๋ฅํ๋ค.
โญ๏ธ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋ง์ ๋น์ ๋ฑ๋กํ๋ ๋จ๊ณ์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋จ๊ณ๊ฐ ๋๋์ด์ ธ ์์ง๋ง, ์์ฑ์ ์ฃผ์ ์ ๊ฒฝ์ฐ ๋น์ ๋ฑ๋กํ๋ ๋จ๊ณ์ ์์กด๊ด๊ณ ์ฃผ์ ์ด ๋์์ ์ผ์ด๋๋ค.
์ด๋ ๋น์ ๋ฑ๋กํ ๋ ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์กด ๊ด๊ณ๋ ํจ๊ป ์ฃผ์ ๋๊ธฐ ๋๋ฌธ์ด๋ฉฐ, ์์ฑ์ ์ฃผ์ ๊ณผ ์์ ์ ์ฃผ์ ์ ํผ์ฉํ๋๋ผ๋ ๋์์ ์ผ์ด๋๋ค. (์์ฑ์ ์ฃผ์ ์ดํ setter ์ฃผ์ ์งํ)
๐ฌ ์์ ์ ์ฃผ์
setter๋ฅผ ํตํด ์์กด ๊ด๊ณ๋ฅผ ์ธํ ํด์ฃผ๋ ๋ฐฉ๋ฒ. ์์ฑ์ ์ฃผ์ ์ ํตํด ์์กด ๊ด๊ณ๊ฐ ์ฃผ์ ๋์๋๋ผ๋, ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋ ์ฌ์ฉ ๊ฐ๋ฅ
์์ ์์ @Autowired๋ฅผ ๋ถ์ฌ์ ์ฃผ์ ํ ์ ์๋ค.
โญ๏ธ ๋ช๋ช ๊ธ์์๋ ์์ ์ ์ฃผ์ , ํ๋ ์ฃผ์ ์ ์งํํ๋ฉด ์ํ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ์ก์ ์ ์๋ค๊ณ ๋งํ์ง๋ง, ์คํ๋ง 2.6๋ถํฐ๋ ์ํ ์ฐธ์กฐ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๋๋๋ก ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ์์ ์ ์๋ฒ๊ฐ ์คํ๋์ง ์๋๋ค.
๐ฌ ํ๋ ์ฃผ์
ํ๋์ @Autowired๋ฅผ ์ ์ธํ์ฌ ๋ฐ๋ก ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ.
์ฝ๋๋ ๊ฐ๊ฒฐํ์ง๋ง, ์ธ๋ถ์์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํ ์คํธํ๊ธฐ ์ด๋ ค์์ง๋ค.
DI ํ๋ ์์ํฌ์ ์์กด์ ์ธ ํํ์ด๋ค.
๐ฌ ์ผ๋ฐ ๋ฉ์๋ ์ฃผ์
์ผ๋ฐ ๋ฉ์๋๋ฅผ ํตํด์ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ.
์์ ์ ์ฃผ์ ์ฒ๋ผ setXXX์ ํํ์ฌ์ผ ํ์ง๋ง, ์์ ์ ์ฃผ์ ๊ณผ ๋ค๋ฅด๊ฒ ์ฌ๋ฌ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ธธ ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค.
๐ฑ IoC (์ ์ด์ ์ญ์ )
์ค๋ธ์ ํธ์ ์์ฑ๊ณผ ๊ด๊ณ ์ค์ , ์ฌ์ฉ, ์ ๊ฑฐ ๋ฑ์ ์์ ์ ์ธ๋ถ๋ก ์์ํ๋ ๊ฒ.
โ๏ธ IoC container (Spring Container)
- ์คํ๋ง ํ๋ ์์ํฌ์์ IoC๋ฅผ ํตํด Object๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฐ๋
BeanFactory / ApplicationContext ์ธํฐํ์ด์ค.
ApplicationContext๊ฐ BeanFactory๋ฅผ ์์๋ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ง์ด ์ฌ์ฉํ๋ค.
- IoC container์ ๋ฑ๋ก๋ Bean์ ๋ํด์ DI๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๊ด๋ฆฌ
์ด๋, ์ปจํ ์ด๋์ ๋ฑ๋กํ๊ธฐ ์ํด ๊ฐ๋ฐ์๊ฐ ์ ๊ณตํ๋ ์ ๋ณด๋ฅผ ‘metadata’๋ผ๊ณ ํํ
XML ๊ธฐ๋ฐ / ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ ๊ตฌ์ฑ์ผ๋ก ๋๋์ด์ง๋ค.
๐ฑ ์คํ๋ง ์ปจํ ์ด๋์ ๋ผ์ดํ์ฌ์ดํด์ ์ด๋ป๊ฒ ๋๋๊ฐ?
โญ๏ธ ์์ฑ๊ณผ ์ด๊ธฐํ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ํต์ฌ ์ญํ ์ด๋ค.
โ๏ธ ๋น์ด๋?
Spring IoC ์ปจํ ์ด๋์ ์ํด์ ์ธ์คํด์คํ ๋๊ณ , ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด์ด๋ค.
1. ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
๋ง ๊ทธ๋๋ก ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์์ฑ๋๋ ๊ณผ์ ์ด๋ค.
2. ์คํ๋ง ๋น ์์ฑ
๐ฌ @Configuration + @Bean
๊ฐ๋ฐ์๊ฐ ์ปจํธ๋กคํ ์ ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ Bean์ผ๋ก ๋ฑ๋กํ ๋ ์ฌ์ฉ
ex) ObjectMapper ํด๋์ค๋ฅผ ์ปค์คํ ํ๊ณ ์ถ์ ๋
// ์ด๋ฐ ์์ผ๋ก 'RedisTemplate'์ด๋ผ๋ ํด๋์ค์ ์ง์ ์ ๊ทผํ ์ ์๋ ๊ฒฝ์ฐ
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
๐ฌ @Component
๊ฐ๋ฐ์๊ฐ ์ปจํธ๋กคํ ์ ์๋ ํด๋์ค์ ๋ํด์ ์ฌ์ฉ
Component์ ๊ฒฝ์ฐ ํด๋์ค์ ๋ํด์๋ง ์ง์ ์ด ๊ฐ๋ฅํ๋ค.
// ์ด๋ฐ ์์ผ๋ก ์ง์ ์์ฑํ ํด๋์ค์ ๋ํด์ ์ ์ธํ๊ณ ์ถ์ ๋ ์ง์
@Component
public class RaceNumberGenerator implements NumberGenerator {
...
}
- @ComponentScan ์ด๋ ธํ ์ด์ ์ ์ํด์ @Component ๋ฐ ์คํ ๋ ์ค ํ์ (@Controller, @Service, @Repository) ์ด๋ ธํ ์ด์ ์ด ๋ถ์ฌ๋ ํด๋์ค๋ค์ ์๋์ผ๋ก ์ค์บํ์ฌ ๋น์ผ๋ก ๋ฑ๋กํด์ค๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋น์ ์ด๋ฆ์ ํด๋์ค๋ช ์ ์ฌ์ฉํ๋ฉฐ, ๊ฐ์ฅ ์๊ธ์๋ฅผ ์๋ฌธ์๋ก ์ฌ์ฉํ๋ค.
- ์ด๋ ธํ ์ด์ ์ ์ธ์๋ก ๋น์ ์ด๋ฆ์ ์ง์ ์ง์ ํด์ค ์ ์๋ค.
3. ์์กด ๊ด๊ณ ์ฃผ์
์์ฑ์์ ์ง์ ๋ @Autowired๋ฅผ ๋ณด๊ณ , ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ๋น์ ์ฐพ์ ์กฐํํ๋ค.
์์กด ๊ด๊ณ ์ฃผ์ ์ ‘ํ์ ์ด ๊ฐ์ ๋น’์ ์ฐพ์์ ์กฐํํ๋ค.
๊ทธ๋์ ๋์ผํ ํ์ ์ด ์๋ค๋ฉด @Primary๋ @Qualifier ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ด๋ค ๋น์ ์ฐ์ ์ผ๋ก ์ฃผ์ ํ ์ง ์ง์ ํด์ผ ํ๋ค.
4. ์ด๊ธฐํ ์ฝ๋ฐฑ
๋น ์์ฑ ๋ฐ ์์กด ๊ด๊ณ ์ฃผ์ ์ด ๋๋์ผ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ค๋น๊ฐ ๋๋ค.
์คํ๋ง์ ์์กด๊ด๊ณ ์ฃผ์ ์ด ์๋ฃ๋๋ฉด, ์คํ๋ง ๋น์๊ฒ ์ฝ๋ฐฑ ๋ฉ์๋๋ฅผ ํตํด์ ์ด๋ ํ ์ด๊ธฐํ ๊ธฐ๋ฅ์ ํ ์ ์๋๋ก ์ ๊ณตํ๋ค.
๐ฌ InitializingBean
InitializingBean ์ธํฐํ์ด์ค์ afterProperiesSet() ๋ฉ์๋๋ฅผ ํตํด ์ด๊ธฐํ๋ฅผ ์ง์ํ ์ ์๋ค.
์คํ๋ง ์ ์ฉ ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์, ์คํ๋ง์ ์์กด์ ์ธ ํํ๊ฐ ๋๋ค. (์ ์ฌ์ฉํ์ง ์๋ ํํ)
๐ฌ ๋น ์ค์ ์ ๋ณด์ ์ด๊ธฐํ ๋ฉ์๋ ์ง์
@Bean(initMethod=””)์ ํตํด์ ์ด๊ธฐํ ๋ฉ์๋๋ฅผ ์ง์ ํ ์ ์๋ค.
์ค์ ์ ๋ณด๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ ํ ์ ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด์๋ ์ด๊ธฐํ ๋ฉ์๋๋ฅผ ์ง์ ํ ์ ์๋ค.
โญ๏ธ @PostConstruct ์ฌ์ฉ
๊ฐ์ฅ ๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ ธํ ์ด์ ํ๋๋ง ๋ถ์ด๋ฉด ๋ผ์ ๊ฐ๋จํ๋ค.
์๋ฐ ํ์ค ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ ์คํ๋ง์ ์ข ์์ ์ด์ง ์๋ค.
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ ์ฉํ์ง ๋ชปํ๋ค.
์์ ๋ฐฉ๋ฒ๋ค์ ํผ์ฉํ์ฌ ์ฌ์ฉํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์์๋ก ํธ์ถ๋๋ค.
@PostConstruct → afterPropertiesSet() → @Bean(initMethod=””)
5. ์ค์ ๋ก ์ฌ์ฉํ๊ธฐ
์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌ์ฑํ๋ฉฐ ์ฌ์ฉํ๋ ๋จ๊ณ์ด๋ค.
6. ์๋ฉธ ์ ์ฝ๋ฐฑ
์ฑ๊ธํค ๋น๋ค์ ์คํ๋ง ์ปจํ ์ด๋ ์ข ๋ฃ ์ ๋น๋ค๋ ํจ๊ป ์๋ฉธํ๊ธฐ ๋๋ฌธ์, ์๋ฉธ์ ์ฝ๋ฐฑ์ด ๋ฐ์ํ๋ค.
๐ฌ DisposableBean ์ฌ์ฉ
DisposableBean ์ธํฐํ์ด์ค์ destroy() ๋ฉ์๋๋ฅผ ํตํด ์๋ฉธ์ ์ง์ํ ์ ์๋ค.
๐ฌ ๋น ์ค์ ์ ๋ณด์ ์๋ฉธ ๋ฉ์๋ ์ง์
@Bean(destroyMethod=””)์ ํตํด์ ์ด๊ธฐํ ๋ฉ์๋๋ฅผ ์ง์ ํ ์ ์๋ค.
์ค์ ์ ๋ณด๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ ํ ์ ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด์๋ ์๋ฉธ ๋ฉ์๋๋ฅผ ์ง์ ํ ์ ์๋ค.
์ฐธ๊ณ ๋ก, ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋๋ถ๋ถ close, shutdown์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ข ๋ฃ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. destroyMethod๋ ๋ด๋ถ์ ์ผ๋ก ์ถ๋ก ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค๋ฉด ์ข ๋ฃ ๋ฉ์๋๋ฅผ ๋ฐ๋ก ์์ฑํ์ง ์์๋ ์์์ ๋์ํ๋ค.
โญ๏ธ @PreDestroy ์ฌ์ฉ
๋ง์ฐฌ๊ฐ์ง๋ก ๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ ธํ ์ด์ ํ๋๋ง ๋ถ์ด๋ฉด ๋ผ์ ๊ฐ๋จํ๋ค.
์๋ฐ ํ์ค ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ ์คํ๋ง์ ์ข ์์ ์ด์ง ์๋ค.
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ ์ฉํ์ง ๋ชปํ๋ค
์์ ๋ฐฉ๋ฒ๋ค์ ํผ์ฉํ์ฌ ์ฌ์ฉํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์์๋ก ํธ์ถ๋๋ค.
@PreDestroy → destroy() → @Bean(destroyMethod=””)
7. ์คํ๋ง ์ปจํ ์ด๋ ์ข ๋ฃ
๐ฑ ๋น ์ค์ฝํ๋?
์ค์ฝํ๋ ‘๋น์ด ์กด์ฌํ ์ ์๋ ๋ฒ์’๋ฅผ ์๋ฏธํ๋ค.
์คํ๋ง์์๋ ์ด 6๊ฐ์ง์ ์ค์ฝํ๋ฅผ ์ ๊ณตํ๋ฉฐ, @Scope ์ด๋ ธํ ์ด์ ์ ์ด์ฉํ์ฌ ์ง์ ํ ์ ์๋ค.
๐ฌ ์ฑ๊ธํค ์ค์ฝํ
์คํ๋ง์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ค์ฝํ์ด๋ค.
์คํ๋ง ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ์์ฑ๋์ด์, ์ข ๋ฃ๋ ๋๊น์ง ์ ์งํ๋ค. (๊ฐ์ฅ ๋์ ๋ฒ์)
IoC ์ปจํ ์ด๋์์ ์กฐํํ๊ฒ ๋๋ฉด ํญ์ ๊ฐ์ ์ธ์คํด์ค์ ๋น์ ๋ฐํํ๋ค.
๐ฌ ํ๋กํ ํ์ ์ค์ฝํ
IoC ์ปจํ ์ด๋๋ ๋น์ ์์ฑ๊ณผ ์์กด ๊ด๊ณ, ์ด๊ธฐํ๊น์ง๋ง ๊ด์ฌํ๊ณ , ๊ทธ ์ด์ ๊ด๋ฆฌํ์ง ์๋ ์ค์ฝํ์ด๋ค.
์ข ๋ฃ ์ฝ๋ฐฑ ๋ฉ์๋๋ ํธ์ถ๋์ง ์๋๋ค.
IoC ์ปจํ ์ด๋์ ์กฐํ ์ ๋ ๋น์ ์์ฑํ๊ณ , ํ์ํ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๊ธฐ ๋๋ฌธ์ ๋งค๋ฒ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
โญ๏ธ ์ฑ๊ธํค ์ค์ฝํ with ํ๋กํ ํ์ ์ค์ฝํ
์ฑ๊ธํค ์ค์ฝํ๋ฅผ ๊ฐ์ง ๋น์ ์ปจํ ์ด๋ ์์ฑ ์์ ์ ์์ฑ๋๊ณ , ์์กด๊ด๊ณ ์ฃผ์ ์ด ๋ฐ์ํ๋ค.
๋ง์ฝ ์ฃผ์ ์ ํ์ํ ๋น์ด ํ๋กํ ํ์ ๋น์ด๋ผ๋ฉด, ์ปจํ ์ด๋๋ ์ด๋ฅผ ๋ฐ์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ๋ฐํํ๋ค.
๊ทธ๋ฌ๋ฉด ์ฑ๊ธํค ๋น์ ์ฌ์ ํ ํ๋กํ ํ์ ์ ๋ํ ๋น์ ์์กด ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์, ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ๋ณด๊ดํ๊ณ ์๋ค.
๋จ, ๊ณผ๊ฑฐ์ ์ฃผ์ ์ด ๋๋ ์ํ๋ก ๋ฐํ๋ฐ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ค๊ณ ํด์ ์๋กญ๊ฒ ์์ฑ๋๋ ๊ฒ์ ์๋๋ค.
๋ง์ฝ, ์ฑ๊ธํค ๋น์ ์ฌ์ฉํ ๋ ๋ด๋ถ์ ์ผ๋ก ํ๋กํ ํ์ ๋น์ ์ฌ์ฉํ๋ ๋ก์ง์ ํธ์ถํ๋ค๋ฉด ์ด๋ฏธ ์ฃผ์ ์ด ๋๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ ์๋ก์ด ๋น์ด ์๋ ๊ธฐ์กด์ ๋น์ ๊ณ์ํด์ ์ฌ์ฉํ๋ ํํ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค. (=์ฆ, ์ฑ๊ธํค ๋น๊ณผ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋์ผํด์ง๋ค)
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ObjectProvder๋ฅผ ์ฌ์ฉํ ์ ์๋ค. (์ปจํ ์ด๋์์ ์กฐํํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ํ๋กํ ํ์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ๋จ)
๐ฌ request ์ค์ฝํ
HTTP ์์ฒญ๊ณผ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ ์ค์ฝํ์ด๋ค. HTTP ์์ฒญ๋ง๋ค ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ๊ด๋ฆฌ๋๋ ํํ์ด๋ค.
๐ฌ session ์ค์ฝํ
Http ์ธ์ ๊ณผ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ์ค์ฝํ์ด๋ค.
๐ฌ application ์ค์ฝํ
์๋ธ๋ฆฟ ์ปจํ ์คํธ์ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ์ค์ฝํ์ด๋ค.
๊ณผ๊ฑฐ์๋ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ฌ๋ฌ ๊ฐ ๋์ ๊ธฐ ๋๋ฌธ์ ๊ฐ ์ปจํ ์ด๋๋ง๋ค ๊ด๋ฆฌ๋๋ ๋น์ ๋ค๋ฅด๊ฒ ํ๊ธฐ ์ํด์ ์ฌ์ฉํ์๋ค. (์ง๊ธ์ ํ๋์ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํด์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋๋ถ๋ถ์ด๋ค.)
๐ฌ websocket ์ค์ฝํ
์น ์์ผ๊ณผ ๋์ผํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ์ค์ฝํ์ด๋ค.
โญ๏ธ ์ฑ๊ธํค ์ค์ฝํ with ์น ์ค์ฝํ
์์ 4๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์น ์ค์ฝํ๋ผ๊ณ ํ๋ค.
์ฑ๊ธํค ๋น์ ๊ฒฝ์ฐ ์คํ๋ง ์ปจํ ์ด๋์ ๋ผ์ดํ ์ฌ์ดํด์ด ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ปจํ ์ด๋ ์์ฑ ์ ๊ฐ์ด ์์ฑ๋์ง๋ง, ์น ์ค์ฝํ์ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ ์์ฒญ์ด ๋ค์ด์์ ๋ ๋น์ด ์์ฑ๋๊ธฐ ๋๋ฌธ์, ๋ง์ฝ ์ฑ๊ธํค ๋น์ด ์น ์ค์ฝํ ๋น์ ์์กด ๊ด๊ณ๋ก ๊ฐ์ง๊ณ ์์ ๋ ์์กด ๊ด๊ณ ์ฃผ์ ์ด ๋ถ๊ฐ๋ฅํด์ง๋ค.
์ด๋ฅผ ์ํด์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
1. ObjectProvider ์ฌ์ฉํ๊ธฐ
- getObject()๋ฅผ ํธ์ถํ๋ ์์ ๊น์ง ์น ์ค์ฝํ ๋น์ ์์ฑ์ ์ง์ฐ์ํค๊ธฐ
2. ํ๋ก์ ์ฌ์ฉํ๊ธฐ
- @Scope ์ด๋ ธํ ์ด์ ์ ์ธ์๋ก proxyMode = ScopedProxyMode.TARGET_CLASS ์ง์ ํ๊ธฐ (ํด๋์ค์ผ ๊ฒฝ์ฐ, ์ธํฐํ์ด์ค๋ผ๋ฉด INTERFACES ์ฌ์ฉ)
- ์ด๋ฌ๋ฉด ๊ฐ์ง ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์๊ด์ด ์์ด์ง๋ค. ๊ฐ์ง ํ๋ก์ ๊ฐ์ฒด์ ๊ฒฝ์ฐ, ์์ฒญ์ด ์์ ๋ ์ง์ง ๋น์ผ๋ก ์์ฒญ์ ์์ํ๋ค.
๐ฑ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํด๋ ๊ด์ฐฎ์๊น?
๊ธฐ๋ณธ์ ์ผ๋ก ‘์ฑ๊ธํค’์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ถ์ ์ธ์คํด์ค์ ๋ํด์๋ง ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง, ์ฑ๊ธํค ๋น์ ๊ฒฝ์ฐ ํญ์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฐํ๋ฐ๋๋ค. ๋ง์ฝ ํด๋น ์ธ์คํด์ค๊ฐ ์ด๋ ํ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ํด๋น ์ํ๋ ์ ์ง๋์ง ์๊ธฐ ๋๋ฌธ์ ์๊ธฐ์น ๋ชปํ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฌผ๋ก , ๋ถ๊ฐ๋ฅํ ๊ฑด ์๋๋ค. ์ค์ฝํ๋ฅผ ํ๋กํ ํ์ ์ผ๋ก ๋ง๋ ๋ค๋ฉด ํญ์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ฐํ๋ฐ๋๋ก ๋ง๋ค ์ ์๋ค. ํ์ง๋ง, ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํ๋ฐ์์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๊ฒ ๋๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์์ผ๋ก๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๊ณต์ ๋ฌธ์์์๋ ์๋์ ๊ฐ์ ๋ต๋ณ์ ๋ด๋์๋ค.
These bean definitions correspond to the actual objects that make up your application.
Typically, you define service layer objects, persistence layer objects such as repositories or data access objects (DAOs), presentation objects such as Web controllers, infrastructure objects such as a JPA EntityManagerFactory, JMS queues, and so forth.
Typically, one does not configure fine-grained domain objects in the container, because it is usually the responsibility of repositories and business logic to create and load domain objects.
๋น์ ๋ํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๊ฐ์ฒด๋ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก service layer, ๋ ํฌ์งํ ๋ฆฌ๋ DAO ๊ฐ์ persistence layer, ์ปจํธ๋กค๋ฌ ๊ฐ์ presentation layer, ํน์ infrastructure layer ๋ฑ์์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ฅผ ์ ์ํ๋ค.
ํ์ง๋ง, ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ก๋ํ๋ ๊ฒ์ ‘๋ ํ์งํ ๋ฆฌ ๋ฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ฑ ์’์ด๊ธฐ ๋๋ฌธ์ IoC ์ปจํ ์ด๋์์ ์ด๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ด์ง ์๋ค๊ณ ํ์๋ค.
๐ฑ ๋น์ผ๋ก ๋ฑ๋กํ๋ ๊ฒ vs ์คํํฑ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ
์ด์ ์ ์น ์ค์ฝํ๋ฅผ ์ค๋ช ํ ๋ ๋งํ๋ ๊ฒ์ฒ๋ผ, ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋์ฐ๋ ์ํฉ์์ ์ ์ญ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ถ๋ค๋ฉด static method๋ฅผ ์ฌ์ฉํด์ ๊ด๋ฆฌํ ์ ์์ ๊ฒ ๊ฐ๋ค. (๋ค๋ง, application scope๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ค ์ด๋ง์ ๋ ์๋ฏธ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค.)
static ๋ฉ์๋์ ๊ฒฝ์ฐ ์ธ์๊ฐ ๋์ผํ๋ค๋ฉด ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด์ผ ํ๋๋ฐ, ์ด๋ฅผ ์งํฌ ์ ์๋ค๋ฉด POJO bean์ผ๋ก ๋ง๋ค๋ผ๋ ๊ธ์ด ์์๋ค. ์ธ๋ถ ์์์ ์์กดํ์ง ์์ผ๋ฉด์, ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ง ๋ฐํํจ์ ๋ณด์ฆํ ์ ์๋ค๋ฉด (util์ฑ ํด๋์ค) ๊ตณ์ด ๋น์ผ๋ก ๋ฑ๋กํ ํ์๋ ์์ ๊ฒ ๊ฐ๋ค.
์ถ๊ฐ์ ์ผ๋ก, ์ง๊ธ์ ํฌ๊ฒ ์๊ด์์ง๋ง static ๋ฉ์๋์ ๊ฒฝ์ฐ ๊ณต์ ๋ฒ์๊ฐ ํด๋์ค ๋ก๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๊ณ , ์ฑ๊ธํค ๋น์ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ์์ ๋งํ ๊ฒ์ฒ๋ผ ์ปจํ ์ด๋๋ฅผ ์ฌ๋ฌ ๊ฐ ๋์ฐ๋ ์ํฉ์ด๋ผ๋ฉด ์๋ช ์ฃผ๊ธฐ ์ฐจ์์์๋ static method๋ฅผ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ๋ค.