개발하는 자몽

스프링 부트 공부 (6), 스프링 빈과 의존관계 - 1 본문

Java & Kotlin/Spring

스프링 부트 공부 (6), 스프링 빈과 의존관계 - 1

jaamong 2022. 2. 22. 14:13

이 시리즈는 오랜만에 작성한다. ㅎ.. 정신차리고 다시 해야지.

 

이 글은 아래 강의를 바탕으로 작성됩니다.

 

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

스프링 빈(Bean)을 등록하는 방법에는 2가지가 있다.

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

이 글에서는 첫번째 방법을 이용해서 등록한다.

 

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

멤버 컨트롤러는 멤버 서비스를 통해 회원가입을 하고, 데이터를 조회할 수 있어야 함

 의존관계가 있다 : 멤버 컨트롤러가 멤버 서비스를 의존한다.

 

빈(Bean)이란?

Spring IoC(Inversion Of Control) 컨테이너가 관리하는 자바 객체

 

잠깐! IoC(Inversion Of Control, 제어의 역전)이란?

일반적으로 자바 프로그램에서는 각 객체들이 프로그램의 흐름을 결정하고 각 개체를 직접 생성하고 조작하는 작업(객체를 직접 생성하여 메서드 호출)을 했었다. 즉, 모든 작업을 사용자가 제어하는 구조였다. 

하지만 IoC가 적용된 경우, 객체의 생성을 특별한 관리 위임 주체에게 맡긴다. 이 경우 사용자는 객체를 직접 생성하지 않고, 객체의 생명주기를 컨트롤하는 주체는 다른 주체가 된다. 즉, 사용자의 제어권을 다른 주체에게 넘기는 것이다. 

 

기존의 Java Programming에서는 Class를 직접 생성하고 new로 객체를 직접 생성했다. 하지만 Spring 스러운 방식은 직접 new를 이용하여 객체를 생성하는 것이 아닌, Spring이 관리하는 자바 객체를 사용하는 것이다. 이렇게 Spring이 생성하고 관리하는 자바 객체를 Bean이라고 한다.

 

Bean을 등록하기 위해서는 @Component 어노테이션(annotation)을 사용한다. 해당 어노테이션이 등록되어 있는 경우에는 Spring이 어노테이션을 확인하고 자체적으로 스프링 빈(Bean)으로 등록한다.

 

생성자에 @Autowired

위에서 언급한 것처럼 Spring에서는 new로 객체를 직접 생성하지 않는다. 그렇다면 객체를 직접 생성하지 않고 어떻게 Controller와 Service, Service와 Repository를 연결할 수 있을까? 

 

MemberController Class
MemberService Class

위 사진은 MemberContorller Class(1)와 MeberService Class(2)다. (1)번 사진 윗 줄에 memberSerivce를 선언하고 new로 객체를 생성하는 것이 아닌 생성자를 만들어서 그 위에 @Autowired 어노테이션을 부여했다. @Autowired 어노테이션은 각 상황의 타입에 맞는 IoC 컨테이너 안에 존재하는 Bean을 자동으로 주입해준다.

여기서 위에서 먼저 설명한 Bean이 또 등장하는데, Bean은 @Component 어노테이션으로 부여한다고 설명했다. 지금 상황은 Controller에서 Service 객체를 생성하는 것이다. 그렇다면 주입해야 하는 Bean은 MemberService가 된다. 하지만 (2) 번 사진에서는 @Component 어노테이션이 아닌 @Service만이 존재한다. 

 

 

@Service annotation

위 사진은 @Service 코드로, 위에 @Component 어노테이션이 부여되어있는 것을 볼 수 있다. 따라서 MemberService Class에서 @Service만 부여되어 있어도 MemberService는 스프링 컨테이너에 Bean으로 등록이 된다. (@Controller, @Repository에도 @Component가 있음)

결과적으로 생성자에 @Autowired 어노테이션을 사용하면 스프링 빈(Bean)에 등록되어 있는 MemberService 객체(@Service가 부여된 MemberService Class)를 넣어준다. 이러한 것을 의존성 주입(DI, Dependency Injection)이라고 한다. 

 

똑같이 Service에서 Repository 객체를 생성할 때도 생성자에 @Autowired를 사용해서 의존성을 주입해주자. 당연히 이때 Repository Class 상단에 @Repository 어노테이션이 있어야 한다. @Service, @Repository 없이 @Autowired를 하면 Component Scan할 때 Bean이 등록되어 있지 않아서 에러가 난다. 

MemoryMemberRepository Class
MemberService Class

 

SUMMARY

스프링 빈(Bean)을 등록하려면 구성 파일에 @Bean을 사용해야 한다. 하지만 이 같은 방법은 관리할 Bean이 많아지면 힘들다. 

@Component와 Component Scan을 사용하면 @Bean 어노테이션을 쓰지않고도 Bean 등록을 할 수 있다. 또한 @Autowired를 사용하여 설정파일 없이 자동으로 의존성을 주입(의존관계 설정)한다.

 

Component Scan?

@Component를 가진 모든 대상을 가져와서 빈(Bean)에 등록하기 위해 찾는 과정 (Bean 설정 파일 + @Bean을 통해 빈을 하나하나 지정할 필요가 없음)

 

 

 

 

 

참고

 

스프링 빈(Spring Bean)이란? 개념 정리 - Easy is Perfect

 

melonicedlatte.com

 

Spring - @Autowired 분석!

Spring @Autowired어노테이션이란 @Autowired에 대한 분석이라기에는 얕은 지식을 가지고 @Autowired 어노테이션에 관해서 포스팅을 해보겠습니다. 1. Autowired란? @Autowired 어노테이션은 이름을 보면 알 수

galid1.tistory.com

 

Spring 핵심 원리 기본편 (6) - 컴포넌트 스캔(Component Scan) / @Autowired

지금까지 스프링 빈(Bean)을 등록할 때 구성파일에 @Bean 을 사용했다   \--> 관리할 빈이 많아지면 관리하기 번거로워 진다굳이 빈 설정파일을 만들지 않거나, @Bean을 안쓰고 빈 등록을 할 수 있다

velog.io

 

Comments