-스프링 빈을 등록하는 2가지 방법
- 컴포넌트 스캔과 자동 의존관계 설정
- 자바 코드로 직접 스프링 빈 등록하기
1. 컴포넌트 스캔과 자동 의존관계 설정
-스프링 컨테이너
spring이 실행될 때, 스프링 컨테이너가 생성된다.
@Controller가 있으면 MemberController를 생성해서 spring에 해당 객체를 넣어서 관리한다.
이를 '스프링 컨테이너에서 스프링 빈이 관리된다'라고 표현한다.
@Controller
public class MemberController {
private final MemberService memberService = new MemberService();
}
객체를 선언할 때, 보통 위와 같이 new를 이용해서 나타낼 수 있다.
그러나 스프링에서는 모두 스프링 컨테이너에 등록을 하고, 사용할 때는 컨테이너로부터 받아서 사용해야 한다.
만약 new를 사용하면 여러개의 컨트롤러가 매번 서비스 객체를 생성해서 사용하게 되므로 여러개의 서비스 객체가 사용된다. 하지만 서비스 객체는 하나만 등록되기 때문에 서비스 객체가 같도록 수정해야 한다.
스프링 컨테이너에 서비스 객체를 등록한다.
controller 패키지에 MemberController 클래스를 생성한다.
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Autowired : 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다. 위 코드에서는 인자로 받은 값을 스프링 컨테이너에 있는 memberService에 연결해준다.
그러나 memberService 클래스는 순수한 자바 클래스이기 때문에 spring이 인식할 수 있도록 바꿔야 한다.
이를 위해서 service 클래스 위에 @Service 를, Repository 클래스 위에 @Repository를 추가해야 한다.
@AutoWired를 통해 memberController와 memberService를 연결한다.
( DI (Dependency Injection) : 의존성 주입)
-컴포넌트 스캔 : 어노테이션(@) 사용
- @Component : 스프링 빈으로 자동 등록
- @Controller : 컴포넌트 스캔 때문에 컨트롤러가 스프링 빈으로 자동 등록
- @Component를 포함하는 어노테이션(Controller, Service, Repository)도 스프링 빈으로 자동 등록
2. 자바 코드로 직접 스프링 빈 등록하기
service 패키지에 SpringConfig 클래스를 생성한다.
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();
}
}
MemberService와 MemberRepository를 둘 다 스프링 빈에 등록한다.
MemberService가 MemberRepository를 사용할 수 있도록 MemberRepository를 MemberService에 넣어준다.
DI 주입 방식에는 3가지가 있다. (setter 방식, 필드 방식, 생성자 방식)
//1.setter방식
@Autowired
public setMemberRepository(MemoryRepository memoryRepository) {
this.memoryRepository = memoryRepository
}
//2.필드방식
@Autowired
public void MemberRepository memberRepository;
//3.생성자방식(추천)
@Autowired
public MemberService memberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository
}
1. setter 방식
-생성이 된 후 setter가 나중에 호출이 되는데, setter가 public으로 설정되어 있기 때문에 중간에 잘못 변경 시 문제 발생
2. 필드 방식
-중간에 값을 변경할 수 없다.
3. 생성자 방식
-생성자를 통해 MemberService를 MemberController에 주입한다.
-의존관계가 실행 중에 동적으로 변하는 경우가 거의 없기 때문에 권장하는 방법이다.
cf) 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.
그러나 정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.
MemberRepository를 DbMemberRepository로 구현한다.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new DbMemberRepository(); //추후에 DB가 선정된 경우
}
}
'Spring > 스프링 입문' 카테고리의 다른 글
인프런 스프링 입문 강의 정리 #6 (1) | 2023.11.17 |
---|---|
인프런 스프링 입문 강의 정리 #5 (0) | 2023.11.17 |
인프런 스프링 입문 강의 정리 #3 (0) | 2023.11.16 |
인프런 스프링 입문 강의 정리 #2 (0) | 2023.11.16 |
인프런 스프링 입문 강의 정리 #1 (0) | 2023.11.15 |