Spring

토비의 Spring_Chapter08_스프링이란 무엇인가?

강용민 2022. 11. 27. 02:37

8.1 스프링의 정의

스프링에 대한 정의는 "자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크"이다.

이 정의를 하나씩 풀어서 살펴보자.

  • 애플리케이션 프레임워크
    • 핵심 기술에 담긴 프로그래밍 모델을 일관되게 적용해서 엔터프라이즈 애플리케이션 전 계층과 전 영역에 전략과 기능을 제공해줌으로써 애플리케이션을 편리하게 개발하게 해주는 애플리케이션 프레임워크라는게 존재 목적이다.
    • 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는데 일차적인 목표를 두는 프레임워크
      • 프레임워크는 이상적인 프로그래밍 모델을 추구하는 데 필요한 기반이 돼주는 코드이다.
  • 경량급
    • EJB에서 불필요한 복잡함을 제거해 코드는 더 단순하고 개발 과정은 편리하게 만들었다.
    • 만들어진 코드가 지원하는 기술수준은 비슷하더라도 그것을 훨씬 빠르고 간편하게 작성하게 해줌으로써 생산성과 품질 면에서 율리하다는 것이 바로 경량급이라는 말로 표현되는 스프링의 특징이다.
  • 자바 엔터프라이즈 개발을 편하게
    • EJB가 실수한 엔터프라이즈 개발의 근본적인 분제점에 도전해서 해결책을 제시한다. 즉, 비즈니스 로직에만 집중할 수 있게했다.
  • 오픈소스
    • 소스가 모두에게 공개되고, 특별한 라이선스를 취득할 필요 없이 얼마든지 가져다 자유롭게 이용해도 된다.
    • 다만 당연하게도 원 저작자에 대한 정보와 라이선스는 유지한 채로 사용하거나 배포해야한다.

 

8.2 스프링의 목적

자바의 근본적인 목적은 객체지향 프로그래밍을 통해 유연하고 화장성 좋은 애플리케이션을 빠르게 만드는 것이다. 그렇다면 스프링의 목적은 무엇일까? 그럼 그전에 기존 문제점부터 살펴봐야한다.

 

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

엔터프라이즈 시스템 개발은 왜 복잡할까? 크게 두 가지 원인을 생각해볼 수 있다.

  • 기술적인 제약조건과 요구사항이 늘어가기 때문이다.
    • 엔터프라이즈 시스템을 개발하는 데는 순수한 비즈니스 로직을 구현하는 것 외에도 보안, 안정성, 확장성,리모팅 등의 기술적으로 고려할 사항이 많다.
  • 엔터프라이즈 애플리케이션이 구현해야 할 핵심기능인 비즈니스 로직의 복잡함이 증가하기 때문이다.
    • 2000년 후로 시스템 개발과 유지보수, 추가 개발 등의 작업에 대한 부담은 커지고 그에 따른 개발의 난이도는 크게 증가했다.

 

복잡함을 해결하려는 도전

근복적으로 엔터프라이즈 개발에 나타나는 복잡함의 원인은 제거 대상이 아니라 그 복잡함을 효과적으로 상대할 수 있는 전략과 기법이 필요하다. 가장 먼저 할 일은 성격이 다른 이 두 가지 복잡함을 분리해내는 것이다.

 

실패한 해결책 : EJB

EJB는 기술적인 복잡함을 애플리케이션의 핵심 로직에서 일부분 분리하는 데 성공했지만, EJB라는 환경과 스펙에 종속되는 코드로 만들어져야 하는 더 큰 부담을 안게 됐다. 또한 EJZB라는 틀 안에서 자바 코드를 만들게 강제함으로써 자바 언어가 갖고 있던 장점마저 잃어벼렸다.

 

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

EJB의 처음 목표와 마찬가지로 기술적인 복잡함을 애플리케이션 핵심 로직의 복잡함에서 제거하는 데 목표를 뒀다. 다만 EJB처럼 어떤 기술을 적용했을 때 그 기술과 관련된 코드나 규약 등이 코드에 등장하지 않고 기술의 적용 사실이 코드에 직접 반영되지 않게 했다. 이를 비침투적인(non-invasive) 기술이라 한다.이를 통해 기술적인 복잡함과 비즈니스 로직을 다루는 코드를 깔끔하게 분리할 수 있었다.

 

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

이제 기술을 분리했으니 각 기술의 복잡함을 상대해야 한다.

 

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

스프링은 엔터프라이즈 기술을 적용했을 때 발생하는 복잡함의 문제를 두 가지로 분류하고 각각에 대한 적절한 대응 방법을 제공한다.

  • 기술에 대한 접근 방식이 일관성이 없고, 특정 환경에 종속적이다.
    • 환경, 서버 등이 바뀌면 적용하는 기술이 달라지고 그에 따라 코드도 바뀐다는 건 심각한 문제다.
    • 스프링이 제공하는 템플릿/콜백 패턴은 반복적인 작업 흐름과 API 사용 코드를 제거해준다.
  • 기술적인 처리를 담당하는 코드가 성격이 다른 코드에 섞여서 등장한다.
    • 비즈니스 로직 전후로 경계가 설정돼야 하는 트랜잭션, 비즈니스 로직에 대한 보안 적용, 계층 사이에 주고받는 데이터와 예외의 일괄 변환이나 로깅이나 감사(audit)기능 등이 대표적인 예다.
    • 스프링은 이를 AOP로 해결했다.

 

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

