Anoi 2023. 2. 2. 18:28

스프링 빈과 의존관계

스프링 빈을 등록하고, 의존관계 설정하기

 

MemberController를 만들어보자.

이렇게 작성해두면 기능은 없으나 스프링이 처음 실행될 때 스프링 컨테이너라는 통이 생기는데

이 통에 @Controller 어노테이션이 붙으면 MemberController라는 객체를 만들어서

스프링이 컨테이너에 넣어두고 관리한다.

-> 스프링 빈이 관리된다.

이제 이 안에서 service 객체를 만들 것인데

이런 식으로 new로 생성할 수도 있겠지만 스프링이 관리하게 되면 

다 스프링 컨테이너에 등록을 하고 스프링 컨테이너에서 받아서 쓰도록한다.

그러면 딱 하나만 등록되어 그걸 사용하면 된다.

 

MemberController는 스프링 컨테이너가 뜰 때 생성되는데 그 때 생성자를 호출한다.

그런데 생성자에 @Autowired가 붙어있으면 스프링 컨테이너에 있는 memberService를 연결시켜준다.

 

여기까지하고 실행시켜보면 오류가 발생한다.

memberService를 못 찾아서 생긴 오류이다.

 

@Autowired라고 하면 스프링 컨테이너에서 memberService를 가져오는데 현재 memberService가 빈으로 등록되어 있지 않다.

현재 서비스는 그저 자바 코드이므로 스프링에서 MemberService 코드를 알 수 없다.

그러면 @Service를 추가하면 된다.

그러면 스프링 컨테이너가 생성될 때 @Service를 읽고 MemberService를 등록한다.

MemoryMemberRepository도 등록해준다.

현재 시도하려는 그림

controller, service, repository를 연결하려면 @Autowired를 쓰면 된다.

 

생성자에 쓰면 컨트롤러가 생성될 때 스프링 빈에 등록되어 있는 MemberService 객체를 가져다 넣어준다

-> Dependencies Injection

실행시키면 잘 돌아간다.

 

스프링 빈을 등록하는 2가지 방법

  • 컴포넌트 스캔과 자동 의존관계 설정 
  • 자바 코드로 직접 스프링 빈 등록하기

우리가 사용한 @Controller, @Service, @Repository -> 컴포넌트 스캔

@Autowired -> 자동의존관계

해당 어노테이션을 ctrl로 타고 들어가보면 @Component를 확인할 수 있다.

스프링이 올라올 때 @Component 어노테이션이 있으면 스프링이 객체로 만들어서 스프링 컨테이너에 빈으로 등록해둔다.

 

그렇다면 어디에 @Component가 있더라도 다 등록되는 것일까?

 

이 클래스를 실행시키는데 위에 보면 hello.hellospring2라는 패키지 안에 있다.

그러면 스프링이 이 패키지의 하위 패키지들을 자동으로 뒤져서 @Component 어노테이션이 있다면 등록하는 것이고

만약 이와 동급이거나 그 이상의 패키지에 @Component 어노테이션이 있다면 등록하지 않는다.