쌓고 쌓다
자바 코드로 직접 스프링 빈 등록하기 본문
앞전 게시글에서 작성한 컴포넌트 스캔 방식도 있고
이번 게시글에서는 스프링에 직접 스프링 빈을 등록하는 방식을 보인다.
SpringConfig
package hello.hellospring;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
@Configuration 어노테이션을 사용한다.
스프링이 뜰 때 @Configuration을 읽고 스프링 빈에 등록을 한다.
@Bean은 스프링 빈을 등록하겠다는 의미로 이해하자.
MemberService는 스프링 빈에 등록되나 생성자로 MemberRepository가 필요하다.
MemberRepository는 인터페이스이기에 new가 안되므로 구현체를 new 하게 한다.
MemberRepository 메소드를 MemberService 생성자로 넣어주자.
MemberController
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
MemberController는 컴포넌트 스캔 방식으로 만들어 놓는다.
컴포넌트 스캔 방식이기에 @Autowired로 MemberService를 가져오게 한다.
이때 앞서 @Bean으로 등록했었기에 스프링 빈에 있는 MemberService를 가져온다.
최종적으로 아래의 그림이 완성된다.
DI에는 필드 주입, setter 주입, 생성자 주입 3가지 방법이 있다고 한다.
앞서 사용한 방법은 생성자 주입 방법이다.
의존관계가 동적으로 변하는 경우는 없어 생성자 주입을 권장한다.
필드 주입 방법
@Controller
public class MemberController {
@Autowired
private final MemberService memberService;
}
setter 주입 방법
@Controller
public class MemberController {
private MemberService memberService;
@Autowired
public setMemberService(MemberService memberService) {
this.memberService = memberService;
}
}
(final 빼야함)
MemoryMemberRepository를 사용했으나 추후에 DB를 선정하여 사용할 때
직접 설정 파일을 운영하고 있다면 아래와 같이 구현체만 바꿔주면 된다.
(컴포넌트 스캔 방식이라면 여러 코드를 바꿔야 한다..)
주의
@Autowired 를 통한 DI는 helloController , memberService 등과 같이 스프링이 관리하는 객체에서만 동작한다.
스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.
MemberRepository가 빈에 등록되지 않았을 때.
MemberService memberService = new MemberService(생성자 넣고) 해도 안된다는 뜻임.
'프로그래밍 > spring' 카테고리의 다른 글
회원 웹 기능 - 조회 (0) | 2023.06.21 |
---|---|
회원 웹 기능 - 홈 화면 추가, 등록 (0) | 2023.05.16 |
컴포넌트 스캔과 자동 의존관계 설정 (0) | 2023.05.08 |
회원 서비스 테스트 ( 의존성 주입, 예외 테스트 코드 ) (0) | 2023.05.07 |
회원 서비스 클래스 작성 (0) | 2023.05.02 |