인프런 스프링 입문 강의 정리 #12 스프링 빈과 의존관계(컴포넌트 스캔과 자동 의존관계 설정)
[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com
- 스프링 컨테이너
spring이 실행될 때 스프링 컨테이너가 생김
이 때 @Controller가 있다면 MemberController객체를 생성하여 spring에 해당 객체를 넣어두고 관리
● HelloController 클래스
@Controller를 보고 spring이 HelloController 객체를 생성하여 관리
이거를 스프링 컨테이너에서 스프링 빈이 관리된다고 표현
- spring container
MemberController가 MemberService를 사용해야 함
@Controller
public class MemberController {
private final MemberService memberService = new MemberService();
}
new를 사용해서 쓸 수 있음
but spring이 관리를 하게 되면 다 스프링 컨테이너에 등록을 해야 하며 스프링 컨테이너로부터 받아서 쓰도록 바꾸어야 함
스프링 컨테이너에 등록을 하고 사용 (하나만 등록됨)
* 스프링은 스프링 컨테이너에 스프링 빈 등록 시 싱글톤(유일하게 하나만 등록해서 공유)으로 등록
* 같은 스프링 빈이면 모두 같은 인스턴스
* 설정으로 싱글톤이 아니게 설정할 수 있지만 특별한 경우를 제외하면 대부분 싱글톤을 사용
다른 Controller에서도 MemberService를 가져와 사용 가능
package hello.hellospring.controller;
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가 있으면 spring이 스프링 컨테이너에 있는 memberService를 가져와 연결을 시켜줌
코드를 실행하면 memberService를 찾을 수 없다는 오류 발생
memberService가 스프링 컨테이너에 스프링 빈으로 등록되어있어야 연결 가능
but memberService는 순수한 java class이기 때문에 스프링 빈으로 등록되어있지 않음
@Service
public class MemberService {
...
}
@Repository
public class MemoryMemberRepository implements MemberRepository {
...
}
애노테이션을 붙여줌
● memberController와 memberService 연결 => @AutoWired
(memberController가 생성될 때 스프링 빈에 등록되어있는 memberService 객체를 가져와 넣어줌)
Dependency Injection(DI) = 의존관계 주입
● memberService는 memberRepository 필요
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
memberService가 생성될 때 스프링 컨테이너에 등록하며 생성자 호출
생성자를 호출할 때 @AutoWired가 있으면 spring이 스프링 컨테이너에 있는 memberRepository를 넣어줌
(MemoryMemberRepository 구현체를 MemberService에 주입)
- 컴포넌트 스캔과 자동 의존관계 설정
● 스프링 빈 등록 방식 : 컴포넌트 스캔과 자동 의존관계 설정, 자바 코드로 직접 스프링 빈 등록
● 컴포넌트 스캔 : 애노테이션(@) 사용
(@Service, @Controller, @Repository의 내부 코드를 보면 @Component 애노테이션이 있는 것을 알 수 있음)
spring이 올라올 때 @Component와 관련된 애노테이션이 있으면 객체를 하나씩 생성하여 스프링 컨테이너에 등록, @Autowired는 연결해주는 역할 (memberController와 memberService 연결, memberService와 memberRepository 연결)
● @Component : 스프링 빈으로 자동 등록
● @Controller : 컨트롤러가 스프링 빈으로 자동 등록 => 컴포넌트 스캔 때문
● @Component를 포함하는 애노테이션도 스프링 빈으로 자동 등록 (@Service, @Controller, @Repository)
* 컴포넌트 스캔은 main 메서드가 있는 package의 하위만 스캔, 등록
'Web > Spring' 카테고리의 다른 글
[Spring] 김영한 스프링 입문 강의 정리 #14 회원 관리 예제 - 웹 MVC 개발(회원 웹 기능 - 홈 화면 추가) (0) | 2023.01.11 |
---|---|
[Spring] 김영한 스프링 입문 강의 정리 #13 스프링 빈과 의존관계(자바 코드로 직접 스프링 빈 등록하기) (0) | 2023.01.10 |
[Spring] 김영한 스프링 입문 강의 정리 #11 회원 관리 예제 - 백엔드 개발(회원 서비스 테스트) (0) | 2023.01.08 |
[Spring] 김영한 스프링 입문 강의 정리 #10 회원 관리 예제 - 백엔드 개발(회원 서비스 개발) (0) | 2023.01.07 |
[Spring] 김영한 스프링 입문 강의 정리 #9 회원 관리 예제 - 백엔드 개발(회원 리포지토리 테스트 케이스 작성) (0) | 2023.01.06 |