2022. 9. 20. 22:30ㆍSpring
🧐 스프링의 DI
스프링의 특징이라고 할 수 있는 DI는 Dependency Injection의 준말이다.
말 그대로 의존성 주입이며, 기본적으로 의존 객체 주입 패턴으로 이루어져 있다.
스프링에서는 bean을 직접 생성하는 것이 아닌 IoC, 즉 스프링 컨테이너가 관리하고 있다.
스프링은 가장 먼저 Controller 어노테이션을 찾고 이후 wiring 되어 있는 객체를 순차적으로 생성해서
컨테이너에 등록하는데,
이때 DI, 즉 의존관계 주입이 필요하다.
의존관계 주입에는 다음과 같은 방식이 주를 이룬다.
- 생성자 주입 방식
- setter 주입 방식
- autowired 어노테이션 주입 방식
🧐 생성자 주입 방식
public class MovieController {
private final MovieService movieSerivce;
public MovieController(MovieService MovieService) {
this.movieService = movieService;
}
}
생성자 주입 방식은 위에서 본 방식과 동일하다.
Spring에서는 이를 Lombok을 사용해서 다른 방식으로 쓰기도 한다.
@RequiredArgsConstructor
public class MovieController {
private final MovieService movieSerivce;
}
@RequiredArgsContructor는 멤버 변수를 자동으로 생성자에 주입해주는 Lombok 어노테이션이다.
이때 주의해야 할 점은 반드시 멤버 변수가 final 이어야 한다는 것이다.
🧐 setter 주입 방식
public class MoviewController {
private MovieService movieService;
@Autowired
private void setMovieService(MovieService movieService) {
this.moviewSerivce = movieService;
}
}
setter 주입 방식은 말 그대로 setter 메서드를 사용해서 주입하는 방식이다.
@Autowired 어노테이션이 반드시 존재해야 하며,
주입받는 객체가 변경될 가능성이 있는 경우에 사용된다.
하지만 객체 변경이 일어나는 것 자체가 흔치 않고,
객체 변경이 일어나는 것은 안티 패턴이기 때문에 선호되지 않는다.(뇌피셜)
🧐 필드 주입 방식
public class MovieController {
@Autowired
private MovieService movieService;
...
}
@Autowired 어노테이션을 이용한 방식이다.
이 방식의 문제점은 외부에서 접근이 불가능하다는 것이다.
한마디로 테스트 코드를 작성할 수 없게 된다.
그래서 이 방식 역시 잘 사용하지 않는다.
(테스트 코드에서는 많이 씀)
'Spring' 카테고리의 다른 글
(Spring) JpaRepository는 인터페이스인데 어떻게 동작할까? (0) | 2023.08.31 |
---|---|
(Spring) JPA exists를 최적화하는 여러가지 방법들 (0) | 2022.11.05 |
(Spring) Transactional 사용법 (0) | 2022.08.10 |
(Spring) Why Maven? Why Gradle? (0) | 2022.08.07 |
(Spring) MVC에 대해서 (0) | 2022.02.21 |