spring Bean(2)

한지개·2023년 4월 4일
0

spring

목록 보기
3/7

spring Bean(1)에서 컴포넌트 스캔과 자동 의존관계 설정을 통해 스프링 빈을 등록하는 방법에 대해 알아보았다. 이번엔 자바 코드로 직접 스프링 빈을 등록하는 방법을 알아보고자 한다.

스프링 빈을 등록하는 2가지 방법
1. 컴포넌트 스캔과 자동 의존관계 설정
2. 자바 코드로 직접 스프링 빈 등록하기

자바 코드로 직접 스프링 빈을 등록하기 위해선 먼저 MemberService와 MemmoryMemberRepository의 @Service, @Repository, @Autowired를 삭제해야한다.

이렇게 되면 Run할 시 Spring이 뜰 때 컨포넌트 스캔이 안되서 어러가 난다.

이제 Service 하위에 SpringConfig 클래스를 생성해준다.

위처럼 해주면 Spring이 뜰 때 @Configuration을 읽고, @Bean이 붙은 memberService와 memberRepository를 Spring 빈에 등록 해준다.
(이때 헷갈리지 말아야 될건 MemberRepository는 인터페이스고, MemoryMemberRepository는 구현체이다.)

그리고, Spring 빈에 등록되어있는 memberRepository를 MemberService에 넣어준다.
return new MemberService(memberRepository());

(+)
MemberController 부분읜 @Autowired은 컨포넌트 스캔을 해야하기 때문에 그냥 둬야한다.

참고 :
DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다. 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.

1) 필드 주입

2) setter 주입

단점 : 누군가 MemberController를 호출했을때, public으로 열려 있어야 한다. 즉, memberService.setMemberRepository();를 아무나 호출할 수 있다.

3) 생성자 주입

생성자를 통해서 memberService가 MemberController에 주입된다.

실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.

그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 Spring 빈으로 등록한다.

초반 강의에서 MemberRepository를 설계할때 아직 데이터 저장소가 선정되지 않았다는 가상의 시나리오를 정했기 때문에 일단 메모리로 만들고 나중에 교체하기로 하였다.

그래서 MemberRepository를 인터페이스로 설계하고, 구현체로 MemoryMemberRepository를 썼다.

나중에 MemoryMemberRepository는 다른 Repository로 바꿔써야 하기 때문에 이 과정에서 기존에 운영되던 코드를 하나도 손대지 않고 바꿔줘야한다.
이 작업을 해주기 위해선 설정을 통해 Spring 빈으로 등록해줘야 한다.

참고
김영한 스프링 입문 강의

profile
평생 소원이 누룽지

0개의 댓글