스프링의 정의

자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크

애플리케이션 프레임워크

  • 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크임
  • 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는 데 일차적인 목표

경량급

  • 가볍다거나 작은 규모의 코드로 이루어진게 아니라 불필요하게 무겁지 않은것

자바 엔터프라이즈 개발을 편하게

  • 엔터프라이즈 개발의 근본적인 문제점에 도전해서 해결책을 제시
  • 개발자들이 프레임워크가 제공하는 기술이 아니라 자신이 작성하는 애플리케이션의 로직에 더 많은 관심과 시간을 쏟게 해줌

오픈소스

  • 아파치 라이선스 버전 2.0(Apache License Ver 2.0)
  • 잠재적인 버그와 문제점이 빠르게 발견되고 해결될 수 있다.
  • 비용에 대한 부담이 없다.

스프링의 목적

엔터프라이즈 개발의 복잡함

복잡함의 근본적인 이유

  • 기술적인 제약조건과 요구사항이 늘어남
  • 엔터프라이즈 애플리케이션이 구현해야 할 핵심기능인 비즈니스 로직의 복잡함이 증가함

복잡함을 가중시키는 원인

  • 전통적인 자바 엔터프라이즈 개발 기법은 대부분 비즈니스 로직의 복잡한 구현 코드와 엔터프라이즈 서비스를 이용하는 기술적인 코드가 자꾸 혼재될수밖에 없는 방식이었음

복잡함을 해결하려는 도전

제거될 수 없는 근본적인 복잡함

  • 근본적으로 엔터프라이즈 개발에 나타나는 복잡함의 원인은 제거 대상이 아님
    • 복잡함을 효과적으로 상대할 수있는 전략과 기법이 필요
    • 비즈니스 로직의 복잡함/기술적인 복잡함을 효과적으로 처리하는 데 적용되는 방법이 다름
    • 이 두가지 복잡함을 분리해야함

실패한 해결책: EJB

  • 일부분 분리하는 데 성공
  • EJB라는 환경과 스펙에 종속되는 코드로 만들어져야 한는 더 큰 부담 생김
  • 망함

비침투적인 방식을 통한 효과적인 해결책: 스프링

  • 비침투적인 - 기술의 적용 사실이 코드에 직접 반영되지 않음
  • 스프링 스스로가 애플리케이션 코드에 불필요하게 노출되지 않도록 함
  • 성공

복잡함을 상대하는 스프링의 전략

기술적 복잡함을 상대하는 전략

  • 문제) 기술에 대한 접근 방식이 일관성이 없고, 특정 환경에 종속적이다.
    • 서비스 추상화
  • 문제) 기술적인 처리를 담당하는 코드가 성격이 다른 코드에 섞여서 등장한다.
    • AOP

비즈니스와 애플리케이션 로직의 복잡함을 상대하는 전략

  • 객체지향 프로그래밍 기법과 언어가 주는 장점인 유연한 설계가 가능하고 재사용성이 높다는 점을 잘 활용하면 자주 바뀌고 조건이 까다로운 비즈니스 로직을 효과적으로 구현해낼 수 있다.

핵심 도구: 객체지향과 DI

  • 기술적인 복잡함을 효과적으로 다루게 해주는 기법은 모두 DI를 바탕으로 함
  • DI란 특별한 기술이라기보다는 오브젝트 설계를 하다 보면 자연스럽게 젹용하게 되는 객체지향 프로그래밍 기법 - 스프링은 단지 편하고 쉽게 사용하도록 도와주는거임

POJO 프로그래밍

스프링의 핵심: POJO

아래는 스프링의 핵심을 가장 잘 나타내고 있다고 알려진 스프링 삼각형이다. 스프링 애플리케이션은 POJO를 이용해서 만든 애플리케이션 코드와, POJO가 어떻게 관계를 맺고 동작하는지를 정의해놓은 설계정보로 구분된다.

  • IoC/DI, AOP, PSA는 애플리케이션을 POJO로 개발할 수 있게 해주는 가능기술이라고 불린다.

POJO란 무엇인가?

  • Plain Old Java Object
  • 평범한 자바오브젝트에는 그럴싸한 이름이 없어서 뭔가 있어 보이도록 만든 이름

POJO의 조건

특정 규약에 종속되지 않는다

  • 자바 언어와 꼭 필요한 API 외에는 종속되지 않아야 함
  • 별다른 가치를 주지도 못하는 규약 따위에 종속죄지 않아야 하고, 객체지향 설계의 자유로운 적용이 가능한 오브젝트여야만 함

특정 환경에 종속되지 않는다

  • 특정 환경이 의존 대상 검색 방식에 종속적이라면 POJO라고 할수없음
  • 객체지향적인 자바 언어의 기본에 충실하게 만들어져야 함
  • 진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다.

POJO의 장점

  • 깔끔한 코드
  • 자동화된 테스트에 매우 유리
  • 객체지향적인 설계를 자유롭게 적용 가능

