@RequiredArgsConstructor

seul·2022년 12월 20일
0

공부

목록 보기
6/13
post-thumbnail

JPA 강의를 다시 듣고 있다.
전에도 알았던 내용인데 너무 당연하게 쓰고 있어서 왜 이렇게 썼더라? 싶은 것을 적어본다.

@AutoWired 말고 써보자, @RequiredArgsConstructor

🧐 @AutoWired?

예전에는 의존성 주입을 위해서는 필드에 AutoWired를 붙여 사용했다.
그런데

이제는 필드에 붙이는 것을 추천하지 않는다고 한다.
그럼 뭘 써야 하지?

😯 Setter?

setter로 주입하는 방법이 있다.

@Service
public class OrderService {

    private OrderRepository orderRepository;

    @Autowired // 필ㄷ에서 옮겨온 Autowired
    public void setOrderRepository(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
}

이렇게 적으면 테스트 시에도 원하는 객체를 주입할 수 있다.

이때,
이런 Repository는 변경될 일이 없기 마련이라 final 키워드를 붙여주는데

에러 발생...
final을 쓰려면 초기화가 필요하다는 것!
그래서 나온 방법이

🙂 Constructor (생성자)

생성자로 주입하는 것이다.

@Service
public class OrderService {

    private final OrderRepository orderRepository;

    @Autowired
    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
}

(여기서 @Autowired는 제외해도 된다. 생성자가 하나만 있으면 자동으로 해준다고 한다.)

그런데 (왜 또)
의존성을 주입해줄 것이 생기면 생길 때마다 작성하기 너무 귀찮지 않을까?
그래서

😄 @AllArgsConstructor

@Service
@AllArgsConstructor
public class OrderService {

    private final OrderRepository orderRepository;

}

@AllArgsConstructor를 붙인다.
그런데 All은... 좀 투머치 아닌가?

🥰 @RequiredArgsConstructor (최종)

@Service
@RequiredArgsConstructor
public class OrderService {

    private final OrderRepository orderRepository;

}

@RequiredArgsConstructor는 final 키워드가 붙은 필드만 생성자로 만들어준다.
그래서 요즘에는 @RequiredArgsConstructor를 쓴다고 한다.

그냥 막 붙이지 말고 이유를 잊지 말기!

또 다른 설명: https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/

profile
자존감은 일상의 성실함으로부터 온다

0개의 댓글