[Spring] @Autowired와 @RequiredArgsConstructor 차이

yjkim97·2023년 7월 12일
2

Spring & Spring boot

목록 보기
5/6
post-thumbnail

Spring에서는 Bean DI를 지원하는 어노테이션 @Autowired@RequiredArgsConstructor가 있다.

@Autowired는 Bean 주입시마다 달아줘야하지만, @RequiredArgsConstructor는 해당 클래스에 달고 private final로 Bean을 주입하면 되서 코드가 깔끔해지고 가독성이 높다고 느낀다.
이런 이유로 나는 @RequiredArgsConstructor 사용하고 있었는데 많은 글들이 @Autowired 대신 @RequiredArgsConstructor를 사용하라고 한다.

왜일까? 이 두개는 무슨 차이가 있길래 그러는걸까?

@Autowired

@Service
public class AService {
	@Autowired
    private BService bService;
}
  • @Autowired를 활용한 DI를 필드 주입이라고 한다.
  • 이 Annotation을 특정 필드에 부여하면 Spring IoC Container 안에 존재하는 해당 Type의 Bean을 찾아 자동 주입해준다.
    위 코드를 해석하자면 Spring IoC Container가 관리하고 있는 BService 타입의 Bean이 bService 매개변수에 주입되는 것이다.

@RequiredArgsConstructor

@Service
@RequiredArgsConstructor
public class AService {
    private final BService bService;
}
  • @RequiredArgsConstructor를 활용한 DI를 생성자 주입이라고 한다.
  • 해당 Class의 생성자를 자동으로 만들어주는 lombok Annotation이다.
    priate final 접근제어자로 선언된 멤버변수를 생성자 파라미터로 넣어준다.

왜 @RequiredArgsConstructor을 권장하지?

Spring Team recommends: “Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies”.

Spring 4.3부터는 @Autowired사용을 지양하고 항상 생성자 주입을 사용하는 것을 권장한다.

생성자 주입 장점

1. 순환 참조 방지

아래와 같은경우 순환 참조 에러가 발생할 수 있다.

@Service
public class AService {
	@Autowired
    private BService bService;
}

@Service
public class BService {
	@Autowired
    private AService aService;
}

2. 테스트 코드 작성 용이

Spring Container의 도움 없이 테스트 코드를 편리하게 작성 할 수 있다.
단. @RequiredArgsConstructor은 Spring Test쪽에서는 lombok 적용이 안되므로 사용할 수 없다.

3. 코드 악취 제거

4. 객체 변이 방지

final 선언이 가능하기 때문에 Runtime시 주입된 Bean 객체의 불변성을 보장한다.


여기서 말하는 생성자 주입하는 코드는 아래와 같다.

@Service
public class AService {
    private final BService bService;
    private final CService cService;
    
    public AService(BService bService, CService cService)
    {
    	this.bService = bService;
        this.cService = cService;
    }
}

위 처럼 생성자 주입으로 작성하게 되면 주입할 Bean이 많아지면 많아질 수록 정말 많이 번거롭다.
이런 번거로움을 해결해주고 코드를 줄여주며 생성자 주입 기능을 지원하는 Annotation이 @RequiredArgsConstructor이다.

profile
어제는 🐸두꺼비 오늘은 😄YJ

0개의 댓글