Spring Boot - DI

개발자·2022년 8월 14일
0

Spring boot 개념정리

목록 보기
5/5
post-thumbnail

📝 DI

✔️ DI ?

  • Dependency Injection ( 의존성 주입 )

  • Spring의 핵심개념이다.

  • 어떠한 객체가 사용하는 의존 객체를 직접 만들어 사용하는것이 아니라,
    주입 받아서 사용하는 개념이다.

  • 강하게 결합된 클래스들을 분리하고, 애플리케이션 실행 시점에서 객체간의 관계를 결정해 줌으로써, 결합도를 낮추고 유연성을 확보해준다.

✔️ DI 주입 방법

필드 주입 ( Field Injection )

  • 코드가 간단하다는 장점을 가지고 있다.
  • But ) 외부에서 수정이 불가능하고, 테스트 코드 작성 시 에러가 있다.
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
}

수정자 주입 ( Method Injection )

  • Setter 혹은 사용자 정의 메소드를 통해 객체 의존 관계를 주입하는 방식
  • But ) public 으로 구현하기 때문에, 관계를 주입받는 객체의 변경 가능성을 열어두게 된다.
@Service
public class UserService {

    private UserRepository userRepository;

    @Autowired
    public void setUserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
}

생성자 주입 ( Constructor Injection )

  • 생성자를 통해 의존 관계를 주입하는 방법이다.

  • 생성자의 호출 시점에 1회 호출 되는것이 보장된다.

  • Spring Framework에서 적극 지원하는 방법으로, 생성자가 한개만 있을경우에 @Autowired Annotation을 생략하여도 주입되도록 되어있다.

생성자 주입의 장점
1. 순환 참조를 방지한다.
2. 테스트에 용이하다.
3. 의존성이 명시적으로 들어난다.
4. Field를 final로 선언 할 수 있어 불변성을 갖는다.
5. 불변객체나 NULL이 아님을 보장하여 오류를 방지할 수 있다.

@Service
public class UserService {

    private UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
}

✔️ Lombok 생성자 주입

  • @RequiredArgsConstructor 을 통해서 생성자를 주입한다.

  • @RequiredArgsConstructor Annotation : 클래스에 선언된 final 변수들, 필드들을 매개변수로 하는 생성자를 자동으로 생성해주는 어노테이션

@RequiredArgsConstructor
@Service
public class UserService {

    private final UserRepository userRepository;
    
}

0개의 댓글