티스토리 뷰

Development/Spring

SpringFramework

김드랍 2017. 6. 20. 01:45


Spring이란?

- JavaEE 개발을 편하게 해주는 경량급 오픈소스 애플리케이션 프레임워크

- 동적인 웹사이트를 개발하기 위한 여러가지 서비스를 제공

- 대한민국 전자정부 표준프레임워크의 기반 기술


* Framework이란?

소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화 된 형태로 클래스들을 제공하는 것


Spring의 특징

- 경량 Container

- Java객체를 담고있으며 생성,소멸과 같은 라이프 사이클을 관리하며 Spring Container로 부터 필요한 객체를 가져와 사용가능

- IoC(Inversion of Control)

- DI(Dependency Injection) 지원

- AOP(Aspect Oriented Programming)

- POJO(Plain Old Java Object) 지원

- Transaction 처리를 위한 일관된 방법을 제공한다

- Durability(영속성)와 관련된 다양한 API지원

- 다양한 API에 대한 연동


* POJO란?

- 말 그대로 해석하면 오래된 방식의 간단한 자바 오브젝트 라는 뜻

- J2EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 '무거운' 객체를 만들게 된 것에 반발해서 사용되는 용어

- 특정 자바 모델이나 기능, 프레임워크등을 따르지 않은 Java객체를 지칭하는 말

* Durability(영속성)이란?

- DB의 특징중 하나로 하나의 트랜잭션이 성공적으로 수행된 후 Commit되고 나면 해당 트랜잭션에 의한 내용은 영구적으로 유지되어야 한다



IoC(Inversion of Control) - 제어 반전

- Spring의 가장 핵심적인 기능 중 하나로써 컴포넌트간 의존성을 컨테이너가 주입해주고 객체의 생명주기를 컨테이너에서 관리하는 것과 같이 애플리케이션의 전반적인 컨트롤 제어권이 개발자(사용자)가 아닌 프레임워크로 넘어가는 것을 말한다

- 자바의 반영 reflection을 이용해 객체의 생명주기를 관리하고 각 계층이나 서비스들간의 의존성을 맞춰준다

- 환경설정을 담당하는 XML 파일에 의해 설정되고 수행된다

- 컨트롤 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자 코드를 호출해 사용한다

- IoC컨테이너는 빈팩토리(BeanFactory), 애플리케이션 컨텍스트(Application Context) 두가지가 있다

  ApplicationContext는 BeanFactory를 더 확장한 개념, 그자체로 IoC와 BeanFactory이면서 그 이상의 기능을 가짐



DI(Dependency Injection) - 의존성 주입

- 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 XML 설정파일을 통해 프레임워크가 서로 연결해준다

- Has-a 관계로 객체를 보유할 때는 최상위 자료형을 보유할 수록 유연해진다 : 유지보수성 증가

- 객체와 객체간 의존성을 낮춤 - 불필요한 의존관계를 없애거나 줄일 수 있다

- 디자인 패턴의 전략패턴이 대표적인 예 

A->B 구조에서 A의 기능 일부를 B에게 위임한다고 했을때 B의 구현 방식을 필요에 따라 B1,B2,B3로 바꾸는 것이다  

ex) DAO 의 구현을 JDBC 로 했다가, Hibernate/iBatis/JPA 등으로 변경

- DI 적용 패턴 2가지

1. 생성자를 이용한 의존성 삽입 (Constructor Injection)

: 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통해 의존성 주입

           즉, 파라미터를 만들어 두고 이를 통해 DI 컨테이너가 의존 할 오브젝트 레퍼런스를 넘겨주는 방식

2. setter() 를 이용한 의존성 삽입(Setter Injection)

: 의존성을 입력받는 setter()를 만들고 이를 통해 의존성 주입

3 .Annotation( @Autowired )를 이용해 주입하는 방법

: Springframework에 종속적인 프레임워크 , 여러개의 빈이 검색될 경우 @Qualifier(name=" XXX" )로 구분한다 

- 핵심기능의 동적인 변경

일반적인 DI를 이용한 변경 방법과 달리 애플리케이션이 동작하는 중간에 그 의존 대상을 Dynamic하게 변경 가능

사용자 등급에 따라 다른 DataSource를 사용하게 할 수 있다

DAO -> DataSource 관계가 생성

다이나믹 라우팅 프록시 or 프록시 오프젝트기법 활용


AOP(Aspect-Oriented Programming) - 관점 지향 프로그래밍

- 횡단관심사(Crosscutting Concern)와 이에 영향 받는 객체가 결합도를 낮추는 것이 목적

(윗줄을 풀어서 설명하면...) Logging,Transaction,Security,Caching,예외처리 등과 같이 핵심적인 비즈니스 로직과 관련이 없으나 여러 곳에서 공통적으로 쓰이는 기능들을 분리하여 개발하고 실행 시에 서로 조합하는 프로그래밍 방법

