MemberController가 MemberService를 통해 멤버를 등록하고 조회한다.
- 이를 MemberController가 MemberService에 '의존'한다고 표현
MemberController 클래스 생성(@Controller 어노테이션 포함) : 스프링 컨테이너 생성 -> MemberController 객체를 생성해서 스프링에 넣게 된다.
스프링 컨테이너에 한번만 등록하고 그 외 기능을 한번에 해결하기! - 생성자 호출을 통해 @Autowired (스프링 컨테이너에서 멤버 서비스를 가져온다. )
클래스 위에 @Repository, @Service, @Controller를 추가해 스프링이 해당 클래스가 리포지토리, 서비스, 컨트롤러 클래스임을 인식하고 스프링 컨테이너에 넣도록 한다.
memberService 객체는 memberController 의 내부 변수.
생성자에서 해당 객체의 MemberService객체를 넣어줌으로써 의존성을 주입한다. (의존성을 주입한다는 말은, 그냥 Controller와 Service간의 연관관계를 형성시켜준다는 이야기 - Dependency injection)
1. 컴포넌트 스캔과 자동 의존관계 설정
컴포넌트 스캔 : @Componenet 을 추가해서 스프링이 올라올 때 이 어노테이션이 추가된 객체들을 스캔해서 스프링에 등록
- @Component 어노테이션을 통해 스프링 빈을 자동 등록
- @Controller 컨트롤러가 스프링 빈으로 자동 등록
- @Controller, @Service, @Repository 어노테이션에는 @Component가 포함되어 있어 스프링 빈으로 등록 가능
자동 의존관계 설정 : @Autowired 를 이용해서 Controller, Service, Repository간의 의존관계 설정
- '의존성 주입'이라고 하는데, 스프링이 연관된 객체를 스프링 컨테이너에 찾아서 넣어준다.
- 앞서 @Component를 이용해 MemberService가 스프링 컨테이너에 스프링 빈으로 등록되었음. 이후 @Autowired에서 MemberController 생성자에 있는 memberService를 스프링 컨테이너에서 찾아서 넣어주고, 의존관계가 생기는 것이다.
package com.hello.hellospring.controller;
import com.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;
}
}
이렇게 생성자 안에서 스프링 빈 간의 연관관계를 맺는 것을 생성자 주입이라고 한다.
- 필드 주입
- Setter 주입
2. 자바 코드로 직접 스프링 빈 등록
memberService와 memberRepository가 스프링 컨테이너에 스프링 빈으로 등록
package com.hello.hellospring.service;
import com.hello.hellospring.repository.MemberRepository;
import com.hello.hellospring.repository.MemoryMemberRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.management.MemoryType;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
} // memberService를 스프링 빈에 등록
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
다음과 같이 SpringConfig클래스를 @Configuration 어노테이션을 통해 어노테이션 기반 환경을 설정하고, @Bean 메소드로 해당 클래스들이 스프링 빈에 등록되도록 한다.
의문점 : 최초 MemberController는 어디서 스프링 빈으로 등록된것인가? -> @Controller로 컴포넌트 스캔으로 스프링 빈 등록 -> MemberService에서 생성자 주입을 이용해 memberservice 객체를 스프링 빈에 등록!
'Framework > Spring' 카테고리의 다른 글
스프링 부트 JPA 활용 1 - 회원 도메인 개발 (0) | 2021.06.23 |
---|---|
스프링 부트 JPA 활용 1 - 도메인 분석 설계 / 엔티티 클래스 개발 (0) | 2021.06.02 |
스프링 부트와 JPA 활용1 - 프로젝트 환경 설정 (0) | 2021.05.19 |
스프링 관련 의문점 다루기 (0) | 2021.02.06 |
스프링 복습 및 기초 다지기 (0) | 2021.02.05 |