yun000 2025. 1. 6. 17:51

<1. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„ ์›Œํฌ ๊ฐœ์š”>

๐Ÿ ์ž๋ฐ”์˜ ๊ฐ์ฒด ์ƒ์„ฑ, ๋ฉ”๋ชจ๋ฆฌ ๋กœ๋”ฉ

๋™์  ๋กœ๋”ฉ = ํ”„๋กœ๊ทธ๋žจ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ ๋†’์ž„.

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ = ์ž๋ฐ”์—์„œ ๋™์ ์œผ๋กœ ํด๋ž˜์Šค ๋กœ๋“œํ•˜๊ณ  ๋งํฌ. 

 

๋™์ ์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ+๋ฉ”๋ชจ๋ฆฌ ๋กœ๋”ฉ ๋ฐ˜๋ณต์‹œ

- ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ = ๊ฐ์ฒด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ ๋  ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€

- ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋ถ€ํ•˜ = ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ๋งŽ์•„์ ธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋ถ€ํ•˜ ์ฆ๊ฐ€

- ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„ ์ €ํ•˜ = ์‹œ์Šคํ…œ ์ž์› ์†Œ๋น„ ↑

- ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” = ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ๋˜๊ณ  ์†Œ๋ฉธํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” ๋ฐœ์ƒ

๋ฉ”๋ชจ๋ฆฌ ์ผ๋ถ€ ์˜์—ญ์ด ์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ ํ•˜๋ฝ

 

๐Ÿ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํƒ„์ƒ๊ณผ ๋ฐœ์ „

์Šคํ”„๋ง=EJB(Enterprise Java Beans)์˜ ๋ณต์žก์„ฑ, ๋ถˆํŽธํ•จ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค.

ํŠน์ง•

1. IoC์ปจํ…Œ์ด๋„ˆ ์ œ๊ณต=Bean์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•œ๋‹ค.

2. XML์ด๋‚˜ Annotation์„ ์‚ฌ์šฉํ•œ ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋“ฑ์„ ์ œ๊ณต

3. POJO=์ฝ”๋“œ ์ˆ˜์ • ์—†์ด๋„ enterprise์„œ๋น„์Šค ์ ์šฉ ๊ฐ€๋Šฅ

4. MVCํ”„๋ ˆ์ž„์›Œํฌ ์ œ๊ณต=์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต

5. AOP=์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋“ฑ ์ง€์›

6. DI ์˜์กด์„ฑ ์ฃผ์ž… ์ง€์›=๊ฐ ๊ณ„์ธต์ด๋‚˜ ์„œ๋น„์Šค๋“ค ์‚ฌ์ด ๋˜๋Š” ๊ฐ์ฒด ์‚ฌ์ด ์˜์กด์„ฑ ์กด์žฌ์‹œ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„ ์›Œํฌ๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐ. 

7. ํ™•์žฅ์„ฑ ๋†’๋‹ค=๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ถ„๋ฆฌํ•ด๋†จ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•œ๊ฒƒ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

๐Ÿ IoC์ปจํ…Œ์ด๋„ˆ

=๊ฐ์ฒด ์ƒ์„ฑ, ๊ด€๋ฆฌ, ์˜์กด์„ฑ ์ฃผ์ž… ๋‹ด๋‹นํ•˜๋Š” ์š”์†Œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ œ์–ด ํ๋ฆ„์„ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋‹ด๋‹นํ•˜๋„๋ก ํ•จ

๊ธฐ๋Šฅ=Bean๊ด€๋ฆฌ, ์˜์กด์„ฑ ์ฃผ์ž…, ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ

IoC ์ปจํ…Œ์ด๋„ˆ ๊ตฌํ˜„์ฒด=BeanFactory, ApplicationContext

IoC ์ด์  = ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ, ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ

 

๐Ÿ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ๋นˆ ๊ด€๋ฆฌ

=๋นˆ ์ƒ์„ฑ-์†Œ๋ฉธ๊นŒ์ง€ ๊ฐ์ฒด ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ.

 

1. ๋นˆ ์ •์˜(Bean Definition)

– ์ •์˜๋ฐฉ์‹: XML ์„ค์ •ํŒŒ์ผ, ์ž๋ฐ”์„ค์ •ํด๋ž˜์Šค, ๋˜๋Š”์–ด๋…ธํ…Œ์ด์…˜(@Component, @Service, @Repository ๋“ฑ).

– ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ: ๋นˆ์˜ํด๋ž˜์Šค, ์ƒ์„ฑ๋ฐฉ๋ฒ•, ์˜์กด์„ฑ, ์ดˆ๊ธฐํ™”/์†Œ๋ฉธ ๋ฉ”์„œ๋“œ๋“ฑํฌํ•จ.

2. ๋นˆ ์ƒ์„ฑ(Bean Instantiation)

– ์‹ฑ๊ธ€ํ†ค๊ด€๋ฆฌ: ๊ธฐ๋ณธ์ ์œผ๋กœํ•˜๋‚˜์˜์ธ์Šคํ„ด์Šค๋งŒ์ƒ์„ฑ๋ฐ๊ด€๋ฆฌ.

– ๋‹ค๋ฅธ์Šค์ฝ”ํ”„์ง€์›: ํ”„๋กœํ† ํƒ€์ž…, ์š”์ฒญ(Request) ๋“ฑ ๋‹ค์–‘ํ•œ์Šค์ฝ”ํ”„๊ฐ€๋Šฅ.– ์ƒ์„ฑ์žํ˜ธ์ถœ: ์ƒ์„ฑ์‹œํ•„์š”ํ•œ์˜์กด์„ฑ์„์ฃผ์ž….

3. ์˜์กด์„ฑ์ฃผ์ž…(Dependency Injection)

– ์˜์กด์„ฑํ•ด๊ฒฐ: ์ƒ์„ฑ์ž์ฃผ์ž…, ์„ธํ„ฐ์ฃผ์ž…, ํ•„๋“œ์ฃผ์ž…๋ฐฉ์‹์œผ๋กœ์ž๋™์ฃผ์ž….

– ์ž๋™์ฃผ์ž…: @Autowired์™€๊ฐ™์€์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ๊ฐ„๋‹จํ•˜๊ฒŒ์˜์กด์„ฑํ•ด๊ฒฐ๊ฐ€๋Šฅ.

4. ๋นˆ ์ดˆ๊ธฐํ™”(Bean Initialization)

– ์ดˆ๊ธฐํ™”๋ฉ”์„œ๋“œ: @PostConstruct ์–ด๋…ธํ…Œ์ด์…˜์ด๋‚˜ InitializingBean ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ.

