토비의 스프링: Vol. 1: 스프링의 이해와 원리
스프링의 정의
스프링의 정의: 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
애플리케이션 프레임워크: 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크
스프링의 일차적인 존재 목적: 핵심 기술에 담긴 프로그래밍 모델을 일관되게 적용해서 엔터프라이즈 애플리케이션 전 계층과 전 영역에 전략과 기능을 제공해줌으로써 애플리케이션을 편리하게 개발하게 해주는 애플리케이션 프레임워크
경량급: 군더더기 없이 깔끔한 기술을 가진 프레임워크
자바 엔터프라이즈 개발을 편하게: 개발자가 복잡하고 실수하기 쉬운 로우레벨 기술에 많은 신경을 쓰지 않으면서도 애플리케이션의 핵심인 사용자의 요구사항, 즉 비즈니스 로직을 빠르고 효과적으로 구현하게 해주는 프레임워크
오픈소스: 스프링은 오픈소스의 장점(빠른 피드백)을 충분히 취하면서 동시에 오픈소스 제품의 단점과 한계(프로젝트의 중단)를 잘 극복하고 있는 전문적이고 성공적인 오픈소스 소프트웨어
스프링의 목적
자바의 근본적인 목적: 객체지향 프로그래밍을 통해 유연하고 확장성 좋은 애플리케이션을 빠르게 만드는 것
스프링의 목적: 경량급 프레임워크인 스프링을 활용해서 엔터프라이즈 애플리케이션 개발을 편하게 하는 것
엔터프라이즈 개발의 복잡함
복잡함의 근본적인 이유
- 기술적인 제약조건과 요구사항이 늘어나기 때문
- 엔터프라이즈 애플리케이션이 구현해야 할 핵심기능인 비즈니스 로직의 복잡함이 증가하기 떄문
기술적인 복잡함 + 비즈니스 로직의 복잡함 → 엔터프라이즈 개발의 복잡함
스프링은 비침투적인(non-invasive) 기술을 적용했음 → 기술적인 복잡함과 비즈니스 로직을 다루는 코드를 깔끔하게 분리할 수 있음
스프링의 기본 전략: 비즈니스 로직을 담은 애플리케이션 코드와 엔터프라이즈 기술을 처리하는 코드를 분리하는 것
기술적인 복잡함을 상대하는 전략
- 문제 1: 기술에 대한 접근 방식이 일관성이 없고, 특정 환경에 종속적이다
- 문제 2: 기술적인 처리를 담당하는 코드가 성격이 다른 코드에 섞여서 등장한다
- 비즈니스와 애플리케이션 로직의 복잡함을 상대하는 전략
스프링의 모든 기술과 전략은 객체지향이라는 자바 언어가 가진 강력한 도구를 극대화해서 사용할 수 있도록 돕는 것
POJO 프로그래밍
스프링의 가장 강력한 특징과 목표: 분리됐지만 반드시 필요한 엔터프라이즈 서비스 기술을 POJO 방식으로 개발된 애플리케이션 핵심 로직을 담은 코드에 제공한다
스프링의 핵심: POJO
스프링 애플리케이션: POJO를 이용해서 만든 애플리케이션 코드와, POJO가 어떻게 관계를 맺고 동작하는지를 정의해놓은 설계정보로 이루어져 있음
스프링의 프로그래밍 모델: 유연하게 확장 가능한 오브젝트를 만들어주고 그 관계는 외부에서 다이내믹하게 설정해준다는 DI의 개념을 애플리케이션 전반에 걸쳐 적용하는 것
POJO(Plain Old Java Object): 자바의 단순한 오브젝트를 사용하자
POJO의 조건
- 특정 규약에 종속되지 않는다: 객체지향 설계의 자유로운 적용이 가능한 오브젝트여야 함
- 특정 환경에 종속되지 않는다: 환경에 독립적이여야 함
진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트
POJO 프로그래밍: POJO에 애플리케이션의 핵심 로직과 기능을 담아 설계하고 개발하는 방법
POJO의 장점
- 종속되지 않는다 → 깔끔한 코드
- 자동화된 테스트에 유리함
- 객체지향적인 설계를 자유롭게 적용할 수 있음
객체지향 프로그래밍은 지금까지 나온 프로그래밍 패러다임 중에서 가장 성공했고, 가장 많은 언어에 적용됐으며, 무엇보다도 엔터프라이즈 시스템에서와 같이 복잡한 문제 도메인을 가진 곳에서 가장 효과적으로 사용될 수 있음
스프링을 이용하면 POJO 프로그래밍의 장점을 그대로 살려서 엔터프라이즈 애플리케이션의 핵심 로직을 객체지향적인 POJO를 기반으로 깔끔하게 구현하고, 동시에 엔터프라이즈 환경의 각종 서비스와 기술적인 필요를 POJO 방식으로 만들어진 코드에 적용할 수 있음

