당니의 개발자 스토리
스프링이란? 본문
이번 시간에는 스프링이 뭔지, 스프링에 대해서 자세히 알아보겠습니다.
먼저 스프링 생태계에 대해서 말씀드릴게요.

스프링은 어떤 특정한 하나가 아니라, 여러가지 기술들의 모음이라고 볼 수 있어요.
먼저 스프링의 가장 핵심이 되는 스프링 프레임워크, 그리고 여러 스프링 기술들을 굉장히 편리하게 사용할 수 있도록 도와주는 스프링 부트, 그리고 스프링 데이터, 세션, 시큐리티, Rest Docs, 배치, 클라우드 등등등 여러가지가 있어요.
핵심인 스프링 프레임워크나 부트는 제가 뒤에서 자세히 설명을 할게요.
스프링 데이터는 뭐냐면, 데이터베이스가 관계형 데이터베이스든, NoSQL이든, MongoDB든, Redis든 기본적인 CRUD는 다 비슷하거든요. 등록, 수정, 삭제, 조회 이러한 CRUD는 비슷하기 때문에, 이런 것들을 굉장히 편리하게 사용할 수 있도록 도와주는 게 스프링 데이터라는 기술이에요. 그리고 여기서 제일 많이 쓰는 것은 스프링 데이터 JPA를 많이 쓰고요.
그 다음에 스프링 세션은 세션 기능을 좀 편리하게 사용 할 수 있도록 도와주는 겁니다.
그리고 Security는 보안과 관련된 것,
REST Docs는 API 문서화 테스트를 편하게 엮어서 문서화를 편하게 해주는 것입니다.
Spring Batch는 여러분들이 보통 애플리케이션 이라고 하면, 실무을 안해보신 분들은 어떻게 생각하냐면, api 같은거 만들거나 화면을 만든다고 생각하는데, 실무에서는 예를 들어서, 천만 명의 데이터를 한번에 업데이트를 한다고 하면, 실시간으로 하기가 되게 어렵거든요. 그래서 데이터를 천만 건 중에서 한 100컷씩, 1,000컷씩 퍼올려서 하고, 1000컷 저장하고 또 1,000컷 퍼올려서 돌리고 저장하고 이런 걸 배치처리라고 하는데, Spring Batch 그 배치처리에 특화된 기술입니다.
그리고 스프링 클라우드는 최근에 클라우드 기술에 특화된 기술이고요.
자 이거 외에도 굉장히 많은 기술들이 있습니다.
여러분이 Spring.io 사이트에 들어와서,

Project의 Overview를 보시면,


Spring Boot, Framework, 그 다음에 Data 등등 굉장히 많은 프로젝트가 있습니다. 이게 다 스프링 관련된 프로젝트들입니다.

그리고 뭐 다락방 프로젝트를 해가지고 또 몇가지들이 있고 플랫폼은 진짜 많아요.
근데 제일 중요한 핵심이 뭐냐면, 스프링 프레임워크라고 보시면 됩니다.
그리고 여기 나와있는 이 모든 기술들을 편리하게 사용하도록 도와주는 게 스프링 부트예요.
그러면 이제 가장 중요한 건 사실 Spring Framework가 가장 중요해요. 프레임워크는 공통으로 사용될 수 있는 특정한 기능들을 모듈화한 것을 말합니다.

이 Spring Framework는 하나로 이루어진 건 아니고요.
이 안에는 첫 번째로 핵심 기술, 즉 Spring의 어떤 DI 컨테이너, AOP, 이벤트 등등 Spring의 모든 라이브러리를 활용하는 Spring의 가장 핵심 중의 핵심이라고 할 수 있는 핵심 기술이 스프링 프레임워크 안에 있고요.
그 다음에 웹 기술이 있어요. Spring MVC, WebFlux 같은 웹 기술들이 있고요.
그리고 DB에 접근하는, 즉 데이터베이스 트랜잭션이나 JDBC, ORM 등을 지원하는 데이터 접근 기술과 관련된 부분이 있고요.
그 다음에 기술을 통합하거나 테스트와 관련된 부분. 그 다음에 언어, 코틀린이랑 그루비, 최근에 스프링 프라임워크에서 코틀린도 많이 시용하고 있죠. 이런 언어와 관련된 부분들을 통합해서 스프링 프레임워크라고 해요. 공통으로 사용하는 특정한 기능들을 모듈화 한거죠.
이 강의에서 설명하고 초점을 맞추는 것은 사실 스프링 프레임워크 중에서도 이 핵심 기술에 초점을 맞춥니다. 나머지는 다 여기서 파생이 된 거라고 보시면 됩니다.
최근에는 스프링 프레임워크를 그냥 딱 스프링 프레임워크만 쓰는 건 아니고요. 이거를 되게 편리하게 사용할 수 있는 스프링 부트라는 것을 통해서, 스프링 프레임워크를 많이 사용합니다.
스프링 부트는 스프링을 굉장히 편리하게 사용할 수 있도록 지원하는 기술이고요. 최근에는 기본으로 모든 실무 프로젝트에 스프링 부트를 일단 깔고 들어갑니다.
스프링 부트의 장점들을 하나씩 설명을 드릴게요.