– ์ปค์Šคํ„ฐ๋งˆ์ด์ง•: ์ดˆ๊ธฐํ™”๋ฉ”์„œ๋“œ์ง€์ •๊ฐ€๋Šฅ.

5. ๋นˆ ์‚ฌ์šฉ(Bean Usage)

– ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์‚ฌ์šฉ: ๋นˆ์„์ฃผ์ž…๋ฐ›์•„์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ์‚ฌ์šฉ.

– ์‹ฑ๊ธ€ํ†ค์žฌ์‚ฌ์šฉ: ์‹ฑ๊ธ€ํ†ค์Šค์ฝ”ํ”„๋Š”๋™์ผํ•œ์ธ์Šคํ„ด์Šค๋ฅผ์žฌ์‚ฌ์šฉ, ํ”„๋กœํ† ํƒ€์ž…์€์ƒˆ๋กœ์šด์ธ์Šคํ„ด์Šค๋ฅผ์ƒ์„ฑ.

6. ๋นˆ ์†Œ๋ฉธ(Bean Destruction)

– ์†Œ๋ฉธ๋ฉ”์„œ๋“œ: @PreDestroy ์–ด๋…ธํ…Œ์ด์…˜์ด๋‚˜ DisposableBean ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ.

– ์ž์›ํ•ด์ œ: ํŒŒ์ผ๋‹ซ๊ธฐ, ๋„คํŠธ์›Œํฌ์—ฐ๊ฒฐ์ข…๋ฃŒ๋“ฑํ•„์š”ํ•œ์ž์›ํ•ด์ œ์ˆ˜ํ–‰.

 

๐Ÿ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ์žฅ๋‹จ์ 

์žฅ์ =์ƒ์‚ฐ์„ฑ, ํ’ˆ์งˆ๋ณด์ฆ, ์œ ์ง€ ๋ณด์ˆ˜

๋‹จ์ =ํ•™์Šต๊ณก์„ (๊ณต๋ถ€ํ•  ์–‘ ๋งŽ์Œ), ์„ค๋ช…์˜ ๋ณต์žก์„ฑ, ์ถ”์ƒํ™”์˜ ํ•œ๊ณ„

 

๐Ÿ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ์ฃผ์š” ๊ตฌ์„ฑ์š”์†Œ

Spring Core Container

= ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์ด๋ฃจ๋Š” ์ปจํ…Œ์ด๋„ˆ. BeanFactory๋ฅผ ํฌํ•จํ•˜์—ฌ ์˜์กด์„ฑ ์ฃผ์ž… ๊ธฐ๋Šฅ์„ ์ œ๊ณต.

๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๊ฐ์ฒด ๊ฐ„ ๊ด€๊ณ„ ์„ค์ •์ด ์‰ฌ์›Œ์ง„๋‹ค

 

SpringAOP

=ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ๋กœ๊น…, ๋ณด์•ˆ ๋“ฑ ์„œ๋น„์Šค๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ•ต์‹ฌ ๋กœ์ž‘์—์„œ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌ

 

Spring MVC

= ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ model view controller ๊ตฌ์กฐ ์ œ๊ณต. 

๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ ๋ถ€๋ถ„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ

 

Spring Data Access/Integration

= ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ธฐ์ˆ ์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ œ๊ณต

๋” ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—… ์ง„ํ–‰ ๊ฐ€๋Šฅ

 

Spring Web Flow

= ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ๋ฆ„ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ.

 

Spring Security

= ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•œ ๋ณด์•ˆ ํ”„๋ ˆ์ž„์›Œํฌ

 

Spring Boot

= ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜์œผ๋กœ 

๋ณต์žกํ•œ ์ดˆ๊ธฐ ์„ค์ •์„ ์ตœ์†Œํ™”ํ•˜๊ณ 

๋น ๋ฅด๊ฒŒ ํ”„๋กœ๋•์…˜ ์ค€๋น„๊ฐ€ ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋•๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

 

๐Ÿ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๋ชจ๋“ˆ

๋ชจ๋“ˆ ์„ค๋ช…
spring-beans ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ด์šฉํ•ด์„œ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์ œ๊ณต
spring-context ๊ฐ์ฒด ์ƒ์„ฑ, ๋ผ์ดํ”„ ์‚ฌ์ดํด ๊ด€๋ฆฌ, ์Šคํ‚ค๋งˆ ํ™•์žฅ
spring-aop ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜ AOP๊ธฐ๋Šฅ ์ œ๊ณต
spring-web RESTํด๋ผ์ด์–ธํŠธ, ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ์ฒ˜๋ฆฌ, ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ, ํŒŒ์ผ ์—…๋กœ๋“œ ๋“ฑ ๊ธฐ๋Šฅ ์ œ๊ณต
spring-webmvc ์Šคํ”„๋ง ๊ธฐ๋ฐ˜ ์›น MVC ํ”„๋ ˆ์ž„์›Œํฌ, controller, view๊ตฌํ˜„ ์ œ๊ณต
spring-websocket MVC์—์„œ ์‚ฌ์šฉํ•  ์›น์†Œ์ผ“ ๊ธฐ๋Šฅ ์ง€์›
spring-oxm XML๊ณผ ์ž๋ฐ” ๊ฐ์ฒด๊ฐ„ ๋งคํ•‘ ์ฒ˜๋ฆฌ API
spring-tx ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์œ„ํ•œ ์ถ”์ƒ ๋ ˆ์ด์–ด
spring-jdbc jdbcํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ ์ œ๊ณต
spring-orm ํ•˜์ด๋ฒ„๋„ค์ดํŠธ, JPA, MyBatis๋“ฑ๊ณผ ์—ฐ๋™
spring-jms JMS์„œ๋ฒ„์™€ ๋ฉ”์‹œ์ง€ ์‰ฝ๊ฒŒ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ…œํ”Œ๋ฆฟ๊ณผ ์–ด๋…ธํ…Œ์ด์…˜ ๋“ฑ ์ œ๊ณต
spring-context-support ์Šค์ผ€์ค„๋ง, ๋ฉ”์ผ ๋ฐœ์†ก, ์บ์‹œ ์—ฐ๋™, ๋ฒจ๋กœ์‹œํ‹ฐ ๋“ฑ ๊ธฐ๋Šฅ

 


<2. ์˜์กด์„ฑ ์ฃผ์ž… ๊ฐœ์š”>

์˜์กด์„ฑ ์ฃผ์ž… (DI) =๋นˆ์ด ํ•„์š”ํ•œ ๊ณณ์— ์ œ3์ž๊ฐ€ ๋นˆ์„ ๋งŒ๋“ค์–ด ์ „๋‹ฌํ•ด ์ฃผ๋„๋ก ํ•˜๋Š” ๊ฒƒ. โญโญโญโญโญ

 

