스프링 개발자라면 다 아는 정보, 나만 모르지 않게 해주는 포스팅.
오늘은 스프링 빈을 등록하고 의존관계를 설정하는 방법에 대해 알아보고자 합니다.
포스팅에 앞서 몇가지 미리 준비된 상황이 있습니다.
Consumptions
- memberService와 memberReposiroty를 생성
- 멤버 객체도 생성
- 서비스를 통해서 멤버를 타입
- repository로 저장
- reppository로 부터 원하는 데이터를 꺼내올수 있다.
회원가입을 하고 회원가입된 결과를 html로 뿌려주는 과정에서 controller와 view template이 필요하다.
memberController가 memberService를 통해서 회원가입을 하고 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){ //오류발생, memberService가 스프링 빈으로 등록되어 있지 않음
this.memberService = memberService;
}
}
[코드 1]
그러면 다음과 같은 에러가 나옵니다.
자세히 보면, MemberController안에는 memberService타입의 빈이 없다는 내용의 오류 문구가 나옵니다.
이는 MemeorymemberRepository, memberService에 각각 @Repository
, @Service
를 추가하면서 해결할 수 있고, Controller
, Service
, Repository
라는 정형화된 패턴을 구현할 수 있습니다.
더 구체적으로는,
Controller
를 통해서 외부요청을 받고, Service
에서 비즈니스 로직을 만들고 Repository
에서 데이터를 저장하게 됩니다. 그림으로는 아래와 같습니다.
[그림2- 스프링 빈 등록 이미지]
[코드 1]을 보면, Controller
와 Service
는 @Autowired
를 통해 연결됩니다.
이렇게 되면, 스프링 빈에 등록되어있는 memberService객체를 넣어줍니다.
이것이 DI(Dependency Injection)
이자 본 단원의 핵심 개념입니다.
참고
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 기본적으로싱글톤(singleton)
패턴으로 등록합니다. 즉, 유일하게 하나만 등록합니다.