sugenius

김영한 스프링 입문/섹션4.스프링 빈과 의존관계 본문

김영한 스프링

김영한 스프링 입문/섹션4.스프링 빈과 의존관계

sugeniusk 2024. 3. 7. 16:57

스프링 빈을 등록하는 2가지 방법 

1. 컴포넌트 스캔과 자동 의존관계 설정

2. 자바 코드로 직접 스프링 빈 등록하기 

컴포넌트 스캔과 자동 의존관계 설정

 

@Component 어노테이션이 있으면 스프링 빈으로 자동 등록된다.

@Component 를 포함하는 어느테이션도 스프링 빈으로 자동 등록 된다. 

@Controller, @Service, @Repository 

 

@Aurowired를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다. 

생성자가 1개만 있으면 @Autowired는 생략 할 수 있다. 

 

자바 코드로 직접 스프링 빈 등록하기 

기존 소스에서 MemberService 에서 @Service 와 @Autowired 를 제거하고

MemoryMemberRepository 에서 @Repository 를 지움. MemberController는 그대로 둔다. 

 

그리고 SpringConfig 파일을 생성하여 

@Configuration , @Bean 을 사용하여 아래와 같이 작성하여 직접 스프링 빈에 등록하는 행위를 한다.

 

참고 : XML로 설정하는 방식도 있지만 최근에는 잘 사용하지 않음

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

( 의존관계가 실행중에 동적으로 변하는 경우 == 서버가 실행되고 런타임에 바뀌는 경우) 

위 사진과 같이 생성자를 통해 들어옴 ==> 생성자 주입 

 

생성자를 빼고, 필드에다가 @Autowired 하는 것을 ==> 필드 주입 (비권장)

 

==> setter 주입 

여기서 단점은 , MemberController 호출했을 때, setMemberService가 public 으로 노출 되어야 한다. 이러므로 setMemberService는 빈에 등록된 후 수정될 일이 거의 없는데, 수정될 위험이 생기고 수정이 된다면 문제가 생길 가능성이 크다. 

 

따라서 요즘 권장하는 스타일은 생성자를 통해 주입함 

 

참고 : 실무에서는 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 그리고 정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다. 

 

주의 : @Autowired를 통한 DI는 'helloController', 'MemberService' 등과 같이 스프링이 관리하는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.