Hello ๊ตฌ์กฐ

1๏ธโƒฃ DI ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ

=(bad case!) HelloControllerํด๋ž˜์Šค์™€ HelloServiceํด๋ž˜์Šค๊ฐ€ ๊ฐ•ํ•œ ์˜์กด๊ด€๊ณ„๊ฐ€ ๋˜๊ฒŒ ๋œ๋‹ค.

 

2๏ธโƒฃ Constructor based DI

์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž…  = ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด๋ฅผ inject(์ „๋‹ฌ)ํ•˜๋Š” ๊ฒƒ

 

HelloMain.java

package com.example.myapp.di;

public vlass HelloMain{
	public static void main(String[] args){
    	IHelloService helloService=new HelloService(); //Service ๊ฐ์ฒด ์ƒ์„ฑ ํ›„
        HelloController controller=new HelloController(helloService);//Controller์— ์ „๋‹ฌ
        controller.hello("hoho");
    }
}

 

HelloController.java

package com.example.myapp.di;

public class HelloController{
	IHelloService helloService;
    
    public HelloController(IHelloService helloService)
    {this.helloService=helloService;}
    public void hello(String name)
    { System.out.println("HelloController:"+helloService.sayHello(name)); }
}

 

HelloMainํด๋ž˜์Šค์—์„œ HelloService๊ฐ์ฒด ์ƒ์„ฑํ›„

HelloControllerํด๋ž˜์Šค ์ƒ์„ฑ์ž ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ HelloController๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ.

์ด๋Ÿฌ๋ฉด HelloController์—๊ฒŒ HelloService๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ ๊ฐ€๋Šฅ.

 

์ด์ฒ˜๋Ÿผ ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด๋ฅผ inject(์ „๋‹ฌ)ํ•˜๋Š” ๊ฒƒ์ด ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž…์ด๋‹ค.

 

3๏ธโƒฃ Setter based DI

setter based DI =  setter๋ฉ”์„œ๋“œ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด inject(์ „๋‹ฌ)ํ•˜๋Š” ๋ฐฉ๋ฒ• 

 

์ƒ์„ฑ์ž๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ „๋‹ฌํ•ด์•ผํ•  ๊ฐ์ฒด๊ฐ€ ๋งŽ์œผ๋ฉด

ํ•˜๋‚˜์”ฉ ๋‹ค ์ƒ์„ฑ์ž ๊ตฌํ˜„ํ•˜๊ธฐ ํž˜๋“ค๋‹ค.

์ด ๋•Œ setter๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

HelloMain.java

package.com.example.myapp.di;

public class HelloMain{
	public static void main(String[]args){
    	IHelloService helloService=new HelloService();
        HelloController controller=new HelloController();
        controller.setHelloService(helloService); //set methodํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ฒด ์ „๋‹ฌ
        controller.hello("hongildong");
    }
}

HelloController.java

package com.example.myapp.di;

public class HelloController{
	IHelloService helloService;
    public void setHelloService(IHelloService helloService){
    	this.helloService=helloService;
    }
    
    public void hello(String name){
    	System.out.println("HelloController:"+helloService.sayHello(name));
    }
}

 

 


์ƒ์„ฑ์ž vs setter

์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž…=์ƒ์„ฑ์ž์˜ ์ธ์ž๋กœ, ์˜์กด ๊ฐ์ฒด ์ „๋‹ฌ

setter๋ฉ”์„œ๋“œ ์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž…=setter๋ฉ”์„œ๋“œ ์ด์šฉํ•˜์—ฌ ์˜์กด ๊ฐ์ฒด ์ „๋‹ฌ

 

 

+) ์ฑ…์˜ 60ํŽ˜์ด์ง€ ์šฉ์–ด+์„ค๋ช…์™ธ์›Œ์•ผํ•œ๋‹ค

+) AOP ์šฉ์–ด๋งŒ ์™ธ์šฐ๋ฉด ๋œ๋‹ค.

+) italic์ฒด๋กœ ์“ฐ์—ฌ์žˆ์œผ๋ฉด ๋Œ€์ฑ„๋  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ์ค‘์š”ํ•œ ๊ฒƒ์ด๋‹ค

 

 


 

<3.์Šคํ”„๋ง์˜ ์˜์กด์„ฑ ์ฃผ์ž…>

์Šคํ”„๋ง ์˜์กด์„ฑ ์ฃผ์ž…

1. xml์ด์šฉํ•œ ๋ฐฉ๋ฒ•

2. annotation์ด์šฉํ•œ ๋ฐฉ๋ฒ•

3. configํŒŒ์ผ (์ž๋ฐ” ํด๋ž˜์Šค)์ด์šฉ

 

๐Ÿ1.  XML ์ด์šฉํ•œ DI

 

1๏ธโƒฃXML ์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž…

1. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ

โ‘  workspace-spring.zip

workspace-spring.zipํŒŒ์ผ ๋‚ด๋ ค๋ฐ›์•„ ์••์ถ• ํ’€๊ณ  

์ดํด๋ฆฝ์Šค์˜ workspace-springํด๋”๋ฅผ ํ•ด๋‹น ์›Œํฌ์ŠคํŽ˜์ด์Šค ํด๋”๋กœ ์„ค์ •

 

โ‘ก  Spring Leagcy Project ์ƒ์„ฑ

 

 

 

2. pom.xml์— ๋ฒ„์ „ ์„ค์ •

 

3.  application-config.xml ํŒŒ์ผ ์ƒ์„ฑ

 

+) ๋งŒ์•ฝ Spring Bean Configuration File์ด ์•ˆ๋œจ๋ฉด ์šฐ์ธก์ƒ๋‹จ์— ์ด ๋ฒ„ํŠผ ๋ˆŒ๋Ÿฌ๋ผ

 

next, finish๋ฅผ ๋ˆ„๋ฅด๋ฉด xmlํŒŒ์ผ ์ƒ์„ฑ๋œ๋‹ค

์ด์ œ ์ด ํŒŒ์ผ์— bean๋“ค์„ ์ •์˜ํ•˜๊ณ  ์˜์กด์„ฑ์„ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

 

application-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- bean ์ƒ์„ฑ ํ›„ ์˜์กด์„ฑ ์ฃผ์ž… ์„ค์ • -->
	<bean id="helloService" class="com.example.myapp.di.HelloService"/>
</beans>

 


<bean> tag 

