직관적으로 간추린 토비의스프링 1장.1 - 스프링이란?

디퐁·2022년 12월 25일
0
post-thumbnail

일러두기

  • 토비의스프링3.1 Vol.1을 읽고 정리한 글입니다.
  • 책을 이미 읽으신 분이 빠르게 훑으며 복습하는 용도로 보시면 좋을 것 같습니다.
  • 임의로 핵심만 간추렸습니다. 책과 설명하는 순서가 바뀌거나 장/절 목차 이름이 바뀌거나 아예 빠진 내용이 많습니다.

1 스프링이란?

  • 자바 엔터프라이즈 애플리케이션 개발에 사용되는 애플리케이션 프레임워크
  • 애플리케이션 개발을 빠르고 효율적으로 할 수 있도록 아래를 제공한다
    • 애플리케이션의 기본 틀
    • 공통 프로그래밍 모델
    • 기술 API

애플리케이션의 기본 틀

  • 애플리케이션을 구성하는 오브젝트가 생성되고 동작하는 방식에 대한 틀
    • 설정 정보를 참고로 해서 애플리케이션을 구성하는 오브젝트를 생성하고 관리한다.
      • (그래서 스프링 개발자는 설정 정보 작성법을 알아야 한다)
  • 이것을 스프링 컨테이너, 애플리케이션 컨텍스트, 스프링 런타임 엔진이라고도 한다.

공통 프로그래밍 모델

  • 애플리케이션 코드가 어떻게 작성돼야 하는지에 대한 기준 = 프로그래밍 모델
  • 세 가지 핵심 프로그래밍 모델
    • IoC/DI
      • 오브젝트의 생명주기와 의존관계에 대한 프로그래밍 모델
      • IoC/DI 방식을 따라 작성돼야 스프링이 제공하는 가치를 제대로 누릴 수 있다
      • 객체지향 설계 원칙과 디자인 패턴의 핵심 원리를 담고 있다
      • 스프링을 사용하는데 가장 기본이 되고 가장 중요한 기술이다
    • 서비스 추상화
      • 구체적인 기술과 환경에 종속되지 않도록 유연한 추상 계층을 두어
      • 이식성이 뛰어나고 유연한 애플리케이션을 만들 수 있도록 한다
    • AOP
      • 코드에 산재해서 나타나는 부가적인 기능을 독립적으로 모듈화한다

기술 API

  • 방대한 양의 기술 API를 제공한다
    • UI 작성
    • 웹 프레젠테이션 계층
    • 비즈니스 서비스 계층
    • 기반 서비스 계층
    • 도메인 계층
    • 데이터 액세스 계층
    • 등등등
  • 필요한 주요 기술을 스프링에서 일관된 방식으로 사용할 수 있도록 지원해주는 기능과 전략 클래스를 제공
  • 제공하는 API와 지원 기술들은 모두 스프링의 프로그래밍 모델에 따라 작성되어 있다
    • 이를 가져다 쓰는 것만으로도 스프링의 프로그래밍 모델을 코드에 자연스럽게 적용할 수 있다

스프링을 사용한다는 것은

기본 틀, 공통 프로그래밍 모델, 기술 API를 적극적으로 활용해서 애플리케이션을 개발한다는 것이다!

구체적으로 어떻게?

  • 클래스
    • 스프링 컨테이너(기본 틀) 위에서 오브젝트로 만들어지고 동작하게 설정
  • 코드
    • 스프링의 공통 프로그래밍 모델을 따라 작성
  • DB, 트랜잭션, REST API 등의 엔터프라이즈 기술이 필요하다면
    • 스프링이 제공하는 기술 API를 활용

2 스프링이 이렇게까지 성공한 이유

  1. 견고하고 건전한 자바와 엔터프라이즈 개발의 핵심 가치에 충실하게 만들어졌기 때문이다.
    • 견고하고 건전한 자바?
      • 스프링은 객체지향의 근본, POJO를 적극 기용했다는 것!
      • 이전 JavaEE 애플리케이션 개발 시에는 POJO를 이용하기 어려웠다.
      • 컨트롤러 클래스를 만들고싶으면 특정 클래스를 상속해서 만들어야 하는 등의 제약이 많았기 때문이다.
      • 더 자세히는 아래 '스프링의 핵심 철학'에서 설명한다.
    • 엔터프라이즈 개발의 핵심 가치?
      • 실수하기 쉬운 로우레벨 기술에 많은 신경을 쓰지 않으면서도
      • 비지니스 로직을 빠르고 효과적으로 구현할 수 있게 하여
      • 엔터프라이즈 개발의 복잡함을 없애주는 것
  2. 스프링 개발자는 자연스럽게 자바와 엔터프라이즈 개발에 충실한 베스트 프렉티스를 적용하게 되고, 스프링을 사용하면서 이상적인 개발 철학과 프로그래밍 모델을 이해함으로써 좋은 개발 습관을 체득하게 된다.
    • 스프링 프레임워크가 그만큼 객체지향 패러다임을 적극적이고 모범적으로 활용했기 때문에 그렇다.

개발자들이 스프링을 통해 얻게되는 두 가지 중요한 가치

단순함

  • 스프링이 지향하는 것은 목적을 이룰 수 있는 가장 단순하고 명쾌한 접근 방법
  • 그것을 위해 스프링이 강력히 주장한 것이 바로 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의 조건

  1. 특정 규약에 종속되지 않아야 한다
  2. 특정 환경에 종속되지 않아야 한다

