(Spring) DI/의존 객체 주입 패턴 + Lombok

2022. 9. 20. 22:30Spring

반응형

🧐 스프링의 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 어노테이션을 이용한 방식이다.

 

 

이 방식의 문제점은 외부에서 접근이 불가능하다는 것이다.

 

 

한마디로 테스트 코드를 작성할 수 없게 된다.

 

 

그래서 이 방식 역시 잘 사용하지 않는다.

(테스트 코드에서는 많이 씀)

반응형