Spring

Spring Framework

seco 2021. 10. 31. 17:29

SpringFramework의 구조

1) POjO(Plain Old Java Object) : 특정환경이나 기술에 종속적이지 않은 객체 지향 원리에 충실한 자바객체.

2) PSA(Portable Service Abstraction) : 환경과 세부기술의 변경과 관계없이 일관된 방식으로 기술에 접근할 수 있게 해주는 설계 원칙. 트랜잭션 추상화 등.

3) IoC/DI(Dependecy Injection) : DI는 유연하게 확장 가능한 객체를 만들어 두고 객체 간의 의존관계는 외부에서 다이나믹하게 설정

4) AOP(Aspect Oriendted Programming) : 관심사의 분리를 통해서 소프트웨어의 모듈성을 향상, 공통 모듈을 여러 코드에 쉽게 적용 가능.

 

특징

1. 경량 컨테이너

   - 스프링은 자바객체를 담고 있는 컨테이너이다.

   - 스프링 컨테이너는 이들 자바 객체의 생성과 소멸과 같은 라이프사이클을 관리한다.

   - 언제든지 스프링 컨테이너로부터 필요한 객체를 가져와서 사용할 수 있다.

 

2.  DI 패턴 지원

   - 스프링은 설정 파일이나 어노테이션을 통해서 객체 간의 의존 관계를 설정할 수 있다.

   - 따라서 객체는 의존하고 있는 객체를 직접 생성하거나 검색할 필요가 없다.

 

3.  AOP 지원

   - AOP는 문제를 바라보는 관점을 기준으로 프로그래밍하는 기법이다.

   - 이는 문제를 해결하기 위한 핵심관심 사항과 전체에 적용되는 공통관심 사항을 기준으로 프로그래밍 함으로서 공통 모듈을 여러 코드에 쉽게 적용할 수 있도록 한다.

   - 스프링은 자체적으로 프록시 기반의 AOP를 지원하므로 트랜잭션이나, 로깅, 보안과 같이 여러 모듈에서 공통적으로 필요로 하지만 실제 모듈의 핵심이 아닌 기능들을 분리하여 각 모듈에 적용이 가능하다.

 

4.  POJO 지원

   - 특정 인터페이스를 구현하거나 또는 클래스를 상속하지 않는 일반 자바 객체를 지원한다.

   - 스프링 컨테이너에 저장되는 자바 객체는 특정한 인터페이스를 구현하거나, 클래스 상속 없이도 사용이 가능하다.

   - 일반적인 자바 객체를 칭하기 위한 별칭 개념이다.

 

5.  IoC

   - IoC는 스프링이 갖고 있는 핵심적인 기능이다.

   - 자바의 객체 생성 및 의존관계에 있어 모든 제어권은 개발자에게 있었다.

   - servlet과 EJB가 나타나면서 기존의 제어권이 넘어갔다.

   - 단, 모든 객체의 제어권이 넘어간 것은 아니고 servlet, EJB에 대한 제어권을 제외한 나머지 객체 제어권은 개발자들이 담당하고 있다.

   - 스프링에서도 객체에 대한 생성과 생명주기를 관리할 수 있는 기능을 제공하고 있는데 이런 이유로 Spring container 호은 IoC container라고 부르기도 한다.

 

6.  스프링은 트랜잭션 처리를 위한 일관된 방법을 제공

   - JDBC. JTA 또는 컨테이너가 제공하는 트렌잭션을 사용하든, 설정파일을 통해 트랜잭션 관련 정보를 입력하기 때문에 트랜잭션 구현에 상관없이 동일한 코드를 여러 환경에서 사용이 가능하다.

 

7.  스프링은 영속성과 관련된 다양한 API를 지원

   - 스프링은 JDBC를 비롯하여 iBatis, MyBatis, Hibernate, JPA 등 DB처리를 위해 널리 사용되는 라이브러리와 연동을 지원하고 있다.

 

SpringFramework Module

Spring Core Spring Framework의 핵심 기능을 제공 하며, Core 컨테이너의 주요 컴포넌트는 Bean Factory이다.
Spring Context Spring 컨테이너로 만든 것이 Spring core의 BeanFactory라면, Spring을 Framework로 만든 것은 Context module이며, 이 module은 국제화된 메시지, application 생명주기 이벤트 , 유효성 검증을 지원함으로써 BeanFactory의 개념을 확장을 한다.
Spring AOP 설정 관리 기능을 통해 AOP기능을 Spring Framework와 직접 통합시킨다.
Spring DAO Spring JDBC DAO 추상 레이어는 다른 데이터베이스 벤더들의 예외 핸들링과 오류 메시지를 관리하는 중요한 예외 계층을 제공한다.
Spring ORM Spring Framework는 여러 ORM Framework에 플러그인되어 Object Relational 툴을 제공한다.
Spring Web Web Context module은 application context module 상위에 구현되어 web기방 어플리케이션에 컨텍스ㅡ를 제공한다.
Spring Web MVC Spring framework 는 자체적으로 MVC 프레임워크를 제공하고 있으며 스프링만 사용해도 MVC기반의 웹 어플리케이션을 어렵지 않게 개발이 가능하다.

 

IoC

- Dependency LookUp

  - 컨테이너가 lookup context를 통해서 필요한 resource나 object를 얻는 방식

  - lookup한 object를 필요한 타입으로 캐스팅해주어야 함

  - naming exception을 처리하기 위한 로직이 필요,,

 

