스프링의 정의
자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
애플리케이션 프레임워크
- 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크임
- 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는 데 일차적인 목표
경량급
- 가볍다거나 작은 규모의 코드로 이루어진게 아니라 불필요하게 무겁지 않은것
자바 엔터프라이즈 개발을 편하게
- 엔터프라이즈 개발의 근본적인 문제점에 도전해서 해결책을 제시
- 개발자들이 프레임워크가 제공하는 기술이 아니라 자신이 작성하는 애플리케이션의 로직에 더 많은 관심과 시간을 쏟게 해줌
오픈소스
- 아파치 라이선스 버전 2.0(Apache License Ver 2.0)
- 잠재적인 버그와 문제점이 빠르게 발견되고 해결될 수 있다.
- 비용에 대한 부담이 없다.
스프링의 목적
엔터프라이즈 개발의 복잡함
복잡함의 근본적인 이유
- 기술적인 제약조건과 요구사항이 늘어남
- 엔터프라이즈 애플리케이션이 구현해야 할 핵심기능인 비즈니스 로직의 복잡함이 증가함
복잡함을 가중시키는 원인
- 전통적인 자바 엔터프라이즈 개발 기법은 대부분 비즈니스 로직의 복잡한 구현 코드와 엔터프라이즈 서비스를 이용하는 기술적인 코드가 자꾸 혼재될수밖에 없는 방식이었음
복잡함을 해결하려는 도전
제거될 수 없는 근본적인 복잡함
- 근본적으로 엔터프라이즈 개발에 나타나는 복잡함의 원인은 제거 대상이 아님
- 복잡함을 효과적으로 상대할 수있는 전략과 기법이 필요
- 비즈니스 로직의 복잡함/기술적인 복잡함을 효과적으로 처리하는 데 적용되는 방법이 다름
- 이 두가지 복잡함을 분리해야함
실패한 해결책: EJB
- 일부분 분리하는 데 성공
- EJB라는 환경과 스펙에 종속되는 코드로 만들어져야 한는 더 큰 부담 생김
- 망함
비침투적인 방식을 통한 효과적인 해결책: 스프링
- 비침투적인 - 기술의 적용 사실이 코드에 직접 반영되지 않음
- 스프링 스스로가 애플리케이션 코드에 불필요하게 노출되지 않도록 함
- 성공
복잡함을 상대하는 스프링의 전략
기술적 복잡함을 상대하는 전략
- 문제) 기술에 대한 접근 방식이 일관성이 없고, 특정 환경에 종속적이다.
- 서비스 추상화
- 문제) 기술적인 처리를 담당하는 코드가 성격이 다른 코드에 섞여서 등장한다.
- AOP
비즈니스와 애플리케이션 로직의 복잡함을 상대하는 전략
- 객체지향 프로그래밍 기법과 언어가 주는 장점인 유연한 설계가 가능하고 재사용성이 높다는 점을 잘 활용하면 자주 바뀌고 조건이 까다로운 비즈니스 로직을 효과적으로 구현해낼 수 있다.
핵심 도구: 객체지향과 DI
- 기술적인 복잡함을 효과적으로 다루게 해주는 기법은 모두 DI를 바탕으로 함
- DI란 특별한 기술이라기보다는 오브젝트 설계를 하다 보면 자연스럽게 젹용하게 되는 객체지향 프로그래밍 기법 - 스프링은 단지 편하고 쉽게 사용하도록 도와주는거임
POJO 프로그래밍
스프링의 핵심: POJO
아래는 스프링의 핵심을 가장 잘 나타내고 있다고 알려진 스프링 삼각형이다. 스프링 애플리케이션은 POJO를 이용해서 만든 애플리케이션 코드와, POJO가 어떻게 관계를 맺고 동작하는지를 정의해놓은 설계정보로 구분된다.
- IoC/DI, AOP, PSA는 애플리케이션을 POJO로 개발할 수 있게 해주는 가능기술이라고 불린다.
POJO란 무엇인가?
- Plain Old Java Object
- 평범한 자바오브젝트에는 그럴싸한 이름이 없어서 뭔가 있어 보이도록 만든 이름
POJO의 조건
특정 규약에 종속되지 않는다
- 자바 언어와 꼭 필요한 API 외에는 종속되지 않아야 함
- 별다른 가치를 주지도 못하는 규약 따위에 종속죄지 않아야 하고, 객체지향 설계의 자유로운 적용이 가능한 오브젝트여야만 함
특정 환경에 종속되지 않는다
- 특정 환경이 의존 대상 검색 방식에 종속적이라면 POJO라고 할수없음
- 객체지향적인 자바 언어의 기본에 충실하게 만들어져야 함
- 진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다.
POJO의 장점
- 깔끔한 코드
- 자동화된 테스트에 매우 유리
- 객체지향적인 설계를 자유롭게 적용 가능
POJO 프레임워크
POJO 프로그래밍이 가능하도록 기술적인 기반을 제공하는 프레임워크를 POJO 프레임워크라고 한다
- 대표적인 POJO 프레임워크 - 스프링 프레임워크, 하이버네이트
스프링의 기술
제어의 역전(IoC) / 의존관계 주임(DI)
- 스프링의 가장 기본이 되는 기술이자 핵심 개발 원칙
- DI는 유연한 확장이 가능하게 하기 위해서 사용
- 개방 폐쇄 원칙
DI의 활용 방법
- 핵심기능의 변경
- 의존 대상의 구현을 바꿈(디자인 패턴)
- 핵심기능의 동적인 변경
- 의존 오브젝트의 핵심기능 자체를 바꾸는 것
- 동적으로, 동작하는 중간에
- 다이내믹 라우팅 프록시나 프록시 오브젝트 기법 활용
- 부가기능의 추가
- 데코레이터 패턴
- 핵심기능과 클라이언트 코드에는 전혀 영향을 주지 않으면서 부가적인 기능을 얼마든지 추가 가능
- DI 덕분
- 인터페이스의 변경
- 오브젝트 방식의 어댑터 패턴의 응용
- 중간에 인터페이스 어댑터 역할을 해주는 레이어를 하나 추가하는 방법도 있음
- 서비스 추상화(PSA)
- 프록시
- lazy loading
- 원격 프록시
- 템플릿과 콜백
- 반복적으로 등장하지만 할상 고정적인 작업 흐름과 그 사이에서 자주 바뀌는 부분을 분리해서 템플릿과 콜백으로 만들고 이를 DI 원리를 응용해 적용하면 코드를 간결하게 만들 수 있음
- 싱글톤과 오브젝트 스코프
- DI 할 오브젝트의 생명주기를 제어할 수 있음
- DI 대상 오브젝트를 컨테이너가 관리
- 생성,관계설정, 이용, 소멸에 이르기까지의 모든 과정을 DI 컨테이너가 주관
- 그 오브젝트의 스코프를 자유롭게 제어
- 가장 기본이 되는 스코프 → 싱글톤
- 스프링의 DI는 기본적으로 싱글톤으로 오브젝트를 만들어서 사용
- 컨테이너가 알아서 싱글놑을 만들고 관리
- 클래스 자체는 싱글톤을 고려하지 않고 자유롭게 설계해도 됨
- 개발자 스스로 일정한 스코프를 갖는 오브젝트를 만들고 이를 DI에 적용하는 것도 가능
- DI 할 오브젝트의 생명주기를 제어할 수 있음
- 테스트
- DI를 위해 만든 수정자 메소드를 사용하면 테스트 코드 안에서 수동으로 목 오브텍트 주입 가능
- 테스트용으로 설정을 별도로 생성 가능
애스펙트 지향 프로그래밍(AOP)
객체지향 기술의 한계와 단점을 극복하도록 도와주는 보조적인 프로그래밍 기술 OOP를 더욱 OOP답게
AOP의 적용 기법
- 스프링과 같이 다이내믹 프록시를 사용하는 방법
- 데코레이터 패턴 응용
- 부가기능을 부여할 수 있는 곳은 메소드의 호출이 일어나는 지점만 가능
- 스프링의 기본적인 AOP 구현 방법은 다이내믹 프록시를 이용하는 프록시 AOP 방식
- 자바 언어의 한계를 넘어서는 언어의 확장을 이용하는 방법
- 고급 AOP기능을 적용하기 위함
- 별도의 AOP 컴파일러를 이용한 빌드 과정을 거치거나, 클래스가 메모리로 로딩될 때 그 바이트코드를 조작하는 위빙과 같은 별도의 방법 사용
- 프록시 방식의 AOP로는 할 수 없는 작업을 위해 사용
- AspectJ 가 유명
AOP의 적용 단계
- 미리 준비된 AOP 이용
- 스프링이 미리 만들어서 제공(트랜잭션, …)
- 전담팀을 통한 정책 AOP 적용
- 애플리케이션 전체적으로 이용 가능한 것을 소수의 AOP 담당자 관리하에 적용 해볼수 있다
- AOP의 자유로운 이용
- 개발자 스스로가 AOP를 활용
포터블 서비스 추상화(PSA)
환경과 세부 기술의 변화에 관계없이 일관된 방식으로 기술에 접근할수 있게 해주는 PSA(Portable Service Abstraction)다.
- 필요한 기술 DI뿐
- DI 응용 방법의 한가지
- 구체적인 기술에 종속되지 않게 하기 위해서만 사용되는게 아니라 테스트가 어렵게 만들어진 API나 설정을 통애 주요 기능을 외부에서 제어하게 만들고 싶을때도 이용할 수 있다
Ref.
이일민, “토비의 스프링 3.1”, 에이콘 출판사(2012)