기술적인 코드, 침투적인 기술을 제거하면 순수하게 애플리케이션의 주요 기능과 비즈니스 로직을 담은 코드만 독립적으로 존재하게 된다.  비즈니스 로직을 담은 코드는 애플리케이션에서 가장 중요한 핵심이 되는 부분이며, 업무의 변화에 따라 변화가 많은 부분이다. 스프링은 이를 자바라는 객체지향 언어의 장점을 살려 해결했다.

 

핵심 도구 : 객체지향과 DI

기술과 비즈니스 로직의 복잡함을 해결하는 데 스프링이 공통적으로 사용하는 도구가 있다. 바로 객체지향이다. 객체지향의 설계 기법을 잘 적용할 수 있는 구조를 만들기 위해 DI 같은 유용한 기술을 편하게 적용하도록 도와주는 것이 스프링의 기본 전략이다.

지금까지 살펴봤듯이 기술적인 복잡함을 효과적으로 다루게 해주는 기법은 모두 DI를 바탕으로 하고 있으며, 기술적인 복잡함이 비즈니스 로직에 침범하지 못하도록 분리하는 경우에도 DI가 바탕이 된 여러 가지 기법이 활용된다.

반면에 비즈니스 로직 자체의 복잡함을 해결하려면 DI보다는 객체지향 설계 기법이 더 중요하다. 순수한 비즈니스 로직만을 담고 있는 코드에는 객체지향 분석과 설계에서 나온 도메인 모델을 쉽게 적용할 수 있기 때문이다. 객체지향적인 특성을 잘 살린 설계는 상속과 다형성, 위임을 포함해서 많은 객체지향디자인 패턴과 설계 기법이 잘 녹아들어 갈 수 있다.

 

8.3 POJO 프로그래밍

스프링 애플리케이션은 POJO를 이용해서 만든 애플리케이션 코드와, POJO가 어떻게 관계를 맺고 동작하는지를 정의해놓은 설계정보로 구분된다.그럼 POJO는 무엇일까??

 

POJO란 무엇인가?

POJO는 Plain Old Java Object 의 약자로 자바의 단순한 오브젝트를 이용해 애플리케이션의 비즈니스 로직을 구현하는 것을 말한다.

 

POJO의 조건

POJO는 적어도 다음의 세 가지 조건을 충족해야 POJO라 불릴 수 있다.

  • 특정 규약에 종속되지 않는다.
    • POJO는 자바 언어와 꼭 필요한 API 외에는 종속되지 않아야 한다. 따라서 EJB2와 같이 특정 규약을 따라 비즈니스 컴포넌트를 만들어야 하는 경우는 POJO가 아니다. 특정 클래스를 상속하도록 요구한다면 자바의 단일 상속 제한 때문에 더 이상 해당 클래스에 객체지향적인 설계 기법을 적용하기가 어려워지는 문제가 생긴다. 또한 다른 환경으로 이전이 힘들다는 문제점이 있다.
  • 특정 환경에 종속되지 않는다.
    • 특정 환경에 종속적이어야만 동작하는 오브젝트도 POJO라고 할 수 없다.  특히 비즈니스 로직을 담고 있는 POJO 클래스는 웹이라는 환경정보나 웹 기술을 담고 있는 클래스나 인터페이스를 사용해서는 안 된다. 비즈니스 로직을 담은 코드에 HttpServletRequest나 HttpSession, 캐시와 관련된 API가 등장하거나 웹 프레임워크의 클래스를 직접 이용하는 부분이 있다면 그것은 진정한 POJO라고 볼 수 없다.

그럼 이 조건을 지키면 무조건 POJO인가? 아니다. POJO는 객체지향적인 자바 언어의 기본에 충실하게 만들어져야 하기 때문이다. 진정한 POJOf란 객체지향적인 우너리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있느 ㄴ방식으로 설계된 오브젝트를 말한다.

 

POJO의 장점

  • 특정한 기술과 환경에 종속되지 않는 오브젝트는 그만큼 깔끔한 코드가 될 수 있다. 
  • POJO로 개발된 코드는 자동화된 테스트에 매우 유리하다.
  • 객체지향적인 설계를 자유롭게 적용할 수 있다.

 

POJO 프레임워크

스프링을 이용하면 POJO 프로그래밍의 장점을 그대로 살려서 엔터프라이즈 애플리케이션의 핵심 로직을 객체지향적인 POJO를 기반으로 깔끔하게 구현하고, 동시에 엔터프라이즈 환경의 각종 서비스와 기술적인 필요를 POJO 방식으로 만들어진 코드에 적용할 수 있다.

 

8.4 스프링의 기술

스프링에는 POJO 프로그래밍을 손쉽게 할 수 있도록 지원하는 세 가지 가능기술을 제공한다. 엔터프라이즈 개발에서 POJO 개발이 가능하려면 IoC/DI, AOP, PSA 기술이 필요하다.