본문 바로가기
Java | Spring/Spring 입문

[스프링 입문] 4.2 자바 코드로 직접 스프링 빈 등록하기

by 동기 2022. 3. 13.
반응형

순서


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연결 후 나중에 구현체를 바꿔보자

반응형

댓글