์†์„ฑ ์„ค๋ช…
name ๋˜๋Š” id bean๊ณ ์œ  ์‹๋ณ„์ž ์ง€์ •. 
class ํ•„์ˆ˜. ๋นˆ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค ์ง€์ •
scope ํŠน์ • ๋นˆ ์ •์˜์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ๋ฒ”์œ„ ์ง€์ •.
lazy-init ๋นˆ์ด ์‚ฌ์šฉ๋˜๋Š” ์‹œ์ ์— ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ.
์†์„ฑ๊ฐ’์€ true or false
init-method ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ํ›„ init method์†์„ฑ์— ์ €์žฅํ•œ ๋ฉ”์†Œ๋“œ ์‹คํ–‰
destroy-method ๋นˆ ๊ฐ์ฒด ์‚ญ์ œ์ „ destroy method์†์„ฑ์— ์ง€์ •ํ•œ ๋งค์„œ๋“œ ์‹คํ–‰

 

 

spring context ์ƒ์†๋„

spring context class = ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋Šฅ.

์ปจํ…Œ์ด๋„ˆ๋กœ ๋ถ€ํ„ฐ ๋นˆ์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์Šคํ”„๋ง์˜ ์ปจํ…์ŠคํŠธ

=BeaFactory ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋“ค + ์ด๋ฅผ ์ƒ์†ํ•œ ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋“ค 

 

ClassPathXmlAplicationContext๋“ฑ..์€ bean factory(bean์„ ๋งŒ๋“œ๋Š” ๊ณต์žฅ)

 

์˜ˆ์ œ

HelloMain.java

run - run as - java application

package com.example.myapp.di;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class HelloMain {

	public static void main(String[] args) {
		AbstractApplicationContext context=
        	new GenericXmlApplicationContext("application-config.xml");//context์ƒ์„ฑ
		context.close();
	}
}

 

๊ฒฐ๊ณผ

์ปจํ…์ŠคํŠธ ์ƒ์„ฑํ•˜๋ฉด ํด๋ž˜์ŠคํŒจ์Šค ๊ฒฝ๋กœ์˜ application-config.xmlํŒŒ์ผ์ด ๋กœ๋“œ๋˜์–ด

helloService๋นˆ์„ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™” ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธ ๊ฐ€๋Šฅ

context.close()๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋กœ ์ธํ•ด helloService๋นˆ์ด ์†Œ๋ฉธ๋˜๋Š” ๋กœ๊ทธ๋„ ์žˆ์Œ

 

 

2๏ธโƒฃ ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž…

=controller class์— ์„œ๋น„์Šค ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด controller class์ƒ์„ฑ์ž ์ถ”๊ฐ€.

 

HelloController.java

package com.example.myapp.di;

public class HelloController{
	IHelloService helloService;
    public HelloController(IHelloService helloService){
    	this.helloService=helloService;}
    public void hello(String name)
    { System.out.println("HelloController:"+helloService.sayHello(name));}
}

spring์„ค์ • ํŒŒ์ผ์— HelloControllerํด๋ž˜์Šค ๋นˆ ์ •์˜์‹œ <constructor-args> tag๋กœ ์˜์กด์„ฑ ์ฃผ์ž… ๊ฐ€๋Šฅ

<constructor-args> tag์˜ ref ์†์„ฑ์€ ์˜์กด์„ฑ ์ฃผ์ž…ํ•  ๋‹ค๋ฅธ ๋นˆ ์•„์ด๋”” ์ง€์ •ํ•œ๋‹ค. 

 

application-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd">
    
	<!-- bean ์ƒ์„ฑ ํ›„ ์˜์กด์„ฑ ์ฃผ์ž… ์„ค์ • -->
	<bean id="helloService" class="com.example.myapp.di.HelloService"/>
	<bean id="helloService" class="com.example.myapp.di.HelloController">
		<constructor-arg ref="helloService"/>
	</bean>
    
</beans>

 

HelloMain.java

package com.example.myapp.di;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class HelloMain2 {

	public static void main(String[] args) {
		AbstractApplicationContext context
			=new GenericXmlApplicationContext("application-config.xml");
		HelloController controller=context.getBean(HelloController.class);
		controller.hello("hoho");
		context.close();

	}
}

 

HelloService.java

package com.example.myapp.di;

import org.springframework.stereotype.Controller;

@Controller
public class HelloService implements IHelloService{
	
	@Override
	public String sayHello(String name)
	{
		System.out.println("HelloService.salyHello() method");
		String message="HEllO!"+name;
		return message;
	}
}

 

IHelloService.java

package com.example.myapp.di;

public interface IHelloService {

	String sayHello(String name);
}

 

๊ฒฐ๊ณผ

HelloService.sayHello() ๋ฉ”์„œ๋“œ ์‹คํ–‰

HelloController: HELLO!hoho

 

 

 

 

+)

HelloMain์—์„œ controller bean์„ ์ฐพ๊ธฐ ์œ„ํ•ด getBean๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ–ˆ๋‹ค.

getBean(Class<T> requiredType) T๋ฉ”์„œ๋“œ ์ด์šฉํ•˜๋ฉด ํ•ด๋‹น ์ธ์ž ์œ ํ˜•์˜ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

๋งŒ์ผ ๊ฐ™์€ ํƒ€์ž…์˜ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋นˆ ์ด๋ฆ„ ์ง์ ‘ ์ง€์ • ๊ฐ€๋Šฅ

HelloController controller=context.getBeean("helloController",helloController.class);

 

์ƒ์„ฑ์ž์— ์ „๋‹ฌํ•˜๋Š” ์ธ์ˆ˜ ํƒ€์ž…์ด String์ด๊ฑฐ๋‚˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐํƒ€์ž…์ด๋ฉด value์†์„ฑ ์ด์šฉ

public class BasicDataSource implements DataSource{
	private String driverClassName;
    private String url;
    public DataSource(String driverClassName,String url)
    { this.driverClassName=driverClassName; this.url=url;
    .... ์ƒ๋žต
	<bean id="dataSource" class="com.example.myapp.database.BasicDataSource">
		<constructor-arg value="jdbc:oracle:thin:@localhost:1521:xe"/>
		<constructor-arg value="oracle.jdbc.OracleDriver"/>
	</bean>

 

+) index๋„ ์ง€์ •๊ฐ€๋Šฅ --> ์ƒ์„ฑ์ž์—๊ฒŒ ์ „๋‹ฌํ•  ์ธ์ž ์ˆœ์„œ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ๊ฐ€๋Šฅ

	<bean id="dataSource" class="com.example.myapp.database.BasicDataSource">
		<constructor-arg index="1" value="jdbc:oracle:thin:@localhost:1521:xe"/>
		<constructor-arg index="2" value="oracle.jdbc.OracleDriver"/>
	</bean>

 

+) null์ผ ๊ฒฝ์šฐ