먼저, 단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성할 수 있습니다. 또 톰캣 같은 웹서버를 내장해서 별도의 웹서버를 설치하지 않아도 돼요.
이 두 개를 묶어서 말씀드리면, 예전에는 스프링 가지고 프로젝트를 하나 하려고 하면, 보통은 웹 애플리케이션을 개발하니까 빌드를 해요. 그리고 톰캣 서버라는 걸 받아서 별도의 설치를 해요. 그 톰캣 서버에 특정 위치에다가 스프링 프로젝트 빌드 된거를 또 넣고 막 띄우고 복잡했거든요.
지금은 그냥 스프링 부트라는 게 빌드하고 서버 띄우는거까지 그냥 자체적으로 몇줄 치면 됩니다. 그래서 진짜 편리해졌어요. 예전처럼 톰캣 깔고 이런것들 다 안해도 됩니다.
그리고 손쉬운 빌드 구성을 위한 starter 종속성을 제공힌다고 하는데, 예전에는 스프링 프레임워크를 쓰려면, 이 라이브러리를 쓰고 막 이거를 다 했어야 됐거든요.
그런게 되게 어려웠는데, 지금은 스프링 부트 starter, 스프링 부트 AOP starter, 스프링 부트 데이터 JPA starter 등등 해가지고, 라이브러리를 쓸 때 하나만 땡기는 게 아니라, 여러 개 막 묶어서 땡겨야하는데, 그런 것들에 대해서 편하게 하나만 딱 땡기면, starter가 나머지 라이브러리까지 같이 챙겨서 하는 것들을 잘 구성을 해놨습니다.
그리고 이제 스프링과 3rd parth(외부) 라이브러리 자동 구성은 무슨 얘기냐면, 과거에는 진짜 어려웠던 게 소위 말하는 궁합이라고 해야 되나? 그러니까 만약에 스프링 부트가 3.1이고, 스프링 프레임워크가 3.1인인데, 이 3.1 버전으로 할 때 외부 라이브러리, 예를 들어서 JSON 라이브러리의 뭐랑 이 버전이 잘 안 맞는거죠. 이런 게 과거에는 진짜 힘들었습니다.
근데 스프링 부트가 뭘 해주냐면, Spring Framework 5.1에서는 외부 라이브러리들이 뭐를 씁니다. 하고 버전을 자기가 다 챙겨서 줘요. 유명한 메이저 라이브러리들과의 궁합과 조합이 잘 맞는지 스프링이 다 테스트하고 버전까지 다 자기가 지정을 해서 다운로드 받을 수 있게 해줘요.
그래서 우리가 외부 라이브러리 버전에 대해서 크게 고민하지 않아도 돼요. 그게 3rd parth(외부) 라이브러리 자동 구성 입니다.
그리고 메트릭, 상태 확인, 외부 구성 같은 프로덕션 준비 기능을 제공하는데요.
뭐냐면 운영환경에서 모니터링하는게 진짜 중요하거든요. 그런 것들을 스프링 부트가 기본적으로 어느정도 제공을 해줍니다.
그리고 관례에 의한 간결한 설정을 해줘요. 예전에 스프링 프레임워크만 쓸 때는 설정하는게 진짜 힘들었거든요. 스프링 부트는 웬만한건 다 디폴트 설정이 있고 매뉴얼에 다 나와있어요. 거기서 보고 내가 필요하면 설정을 조금만 변경하면 돼요. 대부분 관례에 의한 설정을 쓰고, 꼭 필요할 때만 내가 커스텀하게 그 부분을 변경하면 돼요. 그래서 설정도 정말 편해요.
자 그래서 라이브러리 버전도 최적화 해주고, 메트릭, 모니터링 등등 다 지원해줍니다.
참고로 이제 오해하는 분들이 이제 있어요.
스프링 부트는 스프링 프레임워크와 별도로 사용할 수 있는 게 아니에요.
스프링 부트는 스프링 프레임워크, 아까 보여드린 스프링 데이터, 여러가지 이런 것들을 중간에서 편리하게 사용할 수 있는 기능들을 제공하는 거예요.
결과적으로 어떻게 보면, 껍데기 기능만 있는 거고, 근데 껍데기라고 보기에는 너무 편하기 때문에 껍데기 외에도 여러가지 추가 기능들이 있는데, 기본적으로 스프링 부트는 꼭 스프링 프레임워크를 사용을 해서, 그리고 나머지도 필요하면 당겨와서 사용해가지고 도와주는 기술이지, 이것만 가지고 뭔가 돌아갈 수 있는 프로젝트는 아닙니다.
물론 스프링 부트를 쓰면, 자기가 자동으로 스프링 프레임워크도 땡기고 그렇게 합니다.
자 그러면 스프링이라는 단어에 대해서 알아볼게요.

