Spring 소개

토비의스프링 3.0을 공부하면서 정리하는 내용입니다. 이해할 수 있는 내용은 요약정리를 하였고, 이해할 수 없는 내용이나 경험해보지 못한 내용은 본문을 그대로 적어두고 있습니다.


스프링이란?

  • 자바 애플리케이션 개발을 위한 경량 프레임 워크.

  • 자바 애플리케이션은 스트러츠와 같은 프레임워크와 달리 웹 개발에만 국한되지 않고, Single JVM형, 웹, JEE애플리케이션 등 을 모두 의미 함.

  • 경량의 의미는 "최소영향"의 의미로 스프링 코어는 애플리케이션과 결합도가 낮기 때문에 비교적 자유로운 애플리케이션 이식이 가능 함을 의미.


제어역전(IoC) 또는 의존성 주입(DI)

  • IoC : 스프링 프레임워크의 코어는 제어역전(IoC)원칙을 기반. IoC는 컴포넌트 의존성의 생성 및 관리를 외부화하는 기법.

  • DI : new 키워드로 직접 인스턴스를 생성하는 것이 아닌, 런타임시점에 외부프로세스를 통해 인스턴스를 제공 받는 기법. 스프링을 DI제공자는 외부XML파일, 스프링 자바 설정파일, 코드 내 어노테이션 등을 지원하여 유연하게 정의 가능.DI에 타겟이 되는 객체(설정된 객체)는 자바Bean(POJO)과 interface를 근간으로 구현 한다.


DI의 장점

접착코드를 줄임 (From Interface사용)

의존성 생성(일반적은 new 키워드로 인스턴스 생성) 역시 간단하긴 하지만, JNDI저장소에서 의존성을 룩업하거나, 원격 리소스의 경우 접착코드가 매우 복잡할 수 있다. 이에 비해 DI는 JNDI자동조회 기능 혹은 원격 리소스의 자동 프록시 등을 통해 애플리케이션의 각기 다른 컴포넌트를 서로 연결하려고 작성하는 코드의 양을 감소 시킬 수 있다.


애플리케이션 설정 단순화 (From 외부xml, @사용)

@어노테이션 XML을 사용하여 클래스 의존성 주입설정. 또한, 인터페이스를 근간으로 하기 때문에 같은 인터페이스를 구현하는 다른 구현체로 변경하는 일도 손쉽게 의존성 변경 가능.


이건 내가 조금 다른의견인게, XML파일을 통해서 일괄 관리하는 부분은 납득이 되지만, @을 사용하게 되는 경우, 소스코드와 일부 분리이긴 하지만, 결국 JAVA 파일에 종속되는게 아닌가...?

 

단일 저장소를 통한 공통 의존성 관리 (From 외부xml, @사용)

소스코드에서 의존성 인스턴스 생성(또는 팩토리 클래스에서 검사)은 소스코드 내에서 의존성이 생성되기 때문에 관리나 변경이 어렵다. 하지만, DI를 사용하면 외존성에 대한 정보가 모두 단일저장소(스프링의 경우 XML파일 혹은 자바파일 어노테이션)에 저장되는 만큼 의존성 관리하기가 쉽고, 에러 가능성도 적다.


손쉬운 테스트 (From 인터페이스 사용)

클래스를 DI에 맞게 설계하면 의존성을 쉽게 대체할 수 있고, 어플리케이션 테스트 시 편리하다. 직접 DAO에 접근하지 않고, 더미 SQL결과를 반환하는 테스트 DAO구현체를 생성하여 의존성을 변경시키면 별도의 비지니스 로직만 테스트가 가능하다.



좋은 애플리케이션 설계를 촉진 (From 인터페이스 사용)

DI에 맞게 설계한다는 말은 보통 인터페이스를 기준으로 설계한다는 뜻이다. 의존성 주입을 지향하는 어플리케이션은 보통 주요 컴포넌트가 인터페이스로 정의되어 있고, DI컨테이너가 이들 인터페이스의 구현체를  생성하고, 연결한다. 


