스프링 빈과 의존관계
스프링 빈을 등록하는 2가지 방법
컴포넌트 스캔과 자동 의존관계 설정
우리가 만들었던 MemberController가 MemberService를 통해 가입하고, 데이터를 조회할 수 있어야하는데, 이러한 관계를 MemberController가 MemberService를 의존하는 관계라고한다.
먼저, 아래 코드와 같이 새롭게 객체를 생성해서 사용할 수 있다.
@Controller
public class MemberController {
private final MemberService memberService = new MemberService();
}
그러나 이렇게 객체를 새로 생성한다면, 해당 컨트롤러(멤버 컨트롤러)말고 다른 여러 컨트롤러들이 해당 서비스를 가져다 쓸 수 있다.
고로, 해당 객체를 연결해준다. (DI: 의존관계를 주입해준다.)
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
마찬가지로, 서비스에서 Repository도 의존주입 시켜준다.
기본적으로 스프링은, Application과 동일 선상에 있는 폴더들만 자동으로 객체 등록을 한다. 이외의 폴더에서 객체 등록을 하고싶다면 @ComponentScan 어노테이션을 사용해야 한다.
자바 코드로 직접 스프링 빈 등록하기
기존 코드에 작성했던 @Service, @Repository, @Autowired 어노테이션을 지우고 직접 스프링빈을 등록하는 방법을 알아보자.
package hello.hellospring;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
Config 파일을 만들어 해당 class에서 객체를 의존주입 해준다. Controller의 경우는 해당되지 않는다.
객체 의존 주입의 방법으로는 아래 3가지가 존재한다.
- 필드주입
- setter 주입
- 생성자 주입
대부분의 상황에서 생성자 주입을 권장한다. setter 주입의 경우 setter 메서드를 다시 호출할 수 있는 위험성이 있다.
실무에서는 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 한다면, config파일을 통해 스프링 빈으로 등록한다.
또한, @Autowired 어노테이션을 활용한 DI는 스프링이 관리하는 객체에서만 동작하며 내가 직접 생성한 객체에서는 동작하지 않는다.
위 글은 김영한 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 무료강의를 듣고 정리한 내용입니다.
'Backend > Spring' 카테고리의 다른 글
[Spring] 의존성 주입(Dependency Injection) 4가지 방법 (0) | 2023.12.29 |
---|---|
Configuration은 어떻게 Bean을 등록하고 관리할까? (0) | 2023.12.28 |
[Spring] 스프링 입문 - 코드로 배우는 스프링 부트 #3 회원 관리 예제(백엔드) (0) | 2023.09.12 |
[Spring] 스프링 입문 - 코드로 배우는 스프링 부트 #2 (0) | 2023.08.31 |
[Spring] 스프링 입문 - 코드로 배우는 스프링 부트 #1 (1) | 2023.08.30 |