: MemberController
가 memberService
와 memberRepository
를 사용할 수 있도록 의존관계를 설정한다.
@Controller // 스프링에서 제공하는 @Componenet의 종류로 스프링 빈 자동 등록
public class MemberController {
private final MemberService memberService;
@Autowired // 의존관계 설정 (생성자가 1개만 있을 경, @Autowired는 생략 가능)
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Autowired
애노테이션은 연관된 스프링 빈으로 등록된 객체를 찾아 넣어준다.
이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI(Dependency Injection)
이다.
@Component
가 있다면 스프링 빈으로 등록이 된다.
하위 애노테이션인 @Controller
, @Service
, @Repository
도 자동 등록이 된다.
스프링 빈 :
Spring IoC Container
가 관리하는 자바 객체
컴포넌트 스캔범위 : Application이 속한 Package를 포함한 하위 패키지의 Class
스프링에서 제공하는 @Controller
, @Service
, @Repository
와 같은 @Component
가 아닌 설정을 통해 직접 스프링 빈을 등록하는 방법에 대해 알아보자.
main/.../SpringConfig
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
SpringConfig
클래스를 생성한 뒤, @Bean
애노테이션으로 스프링 빈으로 등록하도록 해준다.
@Bean
애노테이션을 통해 memberService
와 memberRepository
를 스프링 컨테이너에 등록한 뒤, memberRepository
를 memberService
에 주입하여 의존관계가 설정이 된다.
@Controller
의 경우, 스프링이 제공하여, 스프링빈으로 자동 등록이 된다.
: 외부에서 접근이 불가능하여 테스트하기 힘들다는 단점을 가지고 있어, 권장하지 않는다.
@Autowired private final MemberService memberService;
: setter
를 의존관계를 설정하는 방식으로, 누구나 해당 메소드를 호출할 수 있다는 단점을 가지고 있다. 한 번 주입하면 변경할 일이 드물기에 setter 주입은 좋은 방식이라 하기 힘들다.
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
: 실행 중 의존관계가 동적으로 변하는 일이 거의 없기에 생성자 주입으로 의존관계 설정을 권장한다.
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
: 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용하며, 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다
📌 본 포스트는 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 통해 학습한 내용을 요약 및 정리한 것입니다.