| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
- Transaction
- Hexagonal
- Layered Architecture
- Spring Data JPA
- Spring
- 실무
- Adapter
- JPA
- springboot
- transactional
- simplejpaRepository
- hexagonal architecture
- JDBC
- Today
- Total
Ezcho
[Spring] Bean객체 본문
스프링 IoC 컨테이너가 관리하는 자바 객체를 Bean 이라고 부른다.
IoC란?
Ioc(제어역전)
전통적인 프로그래밍에서는 개발자가 작성한 프로그램이 외부 라이브러리의 코드를 호출해서 이용
제어역전은 외부라이브러리에서 개발자의 코드를 호출해서 사용한다. (스프링 프레임워크가 사용자의 코드를 호출)
이렇듯 스프링에서는 개발자가 작성한 코드가 외부라이브러리인 스프링에서 실행되는것을 말한다.
스프링의 탄생배경을 살펴보자
- EJB(Enterprise JavaBeans)의 문제점: Spring 프레임워크가 탄생한 배경 중 하나는 EJB의 복잡성과 무겁고 느린 개발 프로세스에 대한 반발이었습니다. EJB는 자바 엔터프라이즈 애플리케이션 개발을 위한 표준이었지만, 사용이 어렵고 무겁다는 평가를 받았습니다. Spring은 이러한 문제를 해결하고자 만들어졌습니다.
- 경량 컨테이너: Spring은 경량 컨테이너로서 동작하며, EJB 컨테이너보다 가볍고 빠르게 동작합니다. 이를 통해 애플리케이션의 개발과 배포가 훨씬 빠르고 간단해졌습니다.
- 제어의 역전(IoC, Inversion of Control): Spring은 제어의 역전 개념을 적극적으로 활용하여 애플리케이션의 컴포넌트들을 느슨하게 결합시킵니다. 이는 애플리케이션의 유지보수성과 테스트 가능성을 향상시킵니다.
- 관점 지향 프로그래밍(AOP, Aspect-Oriented Programming): Spring은 AOP를 지원하여, 애플리케이션의 핵심 로직과 횡단 관심사(예: 로깅, 보안, 트랜잭션 관리)를 분리하여 관리할 수 있게 합니다.
- 포괄적인 기능: Spring은 다양한 기능을 포함하고 있어서 데이터 액세스, 웹 애플리케이션 개발, 보안, 메시징, 배치 처리 등 다양한 애플리케이션 개발 영역에서 사용됩니다.
코드를 한번 보자
import javax.ejb.Stateless;
@Stateless
public class EJBExample {
public String welcome(String name) {
return "Hello, " + name;
}
}
EJB의 예시이다.
@Stateless 어노테이션은 EJB 컨테이너에 의해 관리되는 빈(Bean) 클래스임을 나타냄. EJB는 컨테이너에 의해 생성, 관리되며 생명주기를 관리.
Stateless: Stateless Session Bean은 클라이언트 간에 상태를 공유하지 않는 객체이다. 각 요청에 대해 새로운 인스턴스가 생성되며, 요청 간에 상태 정보를 유지하지 않음. 이것은 확장성 있는 애플리케이션을 구축하는 데 도움이 된다.
import org.springframework.stereotype.Service;
@Service
public class SpringBean {
public String welcome(String name) {
return "Hello, " + name;
}
}
Spring의 예시이다.
@Service 어노테이션은 Spring IoC 컨테이너에 의해 관리되는 빈 클래스. Spring은 개발자가 직접 객체를 생성하고, IoC 컨테이너에 등록하여 관리가 가능하다.
- EJB는 EJB 컨테이너에 의해 빈 객체의 생명주기 및 관리가 이루어지며, 코드가 비교적 복잡하다
- Spring은 개발자가 직접 빈 객체를 생성하고, IoC 컨테이너에 등록하여 관리하며, 코드가 더 간결하고 유연하다.
이래도 이해가안된다면 전반적인 차이를 한번 읽어보자.
EJB와 Spring IoC의 주요 차이는 제어의 역전(Inversion of Control, IoC) 원리를 어떻게 다루느냐에 있습니다. 이 차이로 인해 다음과 같은 이유로 Spring IoC가 EJB에 비해 더 간편하고 유연한 개발 환경을 제공합니다
- 빈의 생명주기 관리:
- EJB: EJB 컨테이너가 빈의 생명주기를 관리하며, 빈의 생성, 초기화, 소멸을 컨테이너가 제어합니다. 이로 인해 개발자는 빈의 생명주기에 대한 세부 사항을 걱정하지 않아도 됩니다.
- Spring IoC: Spring IoC 컨테이너도 빈의 생명주기를 관리하지만, 개발자는 빈의 생성과 소멸에 대한 더 큰 제어권을 가집니다. 이는 커스텀 초기화와 소멸 로직을 더 쉽게 추가하고 관리할 수 있게 해줍니다.
- 의존성 주입(Dependency Injection, DI):
- EJB: EJB에서도 의존성 주입이 지원됩니다. 하지만 EJB의 DI는 일반적으로 XML 기반의 설정이나 어노테이션을 사용하기 어렵고 복잡합니다.
- Spring IoC: Spring IoC는 DI를 강력하게 지원하며, XML 또는 어노테이션을 사용하여 의존성 주입을 쉽게 설정할 수 있습니다. 이는 테스트 용이성과 코드의 결합도를 낮추는데 도움이 됩니다.
- 경량 컨테이너:
- EJB: EJB 컨테이너는 상대적으로 무겁고 복잡한 구조를 가지며, 애플리케이션을 배포하기 위해 더 많은 설정이 필요합니다.
- Spring IoC: Spring IoC 컨테이너는 경량이며, 개발자가 필요한 빈을 간단하게 설정하고 관리할 수 있습니다.
- 다양한 기능:
- Spring IoC는 IoC 컨테이너 외에도 AOP, 트랜잭션 관리, 보안, 데이터 액세스 등 다양한 기능을 포함한 포괄적인 프레임워크입니다. 이러한 기능을 사용하면 더 많은 엔터프라이즈 요구 사항을 해결할 수 있습니다.
1. 빈 객체가 어떻게 생성되고 소멸되는지 까지의 과정에서 차이가있다(빈의 생명 주기)
2. 경랑 컨테이너: EJB컨테이너는 무겁고 복잡한 구조 Spring IoC컨테이너는 경량이며 개발자가 필요한 빈을 간단하게 설정하고 관리
3. 강력한DI 지원: xml방식의 dependency를 지원하며, 의존성 주입을 쉽게 설정할 수 있다.
4. 다양한 기능:
Spring IoC컨테이너에 Bean을 등록하려면 어떻게 해야할까?
Spring Bean등록방법
1. Component Scan
@Component 어노테이션으로 클래스를 명시하면 Spring 빈에 자동등록된다.
사실 컴포넌트로 구성된 우리가 자주쓰는 3가지 어노테이션이 있다.
@Service
@Controller
@Repository
아무 코드에서나, 해당 어노테이션을 cmd + click(혹은 ctrl + click) 으로 들어가보면
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
/**
* Indicates that an annotated class is a "Service", originally defined by Domain-Driven
* Design (Evans, 2003) as "an operation offered as an interface that stands alone in the
* model, with no encapsulated state."
*
* <p>May also indicate that a class is a "Business Service Facade" (in the Core J2EE
* patterns sense), or something similar. This annotation is a general-purpose stereotype
* and individual teams may narrow their semantics and use as appropriate.
*
* <p>This annotation serves as a specialization of {@link Component @Component},
* allowing for implementation classes to be autodetected through classpath scanning.
*
* @author Juergen Hoeller
* @since 2.5
* @see Component
* @see Repository
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
/**
* 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 "";
}
주석중 일부를 잘 읽어보면
/**
This annotation serves as a specialization of @Component,
allowing for implementation classes to be autodetected through classpath scanning
**/
라는 내용이 있는데, 해석해보면
"이 주석은 @Component의 특수화 역할을 하여 클래스 경로 검색을 통해 구현 클래스가 자동 감지되도록 합니다."
결론적으로 우리가 사용하는 3가지 어노테이션 @Service, @Repository, @Controller는 사실 @Component 를 담는 녀석들인것이고 컴포넌트 어노테이션을 추가함으로써 Spring IoC Bean 에 등록할 수 있는것이다.
-> 이때 객체들은 모두 싱글톤으로 생성된다.
https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
싱글톤(Singleton) 패턴이란?
이번 글에서는 디자인 패턴의 종류 중 하나인 싱글톤 패턴에 대해 알아보자. 싱글톤 패턴이 무엇인지, 패턴 구현 시 주의할 점은 무엇인지에 대해 알아보는 것만으로도 많은 도움이 될 것이라
tecoble.techcourse.co.kr
싱글톤 패턴 관련해서는 위글에서 읽어보자 잘 나와있다.
2. 직접 Bean등록하기
직접 어노테이션을 사용하지않고, Config를 하나 만들어보자.
Spring에서 Config는 @Configuration 으로 명시한다. 이후 @Bean 을 사용해 직접 추가해주면 된다. 예시는 아래와 같다.
package com.example.hajooooo.Config;
import com.example.hajooooo.Repository;
import com.example.hajooooo.Service;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public Service service(){
return new Service();
}
@Bean
public Repository repository() {
return new newRepository();
}
}
3. 의존 관계 설정
1. 자동연결
@Autowired를 사용해서 진행한다. 사실 깊게 설명하려면 끝도없지만. 의존관계를 설정해야한다는 선에서만 알고있고, 아래와 같이 선언해준다.(@Qualifer, @Primary 혹은 어노테이션을 직접 만드는것은 나중에 설명)
@RestController
@RequestMapping("/board")
public class Controller{
@Autowired
private Service service;
2. 수동연결
package com.example.hajooooo.Config;
import com.example.hajooooo.Repository;
import com.example.hajooooo.Service;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public Service service(){
return new Service(repository()); //실제 Service 클래스의 생성자 형식대로 변경
}
@Bean
public Repository repository() {
return new newRepository();
}
}
EJB와 Spring IoC 의 차이점, 사용이유. 그리고 빈객체의 뜻, 생성 소멸 어떻게되는지 이해하는 시간을 가져보자.
'BE > DB' 카테고리의 다른 글
| [Spring] JDBC, JPA + Hibernate, Transaction (1) | 2024.01.05 |
|---|