한 개 이상의 @Bean을 제공하는 클래스에 명시하는 어노테이션으로, IOC Container에게 해당 클래스가 Bean으로 구성된 클래스라는 것을 알려줍니다.
@Bean
개발자가 직접 제어할 수 없는 외부 라이브러리들을 Bean으로 만들 때 사용합니다.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
@Autowired
필드, 생성자, 수정자 메소드에 사용하는 어노테이션으로, 무조건적인 객체에 대한 의존성을 주입시킵니다.
@Component
Java Bean에 등록하지 않아도 자동 주입이 가능하도록 해주는 어노테이션입니다. 개발자가 직접 개발한 클래스를 Bean에 등록할 경우 @Component 어노테이션을 사용하면 됩니다.
@Autowired
스프링에서 빈 인스턴스가 생성된 후, @Autowired로 설정된 메소드, 필드가 자동으로 호출됩니다.
@Controller
해당 클래스가 Controller임을 명시합니다. @Component 어노테이션을 사용해도 상관 없지만 @Cotroller 어노테이션에 @Component 어노테이션의 기능이 포함되어 있고 @Controller를 사용함으로써 해당 클래스가 Controller 역할을 하는 것을 명확하게 알 수 있습니다.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Service
해당 클래스가 비즈니스 로직을 담은 Service 클래스임을 명시합니다. @Component 어노테이션을 사용해도 상관 없지만 @Sevice 어노테이션에 @Component 어노테이션의 기능이 포함되어 있고 @Service를 사용함으로써 해당 클래스가 Service의 역할을 하는 것을 명확하게 알 수 있습니다.
@Repository
해당 클래스가 Repository임을 명시합니다. @Component 어노테이션을 사용해도 상관 없지만 @Repository 어노테이션에 @Component 어노테이션의 기능이 포함되어 있고 @Repository를 사용함으로써 해당 클래스가 Repositorydml 역할을 하는 것을 명확하게 알 수 있습니다.
스프링에서 가장 권장하는 방식입니다. 단일 생성자인 경우에는 @Autowired 어노테이션을 붙이지 않아도 되지만 생성자가 2개 이상인 경우에는 생성자에 어노테이션을 붙여야 합니다.
@Controller
public class MemberController {
private final MemberService memberService;
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
필드 주입(Field Injection)
의존성을 주입할 필드에 @Autowired 어노테이션을 붙이면 자동으로 의존성이 주입됩니다.
@Controller
public class MemberController {
@Autowired
private final MemberService memberService;
}
수정자 주입(Setter Injection)
Setter 네이밍 패턴을 따르는 메소드를 이용한 주입입니다. 반드시 Setter 메소드일 필요는 없으나 동일한 기능을 수행해야 하며, 일관성 있는 코드 설계를 위해 Setter 네이밍 패턴을 사용하는 것이 권장됩니다.
public class MemberController {
private MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
}
생성자 주입이 가장 권장되는 이유
인텔리제이에서 필드 주입 혹은 생성자 주입을 하면 @Autowired 어노테이션에 노란줄과 함께 경고 메시지가 나옵니다. 어노테이션만으로도 간단하게 주입할 수 있는데 생성자 주입이 가장 권장되는 이유는 개발을 할 때 여러 컴포넌트 간에 의존성이 생기고 순환 참조가 발생하는 경우 서로를 참조하게 되어 오류가 발생할 수 있는데 필드 주입과 생성자 주입은 이런 순환 참조의 문제가 발생하였을 때 어플리케이션 동작 초기에 알 수가 없습니다. 하지만 생성자 주입을 사용하는 경우, 순환 참조가 있을 시 어플리케이션이 구동조차 되지 않기 때문에 발생할 오류를 사전에 알 수 있습니다.