[Java Spring] 1-14. 자바 코드로 직접 스프링 빈 등록하기
[Java Spring] 1-14. 자바 코드로 직접 스프링 빈 등록하기
1. 컴포넌트 스캔 방법과 직접 등록하는 방법 두가지 다 알아야한다.
2. 기존에 등록했던 어노테이션들을 삭제한다 (컨트롤러 제외)
3. src > main > java > hello.hellospring > 새로 만들기 > java 클래스
4. SpringConfig 클래스 생성
5. 코드 작성
package hello.hellospring;
import hello.hellospring.domain.Member;
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 MemoryMemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
6. 빌드 후 확인
7. 위 코드를 통해 해당 의존관계가 성립된 모습이다.
8. 각각의 장단점이 존재한다.
8-1. 과거에는 코드가 아닌 XML로 생성하였다.
8-2. DI(의존성 주입)에는 세가지 방법이 존재한다.
8-2-1. 생성자 주입
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
장점 : 건들 수 있고 수정할 수도 없다. 권장되는 방법
8-2-2. 필드 주입
@Autowired private MemberService memberService;
단점 : 한번 선언하면 건들 수가 없다.
8-2-3. setter 주입
private MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
단점 : 수정할 필요가 없는데 사용을 위해 public 으로 사용되어야 하는 위험성이 존재한다.
- 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.
8-3. 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 그리고 정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.
8-3-1. 지금 우리가 처한 상황이 구현 클래스를 변경해야 되는 상황이다.
8-3-2. 우리는 처음에 상황을 데이터 저장소가 선정되지 않아서, 인터페이스로 구현 클래스를 변경할 수 있도록 설계했다.
8-3-3. 이 때 구현 클래스가 변경되게 된다면, 다른 코드를 전혀 손 볼 필요 없이, Bean 부분의 생성자만 변경해주면 된다.
8-3-4. 실제 구현 클래스가 MemoryMemberRepository() 에서 DbMemoryMemberRepository 로 변경된다고 가정하자.
8-3-5. 변경되는 부분 (SpringConfig.java)
@Bean
public MemoryMemberRepository memberRepository() {
return new DbMemoryMemberRepository();
}
8-4. 스프링 컨테이너에 올라가는 것들만 Autowired 어노테이션이 동작한다.