EJB(Enterprise Java Bean)의 실패

  • EJB 환경에서 동작하기 위해 특정 인터페이스를 구현하고, 특정 클래스를 상속해야 했다
    • 특정 규약에 종속
  • 서버 환경에 종속적인 서비스를 통해서만 접근 가능하고 사용이 가능했다
    • 특정 환경에 종속
  • 이 EJB안의 틀 안에서만 자바 코드를 만들수 있게 하면서 자바 언어가 갖고 있던 장점을 잃어버렸다.
    • 특정 클래스를 상속해야만 해서 더 이상 상속구조를 적용할 수 없어졌다.
    • 다형성 적용이 근본적으로 제한됐다.

POJO의 장점

  1. 특정한 기술과 환경에 종속되지 않는 오브젝트는 그만큼 깔끔한 코드가 될 수 있다
  2. 자동화된 테스트에 매우 유리하다
    • 특정 환경에 종속된 코드는 테스트를 자동화가 복잡하고 번거롭다
  3. 객체지향적인 설계를 자유롭게 적용할 수 있다
    • 객체지향 프로그래밍은
      • 지금까지 나온 프로그래밍 패러다임 중 가장 성공했고
      • 가장 많은 언어에 적용됐으며
      • 엔터프라이즈 시스템과 같은 복잡한 도메인을 가진 곳에서 가장 효과적으로 사용될 수 있다는 사실이 이미 오랜 시간을 통해 증명됐다

4 스프링이 가장 관심을 많이 두는 대상

오브젝트

  • 스프링을 이해하려면 먼저 오브젝트에 깊은 관심을 가져야 한다
    • 오브젝트가 생성되고, 다른 오브젝트와 관계를 맺고, 사용되고, 소멸하기까지의 전 과정을 진지하게 생각해볼 필요가 있다
    • 더 나아가서
      • 오브젝트는 어떻게 설계돼야 하고,
      • 어떤 단위로 만들어지며,
      • 어떤 과정을 통해 자신의 존재를 드러내고 등장해야 하는지
    • 에 대해서도 살펴봐야 한다
  • 결국 오브젝트의 관심은 오브젝트의 기술적인 특징과 사용 방법을 넘어서 오브젝트의 설계로 발전하게 된다
    • 객체지향 설계의 기초와 원칙을 비롯해서 다양한 목적을 위해 재활용 가능한 설계 방법인 디자인 패턴
    • 좀 더 깔끔한 구조가 되도록 지속적으로 개선해나가는 작업인 리팩토링
    • 오브젝트가 기대한 대로 동작하고 있는지 효과적으로 검증하는 데 쓰이는 단위 테스트
  • 스프링은 구체적으로 오브젝트의 아래 두 가지에 관심을 갖는다
    1. 오브젝트의 설계와 구현
    2. 오브젝트의 동작원리

1장에서는 스프링이 어떤 것이고, 무엇을 제공하는지보다 이 스프링이 관심을 갖는 대상에 더 집중하기를 바란다.
-토비

5 스프링을 효과적으로 익히는 3단계

스프링 핵심 가치와 혜택을 누리지 못하는 개발자들

  • 인터넷에서 예제를 복붙하여 스프링의 기능을 기계적으로 적용하고
  • 어떤 기능이 있고 어떻게 편리하고 유연하게 개발하는지 모른 채 사용하기 때문에 그렇다

스프링의 가치를 제대로 누리며 사용하려면,
스프링을 제대로 공부해야 한다!

1. 스프링의 핵심 가치와 원리에 대한 이해

  • 스프링의 핵심 가치를 이해하고
  • 스프링 스스로가 그 가치를 어떻게 적용해서 만들어져 있는지를 이해하는 것

핵심 가치와 원리를 자세히 공부하여, 스프링을 일관된 방식으로 이해할 수 있는 눈을 가져야 한다.

2. 스프링의 기술에 대한 지식과 선택 기준 정립

  • 스프링이 어떻게 다양한 방법으로 확장하고 적용했는지 살펴볼 차례다.
  • 스프링은 매우 범용적인 프레임워크다.
    • 애플리케이션의 모든 레이어를 폭넓게 다루고 있음
    • 어떤 분야와 기술 환경에도 적용 가능하도록 기술 영역별로 매우 폭넓은 접근 방법을 제공
    • 그 중에서 어떤 것을 선택할지는 개발자의 몫!
      • 스프링이 제공하는 방법 중 어떤 것을?
      • 스프링과 연동하는 프레임워크로 어떤 것을?
      • 어떤 스타일로 사용?

다양한 선택의 문제를 각 기술영역별로 효과적으로 다루는 법을 배워야 한다.

  • 스프링이 제공하는 기술의 종류와 접근 방법에는 어떤 것이 있는지 충분히 살펴보고
  • 선택의 기준을 마련해서 그때그때 상황에 맞는 최선의 기술과 접근 방법을 선택하라

3. 스프링의 적용과 확장

  1. 스프링의 다양한 기술을 어떻게 실제 애플리케이션 개발에 어떤 식으로 적용해야 하는지 경험해봤다면
  2. 이제 스프링에서 제공하는 기능을 확장하거나 추상화해서 사용하는 방법을 알아야 한다

스프링을 효과적으로 사용하는 기업/개발팀에서는 스프링을 기반으로 프레임워크를 만들어 사용한다.

profile
Backend 취준생

0개의 댓글