POJO 프레임워크

POJO 프로그래밍이 가능하도록 기술적인 기반을 제공하는 프레임워크를 POJO 프레임워크라고 한다

  • 대표적인 POJO 프레임워크 - 스프링 프레임워크, 하이버네이트

스프링의 기술

제어의 역전(IoC) / 의존관계 주임(DI)

  • 스프링의 가장 기본이 되는 기술이자 핵심 개발 원칙
  • DI는 유연한 확장이 가능하게 하기 위해서 사용
    • 개방 폐쇄 원칙

DI의 활용 방법

  • 핵심기능의 변경
    • 의존 대상의 구현을 바꿈(디자인 패턴)
  • 핵심기능의 동적인 변경
    • 의존 오브젝트의 핵심기능 자체를 바꾸는 것
    • 동적으로, 동작하는 중간에
    • 다이내믹 라우팅 프록시나 프록시 오브젝트 기법 활용
  • 부가기능의 추가
    • 데코레이터 패턴
    • 핵심기능과 클라이언트 코드에는 전혀 영향을 주지 않으면서 부가적인 기능을 얼마든지 추가 가능
    • DI 덕분
  • 인터페이스의 변경
    • 오브젝트 방식의 어댑터 패턴의 응용
    • 중간에 인터페이스 어댑터 역할을 해주는 레이어를 하나 추가하는 방법도 있음
      • 서비스 추상화(PSA)
  • 프록시
    • lazy loading
    • 원격 프록시
  • 템플릿과 콜백
    • 반복적으로 등장하지만 할상 고정적인 작업 흐름과 그 사이에서 자주 바뀌는 부분을 분리해서 템플릿과 콜백으로 만들고 이를 DI 원리를 응용해 적용하면 코드를 간결하게 만들 수 있음
  • 싱글톤과 오브젝트 스코프
    • DI 할 오브젝트의 생명주기를 제어할 수 있음
      • DI 대상 오브젝트를 컨테이너가 관리
      • 생성,관계설정, 이용, 소멸에 이르기까지의 모든 과정을 DI 컨테이너가 주관
      • 그 오브젝트의 스코프를 자유롭게 제어
    • 가장 기본이 되는 스코프 싱글톤
    • 스프링의 DI는 기본적으로 싱글톤으로 오브젝트를 만들어서 사용
      • 컨테이너가 알아서 싱글놑을 만들고 관리
      • 클래스 자체는 싱글톤을 고려하지 않고 자유롭게 설계해도 됨
    • 개발자 스스로 일정한 스코프를 갖는 오브젝트를 만들고 이를 DI에 적용하는 것도 가능
  • 테스트
    • DI를 위해 만든 수정자 메소드를 사용하면 테스트 코드 안에서 수동으로 목 오브텍트 주입 가능
    • 테스트용으로 설정을 별도로 생성 가능

애스펙트 지향 프로그래밍(AOP)

객체지향 기술의 한계와 단점을 극복하도록 도와주는 보조적인 프로그래밍 기술 OOP를 더욱 OOP답게

AOP의 적용 기법

  • 스프링과 같이 다이내믹 프록시를 사용하는 방법
    • 데코레이터 패턴 응용
    • 부가기능을 부여할 수 있는 곳은 메소드의 호출이 일어나는 지점만 가능
    • 스프링의 기본적인 AOP 구현 방법은 다이내믹 프록시를 이용하는 프록시 AOP 방식
  • 자바 언어의 한계를 넘어서는 언어의 확장을 이용하는 방법
    • 고급 AOP기능을 적용하기 위함
    • 별도의 AOP 컴파일러를 이용한 빌드 과정을 거치거나, 클래스가 메모리로 로딩될 때 그 바이트코드를 조작하는 위빙과 같은 별도의 방법 사용
    • 프록시 방식의 AOP로는 할 수 없는 작업을 위해 사용
    • AspectJ 가 유명

AOP의 적용 단계

  1. 미리 준비된 AOP 이용
    • 스프링이 미리 만들어서 제공(트랜잭션, …)
  2. 전담팀을 통한 정책 AOP 적용
    • 애플리케이션 전체적으로 이용 가능한 것을 소수의 AOP 담당자 관리하에 적용 해볼수 있다
  3. AOP의 자유로운 이용
    • 개발자 스스로가 AOP를 활용

포터블 서비스 추상화(PSA)

환경과 세부 기술의 변화에 관계없이 일관된 방식으로 기술에 접근할수 있게 해주는 PSA(Portable Service Abstraction)다.

  • 필요한 기술 DI뿐
  • DI 응용 방법의 한가지
  • 구체적인 기술에 종속되지 않게 하기 위해서만 사용되는게 아니라 테스트가 어렵게 만들어진 API나 설정을 통애 주요 기능을 외부에서 제어하게 만들고 싶을때도 이용할 수 있다

Ref.

이일민, “토비의 스프링 3.1”, 에이콘 출판사(2012)