스프링 빈 등록하는 2가지 방법
- 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.
- 정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링빈으로 등록한다.
(DB가 정해지지 않았을 때 구현한 코드를 추후 DB가 정해졌을 때 소스코드 수정 없이 @Bean 에 등록된 생성자만 수정해서 교체할 수 있음)
1. 컴포넌트 스캔 + 자동 의존 관계 설정
- @Repository, @Service, @Controller 애노테이션을 달고 @Autowired 하는 방법
2. 자바 코드로 직접 스프링 빈 등록
- @Repository, @Service, @Autowired 애노테이션을 제거하고 진행
- 최상단에 SpringConfig.java 클래스를 만들어서 @Bean 등록
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration // 자바 코드로 직접 스프링 빈 등록하기
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
의존성 주입하는 3가지 방법
1. 생성자 주입
- 요즘 권장하는 타입
- 처음에 어플리캐이션이 조립될 때 한 번 세팅되고 끝남.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberControlelr(MemberService memberService) {
this.memberService = memberService;
}
}
2. 필드 주입
- 권장하지 않음. 중간에 수정할 방법이 없어서.
@Controller
public class MemberController {
@Autowired
private MemberService memberService;
}
3. Setter 주입
- 생성은 생성대로 되고 Setter 는 나중에 호출 가능
- 세터가 퍼블릭하게 노출이 되어서 중간에 잘못바꾸면 문제가 됨..
- 아무 개발자나 호출할 수 있게 열려있음.
- 최대한 변경, 호출되지 않아야 할 메서드가 호출되면 안됨!
@Controller
public class MemberController {
private MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
}