‡๐Ÿ‘ฉ‍๐Ÿ’ป ‡/ºSpring

[Spring] ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection, DI)

Trudy | ์†ก์—ฐ 2023. 12. 20. 20:46

๐Ÿ“์˜์กด์„ฑ์ด ๋ฌด์—‡์ธ๊ฐ€? 

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํด๋ž˜์Šค A๊ฐ€ ํด๋ž˜์Šค B์˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํด๋ž˜์Šค A๋Š” ํด๋ž˜์Šค B์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž…์€ ์ด ์˜์กด ๊ด€๊ณ„๋ฅผ ํด๋ž˜์Šค A๊ฐ€ ์ง์ ‘ ํด๋ž˜์Šค B๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์™ธ๋ถ€์—์„œ ํด๋ž˜์Šค B์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// ํด๋ž˜์Šค B
public class B {
    public void methodB() {
        System.out.println("Class B์˜ methodB๊ฐ€ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
    }
}

// ํด๋ž˜์Šค A
public class A {
    private B b; // ํด๋ž˜์Šค A๋Š” ํด๋ž˜์Šค B์˜ ์ธ์Šคํ„ด์Šค์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

    // ํด๋ž˜์Šค A๋Š” ํด๋ž˜์Šค B์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…๋ฐ›์Šต๋‹ˆ๋‹ค. (์ƒ์„ฑ์ž ์ฃผ์ž…)
    public A(B b) {
        this.b = b;
    }

    public void useBMethod() {
        // ํด๋ž˜์Šค A๋Š” ํด๋ž˜์Šค B์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
        b.methodB();
    }
}

 

์Šคํ”„๋ง์€ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ๊ตฌํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด์„ฑ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

 

์Šคํ”„๋ง์—์„œ Layered Architecture์„ ์‚ฌ์šฉํ•ด์„œ Controller์˜ ์—ญํ• ์„ Controller, Service, Repository 3๊ฐ€์ง€๋กœ ๋‚˜๋ˆˆ๋‹ค. 

Controller๋Š” Service์„ ํ˜ธ์ถœํ•˜๊ณ , Service๋Š” Repository๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ๋ฐ, ์Šคํ”„๋ง์—์„œ ๊ด€๋ฆฌํ•˜๋Š” Bean๋“ค์€ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ํ•œ๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— Controller์—๋Š” Service๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— Service์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์ฃผ์ž…์„, Service๋Š” Repository๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— Repository์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•ด์คŒ์œผ๋กœ์จ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. 

 

์˜์กด์„ฑ ์ฃผ์ž…์€ ๋‹ค์Œ 4๊ฐ€์ง€๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“์˜์กด์„ฑ ์ฃผ์ž…

 

1. ์ƒ์„ฑ์ž ์ฃผ์ž…

 

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

public class MovieService {

    private final MovieRepository movieRepository;

    public MovieService(MovieRepository movieRepository) {
        this.movieRepository = movieRepository;
    }

    // ...
}

 

 

2. Setter ์ฃผ์ž…

๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž ์ฃผ์ž…๊ณผ ํ•„๋“œ ์ฃผ์ž…์˜ ์žฅ๋‹จ์ ์„ ๋ณด์™„ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

public class MovieService {

    private MovieRepository movieRepository;

    public void setMovieRepository(MovieRepository movieRepository) {
        this.movieRepository = movieRepository;
    }

    // ...
}

 

 

3. ํ•„๋“œ ์ฃผ์ž…

 

๊ฐ์ฒด์˜ ํ•„๋“œ์— ์ง์ ‘ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž ์ฃผ์ž…๋ณด๋‹ค ์œ ์—ฐํ•˜์ง€๋งŒ, ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Autowired
private MovieRepository movieRepository;

 

4. ๋ฉ”์„œ๋“œ ์ฃผ์ž…

 

๋ฉ”์„œ๋“œ ์ฃผ์ž…์€ ๊ฐ์ฒด๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ์˜์กด์„ฑ์„ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ฃผ์ž…ํ•˜๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์˜ ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด์˜ ํ•„๋“œ์— ์ง์ ‘ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ํ•„๋“œ ์ฃผ์ž…๊ณผ ๋‹ฌ๋ฆฌ, ๋ฉ”์„œ๋“œ ์ฃผ์ž…์€ ๊ฐ์ฒด๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ์˜์กด์„ฑ์„ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Service
public class MovieService {

    private MovieRepository movieRepository;

    @Autowired
    public void findMovies(String title) {
        this.movieRepository = movieRepository;
        // ...
    }

    // ...
}