Spring/Spring
[inflearn / spring 입문] 자바코드로 직접 스프링 빈 등록하기(*)
SIXXXX_
2022. 2. 15. 23:34
728x90
직접 등록하기
@annotation 기능들을 controller 빼고 다 지워버림
package welcome.welcomespring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import welcome.welcomespring.repository.MemberRepository;
import welcome.welcomespring.repository.MemoryMemberRepository;
import welcome.welcomespring.service.MemberService;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository()); //로직을 호출해서 bean에 등록해준다
// 밑에 메서드 호출
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
@Bean으로 관리를 해줄 수 있다.
return new MemberService(memberRepository();
에서 memberRepository()로 밑에 메서드 호출
1. 생성자 주입
: 의존 관계가 실행 중에 동적으로 변하는 경우는 아예 없으므로 생성자 주입을 권장한다.
@Controller
public class MemberController {
private MemberService memberService;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
2. 필드 주입
: 안좋은 방법, 변경불가능하게 만든다.
3. 세터 주입
: 누군가가 MemberService 호출하면 public 으로 되어 있어서 모두가 접근가능하기 때문에 문제가 발생한다.
보통은 로딩시점에 변경을 해야되는데 셋팅이 끝난후? 셋팅 중에 바꾸면 에러가 난다고 한다.(무슨 말인지 이해못함, 정확치 않음)
실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다. -> 예를 들면 앞선 DB가 정해지지 않았던 상황이라던지 그런 환경속에선 정형화된 구현 클래스를 만들기 어려우므로 위와같은 방법으로 직접 스프링 빈을 등록한다.
주의: @Autowired 를 통한 DI는 helloController , memberService 등과 같이 스프링이 관리하는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.