- Dependecy Injection

  - Object에 lookup코드를 사용하지 않고 컨테이너가 직접 의존 구조를 Object에 설정할 수 있도록 지정해주는 방식

  - Object가 컨테이너의 존재 여부를 알 필요가 없음

  - lookup 관련된 코드들이 object 내에서 사라짐

  - setter injection과 constructor injection

 

Container란?

 - 객체의 생성, 사용, 소멸에 해당하는 라이프사이클을 담당

  - 라이프사이클을 기본으로 애플리케이션 사용에 필요한 주요 기능을 제공

 

Container 기능

- 라이프사이클 관리

- dependecy 객체 제공

- thread 관리

- 기타 애플리케이션 실행에 필요한 환경

 

Container 필요성

- 비즈니스 로직 외에 부가적인 기능들에 대해서는 독립적으로 관리되도록 하기 위함

- 서비스 lookup이나 configuration에 대한 일광성을 갖기 위함

- 서비스 객체를 사용하기 위해 각각 factory 꼬는 singleton패턴을 직접 구현하지 않아도 됨.

- Ioc Container : BeanFactory, Application Context

 

Spring DI Contatiner

- Spring DI Container가 관리하는 객체를 빈(bean)이라고 하고 이 빈들의 생명주기를 관리하는 의미로 빈팩토리라고 한다.

- bean factory에 여러 가지 컨테이너 기능을 추가하여 application context라 한다.

 

<<interface>> BeanFactory

 - bean을 등록, 생성, 조회, 반환 관리

 - 일반적으로 beanfactory보다는 이를 확장한 applicationcontext를 사용

 - getbean() 메소드가 정의되어 있음

 

<<interface>> applicationContext

 - bean을 등록, 생성, 조회, 반환 관리

 - Spring의 각종 부가 서비스를 추가로 제공

 - spring이 제공하는 어플릴케이션 컨텍스트 구현 클래스는 여러가지 종류가 있음

 

IoC

- 객체간의 결합도를 떨어뜨릴 수 있음 (loose coupling) : 해당 클래스가 유지보수될 때 결합된 다른 클래스도 같이 유지보수

- factory를 통해 결합도를 낮춤 : 각 service를 새성하여 반환하는 factory 사용

 

Spring DI 용어 정리

- 빈 (bean)

1. 스프링이 IoC방식으로 관리하는 오브젝트를 말한다.

2. 스프링이 직접 그 생성과 제어를 담당하는 오브젝트만을 bean이라고 부른다.

 

- 빈 팩토리

1. 스프링이 IoC를 담당하는 핵심 컨테이너

2. bean을 등록, 생성, 조회, 반환하는 기능을 담당

3. 일반적으로 BeanFactory를 바로 사용하지 않고 이를 확장한 ApplicationContext를 이용한다.

 

- 애플리케이션 컨텍스트

1. BeanFactory를 확장한 IoC컨테이너

2. 빈을 등록하고 생성, 조회, 반환하는 기능을 담당

3. 스프링이 제공하는 각종 부가 서비스를 추가로 제공

 

빈 생성범위

- 싱글톤(Singleton) 빈

  - 스프링 빈은 기본적으로 싱글톤으로 만들어짐

  - 그러므로 컨테이너가 제공하는 모든 빈의 인스턴스는 항상 동일함

  - 컨테이너가 항상 새로운 인스턴스를 반환하게 만들고 싶을 경우 scope를 prototype으로 설정해야 함

 

빈의 생성범위 지정

singleton 스프링 컨테인당 하나의 인스턴스 빈만 생성
prototype 컨테이너에 빈을 요청할 때마다 새로운 인스턴스 생성
request HTTP Request별로 새로운 인슨턴스 생성
response Http response 별로 새로운 인스턴스 생성

 

스프링 빈 설정: XML

- XML 문서 형태로 빈의 설정 메타 정보를 기술

- <bean>

 

:Annotaion

- 어플리케이션의 규모가 커ㄴ지고 빈의 갯수가 많아질 경우

- 빈 스캐닝

- 어노테이션 사용의 경우 반드시 component-scan을 설정해줘야 한다.

- <context:component-scan base-package="com.test.hello.*" />

Stereotype annotaion

@Repository DAO 또는 Repository클래스에 사용
자동변환과 같은 aop 적용 대상을 선정하기 위해 사용
@Service service layer의 클래스에 사용
@Controller MVC Controller에 사용
스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 설정
@Component 위의 layer 구분을 적용하기 ㅇ어려운 일반적인 경우에 설정

 

스프링 설정 :xml (applicationContext.xml)

- 애플리케이션에서 사용할 스프링 자원들을 설정하는 파일

- 기본 설정 : 빈 객체 생성 및 주입 

  - 주입할 객체를 설정파일에 설정

 

스프링 빈 의존 관계설정 - xml

- contstructor 이용 <constructor-arg>

- property 이용 setter method (setter를 통해서는 하나의 값만 받을 수 있ㅏ.) <property> xml namespace를 이용하여 주입

 

어노테이션 동일한 타입의 빈이 여러개일 경우 @Qualifier("name")으로 구별

 

스프링 빈의 생명 주기

빈 생성 -> 의존성 주입 -> init method 실행 -> 빈 사용 -> destroy-method 실행 -> 빈 소멸