<constructor-arg><null/></constructor-arg>

 

3๏ธโƒฃ setter ๋ฉ”์„œ๋“œ ์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž…

=DIํ•  ๊ฐ์ฒด ๋งŽ์•„์„œ ํด๋ž˜์Šค์— ์ƒ์„ฑ์ž ์ค‘๋ณต ์„ ์•ˆํ•˜๋Š” ๊ฒƒ์€ ๊ท€์ฐฎ๋‹ค.

set๋ฉ”์„œ๋“œ ์„ ์–ธํ•˜๊ณ  <property>ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ DI๊ฐ€๋Šฅ

+) ๋‹จ set ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์‹œ ๊ธฐ๋ณธ์ƒ์„ฑ์ž ์™ธ์— ๋‹ค๋ฅธ ์ƒ์„ฑ์ž ์ •์˜ํ•˜๋ฉด ์•ˆ๋จ. ๊ธฐ๋ณธ์ƒ์„ฑ์ž๋Š” ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผํ•จ

 

 

HelloController.java

package com.example.myapp.di;

public class HelloController {
	IHelloService helloService;
	
	public void setHElloService(IHelloService helloService) {this.helloService=helloService;}

	public void hello(String name)
	{
		System.out.println("HelloController:"+helloService.sayHello(name));
	}
}

 

์œ„์˜ controller๋Š” ์„œ๋น„์Šค ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค

set ๋ฉ”์„œ๋“œ ์ด์šฉํ•œ DI๋ฅผ ์œ„ํ•œ ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ ํƒœ๊ทธ๋Š” <property>ํƒœ๊ทธ์ด๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	
    <!-- bean ์ƒ์„ฑ ํ›„ ์˜์กด์„ฑ ์ฃผ์ž… ์„ค์ • -->
	<bean id="helloService" class="com.example.myapp.di.HelloService"/>
	<bean id="helloController" class="com.example.myapp.di.HelloController">
		<property name="helloService" ref="helloService"/>
	</bean>
	
</beans>

 

๊ฒฐ๊ณผ

HelloService.sayHello() ๋ฉ”์„œ๋“œ ์‹คํ–‰

HelloController:HELLO!hoho

 

+) DI๊ฐ’์ด ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์ด๊ฑฐ๋‚˜ String์ด๋ฉด <property>tag์— value์†์„ฑ ์ด์šฉํ•˜์—ฌ ๊ฐ’ ์ง€์ •

+) ๋นˆ ์ด๋ฆ„์€ set์„ ๋นผ๊ณ  ๋‹ค์Œ ๋ฌธ์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊พผ ๊ฒƒ

 

 

๐Ÿ2. annotation์„ ์ด์šฉํ•œ DI

 

1๏ธโƒฃAnnotation ์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž…

application-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- ์Šค์บ”ํ•  ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ์„ค์ • -->
    <context:component-scan base-package="com.example.myapp"/>
    
</beans>

์ƒ์œ„ ํŒจํ‚ค์ง€๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ•˜์œ„ ํŒจํ‚ค์ง€๊นŒ์ง€ bean์œผ๋กœ ๋“ฑ๋ก๋  ํด๋ž˜์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.

 

 

annotation์ถ”๊ฐ€, bean์ƒ์„ฑ

HelloService.java

package com.example.myapp.di;
import org.springframework.stereotype.Service;

@Service
public class HelloService implements IHelloService{
	
	@Override
	public String sayHello(String name)
	{
		System.out.println("HelloService.salyHello() method");
		String message="HEllO!"+name;
		return message;
	}
}

HelloController.java

package com.example.myapp.di;

import org.springframework.stereotype.Controller;

@Controller
public class HelloController{
	IHElloService helloService;
    
    public void hello(String name){
    	System.out.println("HelloController:"+helloService.sayHello(name));
    }
}

 

ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ์•„์ด์ฝ˜์ด ์ด๋ ‡๊ฒŒ ๋ณ€ํ•˜๋ฉด ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์—ˆ์Œ์„ ์˜๋ฏธ

 

 

 

๐Ÿ‹bean ์ƒ์„ฑ์šฉ annotation

<bean>ํƒœ๊ทธ์™€ ๊ฐ™์€ ์—ญํ• .

์–ด๋– ํ•œ annotation์„ ๋„ฃ์–ด๋„ ์ž‘๋™์€ ํ•˜์ง€๋งŒ. ๋ชฉ์ ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋นˆ์˜ ์•„์ด๋””๋Š” ํด๋ž˜์Šค ์ด๋ฆ„ ์ฒซ๋ฌธ์ž๋งŒ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊พผ๊ฒƒ์œผ๋กœ ์„ค์ •๋œ๋‹ค.

annotation explanation
@Component ์ผ๋ฐ˜์ ์ธ component๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค์— ์ด์šฉ
๋นˆ์ด๋ฆ„ ์ง์ ‘ ์ง€์ •ํ•˜๊ณ  ์‹ถ์„ ์‹œ @Component(value="homeController")
@Controller controller class
@Service service class
@Repository DAO class or repository class

 

 

๐Ÿ‹์˜์กด์„ฑ ์ฃผ์ž… ์„ค์ •

์˜์กด์„ฑ ์ฃผ์ž… ์„ค์ • annotation

annotation explanation
@Autowired ํƒ€์ž… ๊ธฐ์ค€ ์˜์กด์„ฑ ์ฃผ์ž…
๊ฐ™์€ ํƒ€์ž… ๋นˆ์ด ๋‘๊ฐœ ์ด์ƒ ์žˆ์œผ๋ฉด ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ๋นˆ ์ฐพ์Œ

@Autowired
IHelloService helloService;
@Qualifier ๋นˆ ์ด๋ฆ„์œผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…. @Autowired์™€ ๊ฐ™์ด ์‚ฌ์šฉ
์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ๊ฐ™์€ ํƒ€์ž… ๋นˆ์ด 2๊ฐœ ๋งŒ๋“ค์–ด์ง„๋‹ค.
์ด ๋•Œ ๋นˆ ์ด๋ฆ„ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

@Autowired
@Qualifier("niceService")
IHelloService helloService;
@Resource name์„ ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ๋นˆ ์ด๋ฆ„ ์ง€์ •
name ์†์„ฑ ์ƒ๋žตํ•˜๋ฉด ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ๋นˆ ์ฐพ๋Š”๋‹ค.

@Resource(name="niceService")
IHelloService helloService;
@Inject @Autowired์™€ ๋™์ผ

