https://youwjune.tistory.com/37
지난번에 DI와 IOC를 공부하며, 자바와 다르게 스프링에서는 객체의 대한 생성부터 소멸까지 모든 관리 책임을 스프링이 갖고(IoC), 필요한 경우 해당 객체를 전달(DI) 한다고 했다.
그렇다면, 스프링은 객체를 대체 어떻게 관리할까?
POJO 객체란?
스프링 빈(Bean)이란, 스프링에서 관리하는 자바 POJO 객체라고 말할 수 있다.
사실 이 POJO 객체에 대해서도 개발자들마다 정의하는 방식이 조금씩 다르지만, 보통은 "순수한 자바 객체" 라고 표현하는데, "토비의 스프링 3.1" 에서는 객체지향적인 원리를 따르며, 어떠한 기술 규약이나 환경에 종속적이지 않은 오브젝트라고 정의하였다.
하지만 스프링에서 예를 들어 "entity class에서 orm을 사용한다면, 이는 POJO 객체라고 말할 수 없는거 아닐까?" 라는 의문이 들 수 있다. 스프링에서는 JPA라는 표준 인터페이스를 정의하여, ORM을 사용하는 모든 스프링 개발자는 JPA라는 표준 인터페이스 규격을 따라 사용하도록 강제한다. 이렇게 하면 기술 업데이트와는 상관 없이, POJO를 유지할 수 있다.
스프링 컨테이너란?
스프링 프레임워크에서 이러한 POJO 객체를 관리하는 책임은 스프링 컨테이너(=스프링 DI 컨테이너, 스프링 IoC 컨테이너) 에게 있다.
스프링 컨테이너 내부에는, 위의 그림과 같이 스프링 Bean 객체를 key-value 형식으로 저장할 수 있는 공간이 있다.
앞서 언급한 POJO 객체를 스프링 컨테이너에서 불러와 빈 저장소에 저장하면 빈 등록이 완료된다.
음 그렇다면, 빈으로 등록할 객체를 스프링 컨테이너는 어떻게 알 수 있을까?
정답은 @Bean, @Component 어노테이션을 이용하면 된다.
스프링 컨테이너가 빈을 등록하는 방법
빈을 수동으로 등록하는 방법 - @Bean 이용하기
만약에 빈을 수동으로 직접 등록하고 싶다면, 설정 클래스 파일에 @Configuration을 적용해 주고, 그 내부에서 스프링 빈으로 등록할 메서드에 대해 @Bean 어노테이션을 적용시켜 주면 스프링 컨테이너에 등록된다.
해당 코드는 AppConfig라는 설정 파일을 이용해 memberSerivce()를 빈 객체로 등록한다.
스프링 컨테이너는 @Configuration이 붙어 있는 클래스를 찾아 파싱 후, @Bean이 붙은 오브젝트를 빈 객체로 등록하게 된다.
그렇다면 @Configuration 없이 @Bean만 사용하면 안 될까?
만약 빈 객체로 등록된 어떤 클래스 내에서 @Bean을 이용해 빈 객체로 등록하는 것도 가능하다.
하지만, @Configuration은 CGLIB 라이브러리를 이용해 프록싱을 하여, 해당 @Bean 객체가 싱글톤으로 등록됨을 보장해 준다.
스프링 컨테이너는 기본적으로 빈 객체를 싱글톤으로 관리하기 때문에,
반드시 @Configuration 어노테이션을 함께 사용할 것을 권한다.
빈을 자동으로 등록하는 방법 - @Component 이용하기
@Component 역시 @Bean과 같이 빈으로 등록하고 싶은 오브젝트에 붙여 주지만, 스프링에서는 컴포넌트 스캔(Component Scan)을 이용해서 @Component가 붙은 모든 오브젝트를 빈으로 자동 등록시켜 준다.
또한, @Bean 의 경우 메서드에 적용시키며, 보통 개발자가 직접 변경이 어려운(ex. 외부 라이브러리) 대상에 사용하는 것이 권장된다.
반면, @Component 의 경우, 클래스에만 사용하고, 개발자가 직접 변경이 가능한 대상에 사용한다는 차이 또한 존재한다.
실제 @Bean 어노테이션의 코드를 살펴보니, @Target 어노테이션 부분에 ElementType의 METHOD로 선언된 것을 확인할 수 있다.
반면 @Component 어노테이션의 경우, ElementType이 TYPE으로 되어 있다.
이는 클래스, 인터페이스, enum 타입을 의미한다.
@Component를 사용하는 또 다른 어노테이션들
클래스 레벨에 적용되는 @Component 어노테이션은 주로 스프링에서 자주 사용되는 다른 어노테이션들 속에 포함된 경우가 많다. 대표적인 몇 가지 어노테이션들을 함께 살펴보자.
- @Controller : 스프링 MVC 패턴에서 해당 클래스에 대해 Controller 역할 지정. Controller는 모델 객체를 만들어 View에 담아서 이를 반환해 주는 역할이다.
- @RestController : @Controller와 역할은 같으나, 뷰 반환이 아닌 주로 JSON이나 XML형태로 된 객체를 반환하기 위해 사용합니다.
- @Service : 스프링 MVC 패턴에서 해당 클래스에 대해 Service의 역할 지정. Service는 주로 사용자의 요구사항을 처리하는 실질적인 비즈니스 로직을 작성하는 layer이다.
- @Repository : 스프링 MVC 패턴에서 해당 클래스에 대해 Repository의 역할 지정. Repository는 주로 DB 등 외부와의 통신(I/O)를 담당한다.
- @Configuration : 빈 등록을 위해 사용하는 @Configuration 어노테이션 역시, 그 내부에는 @Component가 붙어 있다.
출처
'CS > Spring' 카테고리의 다른 글
[Spring] @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor의 차이점 간단 정리. (0) | 2023.04.24 |
---|---|
[Spring] DI의 세 가지 방법(필드 주입, 생성자 주입, setter 주입) (0) | 2023.04.21 |
[Spring] 비즈니스 로직이란? (0) | 2023.04.08 |
[Spring] Controller, Service, Repository (0) | 2023.04.08 |
[Spring] Entity, DTO, VO 무슨 차이야? (0) | 2023.04.07 |