"자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크"
스프링은 근본적인 부분에서 엔터프라이즈 개발의 복잡함을 제거해내고 진정으로 개발을 편하게 해주는 해결책을 제시
기본적으로 오픈소스 프로젝트 방식으로 개발되며 스프링소스에서 버그 신고, 기능 추가 등을 요청받아 수행
불필요하게 등장하던 의존적인 코드를 제거하고 복잡하거나 고가의 WAS가 없어도 개발이 가능할 정도로 가장 단순하고 가볍게 구성되어있음
스프링은 특정 계층이나 기술 업무 분야에 국한되지않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크이다.
앞서 정의에서 살펴보았듯 "엔터프라이즈 개발을 편하게" 하는것이 목적이다.
가장 대표적인 프로젝트의 실패 원인 = 엔터프라이즈 시스템 개발이 복잡하다
- 기술적인 제약조건과 요구사항이 늘어감
- 순수한 비즈니스 로직 뿐만 아니라, 트랜잭션, 보안, 리모팅 등 여러요소들을 모두 고려하여 개발을 진행해야한다- 엔터프라이즈 애플리케이션의 핵심기능인 비즈니스 로직의 복잡한 증가
- 엔터프라이즈 시스템으로 업무를 처리하는 비율이 늘어나면서, 다양하고 복잡한 업무 처리 기능을 엔터프라이즈 시스템이 구현해야한다.
비즈니스 로직의 복잡함과 엔터프라이즈 기술의 복잡함이 얽혀있기 때문
- 전통적인 엔터프라이즈 개발 기법은 비즈니스 로직의 코드와 엔터프라이즈 기술 코드가 혼재될 수 밖에 없는 방식이였다.
엔터프라이즈 기술의 근본적인 복잡함은 사실상 제거할 수 없다
- 복잡함을 효과적으로 상대할 수 있는 전략과 기법이 필요
▪ 실패한 해결책 : EJB
EJB도 두가지 종류의 복잡함을 분리하는 것이 목표였다.
- 몇몇 부분은 일부분 분리에 성공했다
- EJB환경에서 동작하기 위한 인터페이스 구현, 상속하는 구조는 오히려 EJB라는 환경에 종속되게 만드는 코드로 만들었다.
▪ 비침투적인 방식을 통한 효과적인 해결책: 스프링
- 스프링은 EJB의 실패를 교훈삼아 시작했다.
- EJB: 어떤 기술을 적용했을 때, 그 기술과 관련된 코드나 규약 등이 코드에 등장하는 "침투적인 기술"
- 스프링: 기술의 적용 사실이 코드에 직접 반영되지 않는 "비 침투적인 기술"
- 코드의 설계나 구현 방식을 제한하지는 않음
스프링은 복잡함의 문제를 두 가지로 분류하고 각각에 대한 적절한 대응 방법 제공
- 기술에 대한 접근 방식이 일관성 없고, 특정환경에 종속적이다.
- 서비스 추상화를 통해 로우 레벨 기술 구현 부분과 기술을 사용하는 인터페이스를 분리하고, 환경과 세부 기술에 독립적인 접근 인터페이스 제공- 기술적인 처리를 담당하는 코드가 성격이 다른 코드에 섞여서 등장한다.
- 스프링은 AOP를 통해 기술 관련 코드를 깔끔하게 분리해 별도의 모듈로 관리
"자바" 라는 객체지향 기술 그 자체.
- 객체지향 프로그래밍은 유연한 설계가 가능하고 재사용성이 높은 코드를 작성할 수 있음
- 스프링은 단지 객체지향 언어의 장점을 못살리게 방해하던 요소를 제거하도록 도와줌
" 기본으로 돌아가자"
- 객체지향에 충실한 설계가 가능하도록 도와주는 것이 스프링의 기본 전략
- DI도 결국 객체지향 기법 중 하나이며 스프링이 쉽게 사용하도록 도와줄 뿐
- 서비스 추상화, 템플릿/콜백, AOP 모두 DI 없이는 존재할 수 없음
"스프링의 정수는 엔터프라이즈 서비스 기능을 POJO에 제공하는 것"
스프링의 주요 기술인 Ioc/DI, AOP와PSA는 애플리케이션을 POJO로 개발할 수 있게 해주는 기능기술 이라고 불린다.
POJO(Plain Old Java Object): 간단한 자바 오브젝트. 뭔가 있어보이려고 용어만듦.
적어도 다음의 세 가지 조건을 충족해야한다
- 특정 규약에 종속되지 않는다.
- 자바 언어와 꼭 필요햔 API 외에는 종속되지 않아야 한다.
- 별다른 가치를 주지도 못하는 규약에 종속되지 않고, 객체지향 설계의 자유로운 적용이 가능한 오브젝트이어야 한다.- 특정 환경에 종속되지 않는다.
- 특정 환경에 종속적이어야 동작하는 오브젝트도 POJO라고 할 수 없다.
- 에노테이션에 특정 기술과 환경에 종속적인 정보를 담고 있으면 안된다.- 객체지향적인 자바 언어의 기본에 충실하게 만들어져야한다.
POJO의 조건이 바로 POJO의 장점이 된다.
- 특정 기술과 환경에 종속되지 않는 오브젝트는 그만큼 깔끔한 코드가 될 수 있다.
- 환경에 종속되지 않아 제약이 없어 자동화된 테스트에 유리한 코드이다.
- 객체지향적인 설계를 자유롭게 적용할 수 있다는 것도 큰 장점
POJO 프로그래밍이 가능하도록 기술적인 기반을 제공하는 프레임워크
- 스프링 프레임워크, 하이버네이트
- 하이버네이트는 DB이용 기술에 POJO를 적용하는 것이 목적
- 스프링은 엔터프라이즈 애플리케이션 개발의 모드 영역과 계층에서 POJO방식의 구현이 가능하게 하려는 목적
스프링은 POJO 개발을 쉽게 할 수 있도록 지원하는 세 가지 기능기술 제공
- Ioc/DI, AOP, PSA
기본원리는 1장에서 살펴보았으니 여기서는 활용 방법을 생각해보자.
- OCP원칙으로 설명가능
- 개방의 관점에선 유연한 확장이 가능
- 폐쇄의 관점에선 코드의 재사용이 가능함
▪ 핵심기능의 변경
의존 대상의 구현을 바꾸는 것 - 전략패턴
- A->B의 구조에서 B의 구현방식을 B1,B2,B3와 같이 필요에 따라 바꾸는 것
▪ 핵심기능의 동적인 변경
의존 오브젝트의 핵심 기능 자체를 바꾸는데, 동적으로 변경도 가능
- 다이나믹 라우팅 프록시, 프록시 오브젝트 기법을 활용
▪ 부가기능의 추가
핵심기능은 그대로 둔 채로 부가기능을 추가 - 데코레이터 패턴
- 트랜잭션 기능을 부여할 때 사용했었음
▪ 인터페이스의 변경
인터페이스와 실제 오브젝트 사이에 인터페이스가 일치하지 않는 경우, 어댑터처럼 인터페이스를 바꾸어 줄 수 있다.
- A->C를 사용하려할 때, A->B라면 B의 내부에서 C를 호출하는 어댑터 오브젝트를 생성하여 연결
▪ 프록시
프록시 패턴의 전형적인 응용 방법
- 실제 사용할 오브젝트를 초기화하고 리소스를 준비하게 해주는 로딩 적용시
- 원격 프록시 적용시
- 웹 서비스, REST호출, HTTP방식의 호출 등 다양한 리모팅 기술
▪ 템플릿과 콜백
템플릿/콜백 패턴은 DI의 특별한 적용 방법
- 반복적으로 등장하지만 항상 고정적인 작업 흐름과 그 사이 자주 바뀌는 부분을 분리하여 템플릿과 콜백으로 만들어 DI를 적용
▪ 싱글톤과 오브젝트 스코프
DI할 오브젝트의 생명주기를 제어할 수 있음
- DI를 프레임워크로 사용한다는 건 DI 대상 오브젝트를 컨테이너가 관리한다는 뜻
▪ 테스트
의존 오브젝트를 대신하여 목 오브젝트와 같은 테스트 대역 사용시 DI가 필요
- DI를 위해 만든 수정자 메소드를 사용하면 테스트 코드 안에서 수동으로 목 오브젝트 주입 가능
IoC/DI만 사용해서는 일부 서비스에서 POJO의 조건을 유지한 채로 적용하기 힘듦
- 이러한 문제를 해결하기 위해 AOP가 필요
▪ 다이나믹 프록시를 사용
데코레이터 패턴의 응용
- 자바의 객체지향 패턴을 활용한 방법이여서 만들기가 쉽고 간편
- 부가기능을 부여할 수 있는 곳은 메소드의 호출이 일어나는 지점뿐
▪ 자바 언어의 한계를 넘어서는 언어의 확장을 이용
AspectJ 오픈소스 AOP 툴 사용
- JDK의 지원만으로는 불가능한 고급 기능을 제공해줌
- 별도의 AOP 컴파일러를 이용한 빌드를 거치거나 바이트 코드를 조작하는 방법 사용해야함
AOP에 익숙하지 않은 상태라면 단계를 밟아 AOP를 도입하는 접근 방법 사용
- 미리 준비된 AOP 이용
미리 만들어져 있는 AOP 기능을 그대로 사용해보는 것으로 시작해보자
- 스프링이 제공하는 대표적인 AOP인 트랜잭션을 사용해보자- 전담팀을 통한 정책 AOP 적용
소수의 AOP 담당자 관리하에 애플리케이션 전체적으로 이용가능 한 것을 적용
-비즈니스 로직을 가진 오브젝트에 대한 보안, 로깅,트레이싱,모니터링- AOP의 자유로운 이용
1,2단계를 거쳐 AOP와 어느정도 친숙해졌고, 위험성, 장단점을 이해했다면 스스로 AOP를 활용하는 단계로 넘어가보자
환경과 세부 기술의 변화와 관계없이 일관된 방식으로 기술에 접근할 수 있게 해줌
- 스프링의 기본 플랫폼인 JavaSEE에 종속적이지 않도록 서비스 추상화 기술 사용