Post

토비의 스프링 8장

8. 스프링이란 무엇인가?

8.1 스프링의 정의

  • 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
  • 애플리케이션 프레임워크
    • 프레임워크는 애플리케이션의 특정 계층에서 주로 동작하는 한 가지 기술 분야에 집중
    • 애플리케이션 프레임워크는 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크
    • 애플리케이션의 전 영역을 관통하는 일관된 프로그래밍 모델과 핵심 기술을 바탕으로 해서 각 분야의 특성에 맞는 필요를 채워주고 있기 때문에, 애플리케이션을 빠르고 효과적으로 개발할 수 있다.
    • 스프링의 일차적인 존재 목적은 핵심 기술에 담긴 프로그래밍 모델을 일관되게 적용해서 애플리케이션을 편리하게 개발하게 해주는 애플리케이션 프레임워크로 사용되는 것
  • 경량급
    • 불필요하게 무겁지 않다.
    • 가볍고 단순한 환경에서도 엔터프라이즈 개발의 고급 기술을 대부분 사용할 수 있다.
    • 생산성과 품질 면에서 유리함
  • 자바 엔터프라이즈 개발을 편하게
    • 편리한 애플리케이션 개발이란 개발자가 복잡하고 실수하기 쉬운 로우레벨 기술에 많은 신경을 쓰지 않으면서도 애플리케이션의 핵심인 사용자의 요구사항, 즉 비즈니스 로직을 빠르고 효과적으로 구현하는 것
    • 엔터프라이즈 개발에서 필연적으로 요구되는 기술적인 요구를 충족하면서도 개발을 복잡하게 만들지 않는다.
  • 오픈소스
    • 아파치 라이선스 버전 2.0
    • 개발 과정에 많은 사람이 자유롭게 참여
    • 오픈소스의 장점은 공개된 커뮤니티의 공간 안에서 투명한 방식으로 다양한 참여를 통해 개발되기 때문에 매우 빠르고 유연한 개발이 가능
    • 지속적이고 안정적인 개발이 계속될지가 불확실하다는 단점

8.2 스프링의 목적

  • 스프링의 목적은 경량급 프레임워크인 스프링을 활용해서 엔터프라이즈 애플리케이션 개발을 편하게 하는 것
  • 8.2.1 엔터프라이즈 개발의 복잡함
    • 복잡함의 근본적인 이유
      • 기술적인 제약조건과 요구사항이 늘어가기 때문
        • 엔터프라이즈 시스템을 개발하는 데는 순수한 비즈니스 로직을 구현하는 것 외에도 기술적으로 고려할 사항이 많다.
      • 엔터프라이즈 애플리케이션이 구현해야 할 핵심기능인 비즈니스 로직의 복잡합이 증가하기 때문
    • 복잡함을 가중시키는 원인
      • 근본적인 비즈니스 로직과 엔터프라이즈 기술이라는 두 가지 복잡함이 한 데 얽혀 있기 때문에
  • 8.2.2 복잡함을 해결하려는 도전
    • 제거될 수 없는 근본적인 복잡함
    • 실패한 해결책: EJB
      • 애플리케이션 로직을 담은 핵심 코드에서 일부 기술적인 코드가 제거된 건 사실이지만, 오히려 EJB라는 환경과 스펙에 종속되는 코드로 만들어져야 하는 부담을 안게 됨
    • 비침투적인 방식을 통한 효과적인 해결책: 스프링
      • 침투적인 기술: EJB처럼 어떤 기술을 적용했을 때 그 기술과 관련된 코드나 규약 등이 코드에 등장하는 경우
      • 비침투적인 기술은 기술의 적용 사실이 코드에 직접 반영되지 않는다는 특징이 있다.
  • 8.2.3 복잡함을 상대하는 스프링의 전략
    • 기술과 복잡함을 상대하는 전략
      1. 기술에 대한 접근 방식이 일관성이 없고, 특정 환경에 종속적이다.
        • 일관성 없는 기술과 서버환경의 변화에 대한 스프링의 공략 방법은 서비스 추상화
      2. 기술적인 처리를 담당하는 코드가 성격이 다른 코드에 섞여서 등장
        • AOP는 기술을 다루는 코드로 인한 복잡함이 기술 그 자체 이상으로 불필요하게 증대되지 않도록 도와주는 가장 강력한 수단
    • 비즈니스와 애플리케이션 로직의 복잡함을 상대하는 전략
      • 비즈니스 로직을 다루는 핵심 코드에 오류가 있으면 엔터프라이즈 시스템을 사용하는 업무 자체에 큰 지장을 주거나 치명적인 손실을 끼칠 수도 있다.
      • 예전에는 DB에서 비즈니스 로직을 처리했지만, DB에 부담을 주는 것도 문제고, 데이터 액세르를 중심으로 로직을 다루면 개발과 유지보수는 물론이고, 테스트도 매우 어렵다
      • 엔터프라이즈 시스템 개발의 흐름은 점차로 비즈니스 로직은 애플리케이션 안에서 처리하는 추세이다.
    • 핵심 도구: 객체지향과 DI
      • 모든 스프링의 기술과 전력은 객체지향이라는 자바 언어가 가진 강력한 도구를 극대화해서 사용할 수 있도록 돕는 것

