순서
- 4. 스프링 빈과 의존관계
4.2 자바 코드로 직접 스프링 빈 등록하기
이전에 진행했던 컴포넌트 스캔과 자동 의존관계 설정 방식 (@Service, @Repository, @Autowired 등을 사용하여 스프링이 자동으로 빈을 인식하는 방식)말고, 자바코드로 직접 스프링 빈을 하나하나 등록해 보자.
먼저, 컨트롤러를 제외한 @Service, @Repository 를 없애보자.
없애면 컴포넌트 스캔을 할 수 없으니 컨트롤러 생성자의 매개변수에 빨간 밑줄이 그어질 것이다.
다음으로 hellospring directory 에 SpringConfig라는 클래스를 하나 만들고, @Configuration ( 구성 ) 어노테이션 을 추가하자.
새 MemverService, MemoryMemberRepository 인스턴스를 생성해서 반환하는 메서드를 작성하고, @Bean 어노테이션을 추가해 보자.
@Configuration이 있으면, 스프링이 해당 어노테이션을 인식하고, @Bean 이 있는 메서드가 실행되면서, 리턴 받은 객체들을 컨테이너에 추가해 준다.
이렇게 등록을 해 주면, @Autowired도 동작이 된다. @Autowired 를 통한 DI는 스프링이 관리하는 객체에서만 동작하기 때문이다.
스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.
이렇게 되면 이전 컴포넌트 스캔방식과 동일한 의존관계가 형성된다. 둘 다 사용해보니 컴포넌트 스캔방식이 훨 편하다.
(과거에는 XML로도 설정 하였으나, 최근에는 잘 사용하지 않음)
DI에는 필드 주입, Setter 주입, 생성자 주입 이렇게 3가지방법이 있다. 의존관계는 실행중에 동적으로 변하는 경우가 거의 없고 생성될때 관계 주입만 해주는것이 대부분 이므로, 생성자 주입을 권한다.
그러면 이렇게 @Configuration을 써서 구성하는 방식을 왜 쓰는 것일까?
실무에서는 주로 (컨트롤러, 서비스, 리포지토리)등 정형화된 방식을 많이 사용하기 때문에 컴포넌트 스캔을 사용한다.
이 외의 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다. 이때 쓰는것이 @Configuration 이다.
지금의 상황이 그렇다. 현재 MemberRepository는 데이터 저장소가 선정되지 않아 Interface설계를 하고, 구현체로 MemoryMemberRepository의 Map에 저장했었기 때문에, 추후 다른 Repository로 교체를 해야 한다.
그 과정에서 Service등 운영중인 코드를 손대지 않고, 구현체만 바꿔주면 되도록 하려면 @Configuration을 활용하면 된다.
위의 memberRepository() 의 리턴값을 new MemoryMemberRepository에서, DB와 연결된 Repository로 변경만 하면 된다.
다음으로 웹 홈, 회원 등록, 조회 를 추가 하고, DB연결 후 나중에 구현체를 바꿔보자
'Java | Spring > Spring 입문' 카테고리의 다른 글
[스프링 입문] 6. 스프링 DB접근 기술 (0) | 2022.04.04 |
---|---|
[스프링 입문] 5. 회원 관리 예제 - 웹 MVC 개발 (0) | 2022.03.14 |
[스프링 입문] 4.1 스프링 빈과 의존관계 (0) | 2022.03.12 |
[스프링 입문] 3.5 회원 서비스 테스트 (2) | 2022.02.27 |
[스프링 입문] 3.4 회원 서비스 개발 (0) | 2021.10.26 |
댓글