POJO 프로그래밍을 지원하는 3가지 가능기술
IoC/DI, AOP, PSA(Portable Service Abstraction)
스프링의 기술들: 스프링 프레임워크가 만들어진 진정한 목표인 POJO 기반의 엔터프라이즈 개발을 편리하게 해주는 도구
제어의 역전(IoC) / 의존관계 주입(DI)
IoC/DI는 스프링의 가장 기본이 되는 기술이자 스프링의 핵심 개발 원칙
나머지 두 기술인 AOP와 PSA도 IoC/DI에 바탕을 두고 있음
DI를 사용하는 이유: 유연한 확장이 가능하게 하기 위해서
DI는 개방 폐쇄 원칙 (OCP)이라는 객체지향 설계 원칙으로 잘 설명될 수 있음
- 확장에는 열려있고, 변경에는 닫혀 있음
DI의 활용 방법
- 핵심기능의 변경 (전략 패턴)
- 핵심기능의 동적인 변경 (런타임 시 유연하게 구현을 바꿀 수 있는 DI)
- 부가기능의 추가 (데코레이터 패턴)
- 인터페이스의 변경 (어댑터 패턴)
- 프록시 (프록시 패턴)
- 템플릿과 콜백
- 싱글톤과 오브젝트 스코프
- 테스트
애스펙트 지향 프로그래밍(AOP)
AOP는 객체지향 기술의 한계와 단점을 극복하도록 도와주는 보조적인 프로그래밍 기술
AOP의 적용 기법
- 스프링과 같이 다이내믹 프록시를 사용하는 방법 (데코레이터 패턴의 응용)
- 자바 언어의 한계를 넘어서는 언어의 확장을 이용하는 방법 (AspectJ 사용)
AOP의 적용 단계
- 미리 준비된 AOP 이용 (@Transactional, @Configurable 등의 스프링 AOP 이용)
- 전담팀을 통한 정책 AOP 이용 (개발 가이드라인이나 표준 정책을 따르는지 검사하는 작업에 AOP 활용)
- AOP의 자유로운 이용 (세부적인, 특정 기능 안에서 작동하는 AOP 기능 만들기)
포터블 서비스 추상화(PSA)
PSA(Portable Service Abstraction): 환경과 세부 기술의 변화에 관계없이 일관된 방식으로 기술에 접근할 수 있게 해주는 기술
스프링은 일관성 있는 서비스 추상화 기술을 제공함 (트랜잭션 서비스 추상화 등)
정리
스프링의 정의: 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
스프링의 목적: 엔터프라이즈 시스템 개발의 복잡함을 줄여주는 POJO를 이용하여 엔터프라이즈 애플리케이션을 쉽고 효과적으로 개발할 수 있도록 지원해 주는 것
스프링의 가능기술: IoC/DI, AOP, PSA
주요 내용
- 스프링은 그 개발철학과 목표를 분명히 이해하고 사용해야 한다
- 스프링은 오픈소스 소프트웨어이며, 애플리케이션 개발의 모든 기술과 영역을 종합적으로 다루는 애플리케이션 프레임워크다
- 엔터프라이즈 애플리케이션 개발의 복잡함은 비즈니스 로직과 엔터프라이즈 시스템의 기술적인 요구에 의해 발생한다. 기존의 접근 방법은 이 복잡도를 낮추지 못하여 자바의 객체지향적인 장점을 포기해야 한다는 문제점이 있다
- 자바의 근본인 객체지향적인 원리에 충실하게 개발할 수 있으며, 환경과 규약에 의존적이지 않은 POJO를 이용한 애플리케이션 개발은 엔터프라이즈 시스템 개발의 복잡함이 주는 많은 문제를 해결할 수 있다
- 스프링의 목적은 이런 POJO를 이용해 엔터프라이즈 애플리케이션을 쉽고 효과적으로 개발할 수 있도록 지원해주는 데 있다
- POJO 방식의 개발을 돕기 위해 스프링은 IoC/DI, AOP, PSA와 같은 가능기술을 프레임워크와 컨테이너라는 방식을 통해 제공한다
Reference: http://www.yes24.com/Product/Goods/7516721
토비의 스프링 3.1 Vol. 1 스프링의 이해와 원리 - YES24
대한민국 전자정부 표준 프레임워크 스프링을 설명하는 책!단순한 예제를 스프링 3.0과 스프링 3.1의 기술을 적용하며 발전시켜 나가는 과정을 통해 스프링의 핵심 프로그래밍 모델인 IoC/DI, PSA, A
www.yes24.com
'백엔드 > 프레임워크' 카테고리의 다른 글
[토비의 스프링] 9장: 스프링 프로젝트 시작하기 (0) | 2023.03.05 |
---|---|
[토비의 스프링] 7장: 스프링 핵심 기술의 응용 (0) | 2023.02.25 |
[토비의 스프링] 6장: AOP (0) | 2023.02.18 |
[토비의 스프링] 5장: 서비스 추상화 (0) | 2023.02.11 |
[토비의 스프링] 4장: 예외 (0) | 2023.02.04 |