3. 스프링 빈과 의존관계
1) 컴포넌트 스캔과 자동 의존관계 설정
.
- 회원에게 가시적인 서비스를 제공하기 위해서는 view template 와 controller (member controller)가 필요하다.
- member controller = memberService를 통해 회원 가입, 데이터 조회해야 함 → "의존관계가 있다."
- member controller가 MemberService를 의존한다.
- member controller가 memberService와 memberRepository를 사용 가능하게 의존관계를 준비한다.
- member controller = memberService를 통해 회원 가입, 데이터 조회해야 함 → "의존관계가 있다."
1. MemberController 만들기 - 컴포넌트 스캔과 자동 의존관계 설정
- controller/... 에 MemberController 클래스 생성 → @Controller (컨트롤러 Annotation) 생성
- 스프링이 뜰 때) @Controller 가 있는 Class에 대해 객체 생성 → 스프링 컨테이너에 넣음 (스프링이 관리)
- MVC 부분에서 등장한 그림이 그 예이다. helloController가 스프링 컨테이너 안에서 객체로 동작한다.
- 스프링이 관리 = 스프링에 모두 등록, 스프링 컨테이너로부터 받아서 쓰도록 바꿔야 함!
- new로 객체를 새로 생성해 사용하면 memberController외 다른 Controller들이 MemberService를 가져다가 사용할 때 ➔ 굳이 여러 개의 객체를 생성할 필요 없이, 하나 생성 후 공유하면 됨
- 따라서, new 대신 Constructor를 이용해 연결해주는 방식을 택하자!
- AutoController : 스프링 컨테이너 뜰 때 MemberController 생성자 호출 시 스프링 컨테이너에 있는 MemberService를 MemberController에 연결시켜줌
- 오류 발생 : MemberService를 찾을 수 없다
⇒ MemberSerive는 그냥 순수한 Java Class임 ∴ 스프링이 MemberService를 인지할 수 없음. (스프링 빈으로 등록X)
( Autowired는 스프링 컨테이너에서 관리하는 MemberService를 가져다가 '스프링이' 넣어줘야 함)
⇒ 아하 얘도 Controller나 Autowired처럼 별도의 @Annotation을 넣어 스프링에 알려줘야 하는군!
- 순수 자바코드였던 MemberSerive Class에 @Service Annotation 추가
♘@Service
- 스프링이 서비스를 인지하고 스프링 컨테이너에 등록시키게끔 함
♘ Annotation 다는 규칙 (@Component Annotation이 있으면 스프링 빈으로 자동 등록됨)
✗✗✗Controller ⇌ @Controller ~ 외부 요청 받는 역할
✗✗✗Service ⇌ @Service ~ 비즈니스 로직 만드는 역할
✗✗✗Repository ⇌ @Repository ~ 데이터 저장하는 역할
- Controller 와 Service를 연결 해 줘야함 ➔ Autowired 사용
(⇒ memberController 생성 시, 스프링 빈에 등록된 memberService 객체를 가져다 넣어준다 ➤ "D.I")
- Service 와 Repository를 연결 해 줘야함 ➔ Autowired 사용
(⇒ memberService 생성 시, 스프링 빈에 등록된 memberRepository 객체를 가져다 넣어준다 ➤ "D.I")
(현재 memberRepository 의 구현체로 MemoryMemberRepository가 존재하므로 그것을 Service에 주입)
HelloSpringApplication부터 시작해서 hellospring 패키지포함 하위 요소를 스프링이 스프링 빈으로 등록하는 것
∴ hellospring 패키지 외에 별도의 패키지 생성해서 Annotation 추가해도 컴포넌트 스캔, 스프링 빈 등록 X
2. MemberController 만들기 - 자바 코드로 직접 스프링 빈 등록
- 직접 설정파일에 작성해 알리는 법
- main/java/practice.spring.hellospring/... 에 SpringConfig 클래스 생성
(1) @Configuration ➔ (2) 등록하고자 하는 스프링 빈 @Bean으로 알리기
- 스프링이 뜰 때, memberService와 memberRepsitory를 스프링 빈에 등록 + '스프링 빈에 등록된' memberRepository를 memberService Constructor의 인자로 넣어준다.
- Controller는 그냥 @Controller로 스프링 빈에 등록하고, @Autowired로 memberService와 연결해준다. (어쩔수없...)
∴ 엄밀히 따지자면, 컴포넌트 스캔, 자동 의존관계(Controller) + 직접 등록 (Service, Repository)
● 정리) 스프링 빈 등록하는 2가지 방법
스프링은 스프링 컨테이너에 스프링 빈 등록시, 싱글톤(기본)으로 등록
- 싱글톤: 스프링 빈 Only 하나만 등록해서 공유하는 것
(if: memberService와 orderService가 공통으로 memberRepository와 연결 시, 동일한 memberRepository 공유함)
1. 컴포넌트 스캔 & 자동 의존관계 설정
⇒ @Service, @Repository, @Controller ... 을 사용하는 방법 (@Component가 포함된 Annotation 이용)
(웬만한 것들은 스프링 빈으로 등록해 이용하는 것이 낫다)
- 스프링 빈 등록시,
@Component 관련 Annotation이 존재하면 ➔ 전부 객체 1개씩 생성해 스프링 컨테이너에 등록
- @Autowired는 스프링 빈 생성시 연관관계를 생성 해줌
2. 자바 코드로 직접 스프링 빈 등록
⇒ @Configuration, @Bean + return new ...() 을 사용하는 방법
3. 의존관계에 대해
DI [Dependency Injection]
- DI 종류, 장 ∙ 단점 비교
- 필드 주입 : 별로 안좋음. (중간에 수정 어려움)
- setter 주입 : 누군가가 memberService 호출 시 setter가 public 상태여야 유효함 ⇒ public하게 노출됨
- 생성자 주입 (권장) : Constructor를 통해 memberRepository가 memberService로 주입됨
- 처음 애플리케이션이 조립되는 시점에서만 (= 스프링 컨테이너가 올라가고 세팅 되는 시점) constructor가 작동하고 끝남 (더 이상 호출 X) - 더 이상의 변경 방지
- 의존 관계가 실행중에 동적으로 변하는 경우 없음
+)
- 주로 정형화된 (일반적으로 작성하는) Controller, Service, Repository 같은 코드 ➔ 컴포넌트 스캔 사용
- 정형화 X 코드 (or 상황에 따라 구현 클래스를 변경해야 하는 경우) ➔ 설정을 통해 빈으로 직접 등록
- 현재 DB 미정, MemberRepository 인터페이스 설계 후 MemoryMemberRepository로 구현체 생성한 상태
- 추후 MemoryMemberRepository(구현 클래스)를 DB에 실제로 연결하는 Repository로 변경해야 함
- 이때, 기존에 운영중인 코드 손대지 않고 변경이 가능하게 함 (Only Configuration만 살짝 손봐주면 OK)
- DI (by Autowired)는 스프링이 관리하는 객체에서만! 동작 (빈으로 등록안된 객체에서는 동작X)
- 컴포넌트 스캔 OR 설정 직접 작성 을 해야 ➔ @Autowired가 동작함
- 어찌됐든 스프링 컨테이너에 스프링이 올려야 함
'Spring > Spring boot 입문' 카테고리의 다른 글
[스프링 입문 강의] H2 DB 접근 오류 - Table "MEMBER" not found (this database is empty) (0) | 2022.08.28 |
---|---|
[스프링 부트] 화면 웹 기능 - 스프링 입문 강의 / 인프런 (0) | 2022.08.19 |
[스프링 부트] 회원 관리 예제(4)~(5) - 스프링 입문 강의 / 인프런 (0) | 2022.08.03 |
[Java] Stream(스트림) 정리 (0) | 2022.07.30 |
[스프링 부트] 회원 관리 예제(1)~(3) - 스프링 입문 강의 / 인프런 (0) | 2022.07.30 |