쉬운 프로그래밍

스프링 빈(Bean) 본문

Programming/Spring Boot

스프링 빈(Bean)

쉬운형 2021. 1. 21. 17:00

예를 들어 @Controller 어노테이션을 달면 

 

스프링 컨테이너에 그 컨트롤러 객체를 생성하고 객체 생명을 스프링이 관리 한다.

 

이를 '스프링 빈(Bean)'이 관리된다고 한다.

 

만약 public SchoolService schoolService = new SchoolService(); 와 같이 객체를 생성하게 되면

 

객체가 여러개 생성될 필요 없이 하나만 생성되도 되는 경우 등 여러가지 상황에서 비효율적으로 동작한다.

 

그러므로 객체를 Bean으로 등록해서 스프링에게 객체의 핸들링을 맡기도록 한다.

 

그러면 스프링 컨테이너에 객체를 Bean 어떻게 등록하는가하면 크게 두가지가 있다.

 

첫번째로 컴포넌트 스캔과 자동 의존관계를 설정하여 Bean을 등록해보겠다.

 

요약하면 @Component 어노테이션을 통해서 Spring Bean으로 객체를 등록할 수 있다.

 

  // @Controller, @Service, @Repository 이러한 어노테이션들은 @Component를 포함하고 잇기에 또한 Spring Bean으로 등록 된다.

 

또한, 스프링은 스프링 컨테이너에 Bean을 등록할 때 기본적으로 싱글톤으로 등록한다. 

 

이렇게 되면 같은 스프링 Bean이면 모두 같은 인스턴스로 볼 수 있다. 설정으로 싱글톤이 아니게 설정할 수 있긴한데 개부분의 경우 싱글톤으로 Bean을 등록한다.

 

서비스 객체로 예를 들어보겠다.

 

위와 같이 @Service 어노테이션을 달아줌으로써 Bean으로 등록할 수 있다.

 

Bean으로 등록될 경우 인텔리제이상에서 라인숫자 옆에 콩같은게 생긴다.

 

레포지토리도 마찬가지다.

 

그러면 컨트롤러에서 Bean으로 등록된 객체를 사용하여야된다고 할 때,

 

스프링 컨테이너로 부터 어떻게 Bean을 주입받을까?

 

DI에는 필드 주입, setter 주입, 생성자 주입 세가지 방법이 존재한다. 

 

의존관계가 실행중에 동적으로 변하는 경우는 거의 없기에, 생성자 주입을 권한다. (현업에선 거의 이거만씀)

 

아래 코드를 참고해보자.

 

@Autowired 어노테이션을 통해서 MemberController 생성자가 실행될 때 스프링 컨테이너로부터 Bean을 수입받는다.

 

위 코드는 아까 @Service 어노테이션을 통해 Bean으로 등록한 MemberService를 주입하는 코드이다.

 

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

 

서비스 코드도 마찬가지로 @Autowired를 통해 의존성을 주입했다.

 

그렇다면, 아무 곳에나 클래스 만들어서 @Component로 Bean을 등록할 수 있을까?

 

그거슨 아니다. Component로 스캔되기 위해서는 SpringBootApplication보다 상위 패키지에 있는 경우 인식이 안된다.

 

즉 SpringBootApplication 이하의 패키지가 되어야한다. (기본적인 상황일때 가정)

 

 

 

두번째 방법으로 자바 코드로 직접 스프링 빈을 등록하는 방식이 있다.

 

SpringConfig라는 class를 생성한다.

 

그러고 @Configureation을 클래스 위에 달아주고, @Bean 어노테이션을 통해 스프링 컨테이너에 Bean으로 등록한다.

 

두번째는(자바 코드를 통한 Bean 등록) 보통 상황에 따라 클래스가 변화해야할 때 사용한다. 나머지는 거의 컴포넌트 스캔을 사용.

 

 

 

참고 : 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/lecture/49587?tab=curriculum

 

 

 

Comments