- 기능을 핵심 비지니스 로직과 공통 모듈로 구분하고 핵심 로직에 영향을 미치지 않고 사이사이에 공통 모듈을 효율적으로 끼워 넣도록 하는 개발 방법

- 공통 모듈을 만든 후 코드 밖(XML 설정파일)에서 이 모듈을 로직에 삽입하는 것 = 코드에서 모듈을 분리

- 기존에 널리 사용되고 있는 관점지향프레임워크인 AspectJ도 내부적으로 사용가능

- Spring 자체적으로 지원하는 실행시(Runtime)에 조합하는 방식도 지원

- 곳곳에 흩어져 있는 다양한 관심 사항이 하나의 장소로 응집 -> 관리가 수월 = 유지보수성 증가

- 가독성 증가

- 자체적으로 프록시 기반의 AOP지원


AOP의 구성요소

- 조인포인트(JoinPoint) : 횡단관심모듈의 기능이 삽입되어 동작할 수 있는 특정위치


- 포인트컷(PointCut) : 어떤 클래스의 어느 조인포인트를 사용할 것인지를 결정하는 선택 기능


- 어드바이스(Advice) : 각 조인 포인트에 삽이되어져 동작할 수 있는 동작할 수 있는 코드


- 인터셉터(Intercepter) : 인터셉터 체인 방식의 AOP틀에서 사용하는 용어로 주로 한개의 invoke 메소드를 가지는 어드바이스


- Aspect = 포인트컷(어디에서) + 어드바이스(무엇을) + (필요에 따라 인트로덕션) : AOP가 기존의 핵심관심모듈 코드에 전혀 영향을 주지 않으면서 필요한 횡단 관심 기능을 추가할 수 있게 해주는 핵심적인 처리과정


- 위빙(Weaving) : 포인트 컷에 의해서 결정된 조인포인트에 지정된 어드바이스를 삽입 하는 과정


- 인트로덕션(Introduction) : 정적인 방식의 AOP기술 , 동적인 AOP방식에 반해서 기존의 클래스와 인터페이스에 필요한 메소드나 필드를 추가해서 사용할 수 있게 해주는 방법, OOP에서 말하는 오브젝트의 상속이나 확장과는 다른 방식으로 어드바이스 또는 Aspect를 이용해서 기존 클래스에 없는 인터페이스 등을 다이나믹하게 구현할 수 있다



* Crosscutting Concern(횡단 관심사)이란?

OOP와 같은 모듈화가 뛰어난 방법을 사용하더라도 결코 쉽게 분리된 모듈로 작성하기 힘든 요구상항이 설계와 개발에서 자주 발견되는데 이를 AOP에서 횡단관심이라고 한다


* Primary(Core) Concern(핵심 관심사)이란?

비즈니스 로직을 구현한 부분


AOP 설정구조

<aop:config> <aop:pointcut /> : pointcut 설정 <aop:aspect> : aspect를 설정 <aop:before /> : method 실행 전 <aop:after-returning /> : method 정상 실행 후 <aop:after-throwing /> : method 예외 발생 시 <aop:after /> : method 실행 후 (예외 발생 예부 상관 없음) <aop:around /> : 모든 시점 적용 가능 </aop:aspect> </aop:config>




MVC 패턴

- Spring은 웹 프로그램 개발시 MVC패턴을 사용한다(SpringMVC)

- DispatcherServlet이 Controller 역할을 담당하여 각종 요청을 적절한 서비스에 분산시켜주며 이를 각 서비스들이 처리를 하여 결과를 생성하고 그 결과를 다양한 View 서비스들로 화면에 표시한다


Batch Framework

- Spring은 특정 시간대에 실행하거나 대용량의 자료를 처리하는데 쓰이는 일괄 처리(Batch Processing)를 지원하는 배치 프레임워크를 제공한다

- 기본적으로 Spring Batch는 Quartz 기반으로 동작한다


영속성과 관련된 다양한 서비스 지원

- Spring은 JDBC 를 비롯하여 iBatis, Hibernate, JPA 등 데이터베이스 처리를 위해 널리 사용되는 라이브러리와의 연동을 지원한다


다양한 API 연동

- Spring은 JMS,Mail,Scheduling 등 Enterprise Application을 개발하는데 필요한 API를 설정 파일과 Annotation을 통해서 손쉽게 사용할 수 있도록 지원한다


확장성이 높음

- Spring에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 Spring에서 사용이 가능하기 때문에 수많은 라이브러리가 이미 Spring에서 지원되고 있고 Spring에서 사용되는 라이브러리를 별도로 분리하기에도 용이하다




* 공부하면서 쓴글이라 잘못 이해하고 잘못된 점이 있을 수 있으니 발견하시면 댓글남겨주시면 정정하겠습니다 *




댓글