* 스프링 빈을 등록하는 2가지 방법
- 컴포넌트 스캔과 자동 의존관계 설정
- 자바 코드로 직접 스프링 빈 등록하기
1 컴포넌트 스캔과 자동 의존관계 설정
(0) 컴포넌트 스캔 원리
- @Component 애노테이션이 있으면 스프링 빈으로 자동 등록 됨
- @Component를 포함하는 @Controller, @Service, @Repository > 스프링 빈으로 자동 등록
- 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록
(1) Controller
- Controller 선언 시 객체를 생성해서 Spring이 들고 있음 (?)
- Spring Container에서 Bin을 관리함
- MemberController
@Controller
public class MemberController {
/* Spring Container에 등록 */
private final MemberService memberService;
/* 생성자 호출 */
/* @Autowired를 사용하여 MemberService를 가져와 memberService 연결 */
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
- Service와 Repository도 각각 애노테이션 추가
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
/* memberRepository를 직접 생성하는 것이 아니라 외부에서 넣어주도록 설정 */
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Repository
/* MemberRepository를 implements하여 기존의 메소드를 모두 불러옴 */
public class MemoryMemberRepository implements MemberRepository{
- 스프링 컨테이너의 연결 구조 형성
(2) main의 SpringApplication을 실행하면 정상적으로 실행
2 자바 코드로 직접 스프링 빈 등록하기
(1) 이전 상태로 돌리기
- @Service, @Repository 애노테이션을 지우고 다시 실행하면 오류 출력
(2) SpringConfig
- @Controller는 그대로 두기
@Configuration
public class SpringConfig {
/* MemberService를 SpringBin에 등록 */
@Bean
public MemberService memberService() {
/* SpringBin에 등록된 memberRepository를 요기 넣어줌 */
return new MemberService(memberRepository());
}
/* MemberRepository를 SpringBin에 등록 */
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
(3) main의 SpringApplication을 실행하면 정상적으로 실행
* 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용
* 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록
* @Autowired 를 통한 DI는 helloController , memberService 등과 같이 스프링이 관리하는 객체에서만 동작 !!