도서 'Spring in Action' 제 5판을 보고 책 내용과 그 이외의 부족한 부분을 채워가며 공부한 내용입니다.
키워드 : Application, Spring, Library, Maven, Bean
1. 애플리케이션(Application)
- 전체 기능 중 일부를 담당하는 많은 Component로 구성되어 있고 이러한 Component는 다른 구성 요소와 협력해서 자료 처리
- Component간의 상호작용으로 동작
- Component 또는 Bean의 형태로 스프링 컨테이너인 ApplicationContext 라는 DI 컨테이너에 올려두고 관리
2. Spring
사전적 정의
자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크
프로젝트가 규모가 크다보니 분할하여 개발하면 문제점이 발생하는데 이러한 상황에서 개발을 편하게 도와주는 뼈대
프레임 워크(Framework)
1. 소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것
2. 플랫폼을 위한 오픈소스 애플리케이션 프레임워크
3. 우리의 개발을 용이하게 해주고 효율을 높여주는 도구
라이브러리(Library)
Framework와 Library의 차이
Inversion of Control(제어의 역전)
3. Maven
정의
자바용 프로젝트 관리도구
- 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 네트워크를 통해서 라이브러리들을 자동으로 다운
장점
-
라이브러리의 관리를 매우 용이하게 해준다.
-
프로젝트의 작성부터 컴파일, 테스트 등 프로젝트 라이프사이클에 포함되는 각 테스트를 지원해준다.
-
war파일 기반의 배포용으로도 자주 사용된다.
4. Bean
정의
Spring의 DI Container에 의해 관리되는 POJO(Plain Old Java Object)
- 스프링을 구성하는 핵심 객체
- Spring Container(DI Container)에 의해 생성 및 관리
- 주요 속성
- class : Bean으로 등록할 class
- id : Bean의 고유 식별자
- scope : Bean을 생성하기 위한 방법(singleton, prototype 등)
- constructor-arg : Bean 생성 시 생성자에 전달할 파라미터
- property : Bean 생성 시 setter에 전달할 인수
Bean의 등록 방법
1. [ @Bean 어노테이션과 @Configuration 어노테이션 ]
@Configuration // Coonfiguration 또한 Component 이다.
public class AppConfig {
@Bean
public UserService userService() {
return new UserService(memberRepository());
}
@Bean
public UserRepository userRepository() {
return new UserRepository();
}
}
특징
- 수동으로 스프링 컨테이너에 빈을 등록
- @Configuration과 @Bean을 사용
- 빈 등록시 메소드 이름으로 빈 이름이 결정(아래의 방법도 동일한 방식)
빈 이름 | 빈 객체 |
userService | UserService@x01 |
userRepository | UserRepository@x02 |
수동 bean 을 등록하는 기준
어플리케이션
- 업무 로직기술
- 지원 로직
- 업무로직
- Service Repository Controller 등 비즈니스 로직
- 만약 문제가 발생하면 어디서 발생했는지 명확히 파악하기가 쉬움.- 기술지원 로직
- 기술적인 문제나 AOP를 처리할 때 주로 사용(log, DBconnetion 등 )
- 횡단 관심사 처리를 목적으로 어플리케이션 전반적으로 영향을 끼치기 때문에 만약 문제가 발생하면 어디서 발생했는지 명확하게 드러나지 않음.따라서 이러한 기술지원 로직들은 수동빈 등록으로 설정정보에 바로 나타나게 하는 것이 유지보수에 유리하다.
2. [ @Component 어노테이션 ]
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
@AliasFor(annotation = Component.class)
String value() default "";
boolean proxyBeanMethods() default true;
}
장점
- 특정 어노테이션(@Component)이 있는 class를 찾아서 bean으로 등록해주는 ComponentScan 기능을 사용
- @Component를 갖는 어노테이션으로 @Controller, @Service, @Repository 등이 있으며 앞서 살펴봤던 @Configuration 역시 안에 @Component를 가지고 있음.
3. xml 파일을 사용한 등록
<bean id="inventoryService"
class="com.example.InventoryService" />
<bean id="productService"
class="com.example.ProductService" />
<constructor-arg ref="inventoryService" />
</bean>
- 현재 잘 쓰이지 않음.
※ Bean의 추가적인 정보
Applicaiton Context?
Bean들의 생성과 의존성 주입 등의 역할을 하는 일종의 DI 컨테이너
Application Context의 Bean 등록
- ApplicationContext가 @Configuration 어노테이션이 붙은 class 체크
- 1번에 식별된 class 중 @Bean이 붙은 메서드의 이름으로 Bean 목록 생성
- Client가 해당 Bean을 요청
- ApplicationContext는 자신의 Bean 목록에 해당 Bean이 있는 지 체크
- ApplicationContext는 설정 class로부터 Bean 생성을 요청하고 해당 class는 생성된 bean을 반환
(※ Spring 내부에서 Reflection API를 사용해 Bean 정의에 나오는 클래스 이름을 이용하거나 Bean Factory를 통해 Bean 생성)
Bean Factory
정의
빈의 생성과 관계 설정의 제어를 담당하는 IoC 오브젝트
- Bean Factory의 확장이 ApplicationContext(Bean Factory 인터페이스를 부모로 상속)
Application Context의 장점
- Client가 @Configuration이 붙은 구체적인 팩토리 Class를 알 필요가 없음
- IoC 서비스 제공
- 다양한 Bean 검색 방법 제시
Bean의 특징
- Singleton
- 여러번 Bean을 요청하더라도 매번 동일한 객체를 돌려줌.
- 대규모 트래픽 처리에 용이
- 매번 Bean 요청때 마다 Bean 객체를 생성하면 부하가 걸림
- 따라서 Bean을 Singleton Scope으로 관리하여 1개의 요청이 왔을 때 여러 쓰레드가 Bean을 공유해 처리ㄴ
- Singleton 사용 시 단점
- private 생성자를 가지고 있어 상속이 불가능
- 테스트가 힘듬
- SOLID에서 OCP, DIP가 위배됨.
- Singleton Registry
- 위의 문제점을 어느정도 보완하기 위해 Spring이 제공
- 직접 Singleton 형태의 Object를 만들고 관리하는 기능
- Spring Container가 Singleton Registry의 역할 수행
- private 생성자로 객체의 생성을 막는 방법이 아닌 일반 자바 클래스를 싱글톤으로 활용할 수 있도록 지원
- 생성, 관계설정, 사용에 대한 제어권이 컨테이너에게 있기 때문에 일반 자바 클래스도 싱글톤으로 관리
- public 생성자를 사용할 수 있기 때문에 필요하다면 새로운 오브젝트를 생성하고 Mock 오브젝트로 대체가능
- 객체지향적 설계와 디자인 패턴 적용이 가능
- 사용 주의점
- 멀티 스레드 환경에서 여러 스레드가 싱글톤에 동시접근 할 수 있기 때문에 상태 관리를 주의
- 대부분은 stateless하게 만들어져야 함.(내부 상태값의 동시수정이 이루어지는 경우 매우 위험하기 때문, 읽기 전용은 제외)
- 싱글톤에서 필요한 정보는 상태없이 어떻게 관리?
- 파라미터, 로컬 변수, 리턴 값 등을 이용
- 위 변수들은 스택 영역에 독립적으로 저장 -> 스레드마다 분리
스프링의 빈의 scope는 모두 싱글톤?
- scope
- Bean이 1) 언제 생성되고 2) 언제까지 존재하며 3) 어디까지 적용되는지
- 기본적인 스프링 빈의 scope는 싱글톤이며 빈의 생명주기는 스프링 컨테이너와 함께
- 이외의 scope도 존재
- 프로토타입 Prototype scope
- 컨테이너에 빈을 요청할 때마다 매번 새로운 오브젝트를 생성
- 요청 Request scope
- 새로운 HTTP 요청이 생길 때마다 생성
- 세션 Session scope
- 웹의 세션과 유사하게 생성
- 프로토타입 Prototype scope
'Spring' 카테고리의 다른 글
Spring 데이터로 작업하기 1 (0) | 2022.05.18 |
---|---|
Spring 웹 애플리케이션 개발 3 (0) | 2022.05.11 |
Spring 웹 애플리케이션 개발 2 (0) | 2022.05.11 |
Spring 웹 애플리케이션 개발 1 (0) | 2022.05.11 |
Spring 기초 - 2 (0) | 2022.05.09 |