[Spring] Bean과 Spring Bean - Bean의 유래와 Spring Bean의 활용

·2024년 2월 13일
0

Spring

목록 보기
3/6
post-thumbnail

Bean

Bean 은 프로그래밍에서 재사용이 가능한 구성요소를 의미한다. 흔히 Java 에는 클래스 객체가 있고, JavaScript 에는 Object , Python 에는 dictionary 가 있다.

Java Bean

Java 역시 Bean 이 존재하며, Java Bean 은 다음과 같은 특징을 지닌다.

POJO 에 포함되는 개념이며, 임의의 서비스나 프로젝트를 수행하기 위해 특화된 Java 객체라고 할 수 있다. 다음의 규약을 지키는 Java 객체의 경우, Java Bean 이라 표현한다.

  1. 기본 생성자가 있어야 한다.
  2. getter , setter 가 정의되어 있어야 한다.
  3. Serializable 이 가능한 클래스여야 한다.

POJO : Plain Old Java Object 의 요약어로, 특정 프레임워크나 규약에 종속되지 않은 순수한 Java 객체를 의미한다. 코드의 의존성을 없애는 것과 Java Bean 과의 명확한 차이를 두기 위해 사용되는 용어이다.

Serializable : Java 에서 객체를 직렬화하거나, 역직렬화를 가능하게 하는 인터페이스이다. 객체의 상태를 바이트 스트림으로 변환하고, 이를 다시 객체로 되돌리는 것이 가능해진다.

Spring Bean

흔히 Java 진영에서 논하는 BeanSpring Bean 에 해당한다. Spring BeanSpring IoC 컨테이너에 의해 관리되는 Java 객체로서, Java Bean 의 특수한 형태라고 볼 수 있다. Spring BeanSpring IoC 컨테이너에 등록시키면 런타임 과정동안 관리되며, 이를 통해 의존성 주입 및 AOPSpring 의 다양한 기능을 사용하는 것이 가능하다.

Spring IoC 컨테이너 : Spring Framework 는 다양한 유형의 컨테이너를 가지고 있으며, 그중 객체의 생성, 관리, 의존성 주입을 담당하는 컨테이너 인터페이스가 바로 IoC 컨테이너 이다. IoC 컨테이너에의 구현체에는 Bean 객체를 관리하는 Bean Factory 가 존재한다.

Spring Bean 등록 방법

  • XML 을 활용한 등록 방법 : 가장 전통적인 등록 방법으로, XML 파일에 각 Bean 의 구성을 명시한다. 어플리케이션 사이즈가 커지면 유지 관리가 어렵고, 런타임 시에 Bean 객체의 변경이 어렵다. 오타나 구문 오류가 일어날 가능성도 커서 현재에는 많이 사용하지 않는 방법이다.

  • *@*Bean : ApplicationContext 실행 이전, 설정을 담당하는 @Configuration 클래스 내부의 객체 혹은 메서드에 대해 @Bean 을 사용하여, 해당 객체를 등록하는 것이 가능하다. 주로 서드 파티 라이브러리를 @Bean 객체로 등록할 때 자주 사용한다.

  • @Component : Spring 프로젝트 내 자신이 생성한 클래스에 대하여 @Component 를 사용하는 것으로, ApplicationContext 실행 시, 자동으로 해당 객체를 Spring IoC 컨테이너 에 등록하여 Spring Bean 객체로 관리한다. @Bean 과 다르게 특정 클래스에 반드시 속하는 것이 아닌, Component Scan 이 이루어지는 모든 위치에서 사용이 가능하다.

등록된 Spring Bean 불러오기

  • getBean() : ApplicationContextgetBean() 메서드를 활용하여, 필요한 Spring Bean 객체를 불러올 수 있다. 일반적으로 등록한 메서드나 클래스의 이름을 매개변수로 넣는 것으로 불러올 수 있다. 단 해당 이름을 가진 객체가 여러개인 경우에는 에러를 반환한다. (해당 문제의 경우에는 @Primary@Qualifier 로 해결할 수 있다. )

    @Primary : 우선순위 적용
    @Qualifier : 별칭 적용

    Spring IoC 컨테이너 에서 관리되는 객체는 키-값 형태로 관리가 이루어진다. 에 대한 특정 설정이 없다면, 기본적으로 객체의 이름을 로 저장이 되기 때문에, 해당 객체 이름으로 Spring Bean 객체를 불러오는 것이 가능한 것이다.

  • @Autowired : 해당 어노테이션을 사용하는 경우, 해당 타입에 의존성이 적합한 Spring Bean 을 찾아 1개 할당해준다. @Autowired 는 크게 3가지 유형을 가진다.
    1. 생성자 기반 의존성 주입 : 생성자를 통해 Spring Bean 객체를 주입하는 방식으로 주로 필수적인 의존성을 나타내기 위한 용도로 사용한다. 클래스 생성 시 딱 한 번 호출이 되며, final 로 설정할 수 있어 Spring Bean 객체에 대한 불변성을 유지할 수 있다. 더불어 클래스 생성 시 의존성 주입이 강제 되기 때문에 런타임 환경에서 발생할 수 있는 에러를 줄인다. 생성자 기반 의존성 주입 은, @Autowired 를 생략할 수 있다.
    2. Setter 기반 의존성 주입 : 주로 선택적인 의존성을 표현하며, 주로 초기화 이후에 의존성을 변경하는 용도로 사용된다.
    3. Field 기반 의존성 주입 : 필드에 직접 의존성을 주입한다. 가장 간단한 방법이지만, 테스트에서 사용할 수 없고, 컴파일 오류를 통해 Spring Bean 객체가 누락될 가능성이 있다.
    생성자 기반 의존성 주입은 `Lombok` 의 `@RequiredArgsConstructor` 을 활용하여, 생성자 주입 코드를 간단하게 작성할 수 있다.

참고
[10분 테코톡] 주디의 Spring Bean
[Spring ] 빈 객체의 초기화와 소멸
[Spring] @Autowired를 통한 의존 관계 주입
[스프링 핵심기술] - @Autowired
[Spring] 스프링 빈 웹 스코프, request 타입과 프록시 모드 - 2/2
스프링 Application Scope
웹 스코프
Springboot Laze Init (Lazy Loading) 사용방법

profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글