스프링이라는 단어가 애매해요. 아예 이거는 스프링 매뉴얼에 '스프링이라는 단어는 애매하다, 문맥에 따라 다르다' 라고 되어있습니다.
스프링을 좀 좁혀서 얘기하면 스프링 DI 컨테이너 기술, 즉 스프링 핵심 중에 핵심인 스프링 빈을 관리하는 DI 컨테이너 기술이고, 스프링 프레임워크 자체를 말하기도 합니다.
최근에는 스프링이라고 하면, 스프링 부트나 스프링 프레임워크 등을 모두 포함하는 스프링 생태계 자체를 스프링이라고 얘기를 합니다.
예를 들어서 '아 스프링 좋아!' 이렇게 얘기할 때는 세 번째인 거고요. 소스 코드 상에서 스프링 컨테이너 라고 얘기하면, 스프링의 어떤 DI 컨테이너를 말하는구나. 생각하면 됩니다.
자 그러면 스프링을 왜 만들었을까요?

이제 잠깐 로드 존슨이 되어봅시다. 이걸 설명하기 전에 이 얘기를 꼭 드리고 싶어요.
아무리 복잡한 기술도 핵심 컨셉은 항상 단순해요. 이 기술을 왜 만들었는지의 핵심 컨셉은 진짜 단순하게 시작하는 거거든요.
근데 이 단순한 핵심 컨셉이 너무 좋으면, 기술이 막 붙으면서 몸집이 커지는 겁니다.
이 큰 스프링 생태계도 처음에 로드 존슨이 시작했던, 그 3만 줄의 코드에서 시작을 한 거예요. 그래서 앞에서 보면 스프링 기술이 매우 복잡하고 커보이잖아요. 그런데 이 기술을 왜 만들었는지, 왜 로드 존슨이 만든 핵심 코드에 여러 개발자들이 열광해서 오픈소스까지 하자고 했는지 이게 중요한 거예요.
왜 열광했을까? 도대체 로드 존슨이 어떤 컨셉을 가지고 만들었기에 그런 걸까?
모든 기술은 핵심 컨셉이랑 개념이 중요하지, 나머지는 사실 다 부차적인 거예요.
그래서 단순하게 API 사용법만 안다고 스프링을 잘하는 건 절대 아니에요.
지금부터 어떤 핵심 컨셉을 가지고 스프링을 만들었는지 본질적인 이야기를 해드리겠습니다.

스프링 핵심 컨셉이 뭔가? 웹 어플리케이션 편하게 만들고 DB에 편하게 접근해주는 기술인가? 물론 와닿지만 이게 핵심은 아닙니다.
이런거는 다 결과물일 뿐이죠.
스프링의 진짜 핵심은 뭐냐면,

스프링은 Java 언어 기반의 프레임워크에요.
Java 언어의 가장 큰 특징은 뭐냐면 바로 객체지향 언어라는 거거든요. 스프링은 이 객체지향 언어가 가진 강력한 특징을 살려내도록 하는 프레임워크에요.
그래서 정리하면, 스프링은 좋은 객체지향 애플리케이션을 개발할 수 있도록, 개발자들을 도와주는 프레임워크입니다.
로드 존슨이 쓴 책에 개발자들이 왜 그렇게 열광했냐면, 기존의 EJB를 사용하면, EJB를 상속받고 하면서 굉장히 지저분하게 EJB에 의존적으로 개발을 해야 됐어요. 그러면서 무슨 문제가 생기냐면, 객체지향이 가진 좋은 장점들을 다 잃어버리는 거에요. 그냥 EJB에 종속돼서 EJB 스타일로 개발할 수 밖에 없었던 거죠.
그래서 "순수한 Java, 순수한 객체지향으로 돌아가자!" 해서, POJO라는 단어도 나온 겁니다.
그런 와중에 스프링이 가진 DI 컨테이너에 좋은 객체지향 애플리케이션을 개발할 수 있도록 하는 것들이 있었어요. DI 컨테이너, IO 컨테이너, IoC 컨테이너 라고 불리는 객체 지향 프로그래밍을 잘 할 수 있게 도와주는 도구가 있었습니다.
그래서 진짜 핵심은 스프링이 "제대로 된 객체지향 프로그래밍을 할 수 있도록 도와주는 도구" 라는 게 진짜 핵심입니다.
그러면 좋은 객체 지향 프로그래밍이 뭘까? 이걸 이해해야 스프링 프레임워크를 제대로 이해할 수가 있어요. 이게 모든 것의 출발점의 시작입니다.
스프링의 본질을 알면, 스프링이 얼마나 객체지향 프로그래밍을 잘 할 수 있도록 고민하고 설계했는지 알 수가 있습니다.
다음 시간에는 좋은 객체지향 프로그램이 뭔지 말씀드리겠습니다.
'스프링 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
| 프로젝트 생성 (0) | 2024.01.16 |
|---|---|
| 객체 지향 설계와 스프링 (0) | 2024.01.16 |
| 좋은 객체 지향 설계의 5가지 원칙(SOLID) (0) | 2024.01.16 |
| 좋은 객체 지향 프로그래밍이란? (0) | 2024.01.16 |
| 이야기 - 자바 진영의 추운 겨울과 스프링의 탄생 (0) | 2024.01.15 |