YoungSoo

스프링 입문 - 컴포넌트 스캔과 자동 의존관계 설정 본문

BE/Spring

스프링 입문 - 컴포넌트 스캔과 자동 의존관계 설정

YoungSooSoo 2022. 7. 7. 17:09

스프링 컨테이너가 관리하는 자바 객체를 빈이라고 한다.

여기서 말하는 자바 객체는 new를 통해 생성하는 객체가 아닌 컨테이너에서 스스로 생성하는 객체이다.

컨테이너를 통해 객체를 여러번 생성할 필요가 없고, 공용으로 사용할 수 있다.

 

스프링 빈을 컨테이너에 등록하는 방법으로는 두 가지 방법이 있다.

오늘 알아볼 방법은 컴포넌트 스캔과 자동 의존관계 설정이다.

MemberController

먼저 MemberController를 만들어준다.

Controller에서 Service를 사용하기 위해 new로 생성해서 사용해줄 수 있지만 여기 뿐만 아니라

다른 곳에서도 Service를 사용할 수 있는데 여러 개의 인스턴스를 생성할 필요가 없고, 하나만 생성해서

공용으로 사용해 좀 더 효율적으로 만들어준다.

 

공용으로 사용하기 위해서는 스프링 컨테이너에 등록을 하면 가능하다.

생성자를 만들어 @Autowired 어노테이션을 사용해 스프링이 컨터이너에 있는 memberService를 가져다가

연결해준다. 하지만 빨간 줄이 그어져 있는 걸 확인할 수 있는데 그 이유는 memberService가 스프링 빈으로 등록되어 있지 않기 때문이다.

Controller에는 @Controller 어노테이션을 넣어줬기 때문에 스프링 컨테이너에 등록이 된다.

Service에는 @Service 어노테이션을 넣어준다면 이 오류는 해결이 되고 마찬가지로,

Repository에도 @Repository 어노테이션을 넣어준다면 Service에 오류가 해결될 것이다.

이렇게 해두면 스프링 컨테이너에 등록되어 오류가 해결되는 것이다.

스프링 빈 등록 이미지

이제 세 개를 연결 시켜줄 차례인데 @Autowired 어노테이션을 사용하면 된다.

@Autowired를 사용하면 스프링 빈에 등록되어 있는 객체를 넣어준다.

이것을 DI(Dependency Injection 의존성 주입)이라고 한다.

Service에도 마찬가지로 @Autowired를 해준다면 연결이된다.

 

지금까지 배운 것이 컴포넌트 스캔 원리인데 컴포넌트 스캔이라는 말은 찾아볼 수 없다.

하지만 위에서 한 @Controller, @Service, @Repository 어노테이션이 컴포넌트 스캔 방식이다.

그 이유는 어노테이션 내부를 살펴보면 모두 @Component 어노테이션이 들어가 있는 것을 확인할 수 있다.

 

마지막으로 아무곳이나 컴포넌트 스캔은 되지 않는다.

그 이유는 HelloSpringApplication을 실행하는데 hello.hellospring 패키지 하위의 패키지들은 전부

자동으로 스프링 빈으로 등록하지만 하위 패키지가 아니라면 따로 등록해야할 수 있다.

 

또한 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다.(유일하게 하나만

등록해서 공유한다). 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수

있지만, 특별한 경우를 제외하면 전부 싱글톤을 사용한다.

싱글톤이란 : 싱글톤이란 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴 이름이다.

 

해당 글은 김영한 님의 인프런 강의를 보고 정리한 글 입니다.

출저 - https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com