DevLog ๐Ÿ˜ถ

[Spring] IoC Container์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ DI, ๋นˆ ์Šค์ฝ”ํ”„, ๋นˆ๊ณผ ์Šคํƒœํ‹ฑ ๋ฉ”์„œ๋“œ ๋ณธ๋ฌธ

Back-end/Spring

[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๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. 

Comments