@Inject
IHelloService helloService;

 

๐Ÿ‹๋นˆ ์ƒ์„ฑ, ์˜์กด์„ฑ ์ฃผ์ž… ๋ฌธ์ œ ํ•ด๊ฒฐ

@Inject, @Autowired๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ๊ฐ™์€ ํƒ€์ž… ๋นˆ์ด 2๊ฐœ ์ด์ƒ ์žˆ์œผ๋ฉด ๋ณ€์ˆ˜ ์ด๋ฆ„ ๊ธฐ์ค€์œผ๋กœ ๋นˆ์„ ์ฐพ๋Š”๋‹ค

์ด๋•Œ ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๋นˆ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค

No unique bean of type[com.exmaple.myall.di.IHelloService] is defiend: expected single matching bean but found 2:[name1, name2]

 

๐Ÿ‹์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์›์ธ ์ฐพ๊ธฐ ๊ฐ€์ด๋“œ๋ผ์ธ

1) ์Šคํ”„๋ง ์„ค์ •ํŒŒ์ผ(ex: application-config.xml) ์ด๋ฆ„, ๊ฒฝ๋กœ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ.

main()๋ฉ”์„œ๋“œ ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์‹ค์ œ ์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ ํ™•์ธ

 

2) XML์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž… -- ๋นˆ ์ƒ์„ฑ, ์˜์กด์„ฑ ์ฃผ์ž…์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ. 

setter ๋ฉ”์„œ๋“œ ๊ธฐ๋ฐ˜ DIํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ์ƒ์„ฑ์ž ์žˆ๋Š”์ง€ ํ™•์ธ

 

3) annotation DI = <context:component-scan> tag์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ

 

4) class์— @Controller, @Service๋“ฑ ๋นˆ ์ƒ์„ฑ์„ ์œ„ํ•œ DI์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ

 

5) DI์— ํ•„์š”ํ•œ ๋ฉค๋ฒ„๋ณ€์ˆ˜์œ„์— @Autowired annotation๋“ฑ์— ์˜ํ•ด ์˜์กด์„ฑ์ฃผ์ž… ์„ค์ • ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ

 

6) ์ดํด๋ฆฝ์Šค ์ข…๋ฃŒํ›„ C:/Users/{์‚ฌ์šฉ์ž๋ช…} ์•„๋ž˜์˜ .m2 ๋””๋ ‰ํ† ๋ฆฌ ์‚ญ์ œ ํ›„ ์ดํด๋ฆฝ์Šค ์‹คํ–‰

 

 

๐Ÿ 3. ์ž๋ฐ” ์„ค์ • ํŒŒ์ผ ์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž…

(java config file)

= XML๋ฌธ์„œ๋‚˜  annotation์—†์ด๋„ ์ž๋ฐ” ํด๋ž˜์Šค๋กœ ๋นˆ ์ƒ์„ฑ, ์˜์กด์„ฑ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค

 

application-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

 

HelloController.java

package com.example.myapp.di;

public class HelloController {
	IHelloService helloService;

	public void setHelloService(IHelloService helloService){
		this.helloService=helloService;
	}

	public void hello(String name){
		System.out.println("HelloController:"+helloService.sayHello(name));
	}
}

 

 

HelloMain.java

package com.example.myapp.di;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;

import com.example.myapp.config.AppConfig;

public class HelloMain {

	public static void main(String[] args) {
		AbstractApplicationContext context=
				new AnnotationConfigApplicationContext(AppConfig.class);
		HelloController controller=context.getBean(HelloController.class);
		controller.hello("HoHo");
		context.close();
	}
}

 

HelloService.java

package com.example.myapp.di;

public class HelloService implements IHelloService{
	
	@Override
	public String sayHello(String name)
	{
		System.out.println("HelloService.salyHello() method = ");
		String message="HEllO!"+name;
		return message;
	}
}

 

IHelloService.java

package com.example.myapp.di;

public interface IHelloService {
	String sayHello(String name);
}

 

AppConfig.java

package com.example.myapp.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

import com.example.myapp.di.HelloController;
import com.example.myapp.di.HelloService;
import com.example.myapp.di.IHelloService;

@Configuration
@ComponentScan(basePackages= {"com.example.myapp"})
@ImportResource(value= {"classpath:application-config.xml"})
public class AppConfig {
	@Bean
	IHelloService helloService() {return new HelloService();}
	
	@Bean //์˜์กด์„ฑ ์ฃผ์ž…!!
	HelloController helloController()
	{
		HelloController controller=new HelloController();
		controller.setHelloService(helloService());
		return controller;
	}

}

 

@Configuration

=์ž๋ฐ”ํด๋ž˜์Šค๊ฐ€ ์„ค์ • ํŒŒ์ผ๋กœ ์‚ฌ์šฉ๋˜๊ฒŒ ํ•œ๋‹ค

ํด๋ž˜์Šค ์„ ์–ธ๋ถ€์— ์œ„์น˜

 

@ComponentScan

=XML๋ฌธ์„œ์˜ <context:component-scan/>๊ณผ ๊ฐ™์€ ์—ญํ•  ํŒจํ‚ค์ง€ ์—ฌ๋Ÿฌ๊ฐœ ์„ค์ •์‹œ {}์‚ฌ์šฉ

 

@ImportResource

=๊ธฐ์กด์— ์žˆ๋Š” XML๋ฌด๋„ˆ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์—ญํ• 

 

@Bean

=@Bean ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ.

ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์ด ๋นˆ์˜ ์ด๋ฆ„์ด ๋œ๋‹ค.

 

 

 

๐Ÿ๋นˆ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ ์ฃผ์ž… ๋น„๊ต

XML vs Annotation

 

 


 

4. Bean ์„ค์ •ํŒŒ์ผ

+) sts-4.27.0์—์„œ ์‹คํ–‰

 

application-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- ์Šค์บ”ํ•  ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ์„ค์ • -->
    <context:component-scan base-package="com.example.myapp"/>
    
</beans>

 

โš ๏ธํ”„๋กœ์ ํŠธ๋“ค ! ํ‘œ์‹œ ์žˆ์„ ๊ฒฝ์šฐ

์•„๋ฌด ํ”„๋กœ์ ํŠธ ์„ ํƒํ•ด์„œ ์˜ค๋ฅธ์ชฝ ๋งˆ์šฐ์Šค - Maven - Update Project

 

 

SelectAll ํ›„ OK

 

 

์Šคํ”„๋ง ์„ค์ •ํŒŒ์ผ ๋‚˜๋ˆ„๊ธฐ

