[Spring] ์์กด์ฑ ์ฃผ์ (Dependency Injection, DI)
๐์์กด์ฑ์ด ๋ฌด์์ธ๊ฐ?
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ํด๋์ค 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;
// ...
}
// ...
}