• 스프링이란 무엇인가?
  • 스프링 프레임워크가 만들어진 이유와 존재 목적, 추구하는 가치는 무엇일까?

스프링의 정의

  • 스프링 : 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
    1. 애플리케이션 프레임워크 : 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크임. 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는데 일차적인 목표를 두는 프레임워크임.
    • 스프링의 탄생
      • 스프링의 기원은 로드 존슨 책의 예제 코드임. 책에서 강조한 중요한 전략의 하나는 ‘항상 프레임워크로 접근하라’라는 것임.
    1. 경량급 : 스프링이 경량급이라는 건 스프링을 기반으로 제작되는 코드가 기존 EJB 등에서 동작하기 위해 만들어진 코드에 비해 상대적으로 작고 단순하다는 의미임. → 코드에 불필요하게 등장하던, 프레임워크와 서버환경에 의존적인 부분을 제거함.
    1. 자바 엔터프라이즈 개발을 편하게 : 개발자가 복잡하고 실수하기 쉬운 로우레벨 기술에 많은 신경을 쓰지 않으면서도 애플리케이션의 핵심인 사용자의 요구사항, 즉 비즈니스 로직을 빠르고 효과적으로 구현하는 것임.
    1. 오픈소스
    • Apache License Ver 2.0
    • 스프링의 개발 과정은 공개되어 있지만 공식적인 개발은 제한된 인원의 개발자에 한정됨.
    • 스프링소스에서 오픈소스 프로젝트로서 스프링이 효율적으로 개발되도록 지원하고 있음.

스프링의 목적

  • 자바의 목적은 객체지향 프로그래밍을 통해 유연하고 확장성 좋은 애플리케이션을 빠르게 만드는 것임.
  • 스프링의 목적은 무엇인가? 만들어진 이유는 무엇이고, 스프링을 통해 궁극적으로 이루려는 것은 무엇인가?
    • 경량급 프레임워크인 스프링을 활용해서 엔터프라이즈 애플리케이션 개발을 편하게 하는 것임.
  • 왜 스프링을 사용해서 엔터프라이즈 애플리케이션 개발을 편하게 할까?
    • 엔터프라이즈 개발은 편하지 않음.

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

  • 복잡함의 이유
      1. 기술적인 제약조건과 요구사항이 늘어남
      • 엔터프라이즈 시스템 : 서버에서 동작하며 기업과 조직의 업무를 처리해주는 시스템임.
      • 엔터프라이즈 시스템을 개발하는 데는 순수한 비즈니스 로직을 구현하는 것 외에도 기술적으로 고려할 사항이 많음.
      1. 엔터프라이즈 애플리케이션이 구현해야 할 핵심기능인 비즈니스 로직의 복잡함이 증가하기 때문임.
      • 엔터프라이즈 시스템의 변경이 많아짐.
  • 복잡함을 가중시키는 원인
    • 비즈니스 로직과 엔터프라이즈 기술이라는 2가지 복잡함이 얽혀 있음.

복잡함을 해결하려는 도전

  • 복잡함의 원인은 제거대상이 아님. 복잡함을 효과적으로 상대할 수 있는 전략이 필요함.
  • 비즈니스 로직의 복잡함과 기술적인 복잡함을 처리하는 데 적용되는 방법이 다름. → 두가지 복잡함을 분리하자.
  • 실패한 해결책: EJB vs. 비침투적인 방식을 통한 효과적인 해결책: 스프링
    • 비침투적인(non-invasive) 기술 - 기술의 적용 사실이 코드에 직접 반영되지 않음.
    • 스프링을 이용하면 기술적인 복잡함과 비즈니스 로직을 다루는 코드를 깔끔하게 분리할 수 있음.

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

  • 엔터프라이즈 기술을 적용했을 때 발생하는 복잡함의 문제
      1. 기술에 대한 접근 방식이 일관성이 없고, 특정 환경에 종속적임.
      • 환경이 바뀌고, 서버가 바뀌고, 적용 조건이 변경되면 적용하는 기술이 달라지고 그에 따라 코드도 바뀐다는 것은 심각한 문제임. → 서비스 추상화로 해결
      • 기술적인 복잡함은 추상화를 통해 로우레벨의 기술 구현 부분과 기술을 사용하는 인터페이스를 분리하고, 환경과 세부 기술에 독립적인 접근 인터페이스를 제공하는 것이 좋은 해결책임.
      1. 기술적인 처리를 담당하는 코드가 성격이 다른 코드에 섞여서 등장함. → AOP로 해결
      • AOP는 최후까지 애플리케이션 로직을 담당하는 코드에 남아 있는 기술 관련 코드를 깔끔하게 분리해서 별도의 모듈로 관리하게 해주는 강력한 기술임.
  • 비즈니스와 애플리케이션 로직의 복잡함을 상대하는 전략
    • 예전에는 비즈니스 로직의 상당 부분을 DB에 두는 것이 유행이었음.
    • 엔터프라이즈 시스템 개발의 흐름은 비즈니스 로직은 애플리케이션 안에서 처리하도록 만드는 추세임.
    • DB는 특화된 기능에만 활용하고, 데이터를 분석하고 가공하고 그에 따른 로직을 처리하는 부분은 애플리케이션 서버 쪽으로 이동함.
    • 비즈니스 로직의 복잡함을 상대하는 전략은 자바라는 객체 지향 기술 그 자체임.

