일러두기
- 토비의스프링3.1 Vol.1을 읽고 정리한 글입니다.
- 책을 이미 읽으신 분이 빠르게 훑으며 복습하는 용도로 보시면 좋을 것 같습니다.
- 임의로 핵심만 간추렸습니다. 책과 설명하는 순서가 바뀌거나 장/절 목차 이름이 바뀌거나 아예 빠진 내용이 많습니다.
1 스프링이란?
- 자바 엔터프라이즈 애플리케이션 개발에 사용되는 애플리케이션 프레임워크
- 애플리케이션 개발을 빠르고 효율적으로 할 수 있도록 아래를 제공한다
- 애플리케이션의 기본 틀
- 공통 프로그래밍 모델
- 기술 API
애플리케이션의 기본 틀
- 애플리케이션을 구성하는 오브젝트가 생성되고 동작하는 방식에 대한 틀
- 설정 정보를 참고로 해서 애플리케이션을 구성하는 오브젝트를 생성하고 관리한다.
- (그래서 스프링 개발자는 설정 정보 작성법을 알아야 한다)
- 이것을 스프링 컨테이너, 애플리케이션 컨텍스트, 스프링 런타임 엔진이라고도 한다.
공통 프로그래밍 모델
- 애플리케이션 코드가 어떻게 작성돼야 하는지에 대한 기준 = 프로그래밍 모델
- 세 가지 핵심 프로그래밍 모델
- IoC/DI
- 오브젝트의 생명주기와 의존관계에 대한 프로그래밍 모델
- IoC/DI 방식을 따라 작성돼야 스프링이 제공하는 가치를 제대로 누릴 수 있다
- 객체지향 설계 원칙과 디자인 패턴의 핵심 원리를 담고 있다
- 스프링을 사용하는데 가장 기본이 되고 가장 중요한 기술이다
- 서비스 추상화
- 구체적인 기술과 환경에 종속되지 않도록 유연한 추상 계층을 두어
- 이식성이 뛰어나고 유연한 애플리케이션을 만들 수 있도록 한다
- AOP
- 코드에 산재해서 나타나는 부가적인 기능을 독립적으로 모듈화한다
기술 API
- 방대한 양의 기술 API를 제공한다
- UI 작성
- 웹 프레젠테이션 계층
- 비즈니스 서비스 계층
- 기반 서비스 계층
- 도메인 계층
- 데이터 액세스 계층
- 등등등
- 필요한 주요 기술을 스프링에서 일관된 방식으로 사용할 수 있도록 지원해주는 기능과 전략 클래스를 제공
- 제공하는 API와 지원 기술들은 모두 스프링의 프로그래밍 모델에 따라 작성되어 있다
- 이를 가져다 쓰는 것만으로도 스프링의 프로그래밍 모델을 코드에 자연스럽게 적용할 수 있다
스프링을 사용한다는 것은
기본 틀, 공통 프로그래밍 모델, 기술 API를 적극적으로 활용해서 애플리케이션을 개발한다는 것이다!
구체적으로 어떻게?
- 클래스
- 스프링 컨테이너(기본 틀) 위에서 오브젝트로 만들어지고 동작하게 설정
- 코드
- DB, 트랜잭션, REST API 등의 엔터프라이즈 기술이 필요하다면
2 스프링이 이렇게까지 성공한 이유
- 견고하고 건전한 자바와 엔터프라이즈 개발의 핵심 가치에 충실하게 만들어졌기 때문이다.
- 견고하고 건전한 자바?
- 스프링은 객체지향의 근본, POJO를 적극 기용했다는 것!
- 이전 JavaEE 애플리케이션 개발 시에는 POJO를 이용하기 어려웠다.
- 컨트롤러 클래스를 만들고싶으면 특정 클래스를 상속해서 만들어야 하는 등의 제약이 많았기 때문이다.
- 더 자세히는 아래 '스프링의 핵심 철학'에서 설명한다.
- 엔터프라이즈 개발의 핵심 가치?
- 실수하기 쉬운 로우레벨 기술에 많은 신경을 쓰지 않으면서도
- 비지니스 로직을 빠르고 효과적으로 구현할 수 있게 하여
- 엔터프라이즈 개발의 복잡함을 없애주는 것
- 스프링 개발자는 자연스럽게 자바와 엔터프라이즈 개발에 충실한 베스트 프렉티스를 적용하게 되고, 스프링을 사용하면서 이상적인 개발 철학과 프로그래밍 모델을 이해함으로써 좋은 개발 습관을 체득하게 된다.
- 스프링 프레임워크가 그만큼 객체지향 패러다임을 적극적이고 모범적으로 활용했기 때문에 그렇다.
개발자들이 스프링을 통해 얻게되는 두 가지 중요한 가치
단순함
- 스프링이 지향하는 것은 목적을 이룰 수 있는 가장 단순하고 명쾌한 접근 방법
- 그것을 위해 스프링이 강력히 주장한 것이 바로 POJO 프로그래밍!
유연성
- 다른 많은 프레임워크와 편리하게 접목돼서 사용될 수 있다
- 그래서 프레임워크를 위한 프레임워크라고도 불린다
- 스스로 발전하는 프레임워크다
- 스프링 기능의 대부분은 초기에는 없었으나 후에 추가된 것들이다!
- "항상 프레임워크 기반의 접근 방법을 사용하라"는 스프링 개발 철학에 따라, 핵심 기능을 확장해서 발전시켜온 것이다.
- 프레임워크를 확장해서 사용한 뒤 시간이 지남에 따라 경험하게 되는 버전 호환성 문제가 스프링에는 거의 없기 때문에 가능했다.
- 그러니 안심하고 여러분도 스프링을 확장해 사용해도 좋다!
- 스프링은 개발자들에게 스프링을 확장해서 사용하도록 오히려 권장한다
3 스프링의 핵심 철학
객체지향 프로그래밍이 제공하는 폭넓은 혜택을 누릴 수 있도록 기본으로 돌아가자
기본으로 돌아가자는 건 POJO 프로그래밍을 하자는 이야기다.
EJB(Enterprise Java Beans)처럼 특정 규약과 환경에 종속된 객체를 사용하는 대신 말이다!
POJO란?
- Plain Old Java Object의 약자
- 그냥 일반적인 '자바 객체'를 가르키는 말이다. 정말 그게 전부다. 정말로.
- 그냥 x, y필드를 가진 Point 클래스를 하나 만들면 그게 POJO다.
- 아무 멤버도 가지지 않은 클래스도 POJO다.
- 그냥 대부분의 객체가 POJO다.
- 이것도 저것도 POJO라면, POJO가 아닌건 뭘까?
- 특정 규약이나 환경에 종속되어 사용되는 객체! EJB 객체가 대표적이다.
- EJB로써 작동하기 위해 특정 클래스를 상속하는 등의 규약을 지켜야 하며
- 이 객체는 EJB 환경의 객체로만 사용될 수 있다.
- 마틴 파울러가 붙인 이름인데, 이름의 유래가 재밌다.
- "사람들이 왜 단순한 오브젝트를 사용하길 꺼려하고 별로 좋지 않은 EJB를 사용할까?"
- "EJB와 같은 그럴싸한 이름이 없어서 그런 게 아닐까?"
- 이런 생각으로 그럴싸한 이름을 붙여준 게 POJO다.
- 간단한 자바 오브젝트를 사용하는데요 라고 말하는 것보다는
- POJO 방식의 기술을 사용합니다. 라고 하면 왠지 세련되고 첨단 기술을 쓰는 것처럼 느껴지지 않는가?
POJO의 조건
- 특정 규약에 종속되지 않아야 한다
- 특정 환경에 종속되지 않아야 한다
EJB(Enterprise Java Bean)의 실패
- EJB 환경에서 동작하기 위해 특정 인터페이스를 구현하고, 특정 클래스를 상속해야 했다
- 서버 환경에 종속적인 서비스를 통해서만 접근 가능하고 사용이 가능했다
- 이 EJB안의 틀 안에서만 자바 코드를 만들수 있게 하면서 자바 언어가 갖고 있던 장점을 잃어버렸다.
- 특정 클래스를 상속해야만 해서 더 이상 상속구조를 적용할 수 없어졌다.
- 다형성 적용이 근본적으로 제한됐다.
POJO의 장점
- 특정한 기술과 환경에 종속되지 않는 오브젝트는 그만큼 깔끔한 코드가 될 수 있다
- 자동화된 테스트에 매우 유리하다
- 특정 환경에 종속된 코드는 테스트를 자동화가 복잡하고 번거롭다
- 객체지향적인 설계를 자유롭게 적용할 수 있다
- 객체지향 프로그래밍은
- 지금까지 나온 프로그래밍 패러다임 중 가장 성공했고
- 가장 많은 언어에 적용됐으며
- 엔터프라이즈 시스템과 같은 복잡한 도메인을 가진 곳에서 가장 효과적으로 사용될 수 있다는 사실이 이미 오랜 시간을 통해 증명됐다
4 스프링이 가장 관심을 많이 두는 대상
오브젝트
- 스프링을 이해하려면 먼저 오브젝트에 깊은 관심을 가져야 한다
- 오브젝트가 생성되고, 다른 오브젝트와 관계를 맺고, 사용되고, 소멸하기까지의 전 과정을 진지하게 생각해볼 필요가 있다
- 더 나아가서
- 오브젝트는 어떻게 설계돼야 하고,
- 어떤 단위로 만들어지며,
- 어떤 과정을 통해 자신의 존재를 드러내고 등장해야 하는지
- 에 대해서도 살펴봐야 한다
- 결국 오브젝트의 관심은 오브젝트의 기술적인 특징과 사용 방법을 넘어서 오브젝트의 설계로 발전하게 된다
- 객체지향 설계의 기초와 원칙을 비롯해서 다양한 목적을 위해 재활용 가능한 설계 방법인 디자인 패턴
- 좀 더 깔끔한 구조가 되도록 지속적으로 개선해나가는 작업인 리팩토링
- 오브젝트가 기대한 대로 동작하고 있는지 효과적으로 검증하는 데 쓰이는 단위 테스트
- 스프링은 구체적으로 오브젝트의 아래 두 가지에 관심을 갖는다
- 오브젝트의 설계와 구현
- 오브젝트의 동작원리
1장에서는 스프링이 어떤 것이고, 무엇을 제공하는지보다 이 스프링이 관심을 갖는 대상에 더 집중하기를 바란다.
-토비
5 스프링을 효과적으로 익히는 3단계
스프링 핵심 가치와 혜택을 누리지 못하는 개발자들
- 인터넷에서 예제를 복붙하여 스프링의 기능을 기계적으로 적용하고
- 어떤 기능이 있고 어떻게 편리하고 유연하게 개발하는지 모른 채 사용하기 때문에 그렇다
스프링의 가치를 제대로 누리며 사용하려면,
스프링을 제대로 공부해야 한다!
1. 스프링의 핵심 가치와 원리에 대한 이해
- 스프링의 핵심 가치를 이해하고
- 스프링 스스로가 그 가치를 어떻게 적용해서 만들어져 있는지를 이해하는 것
핵심 가치와 원리를 자세히 공부하여, 스프링을 일관된 방식으로 이해할 수 있는 눈을 가져야 한다.
2. 스프링의 기술에 대한 지식과 선택 기준 정립
- 스프링이 어떻게 다양한 방법으로 확장하고 적용했는지 살펴볼 차례다.
- 스프링은 매우 범용적인 프레임워크다.
- 애플리케이션의 모든 레이어를 폭넓게 다루고 있음
- 어떤 분야와 기술 환경에도 적용 가능하도록 기술 영역별로 매우 폭넓은 접근 방법을 제공
- 그 중에서 어떤 것을 선택할지는 개발자의 몫!
- 스프링이 제공하는 방법 중 어떤 것을?
- 스프링과 연동하는 프레임워크로 어떤 것을?
- 어떤 스타일로 사용?
다양한 선택의 문제를 각 기술영역별로 효과적으로 다루는 법을 배워야 한다.
- 스프링이 제공하는 기술의 종류와 접근 방법에는 어떤 것이 있는지 충분히 살펴보고
- 선택의 기준을 마련해서 그때그때 상황에 맞는 최선의 기술과 접근 방법을 선택하라
3. 스프링의 적용과 확장
- 스프링의 다양한 기술을 어떻게 실제 애플리케이션 개발에 어떤 식으로 적용해야 하는지 경험해봤다면
- 이제 스프링에서 제공하는 기능을 확장하거나 추상화해서 사용하는 방법을 알아야 한다
스프링을 효과적으로 사용하는 기업/개발팀에서는 스프링을 기반으로 프레임워크를 만들어 사용한다.