지금까지 MemberService
와 MemberRepository
를 만들었다. MemberService
를 통해 회원가입을 할 수 있고 회원 조회를 할 수 있었다. 이제 이 동작을 화면으로 보여 주고 싶은데 그러려면 먼저 view
와 MemberController
가 있어야 할 것이다.
MemberConroller
는 MemberService
를 통해 회원가입을 하고, 데이터를 조회한다. 이를 서로 의존관계에 있다고 한다. 스프링에서 이 의존관계를 어떻게 설정해주는지 알아보도록 하자.
먼저 MemberController
를 다음과 같이 작성하자.
@Controller
public class MemberController {}
이렇게 작성하면 스프링 컨테이너가 @Controller
애노테이션을 보고 MemberController
객체를 만들어 스프링이 관리하는 대상에 추가해준다.
스프링 컨테이너에서 스프링 빈이 관리된다!
MemberController
는 MemberService
객체를 사용해야 하는데 매번 new를 통해 사용하는 것보다는, 이미 컨테이너에 등록되어 있는 것을 가져다 쓰는 것이 더 좋다. 따라서
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
생성자를 통해 의존성을 주입해주는 방식으로 작성한다. @Autowired
애노테이션은 컨테이너에 등록 돼 있는 memberService
를 매개변수와 연결해주는 역할을 한다.
실행시
Consider defining a bean of type 'hello.hellospring.service.MemberService' in your configuration.
와 같은 오류가 뜬다면 MemberService 클래스에@Service
애노테이션을 추가해준다.
@Service
애노테이션이 있어야MemberService
도 스프링 빈으로 인정받을 수 있다
Repository도 같은 이유로 @Repository
애노테이션을 추가해준다.
그러면 이제 MemberService
, MemberController
, MemberRepository
가 모두 스프링 빈으로 등록이 되었다.
이 스프링 빈끼리 연결을 해주려면 아까 언급한 @Autowired
애노테이션을 사용해야 한다. MemberService
에도 추가해주자. 완료되면 스프링 빈들의 관계가 다음 사진처럼 된다. (출처- 김영한님 강의자료)
방금한 방법처럼 애노테이션을 이용해 스프링 빈과 그 관계를 설정해주는 것이 컴포넌트 스캔과 자동 의존관계 설정 방법이다.
@Service
, @Repository
, @Controller
는 내부에 모두 @Component
를 포함하고 있는데 컴포넌트 스캔은 @Component
가 있는 클래스를 스프링 빈으로 자동 등록하는 원리이기 때문에 @Service
, @Repository
, @Controller
를 가지는 클래스도 스프링 빈으로 등록된다.
컨테이너에 스프링 빈이 등록될 때에는 하나의 인스턴스만 등록이 된다. (싱글톤)
스프링 빈을 등록하는 방법은 한 가지가 더 있는데, 자바 코드로 직접 스프링 빈을 등록하는 방법으로 다음 게시물에서 알아보도록 하겠다