๊ธฐ๋Šฅ๋ณ„๋กœ XMlํŒŒ์ผ์„ ๋‚˜๋ˆ„์–ด ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค

 

 

<import>ํƒœ๊ทธ๋กœ ๋‹ค๋ฅธ ๋นˆ ์„ค์ • ํŒŒ์ผ ํฌํ•จ ๊ฐ€๋Šฅ

<import resource="context-aspect.xml"/>

 

 

์—ฌ๋Ÿฌ๊ฐœ ์„ค์ • ํŒŒ์ผ ์ง€์ •

AbstractApplicationContext context =new GenericXmlApplicationContext("context-*.xml");

์˜ˆ์‹œ

package com.example.myapp.di;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class HelloMain {

	public static void main(String[] args) {
		AbstractApplicationContext context
			=new GenericXmlApplicationContext("context-*.xml");
		HelloController controller=context.getBean(HelloController.class);
		controller.hello("hoho");
		context.close();
	}
}

 

 

prototpye๊ณผ singleton

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๋นˆ ์ƒ์„ฑํ•  ๋•Œ (singletonํŒจํ„ด ์—†์–ด๋„) ์ปจํ…Œ์ด๋„ˆ ํด๋ž˜์Šค๋‹น ํ•œ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑํ•œ๋‹ค.

์Šคํ”„๋ง์€ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด ์•„๋‹Œ ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ํด๋ž˜์Šค๋„ ์‹ฑ๊ธ€ํ†ค์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.

binํƒœ๊ทธ์˜ scope (์ƒ๋ช…์ฃผ๊ธฐ) ์†์„ฑ ์ด์šฉํ•ด์„œ bean์ด ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ƒ์„ฑ๋˜๊ฒŒ ํ• ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

 

<bean>ํƒœ๊ทธ์˜ scope ์†์„ฑ

scope์†์„ฑ ๊ฐ’ ์„ค๋ช…
singleton ํ•œ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑ (๊ธฐ๋ณธ๊ฐ’)
prototype ๋นˆ ์šฉ์ฒญํ•  ๋•Œ ๋งˆ๋‹ค ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
thread ์Šค๋ ˆ๋“œ๋ณ„๋กœ ์ƒ์„ฑ. ์‹คํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ์— ์ข…์†๋œ๋‹ค.
request HTTP์š”์ฒญ๋งˆ๋‹ค ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ
session HTTP ์„ธ์…˜๋งˆ๋‹ค ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ
application singleton ์Šค์ฝ”ํ”„์™€ ์œ ์‚ฌ.
globalSession ๊ธ€๋กœ๋ฒŒ HTTP์„ธ์…˜์— ๋Œ€ํ•œ ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ
Portlet ์ง€์›ํ•˜๋Š” ์ปจํ…์ŠคํŠธ์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ
๊ธ€๋กœ๋ฒŒ ์„ธ์…˜์ด ์—†์œผ๋ฉด ์„ธ์…˜ ์Šค์ฝ”ํ”„์™€ ๊ธฐ๋Šฅ์ด ๊ฐ™๋‹ค

+) singleton, prototype ์ฐจ์ด ์•Œ๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ์ฒด getBean()๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌ๋ฐ›์•„ ==์—ฐ์‚ฐ์ž๋กœ ๋น„๊ตํ•˜๋ฉด ๊ฐ™์€์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์ œ

XML์ด์šฉํ•˜์—ฌ ๋นˆ ์ƒ์„ฑํ•  ๋•Œ bbean scope์ง€์ •

<bean id="HelloService" class="com.example.myapp.di.HelloService" scope="prototype"/>

 

Annotation์œผ๋กœ ์˜์กด์„ฑ ์„ค์ •์‹œ bean scope์ง€์ •

@Controller
@Scope("prototype")
public class HelloService implements IHelloService { }

์ž๋ฐ” ํด๋ž˜์Šค ์ด์šฉํ•˜์—ฌ ๋นˆ ์ƒ์„ฑ+์˜์กด์„ฑ ์ฃผ์ž…

@Configuration
@ComponentScan(basePackages={"com.example.myapp"})
@ImportResource(value={"classpath:application-config.xml"})
public class AppConfig {
@Bean
@Scope("prototype")
IHelloService helloService() {
return new HelloService();
}

 

Main ํด๋ž˜์Šค์—์„œ bean 2๊ฐœ ๋น„๊ตํ•ด ๋ณด๊ธฐ

package com.example.myapp.di;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class HelloMain {
    public static void main(String[] args) {
    AbstractApplicationContext context = ... ์ƒ๋žต ...;
    HelloService s1 = context.getBean(HelloService.class);
    HelloService s2 = context.getBean(HelloService.class);
    System.out.println(s1==s2);
    ...
}

 

์ปฌ๋ ‰์…˜ ํƒ€์ž… ์˜์กด์„ฑ ์„ค์ •

 

์˜์กด์„ฑ ์ฃผ์ž…ํ•ด์•ผ ํ•  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ํƒ€์ž…์ด ๋ฐฐ์—ด, ์ปฌ๋ ‰์…˜ ํƒ€์ž… ๋“ฑ์ผ ๋•Œ

์Šคํ”„๋ง ์„ค์ •ํŒŒ์ผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž… ๊ฐ€๋Šฅ

 

pom.xml

lombok ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ์ถ”๊ฐ€

<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <version>1.18.28</version>
</dependency>

 

Customer.java

package com.example.myapp.di;

 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;

 import lombok.Getter;
 import lombok.Setter;

 @Getter @Setter
 public class Customer {
 private List<String> nameList;
 private Set<String> emailList;
 private Map<Integer, String> departmentInfo;
 private Properties jobInfo;
 }

 

์Šคํ”„๋ง ์„ค์ •ํŒŒ์ผ์— ์˜์กด์„ฑ ์ฃผ์ž…ํ•  ๋•Œ ํƒœ๊ทธ

ํƒœ๊ทธ ํƒ€์ž…
<list> java.util.List ๋˜๋Š” ๋ฐฐ์—ด
<set> java.util.Set
<map> java.util.Map
<props> java.util.Properties

 

 

<list>

=๋ฐฐ์—ด, List ํƒ€์ž… ์†์„ฑ ์‚ฌ์šฉ

<value> ๋ฐ์ดํ„ฐํƒ€์ด๋น„ String์ด๊ฑฐ๋‚˜ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์ผ ๋•Œ ์‚ฌ์šฉ

<ref> List๊ฐ€ ์ด๋ฏธ ์ •์˜๋˜์–ด ์žˆ๋Š” ๋‹ค๋ฅธ ๋นˆ ๊ฐ€์งˆ ๋–„ ์‚ฌ์šฉ

<bean> ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ๋Š” ๋นˆ์ด ์•„๋‹Œ ์ƒˆ๋กœ์šด ๋นˆ ์ง์ ‘ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ

 

<set>

<value> ๋ฐ์ดํ„ฐํƒ€์ด๋น„ String์ด๊ฑฐ๋‚˜ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์ผ ๋•Œ ์‚ฌ์šฉ

<ref> List๊ฐ€ ์ด๋ฏธ ์ •์˜๋˜์–ด ์žˆ๋Š” ๋‹ค๋ฅธ ๋นˆ ๊ฐ€์งˆ ๋–„ ์‚ฌ์šฉ

<bean> ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ๋Š” ๋นˆ์ด ์•„๋‹Œ ์ƒˆ๋กœ์šด ๋นˆ ์ง์ ‘ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ

 

<map>

<entry> key๊ฐ’ value ์ง€์ •

 

<props>

<prop>ํƒœ๊ทธ๋ฅผ ์ž์‹ ํƒœ๊ทธ๋กœ ๊ฐ€์ง„๋‹ค.

<prop key="key๊ฐ’">ํ”„๋กœํผํ‹ฐ ๊ฐ’</prop>

 

 

์˜ˆ์ œ) ๋นˆ ์„ค์ • ํŒŒ์ผ

application-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="customer" class="com.example.myapp.di.Customer">
    <property name="nameList">
      <list>
        <value>JinKyoung</value>
        <value>JSook</value>
        <value>HyunJeong</value>
        <value>HyunJun</value>
        <value>HyunSu</value>
      </list>
    </property>