전체적으로 DI의 장점이라기 보다는, IoC나 DI의 특성상 설정파일 외부화, 인터페이스 사용에서 나오는 특장점 들을 억지로 만들고 나열해 놓은 수준 인 것 같다. 주요 포인트는 설정파일 외부화를 의존성 관리 포인트를 하나로 통일 할 수 있다는 점. 그리고 인터페이스 사용으로 클래스 결합성을 낮출 수 있다는 것이 주요 장점. 





스프링 의존성 주입의 특징


스프링을 활용한 관점 지향 프로그래밍(AOP)

관점지향 프로그랠밍(AOP)는 공통 로직을 한 곳에 구현하고 이 로직을 어플리케이션 전 영역에 자동으로 설정 할 수 있게 해준다. 스프링 AOP의 접근 방식은 타깃 객체에 대한 '동적 프록시'를 생성하고 설정된 어드바이스를 사용하 객체를 '위빙(weaving)'함으로써 공통 로직을 수행하는 것이다.

또한, AOP라이브러리 AspectJ와 스프링이 연동되면서 더욱 강력한 기능을 지원한다.

  •  AspectJ방식의 포인터컷 표현식 지원
  •  스프링 AOP위빙에 사용하면서 동시에 @AspectJ  어노테이션 스타일을 지원
  •  AspectJ에 구현된 애스펙트를 통한 DI 지원
  •  스프링 ApplicationContext내에서 로드 시점 위빙 지원


아주 단순하게 AOP가 관점지향프로그래밍으로 모든 method수행시 선처리 후처리에 대한 메소드를 지정하여 로그를 남기거나 공통기능을 처리하는 메소드를 지정하는 기능을 하는 것은 안다. 하지만 글에서 말하는 '동적 프록시', '위빙'에 대한 내용은 들어보긴 한 것 같은데 뭔지 잘 모르겠다. 중요한 것 같다.

 

스프링 표현 언어(SpEL)

자바서버페이지(jsp)와 자바 서버 페이스(jsf)와 같은 자체 표현언의 들의 구문이 모두 다르기 때문에 이를 해결하기 위한 통합 표현 언어(EL).

스프링 3.0부터 표현언어(SpEL)을 도입하여 런타임 시점에서 표현식을 해석하고 자바객체와 스프링 빈에 접근하는 특성 제공.

표현언어의 결과는 애플리케이션에서 사용하거나 다른 자바 빈에 주입 할 수 있다. 


스프링의 유효성 검증

JCP는 빈 유효성 검증 API명세(JSR-303)를 개발. 이는 bean 유효성 검증 규칙을 정의하는 표준 방식제공. @NotNull 어노테이션을 프로퍼티에 추가하면 이프로퍼티는 데이터 베이스에 저장되기 전 널 값 체크를 자동화.

스프링은 JSR-303을 3.0버젼 부터 기본 지원. ValidatorFactoryBean을 선언하고 Validator 인터페이스를 스프링이 관리하는 Bean에 주입하기만 하면 자동으로 Validation적용. 

*JCP(Java Community Process) : 자바 플랫폼의 향후 버전 및 기능에 대한 정의에 관여하는 표준화 과정

*JSR-303 (Java Specification Request) : 자바스펙요구서. 303은 Java Bean Validation에 관한 내용을 담고 있음.


스프링에서의 데이터 접근

스프링은 데이터접근과 영속성에 관한 표준 API를 감싼 단순한 API를 제공함으로써 표준 JDBC를 활용해 많은 프로젝트에 활용.


3.X버젼 기준 스프링 데이터 접근 모듈

    1. JDBC
    2. 하이버네이트
    3. 마이바티스
    4. 자바데이터객체(JDO)
    5. 자바 영속성 API(JPA)

스프링에서의 객체/XML 매핑(OXM)

스프링은 각종 자바->XML 매핑 프레임워크를 지원. 스프링은 마샬링(JAVA Bean -> XML)과 언마샬링(XML->JAVA Bean)을 위한 공통인터페이스를 제공하고 임의의 스프링 빈에 DI로 주입할 수 있도록 제공. 


