컴포넌트 스캔과 자동 의존관계 설정
서비스: 멤버 가입 비즈니스 로직
리포지토리: 데이터베이스, 저장, 불러오기
컨트롤러: 외부 요청을 받는다
컨트롤러가 서비스를 통해서 처리한다.
이를 컨트롤러가 서비스를 의존한다고 한다.
각 요소들(서비스, 컨트롤러, 리포지토리)들은
스프링 컨테이너에서 스프링 빈으로 관리된다.
멤버 컨트롤러에서만 멤버 서비스를 가져다 쓸 수 있어야 한다.
지금은 리포지토리가 new로 생성되어 다른 컨트롤러에서도 사용이 가능하다.
때문에 컨트롤러에서만 사용할 수 있도록 제한해야 한다.(의존성을 가져야 한다. 또한 하나의 인스턴스만 필요하다)
=>의존관계를 설정해야 한다.
스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스이다.
@Autowired
컨테이너가 뜰때 생성자를 호출한다. 멤버 서비스를 스프링컨테이너가 컨트롤러와 연결시켜준다.
member service는 현재 순수한 자바 클래스이다. 따라서 컨테이너가 인식할 수 있는 annotation을 추가해준다.
Service와 Repository 모두 각각 해당하는 annotation을 추가해 주자.
각 부분들이 스프링 클래스에 등록이 될 때, 생성자가 호출되고 Autowired annotation을 참조해 의존성 주입을 해준다.
리포지토리의 경우 구현체를 찾아서 주입.
이런 방법을 컴포넌트 스캔과 의존관계 설정이라고 한다.
원래는 Component라는 annotation으로 설정한다.
@Controller는 특수한 형태의 @Component이다.
@Component annotation이 있으면 스프링 빈으로 자동 추가가 된다.
자바 코드로 직접 스프링 빈 등록하기
컨트롤러는 스프링이 관리하기 때문에 컴포넌트 스캔으로 올라간다.
따라서 서비스와 리포지토리 두 개만 설정해준다.
package hello.hellospring;
import hello.hellospring.Service.MemberService;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
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();
}
}
현재는 생성자를 통해서 주입을 하고 있다. 이를 생성자를 통한 주입이라고 한다.
아래는 필드 주입이다. 필드 주입은 이후에 변경할 방법이 없어서 잘 사용되지 않는다.
@Autowired private MemberService memberService;
마지막은 세터 주입이 있다. 세터가 퍼블릭하게 노출되어 있어 위험하다.
의존관계가 실행중에 변경되는 경우는 없으므로, 안전한 생성자를 통한 주입을 사용하도록 하자.
실무에서 정형화된 컨트롤러, 서비스, 리포지토리는 컴포넌트 스캔을 사용한다.
정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.
직접 설정하는 것의 장점은 클래스가 변경될 때 유연하게 대처할 수 있다.
'Backend > spring' 카테고리의 다른 글
Spring DI (0) | 2022.01.08 |
---|---|
Spring ApplicationContext, IoC, Singleton (0) | 2022.01.08 |
스프링 회원 관리 예제 - 백엔드 개발 (0) | 2021.11.22 |
스프링 웹 개발 기초 (0) | 2021.11.22 |
Spring 프로젝트 환경설정 (0) | 2021.11.22 |