카테고리 없음

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

ernest45 2023. 7. 13. 17:36

 

 

1.  컨포넌트 스캔과 자동 의존관계의 방식 

 

 

why ? 

 

 

 

@Controller, @Service, @Repository 가 아니라

사실 @Component 에노테이션이다. 

@Controller

 

@Service

 

@Repository

 

각 에노테이션 안에 @Component가 있는 것을 확인할 수 있다.

 

 

 

또한 주석으로

 

주석으로 알려주는 컴포넌트

 

"스프링에서는 이 에노테이션이 @Component의 전문화 역할도 수행하여 클래스 경로 스캔을 통해 구현 클래스를 자동으로 탐지할 수 있습니다."

 

라고 설명해준다.

 

 

그래서 스프링이 올라올 때 @Component와 관련된 에노테이션이 있으면 스프링이 객체를 하나씩 생성해서 스프링 컨테이너에 등록한다.

 

멤버 컨트롤러가 멤버 서비스를 통해 조회하고, 회원가입을 할 수 있어야 한다. 이런 것을 의존관계가 있다고 표현함

@autowired는 연관관계를 알려주는 느낌! (생성자를 통해 서로 쓸 수 있게)

 

 

 

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

 

 

하나만 쓰는 예시

 

orderServie의 추가 예시

orderSeriver가 추가로 있을 경우에 같은 memberRepository를 쓴다 (다른 인스턴스를 생성하지 않는다는 게)

싱글톤 패턴! (메모리 절약의 효과도 있음 다른 효과도 알아보자)

 

 

 

Q1) 아무 곳이나 @Component를 써도 되나요 ?

 

 

@SpringBootApplication 에노테이션이 붙은 (실행문)의 같거나 하위의 패키지만 스캔을 해준다!

(설정 시 가능하긴 하지만 그렇게 하지 않음)

예시로 demo

HelloSpringApplication이 포함된 hello.hellospring 패키지의 같은 패키지나 하위 패키지만 가능

demo패키지는 포함이 안된다!

 

 

 

 

2. 자바 코드로 직접 스프링 빈 등록하기

 

1.의 경우 @Controller, @Service, @Repository 등을 통해 @ComponentScan으로 자동으로 등록하고, @Autowired를 통해 자동으로 연결해줬다.

 

이번에는 하나씩 직접 등록을 해볼 것이다.

 

추가로 클래스 하나 생성

 

@Configuration이 붙어 있으면 스프링 빈에 등록하라고 인식함 (클래스 단위로 Spring의 설정 클래스임을 나타냄)

(@bean 에노테이션이 붙은 대상을)

이러면 memberservice가 스프링 빈에 등록이 된다.

 

@Bean 어노테이션은 @Configuration 어노테이션이 붙은 클래스에서 메서드에 적용

@Bean이 붙은 메서드는 Spring IoC 컨테이너에 의해 생성된 빈 객체를 반환하는 역할을 수행한다.

 

 

멤버리포짓을 파라미터로 받는 멤버서비스를 위해 빈 등록

 

memberservice에 memberRepository를 넣어줬다. (둘다 등록이 됨)

 

스프링 빈에 등록되어 있는 memberRepository를 memberservice에 넣어줌!

 

 

 

그러나 

 

Controller는 어떻게 할 수가 없다. 어차피 스프링이 관리하는 것이기 때문에

@Controller

에노테이션을 통해 등록해 컨포넌트 스캔을 이용해야 하고

@Autowired

를 통해서 자동으로 연결해줘야 한다!

 

 

 

 

 

 

 

컨포넌트 스캔과 자동 의존관계의 방식과 자바 코드로 직접 스프링 빈 등록하기의 장단점