MemberController가 MemberService 통해서 회원가입하고 데이터를 조회할 수 있어야,
MemberController가 MemberService를 의존한다고 표현.
스프링이 처음 뜰때, 스프링 컨테이너라는 통이 생긴다.
이렇게만 만들어놔도
@Controller 어노테이션이 있으면 MemberController라는 객체를 생성해서 스프링에 넣어두고
스프링 컨테이너가 관리를 한다.
private final MemberService memberService = new MemberService();
이렇게 MemberService 객체를 새로 생성해주면 후에 다른 주문서비스 같은 데서도 MemberService를 생성할 수도 있음.
객체 하나만 생성해서 공유해서 쓰는게 좋기 때문에 위 같은 방식은 쓰지 않는다.
-> 스프링 컨테이너에 등록해서 쓰면 됨! (스프링 컨테이너에 등록하면 딱 하나만 등록됨)
스프링이 뜰때 컨트롤러 어노테이션 붙어 있는 클래스 객체 생성 -> 생성자 호출
->스프링 컨테이너가 스프링 컨테이너에 있는 MemberService를 연결시켜주게 된다.
생성자부에 @Autowired(자동 연결)를 붙여주면
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public void MemberController(MemberService memberservice){
}
}
에러가 뜬다.
Consider defining a bean of type 'hello.hellospring.service.MemberService' in your configuration.
MemberSerivice는 순수 자바 클래스이다. 스프링이 이 클래스를 알 수 있는 방법이 없다.
=> @Service를 넣어주면 된다!!
=>서비스네? 스프링이 MemberService를 컨테이너에 등록해준다.
마찬가지로 Repository도 @Repository를 붙여주면 된다^^
정형화된 패턴
Controller / Service / Repository
Controller를 통해서 외부 요청을 받고, 서비스에서 비즈니스 로직을 만들고, Repository에서 데이터를 저장을 한다.
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository; }
MemberService는 MemberRepository가 필요해
@Service : 스프링이 오 서비스네? 스프링 컨테이너에 등록해둠
@Autowired : 생성자 부분에서 의존관계를 주입해줌
객체의존관계를외부에서넣어주는것을 DI (Dependency Injection), 의존성주입이라한다.
이전 테스트에서는개발자가직접주입했고, 여기서는 @Autowired에의해 스프링이 주입해준다.
스프링빈을등록하는 2가지방법
1. 컴포넌트 스캔과 자동 의존관계설정
2. 자바코드로 직접 스프링빈 등록하기
컴포넌트 스캔 원리
@Component 애노테이션이있으면스프링빈으로자동등록된다.
@Controller 컨트롤러가스프링빈으로자동등록된이유도컴포넌트스캔때문이다.
@Component를포함하는다음애노테이션도스프링빈으로자동등록된다.
@Controller @Service @Repository
스프링 빈 등록 범위
메인 어플리케이션의 하위 패키지까지만 뒤져서 @Component 찾아서 스프링 빈 등록을 해줌
실습 예시에선 hello.hellospring 하위 패키지 까지만 뒤짐
스프링은 스프링 컨테이너에 스프링 빈 을등록할때, 기본으로 싱글톤으로 등록한다(유일하게하나만 등록해서공유한다)
따라서 같은 스프링빈이면 모두 같은 인스턴스다.
설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을사용한다.
2. 자바코드로 직접 스프링빈 등록하기
회원서비스와회원리포지토리의 @Service, @Repository, @Autowired 애노테이션을제거하고 진행한다.
@Configuration 을 스프링이 보고 아래에 @Bean을 보고 아 Bean 등록하라는거구나 알게됨.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
스프링 올라올때 MemberService, MemberRepository가 스프링 빈으로 등록됨.
DI에는필드주입, setter 주입, 생성자주입이렇게 3가지방법이있다. 의존관계가실행중에 동적으로변하는경우는거의없으므로생성자주입을권장한다
(setter 주입은 후에 아무 개발자나 호출할 수 있기 때문에 사용 잘 안한다.)
(필드 주입은 아예 후에 바꿔치기 할 수 없다.)
실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트스캔을 사용한다.
그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링빈으로 등록한다.
**실습에서는 아직 저장소 설정이 되지 않았기 때문에 후에 @Bean 부분을 수정하기만 하면 된다!
다른 코드는 아예 안거드려도 됨~~
@Autowired를통한 DI는 helloController, memberService등과 같이 스프링이 관리하는 객체에서만 동작한다.
스프링빈으로 등록하지않고 내가 직접 생성한 객체에서는 동작하지않는다.
->스프링 빈으로 등록해야 @Autowired도 동작할 수 있다.
'스프링 > 스프링 입문' 카테고리의 다른 글
6/30 스프링 DB 접근 기술(1) (0) | 2022.07.02 |
---|---|
6/30 스프링 입문 - 웹 MVC 개발 (0) | 2022.06.30 |
6/29 스프링 입문 - 회원관리 예제 (0) | 2022.06.29 |
6/29 스프링 웹 개발 기초 (0) | 2022.06.29 |
6/29 프로젝트 환경설정 (0) | 2022.06.29 |