@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이 붙은 필드에 대해서만 생성자를 만들어 준다.