스프링 XML바인딩 라이브러리 지원 

    1. JAXB (XML바인딩을 위한 JAVA API)
    2. 캐스터
    3. XStream
    4. XMLBeans


트랜잭션 관리

트랜젝션 관리를 위한 추상 레이어를 제공함으로 프로그래밍적으로, 선언적으로 트랜젝션을 제어하도록 지원.

내부 트랜잭션 프로토콜과 리소스 관리자를 쉽게 변경할 수 있음.

코드 변경 없이 로컬, 특정 리소스 관련 트랜젝션 부터 전역, 멀티리소스 트랜젝션 관리 가능


JEE단순화 및 연동

EJB지원을 위해 JNDI룩업을 수행하고 스프링 빈으로 주입할 수 있는 선언 구문 제공.

반대로, 스프링 Bean을 EJB에 주입할 수 있는 간단한 어노테이션 제공

JNDI접근 가능한 위치에 저장된 모든 리소스에 대해 스프링은 복잡한 룩업 코드 없이 JNDI관리 리소스를 런타임 시점에 다른 객체에 의존성으로 주입하여 줌. 이로 인해 어플리케이션은 직접 JNDI와 결합하지 않아도 되고, 소스코드 재사용 범위가 늘어남. 


웹 티어의  MVC

MVC 패턴의 스프링 웹 프레임워크 지원


다양한 VIEW 연동지원

    1. JSP표준지원
    2. 아파치 벨로시티
    3. 프리마커
    4. 아파치 타일즈
    5. XSLT
    6. 엑셀
    7. PDF

다른 FWK와 연계

    1. 스트러츠
    2. JSF
    3. 구글웹툴킷(GWT)


리모팅 지원

다양한 리모트 접근 메커니즘 지원함은 물론이고 이들 리모팅 프로토콜 외에도 표준 자바 직렬화를 기반으로 자체 http기반 호출자 제공. 스프링의 동적 프록시 기능을 적용하면 원격 리소스에 대한 프록시 클래스의 의존성에 주입할 수 있음으로 어플리케이션을 특정 리모팅 구현체와 결합하지 않아도 되고 작성코드의 양도 그만큼 줄어든다.


지원되는 리모팅 프로토콜

    1. JMI
    2. JAXRPC
    3. Caucho Hessian
    4. Caucho Burlap
    5. 스프링 자체 리모팅 호출자


메일 지원

DI기능과 연동하여 이메일 메시지를 보낼 수있는 간단한 API제공

스프링은 DI컨테이너에서프로토타입 메시지를 생성하고 이를 어플리케이션에서 보내는 모든 메시지의 기반으로 사용할 수 있게 해준다?

이를 통해 메일 관련 변수를 쉽게 커스터마이징, 더불어 아파치 벨로시티 같은 템플릿 엔진과 연동해 메일 내용을 자바코드 외부에 둘 수 있게 해준다.


작업 스케줄링 지원

고정주기 작업 혹은 크론 표현식을 통해 예약


별도 라이브러리와 연동해 작업 실행 및 스케쥴링 가능

    1. CommonJ
    2. JDK Timer API
    3. 쿼츠 


동적 스크립팅 지원

JDK6 부터 JAVA는 동적 언어 지원 기능을 도입 이를 통해 그루비, 제이루비, 자바스크립트 등 실행.

스프링역시 어플리케이션에서 동적 스크립트 실행을 지원.

개발자는 동적 스크립팅 언어로 작성된 Bean을 정의하고 다른 자바 Bean에 주입 가능.


스프링 지원 동적 스크립팅 언어

    1. 그루비
    2. 제이루비
    3. 빈셸

 

단순한 예외 처리

스프링의 예외처리 철학은 검사형 예외가 자바에서 남용되고 있으며 프레임워크에서는 개발자가 복구할 수 없는 예외를 처리하도록 강요하지 말야아 한다는 것. 스프링은 비검사형 예외를 개발자가 쓸 수 있게 하고 예외 계층구조를 매우 상세하게 지정할 수 있다.



이 글을 공유하기

댓글

Email by JB FACTORY