@Autowired는 필드 주입이고, @RequiredArgsConstructor는 생성자 주입(Constructor Injection) 입니다.
@RequiredArgsConstructorLombok에서 제공하는 어노테이션 입니다.

결론적으로 생성자 주입을 권장합니다. 인텔리제이에서 코드를 작성하다보면 @Autowired를 사용하면 아래와 같은 경고를 알려줍니다.

경고

Field injection is not recommended
Inspection info: Spring Team recommends: “Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies”.

뭐.. 추천하지 않고 생성자 주입방식을 쓰라고 하는거 같네요.

생성자 주입으로 코드를 작성하면 아래와 같은 장점이 있습니다.

  1. 순환 참조 방지
  2. 테스트 코드 작성 용이
  3. 코드 악취 제거
  4. 객체 변이 방지

필드 주입방식을 쓰면 아래와 같은 단점이 있습니다.

  1. 단일 책임의 원칙 위반
  2. 숨은 의존성 제공
  3. 의존성을 가진 클랙스를 곧바로 인스턴스화 할 수 없음
  4. final을 선언할 수 없기 때문에 객체가 변할 수 있음

Lombok를 쓰면 아래와 같이 간단하게 처리 할 수 있습니다.

1
2
3
4
5
6
7
@Controller
@RequiredArgsConstructor
public class ItemController {
  private final ItemService itemService;

  private final OrderService orderService;
}

만약 Lombok을 사용하지 않으면 아래와 같이 처리해야 합니다. 아래와 같이 생성자가 1개인 경우는 @Autowired를 생략해도 됩니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@Controller
public class ItemController {
    private final ItemService itemService;
    private final OrderService orderService;

    @Autowired
    public ItemController(final ItemService itemService, final OrderService orderService) {
        this.itemService = itemService;
        this.orderService = orderService;
    }
}