[Spring] @Autowired ? @RequiredArgsConstructor ?

sorzzzzy·2021년 12월 23일
0

TIL

목록 보기
18/36
post-thumbnail

오늘은 스프링 부트를 공부하면서 자주 사용했던 어노테이션에 대해 글을 작성해보겠다.


의존성 주입(Dependency Injection)

스프링 프레임워크는 3가지 핵심 프로그래밍 모델을 지원하고 있는데, 그 중 하나가 의존성 주입(Dependency Injection, DI) 이다.
DI란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 다이나믹하게 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다.

의존성이란 한 객체가 다른 객체를 사용할 때 의존성이 있다고 한다.

public class Store { 
	private Pencil pencil; 
}


예를 들어 위와 같이 Store 객체가 Pencil 객체를 사용하고 있는 경우에 우리는 Store 객체가 Pencil 객체에 의존성이 있다고 표현한다.

그리고 이 두 객체 간의 관계를 맺어주는 것을 의존성 주입이라고 하는데,
여기에는 생성자 주입, 필드 주입 등 여러가지가 있지만 요즘에는 생성자 주입을 강력히 권장하고 있다.


@Autowired

@Autowired란, 스프링 DI(Dependency Injection)에서 사용되는 어노테이션으로,
스프링에서 빈 인스턴스가 생성된 이후 @Autowired를 설정한 메서드가 자동으로 호출되고, 인스턴스가 자동으로 주입된다.

즉, 해당 변수 및 메서드에 스프링이 관리하는 Bean을 자동으로 매핑해주는 개념이다.
@Autowired 는 변수, Setter 메서드, 생성자, 일반 메서드에 적용이 가능하며 <property>, <constructor-arg> 태그와 동일한 역할을 한다.

@Autowired 는 주로 타입(Type)을 이용해 주입 한다.
@AutowiredType 으로 찾아서 주입하므로 동일한 Bean 타입의 객체가 여러개 있을 경우, Bean 을 찾기 위해 @Qualifier 어노테이션을 같이 사용해야 한다.

public class AutowiredExController {
    @Autowired
    private AutowiredExService autowiredExService;
}

위와 같이 의존성을 주입할 객체 위에 @Autowired 어노테이션을 붙여주면 자동으로 의존성이 주입된다.


🤚🏻 그러나 스프링 4.3 부터는 위 방법을 지양하고 있다!!

대신에 @RequiredArgsConstructor 사용을 지향하는데 그 이유에 대해 알아보자.

1. 순환 참조 방지

  • 객체의 의존성을 추가하다 보면 순환 참조 문제가 발생할 수 있다.

2. final 선언이 가능하다.

  • 런타임에 객체 불변성을 보장한다.

3. 테스트 코드 작성 용이

  • 스프링 컨테이너 도움 없이 테스트 코드를 편리하게 작성할 수 있다.

@RequiredArgsConstructor

@RequiredArgsConstructor 는 생성자를 자동으로 생성해주는 어노테이션이다.
final 키워드가 붙은 멤버변수를 생성자 파라미터로 알아서 넣어준다.

public class AutowiredExController {
   @RequiredArgsConstrucotr
   final AutowiredExService autowiredExService;
}
public AutowiredExController(finale AutowiredExService autowiredExService) {
    this.autowiredExService =autowiredExService;
}

위의 두 가지 코드는 같은 코드이다.


📌 참고 자료

profile
Backend Developer

0개의 댓글