sugenius
김영한 스프링 입문/섹션4.스프링 빈과 의존관계 본문
스프링 빈을 등록하는 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' 등과 같이 스프링이 관리하는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.
'김영한 스프링' 카테고리의 다른 글
김영한 스프링 입문/섹션6.스프링 DB 접근 기술 (0) | 2024.03.11 |
---|---|
김영한 스프링 입문/섹션5.회원 관리 예제-웹 MVC 개발 (0) | 2024.03.11 |
김영한 스프링 입문/섹션3.회원 관리 예제 (0) | 2024.02.29 |
김영한 스프링 입문/섹션2.스프링 웹 개발 기초 (0) | 2024.02.29 |
IntelliJ(인텔리제이)/spring-boot-devtools 적용/Gradle (0) | 2024.02.29 |