JPA 강의를 다시 듣고 있다.
전에도 알았던 내용인데 너무 당연하게 쓰고 있어서 왜 이렇게 썼더라? 싶은 것을 적어본다.
예전에는 의존성 주입을 위해서는 필드에 AutoWired를 붙여 사용했다.
그런데
이제는 필드에 붙이는 것을 추천하지 않는다고 한다.
그럼 뭘 써야 하지?
setter로 주입하는 방법이 있다.
@Service
public class OrderService {
private OrderRepository orderRepository;
@Autowired // 필ㄷ에서 옮겨온 Autowired
public void setOrderRepository(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
}
이렇게 적으면 테스트 시에도 원하는 객체를 주입할 수 있다.
이때,
이런 Repository는 변경될 일이 없기 마련이라 final 키워드를 붙여주는데
에러 발생...
final을 쓰려면 초기화가 필요하다는 것!
그래서 나온 방법이
생성자로 주입하는 것이다.
@Service
public class OrderService {
private final OrderRepository orderRepository;
@Autowired
public OrderService(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
}
(여기서 @Autowired는 제외해도 된다. 생성자가 하나만 있으면 자동으로 해준다고 한다.)
그런데 (왜 또)
의존성을 주입해줄 것이 생기면 생길 때마다 작성하기 너무 귀찮지 않을까?
그래서
@Service
@AllArgsConstructor
public class OrderService {
private final OrderRepository orderRepository;
}
@AllArgsConstructor를 붙인다.
그런데 All은... 좀 투머치 아닌가?
@Service
@RequiredArgsConstructor
public class OrderService {
private final OrderRepository orderRepository;
}
@RequiredArgsConstructor는 final 키워드가 붙은 필드만 생성자로 만들어준다.
그래서 요즘에는 @RequiredArgsConstructor를 쓴다고 한다.
그냥 막 붙이지 말고 이유를 잊지 말기!
또 다른 설명: https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/