Field Injection(ํ•„๋“œ ์ฃผ์ž…)

๋ณ€์ˆ˜ ์„ ์–ธ๋ถ€์— @Autowired Annotation์„ ๋ถ™์ธ๋‹ค.

@Component
public class SampleController {
    @Autowired
    private SampleService sampleService;
}

 

ํ•„๋“œ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ด์œ 

1. ๋‹จ์ผ ์ฑ…์ž„(SRP)์˜ ์›์น™ ์œ„๋ฐ˜ 

์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค.
@Autowired ์„ ์–ธ ์•„๋ž˜ ๊ฐœ์ˆ˜ ์ œํ•œ ์—†์ด ๋ฌดํ•œ์ • ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. Constructor์˜ parameter๊ฐ€ ๋งŽ์•„์ง๊ณผ ๋™์‹œ์— ํ•˜๋‚˜์˜ Class๊ฐ€ ๋งŽ์€ ์ฑ…์ž„์„ ๋– ์•ˆ๋Š”๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ๋œ๋‹ค.

 

2. ์˜์กด์„ฑ์ด ์ˆจ๋Š”๋‹ค. 

DI Container๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ Class๊ฐ€ ์ž์‹ ์˜ ์˜์กด์„ฑ๋งŒ ์ฑ…์ž„์ง„๋‹ค๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ œ๊ณต๋œ ์˜์กด์„ฑ ๋˜ํ•œ ์ฑ…์ž„์ง„๋‹ค. ๊ทธ๋ž˜์„œ Class๊ฐ€ ์–ด๋–ค ์˜์กด์„ฑ์„ ์ฑ…์ž„์ง€์ง€ ์•Š์„ ๋•Œ, ๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด(Setter๋‚˜ Constructor) ํ™•์‹คํžˆ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ๋˜์–ด์•ผํ•œ๋‹ค.

ํ•˜์ง€๋งŒ Field Injection์€ ์ˆจ์€ ์˜์กด์„ฑ๋งŒ ์ œ๊ณตํ•ด์ค€๋‹ค.

 

3. DI container์˜ ๊ฒฐํ•ฉ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ

DI Framework์˜ ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ๊ด€๋ฆฌ๋˜๋Š” Class๊ฐ€ DI Container์— ์˜์กด์„ฑ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

DI Container ์—†์ด๋„ Unit Test์—์„œ Instanceํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ , ๊ฐ๊ฐ ๋‚˜๋ˆ„์–ด์„œ ํ…Œ์ŠคํŠธ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค. Container์˜ ๊ฒฐํ•ฉ์„ฑ์ด ์—†๋‹ค๋ฉด ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” Class๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์‹ฌ์ง€์–ด ๋‹ค๋ฅธ DI Container๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, Field Injection์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ๊ฐ€์ง„ Class๋ฅผ ๊ณง๋ฐ”๋กœ Instanceํ™” ์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค.

 

4. ๋ถˆ๋ณ€์„ฑ

Constructor Injection๊ณผ ๋‹ค๋ฅด๊ฒŒ Field Injection์€ final์„ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

5. ์ˆœํ™˜ ์˜์กด์„ฑ

Constructor Injection์—์„œ ์ˆœํ™˜ ์˜์กด์„ฑ์„ ๊ฐ€์งˆ ๊ฒฝ์šฐ BeanCurrentlyCreationExeption์„ ๋ฐœ์ƒ์‹œํ‚ด์œผ๋กœ์จ ์ˆœํ™˜ ์˜์กด์„ฑ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

๊ทธ๋Ÿฌ๋‚˜ Field Injection์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๋ง๊ณ ๋Š” ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

