- 지금까지 Project Review
- Spring Bean이 무엇인가?
- Bean으로 만들어야 하는 객체들
- Bean등록하는 방법 2가지
- 컴포넌트 스캔과 자동 의존관계 설정
- "자바 코드"로 (직접) 스프링 빈 등록하기
- DI 3가지
- 필드주입
- setter주입
- 생성자 주입
- 추가적인 주의사항
"자바 코드"로 (직접) 스프링 빈 등록하기
*제목을 왜 "" () 이런식으로 했냐면, 자바코드말고 스프링빈을 "직접" 등록하는 방식은 또 따로있기 때문...
*정확히는 factoryMethod를 이용해서 등록하는 방법이라고 한다. (@Bean annotation이 달린 메소드를 호출해서 스프링빈을 등록하는방식)
이 내용이 궁금하다면 여기를 참고
2021.09.30 - [Backend/Spring] - [Spring] 스프링 컨테이너와 빈 3) 다향한 설정 형식 지원(xml)
지난 게시글에서 해두었던 annotation을 @Service , @Repository를 제거한 후 시작한다.
hello.hellospring package하위에 SpringConfig클래스를 만든다.
SpringConfig
package hello.hellospring;
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();
}
}
직접 Bean을 등록하는 방법이다.
아래의 구조는 동일하기 때문에, memberService는 매개변수로 memberRepository를 가진다.
DI 3가지 방법
필드 주입
중간에 변경할 수 있는 방법이 아예존재하지 않아서 권장되지 않는 방법이다
@Autowired private MemberService memberService;
setter 주입
누군가가 호출했을 때, public으로 열려있어야함. 잘못변경할 시에 큰 문제가 생김
setter는 처음으로 set한 이후로는 호출하여 변경하지 못하게 하는 것이 좋다.
private MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
생성자 주입
가장 많이 사용하는 방식.
의존관계가 실행중(런타임 중에, 서버가 떠있는데 중간에)에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.
진짜 바뀌어야 할 때에는 서버를 내리고 Config파일을 수정한 후 다시 올리는 것이 일반적이다.
private final MemberService memberService;
@Autowired // 맴버 컨트롤러가 스프링컨테이너가 뜰떄 생성됨, 그떄 생성자를 호출하게되는데 생성자에 autowied가 잇으면 맴버서비스를 스프링이 스프링컨테이너에 있는 맴버서비스에서 가져다가 연결시킴 -> 스프링 컨테이너에서 가져오는데
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
컴포넌트 스캔 vs Spring Config
- 참고: 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.
컴포넌트 스캔
정형화된 컨트롤러, 서비스, 리포지토리
일반적으로 우리가 생성하는 컨트롤러, 서비스, 리포지토리를 말한다.
Spring Config를 통한 bean등록
정형화되지 않거나, 상황에 따라 구현클래스를 변경해야하는 경우
상황에 따라 구현 클래스를 변경해야하는 경우는 다음과 같다.
우리는 처음 비즈니스 설계시 데이터 저장소가 선정되지 않았다고 가정했기 때문에 임시로
"Memory"Repository라는 클래스를 이용해 구현하였다.
만약, 데이터 저장소가 선정되어서 다른 레포지토리로 바꾸어야 하는 경우, 기존에 운영중인 코드를 하나도 변경하지 않고,
SpringConfig만을 변경하여 적용할 수 있다. (나중에 나옴)
- 주의: @Autowired 를 통한 DI는 helloConroller , memberService 등과 같이 스프링이 관리하는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다. 즉, Spring Config에 bean으로 등록하지 않으면, Autowired가 동작하지 않는다.
'Backend > Spring' 카테고리의 다른 글
[Spring] DB설치(h2 데이터베이스) (0) | 2021.09.14 |
---|---|
[Spring] 웹 MVC개발 (0) | 2021.09.13 |
[Spring] Spring Bean1 (0) | 2021.09.10 |
[Spring] 회원관리 예제 - 3) 회원 서비스 (0) | 2021.09.07 |
[Spring] 회원관리 예제 - 2) 테스트 케이스 작성(검증) (0) | 2021.09.07 |