8.3 POJO 프로그래밍

  • 스프링의 정수는 엔터프라이즈 서비스 기능을 POJO에 제공하는 것
  • 엔터프라이즈 서비스: 보안, 트랜잭션과 같은 엔터프라이즈 시스템에서 요구되는 기술
  • 8.3.1 스프링의 핵심: POJO
    • 스프링의 주요 기술: IOC/DI, AOP, PSA
  • 8.3.2 POJO랑 무엇인가?
    • POJO(Plain Old Java Object)
  • 8.3.3 POJO의 조건
    1. 특정 규약에 종속되지 않는다.
    2. 특정 환경에 종속되지 않는다.
    3. 객체지향적인 자바 언어의 기본에 충실하게 만들어져야 한다.
  • 8.3.4 POJO의 장점
    • 특정한 기술과 환경에 종속되지 않는 오브젝트는 그만큼 깔끔한 코드가 될 수 있다.
    • 자동화된 테스트에 매우 유리
    • 객체지향적인 설계를 자유롭게 적용 가능
  • 8.3.5 POJO 프레임워크
    • 스프링을 이용하면 POJO 프로그래밍의 장점을 그대로 살려서 엔터프라이즈 애플리케이션의 핵심 로직을 객체지향적인 POJO를 기반으로 깔끔하게 구현 가능

8.4 스프링의 기술

  • 8.4.1 제어의 역전(IoC) / 의존관계 주입(DI)
    • 장점 : 유연한 확장이 가능하게 하기 위해 -> OCP(개방 폐쇄 원칙)
    • DI 활용 방법
      1. 핵심기능의 변경(의존 대상의 구현을 바꾸는 것)
      2. 핵심기능의 동적인 변경(ex. 사용자의 등급에 따라 알맞는 datasource 제공)
      3. 부가기능의 추가(ex. 트랜잭션 기능을 부여한 것)
      4. 인터페이스의 변경(ex. a -> c 사용하고 싶지만 b 인터페이스를 사용하고 있을 때 b 인터페이스에 어댑터로 c를 DI)
      5. 프록시(ex. lazy loading)
      6. 템플릿과 콜백
      7. 싱글톤과 오브젝트 스코프
      8. 테스트(테스트 대상인 오브젝트의 기능에 충실하게 테스트가 가능)
  • 8.4.2 애스펙트 지향 프로그래밍(AOP)
    • OOP가 점점 복잡해져 가는 애플리케이션의 요구 조건과 기술적인 난해함을 모두 해결하는데 한계가 있기 때문에 이를 도와주는 기술이 바로 AOP
    • AOP의 적용 기법
      1. 다이나믹 프록시
        • 기존 코드에 영향을 주지 않고 부가기능을 적용하게 해주는 데코레이터 패턴을 응용한 것
        • 부가기능을 부여할 수 있는 곳은 메소드의 호출이 일어나는 지점뿐이라는 제약
      2. 자바 언어의 한계를 넘어서는 언어의 확장을 이용하는 방법
        • AspectJ를 사용하여 메소드 호출뿐 아니라 인스턴스 생성, 필드 액세스, 특정 호출 경로를 가진 메소드 호출 등에도 부가기능 제공 가능
        • 자바 언어와 JDK의 지원만으로는 불가능
        • 별도의 AOP 컴파일러를 이용한 빌드 과정을 거치거나, 클래스가 메모리로 로딩될 때 그 바이트코드를 조작하는 위빙과 같은 별도의 방법 이용
    • AOP의 적용 단계
      1. 미리 준비된 AOP 사용
        • 트랜잭션을 사용하면서 어떻게 많은 오브젝트에 투명하게 적용되는지 관찰해보고, AOP의 특성과 동작원리 이해
      2. 전담팀을 통한 정책 AOP 적용
        • AOP는 동적으로 동작하면서 개발 정책을 위반한 코드를 잡아내는 데도 유용
      3. AOP의 자유로운 이용
        • 다른 팀이나 개발자가 만든 코드에 몰래 적용되는 AOP 기능을 만드는 위험을 주의할 것!
  • 8.4.3 포터블 서비스 추상화(PSA)
    • 환경과 세부 기술의 변화에 관계없이 일관된 방식으로 기술에 접근 할 수 있게 해주는 것
This post is licensed under CC BY 4.0 by the author.