์ˆœํ™˜ ์˜์กด์„ฑ?
A Class๊ฐ€ B Class๋ฅผ ์ฐธ์กฐํ•˜๋Š”๋ฐ B Class๊ฐ€ ๋‹ค์‹œ A Class๋ฅผ ์ฐธ์กฐํ•  ๊ฒฝ์šฐ,A Class๊ฐ€ B Class๋ฅผ ์ฐธ์กฐํ•˜๊ณ , B Class๊ฐ€ C Class๋ฅผ ์ฐธ์กฐํ•˜๊ณ  C Class๊ฐ€ A Class๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ์ˆœํ™˜ ์˜์กด์„ฑ(Circular Dependency)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

์ฝ๊ธฐ ์‰ฝ๊ณ  ์‚ฌ์šฉ์ด ํŽธํ•˜๋‹จ๊ฒƒ ์ด์™ธ์—” ์žฅ์ ์ด...

 

 

 

Setter Injection(์ˆ˜์ •์ž ์ฃผ์ž…)

Setter Injection์€ ์„ ํƒ์ ์ธ ์˜์กด์„ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ ์˜์กด์„ฑ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

//Setter Injection์€ set Method๋ฅผ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
@Component
public class SampleController {
    private SampleService sampleService;
 
    @Autowired
    public void setSampleService(SampleService sampleService) {
        this.sampleService = sampleService;
    }
}

Setter Injection์œผ๋กœ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์€ ๋Ÿฐํƒ€์ž„์‹œ์— ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ Setter Injection์„ ํ†ตํ•ด์„œ Service์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ฃผ์ž…ํ•ด์ฃผ์ง€ ์•Š์•„๋„ Controller ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Controller ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋‚ด๋ถ€์— ์žˆ๋Š” Service์˜ method ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, set์„ ํ†ตํ•ด Service์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ฃผ์ž…ํ•ด์ฃผ์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, NullPointerException ์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

์ฃผ์ž…์ด ํ•„์š”ํ•œ ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…์ด ๋˜์ง€ ์•Š์•„๋„ ์–ผ๋งˆ๋“ ์ง€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๋‹ค.

 

์ด๋ฅผ ํ•ด๊ฒฐํ•  ์•„์ด๊ฐ€ Constructor Injection์ด๋‹ค

 

 

 

 

Constructor Injection(์ƒ์„ฑ์ž ์ฃผ์ž…)

//Constructor์— @Autowired Annotation์„ ๋ถ™์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
@Component
public class SampleService {
    private SampleDAO sampleDAO;
 
    @Autowired
    public SampleService(SampleDAO sampleDAO) {
        this.sampleDAO = sampleDAO;
    }
}

@Component
public class SampleController {

	private final SampleService sampleService = new SampleService(new SampleDAO());
    
	...
}

 

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ด์œ !!!

(Spring Framework Reference์—์„œ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์ฃผ์ž…~!)

์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ข‹์€ ์ด์œ ๋Š” ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์˜์กด์„ฑ ์—†์ด๋Š” Instance๋ฅผ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

Spring 4.3๋ฒ„์ „๋ถ€ํ„ฐ๋Š” Class๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ DI Framework๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹จ์ผ ์ƒ์„ฑ์ž์— ํ•œํ•ด @Autowired๋ฅผ ๋ถ™์ด์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

๋˜ํ•œ ์•ž์„œ ์‚ดํŽด๋ณธ Field Injection์˜ ๋‹จ์ ๋“ค์„ ์žฅ์ ์œผ๋กœ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

  • null์„ ์ฃผ์ž…ํ•˜์ง€ ์•Š๋Š” ํ•œ NullPointerException ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • final ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ˆœํ™˜ ์˜์กด์„ฑ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ธฐ๊ฐ€ ๋ฒˆ๊ฑฐ๋กœ์›Œ ์œ„๊ธฐ๊ฐ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ๋‹ค. (์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SRP์›์น™์„ ์ƒ๊ฐํ•˜๊ฒŒ ๋˜๊ณ  ๋ฆฌํŒฉํ† ๋งํ•˜๊ฒŒ๋œ๋‹ค.)

Reference.

link1

+ Recent posts