들어가는 말
스프링을 제대로 공부하기 전, 스프링의 탄생의 이유와 핵심 컨셉을 이해해야 한다. 이 글에서는 그에 대한 내용을 간략하게 정리했으며, 자세한 내용은 다음 글부터 다룬다.
자바 진영의 추운 겨울과 스프링의 탄생
Enterprise Java Beans (EJB)
- 자바당 정파 기술이며, 종합 선물 세트
- 자바의 표준 기술이었기 때문에 금융권이나 아키텍트 쪽에서 많이 사용하고 도입했다.
- 이론적인 부분이 좋았다.
- 컨테이너 기술, 트랜잭션 관리, 분산 기술 등에 대한 지원이 잘 됐다.
- 당시 엔티티빈이라는 ORM 기술을 가지고 있었다.
💡 ORM 기술이란
쿼리를 사용하지 않고 자바 객체를 DB에 편하게 저장하고 꺼내는 기술
단점
- 비용이 비싸다.
- 어렵고, 복잡하고, 느리다.
- EJB가 제공하는 인터페이스를 구현하고 EJB를 의존적으로 개발해야 했다.
- 코드가 지저분해진다.
- 라이프 사이클을 알기 어렵다.
POJO
옛날로 돌아가서 오래된 방식의 간단한 자바 오브젝트를 쓰자!
EJB를 사용하면 코드가 지저분해지고 EJB에 의존적으로 개발해야 하므로, “순수하게 옛날 자바로 돌아가자”라고 해서 POJO라는 단어가 나온다.
스프링 프레임워크
스프링의 시작
2002년, SI 개발자였던 로드 존슨이 EJB의 문제점을 지적하면서 EJB보다 훨씬 단순하고 더 좋은 방법으로 개발할 수 있다는 주제로 책을 쓰고 코드를 풀었다.
- EJB 없이도 충분히 고품질의 확장 가능한 애플리케이션을 개발할 수 있음을 보여주고, 30000 라인 이상의 기반 기술을 예제 코드로 선보였다.
- BeanFactory, ApplicationContext, POJO, 제어의 역전, 의존관계 주입
- 여기에 지금의 스프링 핵심 개념과 기반 코드가 들어가 있다.
이후, Juergen Hoeller(유겐 휠러), Yann Caroff(얀 카로프)가 로드 존슨에게 오
픈소스 프로젝트를 제안하면서 스프링이 등장했다.
스프링의 의미
Spring이라는 이름은 전통적인 J2EE, 즉 EJB라는 겨울을 넘어 새로운 시작 Spring이라는 뜻으로, 얀 카로프가 지었다.
스프링 매뉴얼을 보면, 스프링이라는 단어가 애매하고 문맥에 따라 다르다고 되어 있다.
- 스프링 프레임워크 자체
- 스프링 부트나 스프링 프레임워크 등 스프링 생테계 자체를 모두 포함
- 좁은 의미에서는 DI 컨테이너 기술
- Spring-di-contatiner라는 스프링 핵심 기술 중 스프링 빈을 관리하는 DI 컨테이너 기술이 있다.
- 소스 코드 상에서 스프링 컨테이너라고 이야기하면 스프링의 DI 컨테이너를 말한다.
스프링의 역사
- 2003년 스프링 프레임워크 1.0 출시 - XML
- 2006년 스프링 프레임워크 2.0 출시 - XML 편의 기능 지원
- 2009년 스프링 프레임워크 3.0 출시 - 자바 코드로 설정
- 2013년 스프링 프레임워크 4.0 출시 - 자바 8
- 2014년 스프링 부트 1.0 출시
- 2017년 스프링 프레임워크 5.0, 스프링 부트 2.0 출시 - 리엑티브 프로그래밍 지원
- 2020년 스프링 프레임워크 5.2.x, 스프링 부트 2.3.x
- 현재: 스프링 프레임워크 6.1.3, 스프링 부트 3.2.2
XML
2000년 초반에는 XML 기반으로 설정하도록 스프링 프레임워크 1.0 이 나왔다.
2.0 때는 XML 설정하는 게 너무 많다 보니 편의 기능이 추가되었고,
3.0 부터는 본격적으로 XML 없이 Java 코드로 Spring 설정을 할 수 있게 된다.
Spring Boot
- 스프링은 설정이 힘들다.
- WAS에 스프링 War를 빌드해서 넣고 배포해야 한다.
따라서 스프링도 Tomcat 서버를 내장해서 편리하게 개발할 수 있도록 나온 것이 스프링 부트이다.
리액티브 프로그래밍
- 2017년에 스프링 프레임워크 5.0 이 나오면서 리액티브 프로그래밍이 지원된다.
- 리액티브 프로그램은 자바에서도 Node.js 처럼 논블로킹, 비동기 논블로킹 기술을 가지고 개발할 수 있는 것을 말한다.
JPA
개빈킹이라는 개발자가 EJB의 Entity Bean의 문제점 때문에 Hibernate를 만든다.
나중에는 사람들이 Entity Bean대신 Hibernate를 사용해서, 자바 쪽에서 개빈킹을 데리고 와서 Hibernate를 가지고 자바 표준인 JPA를 만들어 냈다.
- JPA라는 표준 기술은 인터페이스만 있고 구현체는 따로 만들어야 한다.
- 구현체로는 Hibernate, Eclipse Link 등 다른 벤더들이 만든 기술들이 있다.
- 대부분 JPA 표준 Hibernate를 쓴다.
스프링의 핵심 개념
모든 기술은 핵심 개념(컨셉)과 개념이 중요하다.
스프링은 객체지향 언어가 가진 강력한 특징을 살려내는 프레임워크이다.
- 스프링은 Java 기반의 프레임워크이다
- Java 언어의 가장 큰 특징은 객체지향 언어라는 것이다.
기존의 EJB는 EJB에 의존적으로 개발하면서 객체지향이 가진 좋은 장점들을 모두 잃어버렸다.
그래서 순수한 객체지향, 순수한 Java로 돌아가자는 POJO라는 단어도 나왔다.
스프링은 객체지향 프로그래밍을 잘 할 수 있도록 도와주는 도구라는 것이 진짜 핵심이다.
따라서 스프링 프레임워크를 이해하려면, 좋은 객체지향 프로그래밍이 무엇인지를 이해해야 한다.
스프링 생태계
스프링의 특정한 하나가 아니라, 여러 가지 기술들의 모음이다.
스프링 프레임워크
하나로 이루어진 것이 아니라, 핵심 기술과 웹 기술, 데이터 접근 기술 등이 들어 있다.
Spring의 DI, 컨테이너, AOP 등 어떤 Spring의 모든 라이브러리를 사용하는 스프링의 핵심 중의 핵심이라 할 수 있는 핵심 기술이 있다.
스프링 부트
- 단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성할 수 있다.
- Tomcat과 같은 웹서버를 내장해서 별도의 웹서버를 설치하지 않아도 된다.
- Starter가 스프링과 서드 파티, 그러니까 외부 라이브러리의 자동 구성을 도와준다.
- 스프링 프레임워크와 잘 맞는지 테스트하고 버전을 챙겨준다.
- 스프링 프레임워크와 분리해서 사용할 수 있는 것이 아니다!
스프링 데이터
- 모든 DB는 기본적인 CRUD가 비슷한데, 이러한 CRUD를 굉장히 편리하게 사용할 수 있도록 도와주는 기술이다.
- 제일 많이 사용하는 것은 Spring Data JPA이다.
스프링 세션
- 세션 기능을 편리하게 사용할 수 있도록 도와준다.
스피링 시큐리티
기타
위에서 언급한 기술들 외의 다른 기술들도 있다.
Reference
인프런 강의
스프링 핵심 원리 - 기본편 강의 - 인프런