스프링 공부/인프런 김영한 스프링 입문 노트정리

4-1. 컴포넌트 스캔과 자동 의존관계 설정

모항 2022. 7. 29. 19:31

이제 웹 브라우저에서 실제로 결과물이 보이도록 하는 과정을 시작해볼 것이다.

MVC를 사용할 것이다.

그런데 본격적으로 시작하기 전에 해야 할 일이 있다.

 

콩 아주머니가 콩들을 콩 바구니에 담을 수 있게 해줘야 한다.

 

이걸 하는 방법에는

  1. 어노테이션을 활용한 컴포넌트 스캔과 자동 의존관계 설정
  2. 그리고 자바 코드로 직접 콩 설계도를 넘겨주는 방법

이렇게 두 가지가 있다.

 

이번 회차는 첫 번째 방법을 알아보는 회차이다.

 

 

 

 

컴포넌트 스캔이란?

스프링 앱을 실행시키는 순간,

스프링은 앱이 속한 패키지의 내용물들을 싹 훑는다.

@Component를 찾는다.

@Component가 붙은 클래스를 바탕으로 그 클래스의 객체를 하나씩 다 만들어서

스프링 컨테이너에 잘 담는다.

그리고 객체들을 알아서 관리해준다.

 

이렇게 스프링에 의해 자동으로 생성되고 관리되는 자바 객체들을 bean이라고 부른다.

그리고 이런 과정을 컴포넌트 스캔이라고 부른다.

 

 

 

스프링 컨테이너는 콩 바구니이다.

그리고 스프링은 콩 아주머니다.

콩 아주머니는 콩 바구니를 들고, 콩 바구니에 어떤 콩들을 담을지 알아내기 위해

눈에 불을 켜고 나의 코드 속을 뒤져본 다음

콩에 대한 정보가 쓰인 부분을 발견하면 그걸 기반으로 콩들을 각각 하나씩 만들어 바구니에 담는 것이다.

 

클래스의 머리에 @Component 어노테이션을 붙이면

스프링은 그 클래스를 스프링의 구성요소를 만드는 설계도로서 인식하게 된다.

이걸 붙이지 않은 클래스는 그냥 평범한 자바 코드에 불과하다. 스프링은 그걸 콩 설계도로 인식하지 못한다.

 

 

 

그런데!

우리가 사용하는 구성요소들은 앞에서 계속 말했듯이

컨트롤러, 서비스, 리포지토리 등이다.

이들은 스프링 웹 앱의 매우 보편적이고 정형화된, 즉 자주 쓰이는 구성요소들이다.

따라서 이들을 위한 특별한 @Component 어노테이션 즉 강화버전, 특화버전 @Component 어노테이션이 준비되어있다.

@Controller, @Service, @Repository 등이다.

@Component의 기능은 가지고 있되 좀 더 특별한 버전이다.

우리는 @Component 대신 저 어노테이션들을 사용할 수 있다.

 

 

 

 

 

 

컴포넌트 어노테이션 붙이기

 

이제 각 구성요소에 맞는 어노테이션들을 싹 붙여주자.

import도 잊지 말자(웬만하면 IntelliJ가 자동으로 import해주긴 함).

@Service
@Repository

회원 관리 웹 어플리케이션의 컨트롤러가 될 Controller 하나를 새로 만들어주고

 

 

@Controller

여기도 잘 붙여준다.

 

 

 

 

 

 

자동 의존관계 설정이란?

 

그리고 콩끼리는 연결관계가 있다.

여기 MemberService 코드를 보면

MemberRepository 객체는 MemberService가 동작하기 위해 꼭 필요한 요소이다.

MemberService의 생성자의 필수 재료로 들어간다.

즉 Service는 Repository에 의존하고 있다.

 

이렇게 의존관계가 있다는 것을 콩 아주머니에게 알려주는 어노테이션이 따로 있다.

바로 @Autowired이다.

생성자 위에 붙여주면 된다.

이걸 붙여주면 콩 아주머니는 얘네 둘이 연결되어 있다는 것을 자동으로 알아채준다.

 

 

 

 

 

 

의존관계 어노테이션 붙이기

 

이제 @Autowired를 적재적소에 싹 붙여주자.

 

가장 먼저,

우리가 새로 만들어갈 MemberController는

MemberService에 의존하여

MemberService의 기능들을 꺼내쓰는 식으로 동작할 것이다.

그러므로 MemberController가 사용할 MemberService 객체를 받아오는 MemberController 생성자를 하나 만들고 거기다가 @Autowired를 붙여주자.

 

 

이렇게 선언까지만 해주고

 

 

Constructor를 만들어준 다음에

 

 

@Autowired 써주기.

 

 

다음으로는 Service와 Repository의 관계를 이어주자.

여기다 써주면 된다.

 

 

 

 

안 하면 무슨 일이 발생하는가?

 

만약 오늘 알아본 이 과정들을 제대로 해주지 않는다면

스프링 앱을 실행시켰을 때 문제가 발생한다.

 

예를 들어,

여기 보면 컨트롤러 객체를 만들기 위하여 생성자에서 MemberService 객체를 가져오라고 되어있다.

근데 MemberService 클래스에다가 @Service 어노테이션을 안 붙인 상태라면?

스프링은 MemberService 콩을 바구니에 담을 수가 없다(객체를 만들어서 스프링 컨테이너에 담을 수가 없다).

그래서 웹 앱이 제대로 실행되지 못하고 오류가 발생한다.

 

 

 

 

컴포넌트 스캔의 범위

스프링이 콩 설계도를 찾으러 뒤지는 범위는 과연 어느 정도일까?

hello-spring 안에 들어있는 이 모든 파일들을 다 뒤질까? 아니다!

 

 

우리가 스프링 앱을 실행한다는 것은

@SpringBootApplication 어노테이션을 가진 이놈의 안에 들어있는 main 메소드를 실행한다는 것이다.

 

 

그러므로 이놈을 실행시켰을 때 콩 바구니를 쥐고 설계도를 찾아헤매는 콩 아주머니는

기본적으로

이놈이 속한 hello.hellospring 패키지 이내의 코드들만 뒤지게 된다.

코드의 첫 번째 줄을 보면 패키지명을 알 수 있다.

 

 

그러므로 만약 우리가

이렇게 example이라는 새로운 패키지를 만들어서

그 안에 열심히 자바 코드를 만들어넣고 @Component 어노테이션을 붙여도,

HelloSpringApplication을 돌렸을 때에는 콩 아주머니가 거기까지 안 간다.