(인프런) 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 공부하고 리뷰한 글입니다.
스프링 빈을 등록하는 2가지 방법
1. 컴포넌트 스캔과 자동 의존 관계 설정
여기서는 1번 방법으로 스프링 빈을 등록하고 의존 관계를 설정하였다. 컴포넌트 스캔방식은 스프링 빈으로 등록해야할 클래스(컨트롤러, 서비스, 리퍼지토리)를 어노테이션을 사용하여 간단하게 등록하는 방식이다.
1. 회원 컨트롤러에 의존 관계 추가
회원 컨트롤러가 회원 서비스와 회원 리포지토리를 사용할 수 있도록 의존 관계를 추가해야한다.
1) controller 패키지에 MemberController 클래스 생성
2) 회원 콘트롤러 코드 작성
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 = new MemberService();
// 스프링 컨테이너에 스프링 빈으로 등록을 해두고 가져다 쓰는 방식(같은 MemberService를 공유하도록)
private final MemberService memberService;
// 회원 컨트롤러 & 회원 서비스 연결
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
- @Autowired: 생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다. 이렇게 객체 의존 관계를 외부에서 넣어주는 것을 DI(Dependency Injection) 의존성 주입이라고 한다.
이렇게 의존 관계를 설정해주었지만 실행해보면 아래와 같은 오류가 난다.
Q. @Autowired로 의존 관계를 설정해주었지만 오류가 나는 이유는?
회원 컨트롤러는 @Controller 사용하여 스프링 빈으로 등록이 되어있기 때문에 스프링이 MemberController가 컨트롤러임을 알고있다. @Autowired가 있는 MemberController의 생성자가 호출될 때 원래는 스프링이 연관된 객체(MemberService)를 스프링 컨테이너에서 찾아서 자동으로 넣어주어야 하지만 MemberService는 스프링 빈으로 등록한 적이 없다! 즉, 스프링 컨테이너에 MeberService는 없기 때문에 MemberService가 서비스임을 알지 못하고 자동으로 넣어줄 수 없어 오류가 생긴다.
2. 회원 서비스 스프링 빈 등록
1) 회원 서비스(~/service/MemberService)로 이동
2) 회원 서비스 MemberService 클래스 앞에 @Service를 붙여 스프링 빈 등록
3) MemberService 생성자에 @Autowired를 붙여 MemberRepository와 의존 관계 설정
@Service
public class MemberService {
// 메모리 회원 리퍼지토리 직접 생성
//private final MemberRepository memberRepository = new MemoryMemberRepository();
private final MemberRepository memberRepository;
// 외부에서 받아온 MemberRepository를 넣어주는 방식으로 변경
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
- 생성자가 1개만 있으면 @Autowired는 생략O
3. 회원 리포지토리 스프링 빈 등록
1) 회원 리포지토리(~/repository/MemoryMemberRepository)로 이동
2) 회원 리포지토리 MemoryMemberService 클래스 앞에 @Repository를 붙여 스프링 빈 등록
@Repository
public class MemoryMemberRepository implements MemberRepository {...}
4. 스프링 빈 등록 이미지
1, 2, 3번에서 스프링 빈을 등록하고 의존관계를 설정한 결과를 이미지로 나타낸 모습이다.
- 1번에서 스프링 빈 등록, memberService와 의존 관계 설정
- 2번에서 스프링 빈 등록, memberRepository와 의존 관계 설정
- 3번 스프링 빈 등록
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다(유일하게 하나만 등록해서 공유한다) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.
'Spring > 스프링 입문' 카테고리의 다른 글
[스프링 입문] 05. 회원 관리 예제(웹 MVC 개발) - 회원 웹 기능1(홈 화면 추가) (0) | 2022.04.28 |
---|---|
[스프링 입문] 04. 스프링 빈과 의존 관계 - 자바 코드로 직접 스프링 빈 등록하기 (0) | 2022.04.28 |
[스프링 입문] 03. 회원관리 예제(백엔드 개발) - 회원 서비스 테스트 (0) | 2022.04.27 |
[스프링 입문] 03. 회원관리 예제(백엔드 개발) - 회원 서비스 개발 (0) | 2022.04.27 |
[스프링 입문] 03. 회원관리 예제(백엔드 개발) - 회원 리포지토리 테스트 케이스 작성 (0) | 2022.04.27 |