SPRING/스프링 입문 (김영한 강사님)

스프링 입문 정리 (4) - 스프링 빈과 의존관계

_ys2 2023. 7. 10. 20:08
728x90
반응형

컴포넌트 스캔과 자동 의존관계 설정

컨트롤러가 서비스를 통해서 기능을 동작하는 것을 의존관계가 있다고 표현한다.

MemberController를 만들어서 MemberService, MemberRepository를 의존하여 사용하는 방법을 배운다.

 

  • @Autowired : 스프링 빈으로 관리되고 있는 객체를DI(의존성 주입)해준다.

 

생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.

이렇게 객체 의존관계를 외부에서 넣ㅎ어주는 것을 DI(Dependency Injection), 의존성 주입이라 한다.

이전 테스트에서는 개발자가 직접 주입했고, 여기서는 @Autowired에 의해 스프링이 주입해준다.

 

 

위의 사진을 보면 'Consider defining a bean of type 'hello.hellospring.service.MemverService' in your configuration.' 이라는 오류가 콘솔로 보여진다.

'MemberService를 빈타입으로 정의하시오' 라고 해석이 되어지고 말그대로 스프링컨테이너가 관리하는 빈으로 설정하라는 뜻이다.

MemberService에도 @Controller와 같은 역할을 하는 어노테이션을 붙여주는 작업을 해야한다.

 

사진 출처 : 인프런 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 김영한

 

서비스에는 @Service 어노테이션을 붙이고, Repository 구현체에는 @Repository 어노테이션을 붙여주면 스프링컨테이너가 관리하는 빈이 된다. 

그러면 Controoler에서 @Autowired를 통해 의존할 수 있다.

 

@Service, @Controller 등은 내부에 @Component 어노테이션을 갖고 있는데, 이 어노테이션이 붙은 애들만 스프링 빈으로 관리된다.

이런식으로 컴포넌트들을 스캔하는 방식을 컴포넌트 스캔 방식이라고 한다.

 

 

컴포넌트 스캔 원리

  • @'Component' 에노테이션이 있으면 스프링 빈으로 자동 등록된다.
  • @'Controller' 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.

 

  • @'Component' 를 포함하는 다음 에노테이션도 스프링 빈으로 자동 등록된다.
  • '@Controller'
  • '@Service'
  • '@Repository'

 

사진 출처 : 인프런 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 김영한

 

 

만약에, hello.hellospring 밖에 패키지를 만들고 @Component 어노테이션을 붙인 클래스 파일을 만들면 스캔이 될까?

안된다. HelloSpringApplication이라는 구동클래스를 포함하는 패키지 안에서만 스캔이된다.

 

 

자바 코드로 직접 스프링 빈 등록하기

회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 어노테이션을 제고하고 진행한다.

hello.hellospring을 벗어난 패키지로 설정하면 인식하지 못한다.

항상 HelloSpringApplication이 속한 패키지 하위에 설정정보 파일을 넣어둬야 한다.

 

DI주입 방식에는 3가지가 있는데 1. setter방식, 2. 필드방식, 3. 생성자방식이 있다.

의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.

 

실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.

그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.

 

주의 : @Autowired를 통한 DI는 helloController, memberService 등과 같이 스프링이 관리하는 객체에서만 동작한다.

스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.

 

이전까지는 MemoryMemberRepository 를 사용했는데 만약 DBRepository 를 사용하고 싶으면

'return new MemoryMemberRepository();' 이 부분을 - > 'return new DBMemberRepository();' 으로 바꾸면 된다.

 

출처 : 인프런 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 김영한

반응형