본문 바로가기
Back-End/Spring

[Spring] 스프링 빈과 의존관계 - 컴포넌트 스캔과 자동 의존관계 설정

by 달의 조각 2022. 2. 25.
이 글은 김영한 님의 스프링 입문 강의(https://inf.run/hcic)를 수강하며 학습한 내용을 정리한 글입니다.

 

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

회원 컨트롤러회원 서비스회원 리포지토리를 사용할 수 있게 의존관계를 준비

MVC, 템플릿 엔진 이미지

 

1. MemberController클래스 생성

@Controller

애노테이션이 있으면 스프링이 뜰 때 스프링 컨테이너에 등록이 되며, 컨트롤러가 컨테이너를 관리하게 된다
Controller의 생성자가 실행된다

참고: helloController는 스프링이 제공하는 컨트롤러여서 스프링 빈으로 자동 등록
        @Controller가 있으면 자동 등록됨

 

2. MemberService 객체

MemberController는 MemberService 객체가 필요하지만 new를 통해 생성하는 건 올바르지 않다
Constructor로 매개변수를 MemberService로 하는 생성자를 만든다

@Autowired

애노테이션을 생성자에 붙이면 스프링이 연관된 객체(MemberService) 스프링 컨테이너에서 찾아서 연결한다
→ 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다

생성자가 1개일 때는 @Autowired 생략 가능

※ 객체 의존관계를 외부에서 넣어 주는 것: DI(Dependency Injection), 의존성 주입
이전 포스트에서는 개발자가 직접 주입했고, 여기서는 @Autowired에 의해 스프링이 주입해 준다

 

🚨 실행 시 오류 발생

MemberSerivice를 찾을 수 없다 = memberService가 스프링 빈으로 등록되어 있지 않다

MemberService.java: 순수한 자바 클래스라서 스프링이 다룰 수 있는 방법이 없다

 

💡 @Service

MemberService 클래스 앞에 @Service 애노테이션을 붙여서 스프링에게 Service임을 알려 준다
스프링이 이를 확인하고 스프링 컨테이너에 MemberService를 등록한다

 

 

++

@Repository

 

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

1. 컴포넌트 스캔과 자동 의존관계 설정 - 이번 포스트 내용
2. 자바 코드로 직접 스프링 빈 등록하기


컴포넌트 스캔 원리

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


@Component를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다

@Controller @Service @Repository

 

 


 

정리

 

1. @Service을 붙이면 스프링이 Service임을 인식하고 MemberService를 컨테이너에 등록한 후 생성자를 호출

2. @Autowired가 붙은 생성자가 호출되면 연관된 객체(MemberRepository)를 연결하면서 필요로 하는 객체임을 인식 후, 스프링 컨테이너에 있는 MemberRepository를 연결시켜 준다

3. 현재 MemoryMemberRepository가 구현체로 있으므로 스프링은 MemoryMemberRepository를 서비스로 주입해 준다

→ @Component를 포함하는 @Controller @Service @Repository 모두 마찬가지
    스프링이 각각 하나씩 객체로 만들어서 스프링 컨테이너에 등록한다
    @Autowired는 연관 관계를 맺어 준다

 

스프링 빈 등록 이미지

참고: 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다(유일하게 하나만 등록해서 공유한다) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다

 

Component - 스프링 빈 등록(유효) 범위

package hello.hellospring;

댓글