본문 바로가기

CS 잡지식

여러 가지의 의존관계 주입 방법과 장/단점

@Service
@Transactional(readOnly = true) // public으로 지정된 메서드에 붙는다.
                                // 읽기 전용으로 트랜잭션을 걸면, 성능 최적화가 일어난다.
public class MemberService {

    @Autowired // 의존 관계 주입 방법 1 : 필드 초기화, 단점 : 한 번 의존관계가 주입되면 의존관계 변경 불가능! 테스트할 때에 이리저리 바꿔 보지 못함.
    MemberRepository memberRepository;

    @Autowired // 의존 관계 주입 방법 2 : setter Injection, 단점 : 런타임에 이 세터에 의해 의존관계가 변경될 수가 있다!
    public void setMemberRepository(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }

    @Autowired // 의존 관계 주입 방법 3 :생성자 주입(많이 사용됨). 위 2개의 단점을 모두 보완.
    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }

    //의존 관계 주입 방법 4 : final 과 생성자의 조합(이 방법이 가장 많이 사용됨)
    // final 키워드를 붙임으로써 생성자가 없으면, 빨간불이 뜨면서 컴파일 타임에서 오류를 잡아 준다.
    // 또한 final 키워드로 인해 객체 생성 시점에만 값을 바꿀 수가 있고, 그 이후 시점에서는 의존관계가 변경 안됨.
   /*
        private final MemberRepository memberRepository;
        //생성자가 1개 일 때에는 자동으로 @Autowired를 붙여준다.
        public MemberService(MemberRepository memberRepository){

            this.memberRepository = memberRepository;

           }
    */

    //의존 관계 주입 방법 5 : Lombok의 [@AllArgsConstor]과 final의 조합
    //  private final MemberRepository memberRepository 만 있으면 되고
    // 생성자는 Lombok이 만들어 줌.

    //의존 관계 주입 방법 6 : Lombok의 [@RequiredArgsConstructor]과 final의 조합
    //  private final MemberRepository memberRepository 만 있으면 되고
    // 생성자는 Lombok이 만들어 줌.
    // [@RequiredArgsConstructor]은 final이 붙은 필드에 대해서만 생성자를 만들어 준다.