이 글은 김영한 님의 스프링 입문 강의(https://inf.run/hcic)를 수강하며 학습한 내용을 정리한 글입니다.
자바 코드로 직접 스프링 빈 등록하기
회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 애노테이션을 제거하고 진행한다.
Service의 @Service, @Autowired와 Repository의 @Repository, @AutowiredController는 그대로 둔다
→ Controller는 컴포넌트 스캔으로 컨테이너에 올라가고, 때문에 @Controller와 @Autowired가 사용된다
˙ SpringConfig클래스 생성
@Configuration
@Bean
실습에서 메모리 리포지토리를 다른 리포지토리로 변경할 예정이므로,
컴포넌트 스캔 방식 대신에 자바 코드로 스프링 빈을 설정한다
DI 3가지 방법
1. 필드 주입
//필드 주입
//좋은 방법 X 바꿀 수 있는 방법이 없다
@Controller
public class MemberController {
@Autowired private MemberService memberService;
}
}
2. setter 주입
누군가 MemberController를 호출할 때 public으로 열려 있어야 한다(setter)
애플리케이션 조립 시점에 한번 세팅되면 변경할 일이 없도록 해야 하는데,
다른 개발자도 접근 가능하게 열려 있으므로 잘못 바뀌어서 문제가 생길 수도 있다
//setter 주입
@Controller
public class MemberController {
private MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService) {
this.momeberService = memberService;
}
}
3. 생성자 주입
의존관계가 실행 중에 동적으로 변하는 경우(런타임, 서버가 열린 상태에서 바뀌는 것)는 거의(아예) 없으므로 생성자 주입을 권장한다
//생성자 주입 - 권장
//memberService가 생성자를 통해 MemberController에 주입된다
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
˙ XML로 설정하는 방식은 최근 잘 사용하지 않는다
˙ 실무
컴포넌트 스캔: 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드
스프링 빈: 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면(현재 예제)
설정을 통해 스프링 빈으로 등록
→ 다른 소스 코드의 수정 없이 변경이 가능하다
˙ 주의
@Autowired를 통한 DI는 helloConroller, memberService 등과 같이 스프링이 관리하는 객체에서만 동작
스프링 빈으로 등록하지 않고 내가 직접 생성한 객체(스프링 컨테이너 외)에서는 동작하지 않는다
'Back-End > Spring' 카테고리의 다른 글
[Spring] 회원 관리 예제 - 웹 MVC 개발 | 회원 웹 기능 - 등록 (0) | 2022.02.26 |
---|---|
[Spring] 회원 관리 예제 - 웹 MVC 개발 | 회원 웹 기능 - 홈 화면 추가 (0) | 2022.02.25 |
[Spring] 스프링 빈과 의존관계 - 컴포넌트 스캔과 자동 의존관계 설정 (0) | 2022.02.25 |
[Spring] 회원 관리 예제 - 백엔드 개발 / 회원 서비스 테스트 (0) | 2022.02.23 |
[Spring] 회원 관리 예제 - 백엔드 개발 / 회원 서비스 개발 (0) | 2022.02.23 |
댓글