4.1.0 스프링 빈을 등록하는 방법
1) 컴포넌트 스캔과 자동 의존 관계 설정
: 정형화된 Controller / Service / Repository 구현시 사용
2) java 코드로 직접 스프링 빈 등록
: 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 할 때 사용
4.1.1 스프링 빈 등록과 의존관계 설정
Spring 에서는 Controller 가 외부 요청을 하고,
Service 에서 비즈니스 로직을 작성하고,
Repository 에서 저장을 하는,
정형화된 패턴이 있음을 알 수 있다.
따라서,
앞서 섹션 3에서 만든 Service 와 Repository를 화면에 연결하기 위해서는,
Member Controller 를 작성해야 한다.
MemberController 가 MemberService 를 통해 회원가입하고,
MemberService 를 통해 Repository 데이터를 조회할 수 있는 기능을 만들어 보고자 한다.
이를 위해서는,
MemberController - MemberService - MemoryMemberRepository 가 서로 연결되어야 한다.
이러한 관계는, Controller, Service, Repository가 서로 의존관계에 있다고 말한다.
먼저, src > main > java > hello.hellospring > controller 패키지에
MemberController 클래스를 다음과 같이 작성하였다.
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;
}
}
MemberController 클래스 코드를 하나씩 살펴보자.
@Controller
스프링이 처음 시작되면,
스프링 컨테이너 틀이 생성된다.
이때, Controller annotation 이 작성되어 있으면,
MemberController 객체를 생성하고,
자동으로 스프링에 넣어두고 관리한다.
이를, ' 스프링 컨테이너에서 스프링 빈이 관리된다 ' 라고 말한다.
@Autowired
private final MemberService memberService = new MemberService();
memberService 객체를 생성할 때,
아래와 같이 'new' 를 사용해서 생성할 수도 있을 것이다.
하지만 이러한 방식은
다른 Controller 가 MemberService 를 사용할 때마다, 새로운 instance를 계속 생성한다는 문제점이 있다.
따라서, MemberService 를 스프링 컨테이너에 한 번 등록하고,
스프링 컨테이너에서 받아 쓸 수 있도록 관리하고자 한다.
+ 참고 )
스프링 컨테이너에 스프링 빈이 등록될 때, 기본적으로 싱글 톤으로 등록된다
즉 유일하게 하나가 등록 된 후, 공유된다.
이때, 스프링 컨테이너에서 받아 사용할 수 있도록 연결하기 위해,
Autowired 를 사용할 수 있다.
@Autowired 를 사용하여,
스프링 컨테이너에 있는 MemberService 를 가져와서 연결할 수 있다.
4.1.2 컴포넌트 스캔
앞서 4.1.1 에서 작성한 코드를 실행하면, 오류가 발생한다.
이는 MemberService 가 순수한 자바 클래스 이므로, 스프링이 인식할 방법이 없기 때문이다.
따라서 다음과 같은 특정한 annotation 을 상단에 작성하여,
스프링이 스프링 서비스를 등록할 수 있도록 해야 한다.
다음과 같은 애노테이션이 있으면,
스프링이 시작되고 스프링 컨테이너에 자동으로 등록된다.
@ Component 애노테이션 : 스프링 빈에 자동 등록
@ Controller / @Repository : 컴포넌트 스캔 때문에 스프링 빈에 자동 등록
또한 앞선 예제와 동일하게,
MemberService 와 MemberRepository 가 연결되어야 하므로,
@Autowired 도 추가로 작성한다.
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
동일하게, MemoryMemberRepository 상단에는 Repository annotation 을 추가한다.
@Repository
public class MemoryMemberRepository implements MemberRepository
이제, helloController - MemberService - MemoryMemberRepository 가 모두 연결되었다.
메인 메소드를 실행시켜보면,
다음과 같이 정상 동작 하는 것을 확인 할 수 있다.
+ 추가 ) 기본적으로, hello.hellospring 포함 하위 패키지만 컴포넌트 스캔을 진행한다.
따라서, 모든 @Component 를 실행시키지 않는다.
김영한 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 강의를 기반으로 작성하였습니다.
'SPRING 입문 [ 코드로 배우는 스프링 부트 ]' 카테고리의 다른 글
[스프링 입문] 섹션 5.1 웹 MVC 개발 (회원 웹 기능 - 홈 화면 추가) (0) | 2023.01.10 |
---|---|
[스프링 입문] 섹션 4.2 스프링 빈과 의존관계 (자바 코드로 직접 스프링 빈 등록하기) (0) | 2023.01.10 |
[스프링 입문] 섹션 3.5 회원 관리 예제 (회원 서비스 테스트) (1) | 2023.01.10 |
[스프링 입문] 섹션 3.4 회원 관리 예제 (회원 서비스 개발) (0) | 2023.01.10 |
[스프링 입문] 섹션 3.3 회원 관리 예제 (회원 리포지토리 테스트케이스 작성) (1) | 2023.01.09 |