티스토리 뷰
빈(Bean)이란?
-스프링 컨테이너가 관리를 하고 있는 객체를 뜻합니다. 이 빈은 스프링 컨테이너 안에서 관리되며, 애플리케이션에서 필요한 객체들인 빈을 컨테이너가 받아오거나 전달합니다.
아래 사진을 보시면 스프링 컨테이너에 빈이 5개 등록이 되어있습니다. 애플리케이션에서 해당 빈이 필요할때 컨테이너에게 필요한 빈이 컨테이너 내부에 있는지 요청하고, 해당 빈이 있으면 컨테이너가 빈을 전달합니다.
@Bean 과 @Component의 차이
Bean
- Bean은 메소드 레벨에서 선언하며, 반환 되는 객체를 수동으로 빈으로 등록하는 것
- @Configuration 선언된 클래스 내부에서 선언되어 빈등록
Component
- Component는 클래스 레벨에서 선언하며, 컴포넌트 스캔을 통해 객체를 자동으로 빈을 등록하는 것
- @Component를 클래스에 선언하여 등록
빈 등록방법
- Component로 자동관리
-'@Component' 애노테이션을 활용해 스프링 빈으로 자동등록하는 방법입니다. 해당 애노테이션은 등록할 클래스에 선언을 해야하며, 이 애노테이션을 붙일 시 컨테이너에 스프링 빈을 자동등록합니다. 보통은 '@Controller' , '@Service' , '@Repository' 애노테이션을 활용하여 해당클래스를 빈으로 등록합니다.
아래 사진은 Controller, Service, Repository를 각각 애노테이션을 활용하여 스프링 빈으로 자동등록하는 예입니다.
@Controller
public class testController {
private final testService service;
public testController(testService service) {
this.service = service;
}
@Service
public class testService {
private testRepository repository;
public testService(testRepository repository){
this.repository=repository;
}
@Repository
public class testRepository {
private static int count=0;
private static String[] list;
public testRepository() {
list = new String[]{" ", " ", " ", " ", " ", " ", " ", " "};
}
위의 애노테이션들은 '@Component'가 내부에 구현되어있기때문에 자동으로 '@Component'를 안써도 자동으로 구현이 됩니다. 아래는 '@Controller'의 내부 구현코드입니다. 보시면 해당 인터페이스 위에 @Component로 선언이 되어 내부구현이 되어있는것을 볼 수 있습니다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
*/
@AliasFor(annotation = Component.class)
String value() default "";
}
- Configuration 파일로 관리
-해당 방법은 Config클래스를 만든 후 클래스에 @Configuration애노테이션을 선언하고 빈으로 등록할 메소드들을 @Bean애노테이션을 설정하여 직접 등록하는 방식입니다. @Bean 애노테이션이 붙은 클래스들이 반환하는 객체를컨테이너 내부에 빈으로 등록이 됩니다. (@Controller는 동작방식이 달라 예외입니다.)
아래는 Config클래스를 직접만들어 빈으로 직접 등록하는 코드입니다.
@Configuration
public class Config {
@Bean
public testRepository testRepository(){
return new testRepository();
}
@Bean
public testService testService(){
return new testService(testRepository());
}
}
코드를 보시면 클래스에 @Configuration 애노테이션을 선언했는데, 이로인해 스프링 컨테이너가 Config 클래스가 빈과 관련된 클래스라는것을 알게됩니다. 스프링 컨테이너는 @Configuration 애노테이션이 부여된 클래스를 로드하고, 해당 클래스 내의 @Bean 메서드들을 호출하여 객체를 생성하고 관리합니다.
아래 그림은 위의 2가지 방법으로 컨테이너에 빈으로 등록했을시, 컨테이너에 저장된 빈들을 나타내는 그림입니다.
그림을 보시면 위에서 빈으로 등록한 Controller , Service , Repository가 컨테이너 내부에 등록되어있습니다. Controller는 Service와 연관되어있고, Service는 Repository와 연관되어있기에 그림과같이 연결되어있습니다.
Component 방식 VS Configuration 방식
Component 방식
- 자동으로 스프링 컨테이너에 빈을 등록하는 방법
- 스프링의 컴포넌트 스캔 기능이 @Component 애노테이션이 있는 클래스를 자동으로 찾아 빈으로 등록
- @Component 하위 애노테이션으로 @Configuration , @Controller , @Service , @Repository가 있음
Configuration 방식
- 수동으로 스프링 컨테이너에 빈을 등록하는 방법
- 여러개의 빈을 한 파일에서 관리할 수 있어, 코드 가독성을 향상시킵니다.
'자바 > 스프링' 카테고리의 다른 글
WAS(Web Application Server) , DispatcherServlet (0) | 2023.06.24 |
---|---|
스프링 Controller, Repositroy, Service (0) | 2023.05.30 |
DI(의존성 주입)이란? (0) | 2023.05.20 |
Spring이란? (0) | 2023.05.14 |
빌드 관리 도구 (maven,gradle) (0) | 2023.05.14 |
- Total
- Today
- Yesterday
- 배포
- 데이터베이스
- 보안
- 네트워크
- 도커
- 파인튜닝
- 자동화
- 프로토콜
- 컨테이너
- 테이블
- sql
- IP주소
- 소프트웨어공학
- JPA
- 포트포워딩
- 데이터
- 컴퓨터구조
- nat
- 깃허브
- 쿼리
- 메세지큐
- 클라우드
- 깃
- 스프링
- 서버
- 웹소켓
- 인공지능
- 문법
- 자바
- DB
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |