- 스프링이란 무엇인가?
- 스프링 프레임워크가 만들어진 이유와 존재 목적, 추구하는 가치는 무엇일까?
스프링의 정의#
- 스프링 : 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
- 애플리케이션 프레임워크 : 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크임. 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는데 일차적인 목표를 두는 프레임워크임.
- 스프링의 탄생
- 스프링의 기원은 로드 존슨 책의 예제 코드임. 책에서 강조한 중요한 전략의 하나는 ‘항상 프레임워크로 접근하라’라는 것임.
- 경량급 : 스프링이 경량급이라는 건 스프링을 기반으로 제작되는 코드가 기존 EJB 등에서 동작하기 위해 만들어진 코드에 비해 상대적으로 작고 단순하다는 의미임. → 코드에 불필요하게 등장하던, 프레임워크와 서버환경에 의존적인 부분을 제거함.
- 자바 엔터프라이즈 개발을 편하게 : 개발자가 복잡하고 실수하기 쉬운 로우레벨 기술에 많은 신경을 쓰지 않으면서도 애플리케이션의 핵심인 사용자의 요구사항, 즉 비즈니스 로직을 빠르고 효과적으로 구현하는 것임.
- 오픈소스
- Apache License Ver 2.0
- 스프링의 개발 과정은 공개되어 있지만 공식적인 개발은 제한된 인원의 개발자에 한정됨.
- 스프링소스에서 오픈소스 프로젝트로서 스프링이 효율적으로 개발되도록 지원하고 있음.
스프링의 목적#
- 자바의 목적은 객체지향 프로그래밍을 통해 유연하고 확장성 좋은 애플리케이션을 빠르게 만드는 것임.
- 스프링의 목적은 무엇인가? 만들어진 이유는 무엇이고, 스프링을 통해 궁극적으로 이루려는 것은 무엇인가?
- 경량급 프레임워크인 스프링을 활용해서 엔터프라이즈 애플리케이션 개발을 편하게 하는 것임.
- 왜 스프링을 사용해서 엔터프라이즈 애플리케이션 개발을 편하게 할까?
엔터프라이즈 개발의 복잡함#
- 복잡함의 이유
- 기술적인 제약조건과 요구사항이 늘어남
- 엔터프라이즈 시스템 : 서버에서 동작하며 기업과 조직의 업무를 처리해주는 시스템임.
- 엔터프라이즈 시스템을 개발하는 데는 순수한 비즈니스 로직을 구현하는 것 외에도 기술적으로 고려할 사항이 많음.
- 엔터프라이즈 애플리케이션이 구현해야 할 핵심기능인 비즈니스 로직의 복잡함이 증가하기 때문임.
- 복잡함을 가중시키는 원인
- 비즈니스 로직과 엔터프라이즈 기술이라는 2가지 복잡함이 얽혀 있음.
복잡함을 해결하려는 도전#
- 복잡함의 원인은 제거대상이 아님. 복잡함을 효과적으로 상대할 수 있는 전략이 필요함.
- 비즈니스 로직의 복잡함과 기술적인 복잡함을 처리하는 데 적용되는 방법이 다름. → 두가지 복잡함을 분리하자.
- 실패한 해결책: EJB vs. 비침투적인 방식을 통한 효과적인 해결책: 스프링
- 비침투적인(non-invasive) 기술 - 기술의 적용 사실이 코드에 직접 반영되지 않음.
- 스프링을 이용하면 기술적인 복잡함과 비즈니스 로직을 다루는 코드를 깔끔하게 분리할 수 있음.
복잡함을 상대하는 스프링의 전략#
- 엔터프라이즈 기술을 적용했을 때 발생하는 복잡함의 문제
- 기술에 대한 접근 방식이 일관성이 없고, 특정 환경에 종속적임.
- 환경이 바뀌고, 서버가 바뀌고, 적용 조건이 변경되면 적용하는 기술이 달라지고 그에 따라 코드도 바뀐다는 것은 심각한 문제임. → 서비스 추상화로 해결
- 기술적인 복잡함은 추상화를 통해 로우레벨의 기술 구현 부분과 기술을 사용하는 인터페이스를 분리하고, 환경과 세부 기술에 독립적인 접근 인터페이스를 제공하는 것이 좋은 해결책임.
- 기술적인 처리를 담당하는 코드가 성격이 다른 코드에 섞여서 등장함. → AOP로 해결
- AOP는 최후까지 애플리케이션 로직을 담당하는 코드에 남아 있는 기술 관련 코드를 깔끔하게 분리해서 별도의 모듈로 관리하게 해주는 강력한 기술임.
- 비즈니스와 애플리케이션 로직의 복잡함을 상대하는 전략
- 예전에는 비즈니스 로직의 상당 부분을 DB에 두는 것이 유행이었음.
- 엔터프라이즈 시스템 개발의 흐름은 비즈니스 로직은 애플리케이션 안에서 처리하도록 만드는 추세임.
- DB는 특화된 기능에만 활용하고, 데이터를 분석하고 가공하고 그에 따른 로직을 처리하는 부분은 애플리케이션 서버 쪽으로 이동함.
- 비즈니스 로직의 복잡함을 상대하는 전략은 자바라는 객체 지향 기술 그 자체임.
핵심 도구: 객체지향과 DI#
- 기술과 비즈니스 로직의 복잡함을 해결하는 데 스프링이 사용하는 도구 → 객체지향(OO)
- 객체지향의 설계 기법을 잘 적용할 수 있는 구조를 만들기 위해 DI 같은 유용한 기술을 편하게 적용하도록 도와주는 것이 스프링의 기본 전략임.
- 왜 스프링이 비즈니스 로직 자체를 기술적인 코드와 특정 기술의 스펙이 침범하지 않는 코드로 만들어주는 데 힘을 썼을까? → 순수한 비즈니스 로직만을 담고 있는 코드에는 객체지향 분석과 설계에서 나온 도메인 모델을 쉽게 적용할 수 있기 때문임.
- 모든 스프링의 기술과 전략은 객체지향을 잘 사용하도록 돕는 것임.
POJO 프로그래밍#
- ‘분리됐지만 반드시 필요한 엔터프라이즈 서비스 기술을 POJO 방식으로 개발된 애플리케이션 핵심 로직을 담은 코드에 제공한다.’는 것이 스프링의 가장 강력한 특징과 목표임.
- 엔터프라이즈 서비스: 보안, 트랜잭션과 같은 엔터프라이즈 시스템에서 요구되는 기술
- 스프링 애플리케이션은 POJO를 이용해서 만든 애플리케이션 코드와, POJO가 어떻게 관계를 맺고 동작하는지를 정의해놓은 설계정보로 구분됨.
- 스프링의 주요 기술 - IoC/DI, AOP, PSA
- DI의 기본 아이디어는 유연하게 확장가능한 오브젝트를 만들어두고 그 관계는 외부에서 다이내믹하게 설정함.
- POJO란?
- Plain Old Java Object의 약자임.
- 다음의 조건을 충족해야 POJO라고 할 수 있음.
- 특정 규약에 종속되지 않음 - 자바 언어와 꼭 필요한 API 외에는 종속되지 않아야 함.
- 특정 환경에 종속되지 않음 - POJO 클래스는 웹이라는 환경정보나 웹 기술을 담고 있는 클래스나 인터페이스를 사용해서는 안됨.
- 장점
- 깔끔한 코드가 될 수 있음.
- 자동화된 테스트에 유리함.
- 객체지향적인 설계를 자유롭게 적용할 수 있음.
- 대표적인 POJO 프레임워크 - 스프링, 하이버네이트
- 스프링은 비즈니스 로직의 복잡함과 엔터프라이즈 기술의 복잡함을 분리해서 구성할 수 있게 도와줌. 하지만 자신은 기술영역에만 관여하지 비즈니스 로직을 담당하는 POJO에서는 모습을 감춤.
- 스프링은 개발자들이 복잡한 엔터프라이즈 기술보다는 객체지향적인 설계와 개발의 원리에 집중할 수 있도록 함.
스프링의 기술#
- POJO 개발이 가능하려면 IoC/DI, AOP, PSA 기술이 뒷받침 돼야함.
제어의 역전(IoC) / 의존관계 주입(DI)#
- DI 방식으로하는 것이 그렇지 않은 경우보다 나은 점은 무엇일까? → 유연한 확장이 가능함.
- DI는 개방 폐쇄 원칙(OCP)이라는 객체지향 설계 원칙으로 설명될 수 있음.
- DI의 활용
- 핵심기능의 변경 - 의존 대상의 구현을 바꿈.
- 핵심기능의 동적인 변경 - 다이내믹 라우팅 프록시나 프록시 오브젝트 기법 활용
- 부가기능의 추가
- 인터페이스의 변경
- 프록시
- 필요한 시점에서 실제 사용할 오브젝트를 초기화하고 리소스를 준비하게 해주는 지연된 로딩을 적용하려면 프록시가 필요함.
- 템플릿과 콜백
- 반복적으로 등장하지만 항상 고정적인 작업 흐름과 그 사이에서 자주 바뀌는 부분을 분리해서 템플릿과 콜백으로 만들고 이를 DI 원리를 응용해 적용함.
- 싱글톤과 오브젝트 스코프
- 오브젝트의 생성부터 관계설정, 이용, 소멸에 이르기까지의 모든 과정을 DI 컨테이너가 주관함.
- 스프링의 DI는 기본적으로 싱글톤으로 오브젝트를 만들어서 사용하게 함.
- 테스트 - 여타 오브젝트와 협력해서 동작하는 오브젝트를 효과적으로 테스트하는 방법은 가능한 한 고립시키는 것임.
AOP#
- AOP는 OOP처럼 독립적인 프로그래밍 패러다임이 아님.
- AOP 적용 기법
- 스프링과 같이 다이내믹 프록시를 사용
- 자바 언어의 한계를 넘어서는 언어의 확장을 이용 → AspectJ
- AOP 적용 단계
- 미리 준비된 AOP 이용
- 스프링이 제공하는 대표적인 AOP는 트랜잭션임.
- @Configurable 애노테이션을 이용해서 도메인 오브젝트에 DI를 자동적용하는 기능도 있음.
- 전담팀을 통한 정책 AOP 적용
- 비즈니스 로직을 가진 오브젝트에 대한 보안, 특정 계층의 오브젝트 이용 전후의 작업 기록을 남기는 로깅 등의 기능에 AOP를 이용
- AOP의 자유로운 이용
포터블 서비스 추상화(PSA)#
- PSA(Portable Service Abstraction): 환경과 세부 기술의 변화에 관계없이 일관된 방식으로 기술에 접근할 수 있게 함.
참고 자료#