    <property name="emailList">
      <set>
        <value>HEOJK</value>
        <value>JSOOK</value>
        <value>JEONG</value>
        <value>JUNE</value>
        <value>SU</value>
      </set>
    </property>

    <property name="departmentInfo">
      <map>
        <entry key="10" value="Administration"/>
        <entry key="20" value="Marketing"/>
        <entry key="30" value="Purchasing"/>
        <entry key="60" value="IT"/>
      </map>
    </property>

    <property name="jobInfo">
      <props>
        <prop key="SA_MAN">Sales Manager</prop>
        <prop key="IT_PROG">IT Programmer</prop>
        <prop key="AC_MAN">Accounting Manager</prop>
        <prop key="ST_MAN">Stock Manager</prop>
      </props>
    </property>
  </bean>
</beans>

 

 

CustomerMain.java

package com.example.myapp.di;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class CustomerMain {

    public static void main(String[] args) {
        AbstractApplicationContext context =
                new GenericXmlApplicationContext("application-config.xml");

        Customer cust = context.getBean(Customer.class);

        List<String> nameList = cust.getNameList();
        System.out.println(nameList);
        System.out.println();

        Set<String> emailList = cust.getEmailList();
        System.out.println(emailList);
        System.out.println();

        Map<Integer, String> departmentInfo = cust.getDepartmentInfo();
        System.out.println(departmentInfo);
        System.out.println();

        Properties jobInfo = cust.getJobInfo();
        System.out.println(jobInfo);

        context.close();
    }
}

 

๊ฒฐ๊ณผ

 

 

 


 

์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ ์‹ค์Šต

โš ๏ธegov 3.9 ๋˜๋Š” 3.10์—์„œ spring legacy project ์ƒ์„ฑ ๊ฐ€๋Šฅ

 

๐Ÿณ๋ฌธ์ œ1

๋‹ต

MemberMain.java

package com.sample.myapp.member;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MemberMain{

	public static void main(String[] args) {
		AbstractApplicationContext context
			=new GenericXmlApplicationContext("application-config.xml");
		MemberController controller=context.getBean(MemberController.class);
		controller.printInfo();
		context.close();
	}

}

MemberController.java

package com.sample.myapp.member;

import org.springframework.stereotype.Controller;

@Controller
public class MemberController {
	
	IMemberService memberService;
	
	public void setMemberService(IMemberService memberService)
	{
		this.memberService=memberService;
	}
	public void printInfo()
	{
		System.out.println("MemberController="+memberService.getMemberInfo());
	}
}

IMemberService.java

package com.sample.myapp.member;

public interface IMemberService {
	public Member getMemberInfo();
}

MemberService.java

package com.sample.myapp.member;

import org.springframework.stereotype.Controller;

@Controller
public class MemberService implements IMemberService{
	
	@Override
	public Member getMemberInfo()
	{
		Member member=new Member();
		member.setMemberId("1234");
		member.setName("hong");
		member.setAge(10);
		member.setEmail("h@naver.com");
		
		return member;
	}
}

Member.java

package com.sample.myapp.member;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Member {
	private String memberId;
	private String name;
	private int age;
	private String email;
	
}

application-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.1.xsd">

	<bean id="memberService" class="com.sample.myapp.member.MemberService"/>
	<bean id="memberController" class="com.sample.myapp.member.MemberController">
		<property name="memberService" ref="memberService"/>
	</bean>
</beans>

 

๊ฒฐ๊ณผ

 

 

 

๐Ÿณ๋ฌธ์ œ2

๋‹ต

EmpMain.java

package com.example.myapp.hr;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;


public class EmpMain {

    public static void main(String[] args) {

        AbstractApplicationContext context = 
                new GenericXmlApplicationContext("application-config.xml");

        EmpController controller = context.getBean(EmpController.class);
        controller.printInfo();
        context.close();
    }
}

EmpController.java

package com.example.myapp.hr;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class EmpController {

    private final IEmpService empService;

    @Autowired
    public EmpController(IEmpService empService) {
        this.empService = empService;
    }

    public void printInfo() {
        int count = empService.getEmpCount(50);
        System.out.println("์‚ฌ์›์˜ ์ˆ˜: " + count);
    }
}

 

IEmpService.java

package com.example.myapp.hr;

public interface IEmpService {
	int getEmpCount(int deptid);
}

EmpService.java

package com.example.myapp.hr;

import org.springframework.stereotype.Controller;

@Controller
public class EmpService implements IEmpService {
	@Override
	public int getEmpCount(int deptid)
	{
		if(deptid==50)
		{
			return 5;
		}
		else {
			return 0;	
		}
	}
}

 

Employee.java

package com.example.myapp.hr;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Employee {
	private int employeeId;
	private String firstName;
	private String lastName;
	private String email;
	private String phoneNumber;
	private java.sql.Date hireDate;
	private String jobId;
	private double salary;
	private double commissionPct;
	private int managerId;
	private int departmentId;
}

application-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.example.myapp.hr" />

</beans>

 

 

๊ฒฐ๊ณผ