핵심 도구: 객체지향과 DI

  • 기술과 비즈니스 로직의 복잡함을 해결하는 데 스프링이 사용하는 도구 → 객체지향(OO)
  • 객체지향의 설계 기법을 잘 적용할 수 있는 구조를 만들기 위해 DI 같은 유용한 기술을 편하게 적용하도록 도와주는 것이 스프링의 기본 전략임.
  • 왜 스프링이 비즈니스 로직 자체를 기술적인 코드와 특정 기술의 스펙이 침범하지 않는 코드로 만들어주는 데 힘을 썼을까? → 순수한 비즈니스 로직만을 담고 있는 코드에는 객체지향 분석과 설계에서 나온 도메인 모델을 쉽게 적용할 수 있기 때문임.
  • 모든 스프링의 기술과 전략은 객체지향을 잘 사용하도록 돕는 것임.

POJO 프로그래밍

  • ‘분리됐지만 반드시 필요한 엔터프라이즈 서비스 기술을 POJO 방식으로 개발된 애플리케이션 핵심 로직을 담은 코드에 제공한다.’는 것이 스프링의 가장 강력한 특징과 목표임.
    • 엔터프라이즈 서비스: 보안, 트랜잭션과 같은 엔터프라이즈 시스템에서 요구되는 기술
  • 스프링 애플리케이션은 POJO를 이용해서 만든 애플리케이션 코드와, POJO가 어떻게 관계를 맺고 동작하는지를 정의해놓은 설계정보로 구분됨.
  • 스프링의 주요 기술 - IoC/DI, AOP, PSA
    • DI의 기본 아이디어는 유연하게 확장가능한 오브젝트를 만들어두고 그 관계는 외부에서 다이내믹하게 설정함.
  • POJO란?
    • Plain Old Java Object의 약자임.
    • 다음의 조건을 충족해야 POJO라고 할 수 있음.
        1. 특정 규약에 종속되지 않음 - 자바 언어와 꼭 필요한 API 외에는 종속되지 않아야 함.
        1. 특정 환경에 종속되지 않음 - POJO 클래스는 웹이라는 환경정보나 웹 기술을 담고 있는 클래스나 인터페이스를 사용해서는 안됨.
    • 장점
      • 깔끔한 코드가 될 수 있음.
      • 자동화된 테스트에 유리함.
      • 객체지향적인 설계를 자유롭게 적용할 수 있음.
    • 대표적인 POJO 프레임워크 - 스프링, 하이버네이트
    • 스프링은 비즈니스 로직의 복잡함과 엔터프라이즈 기술의 복잡함을 분리해서 구성할 수 있게 도와줌. 하지만 자신은 기술영역에만 관여하지 비즈니스 로직을 담당하는 POJO에서는 모습을 감춤.
    • 스프링은 개발자들이 복잡한 엔터프라이즈 기술보다는 객체지향적인 설계와 개발의 원리에 집중할 수 있도록 함.

스프링의 기술

  • POJO 개발이 가능하려면 IoC/DI, AOP, PSA 기술이 뒷받침 돼야함.

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

  • DI 방식으로하는 것이 그렇지 않은 경우보다 나은 점은 무엇일까? → 유연한 확장이 가능함.
    • DI는 개방 폐쇄 원칙(OCP)이라는 객체지향 설계 원칙으로 설명될 수 있음.
  • DI의 활용
      1. 핵심기능의 변경 - 의존 대상의 구현을 바꿈.
      • 디자인 패턴의 전략 패턴이 예임.
      1. 핵심기능의 동적인 변경 - 다이내믹 라우팅 프록시나 프록시 오브젝트 기법 활용
      1. 부가기능의 추가
      • 데코레이터 패턴
      1. 인터페이스의 변경
      • 오브젝트 방식의 어댑터 패턴의 응용
      1. 프록시
      • 필요한 시점에서 실제 사용할 오브젝트를 초기화하고 리소스를 준비하게 해주는 지연된 로딩을 적용하려면 프록시가 필요함.
      1. 템플릿과 콜백
      • 반복적으로 등장하지만 항상 고정적인 작업 흐름과 그 사이에서 자주 바뀌는 부분을 분리해서 템플릿과 콜백으로 만들고 이를 DI 원리를 응용해 적용함.
      1. 싱글톤과 오브젝트 스코프
      • 오브젝트의 생성부터 관계설정, 이용, 소멸에 이르기까지의 모든 과정을 DI 컨테이너가 주관함.
      • 스프링의 DI는 기본적으로 싱글톤으로 오브젝트를 만들어서 사용하게 함.
      1. 테스트 - 여타 오브젝트와 협력해서 동작하는 오브젝트를 효과적으로 테스트하는 방법은 가능한 한 고립시키는 것임.

    AOP

    • AOP는 OOP처럼 독립적인 프로그래밍 패러다임이 아님.
    • AOP 적용 기법
      • 스프링과 같이 다이내믹 프록시를 사용
      • 자바 언어의 한계를 넘어서는 언어의 확장을 이용 → AspectJ
    • AOP 적용 단계
        1. 미리 준비된 AOP 이용
        • 스프링이 제공하는 대표적인 AOP는 트랜잭션임.
        • @Configurable 애노테이션을 이용해서 도메인 오브젝트에 DI를 자동적용하는 기능도 있음.
        1. 전담팀을 통한 정책 AOP 적용
        • 비즈니스 로직을 가진 오브젝트에 대한 보안, 특정 계층의 오브젝트 이용 전후의 작업 기록을 남기는 로깅 등의 기능에 AOP를 이용
        1. AOP의 자유로운 이용

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

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

참고 자료