스프링 프레임워크
스프링 프레임워크는 오픈소스 애플리케이션 프레임워크이다.
자바 최고의 프레임워크로서 동적 웹 사이트를 개발하기 위해 사용된다.
주로 엔터프라이즈급 애플리케이션을 개발하기 위해 사용되는데 여기서 엔터프라이즈급이란 기업, 대규모 조직급이라고 생각하면 될 것 같다. 정리하자면 큰 규모의 개발을 위해 많이 사용된다.
** 여기서 프레임워크란? **
프레임워크는 자주 쓰이는 기능들을 모아 놓은 유틸(클래스)들의 집합이다.
프레임이라는 말 그대로 소프트웨어 개발에서 뼈대 역할을 할 수 있다.
1. 스프링의 탄생과 역사
스프링은 1.0 버전으로 2004년 3월에 처음 배포되었다. 그렇다면 그 전에는 어떤 기술을 사용했을까?
EJB(Enterprise JavaBeans)와 JSP를 많이 사용했다
** 여기서 자바빈즈란? **
자바빈즈는 자바로 작성된 소프트웨어 컴포넌트이다. 자바는 프로그램 기본단위가 클래스이고, 자바빈은 그 클래스들이 복합적으로 이루어진 구조를 말한다. 자바빈은 자바의 클래스를 만드는 것과 같은 규칙을 갖는다.
EJB 자체가 Enterprise JavaBeans로 자바빈즈라는 말을 가지고 있지만
본질적으로 EJB와 자바빈즈는 목적도 다르고 동작하는 위치도 다르니 알아두자.
EJB는 주로 웹 시스템에서 JSP는 화면 로직을 처리하고, EJB는 업무 로직을 처리하기위해 사용했었다.
특히 EJB는 거대규모 시스템 구축을 위해 사용된 컴포넌트 모델이라고 할 수 있는데
문제는 그만큼 너무 복잡했다는 점이다.
단위테스트는 거의 불가능. 시간도 너무 많이 걸리고 효율성도 매우 떨어졌기때문에 자연스럽게 많은 자바개발자들이 EJB에 불만을 가지기 시작했다.
이 때 혜성처럼 등장한 것이 스프링 프레임워크다!! 이름은 왜 스프링일까? EJB를 사용하던 J2EE의 긴 겨울이 끝나고 봄이 왔다는 의미이다.
스프링 버전의 역사는 아래와 같다.
- 1.0 : 2004년 3월
- 2.0 : 2006년 10월
- 2.5 : 2007년 11월
- 3.0 : 2009년 12월
- 3.1 : 2011년 12월
- 4.0 : 2013년 12월
- 5.0 : 2017년 9월
현재는 (2022-01-21) 스프링 5.3.x 버전을 사용하고 있다.
2. 스프링의 특징
- POJO 기반
POJO(Plain Old Java Object)는 말 그대로 오래된 방식의 간단한 자바 오브젝트라는 말이다.
EJB와 같은 기술은 자바 코드 자체를 특정 기술과 환경에 종속 의존하게 만들어 가독성이 떨어뜨리고 유지보수를 어렵게 만들었다. 또한, 특정 기술의 클래스를 상속받거나, 직접 의존하게 되어 확장성이 매우 떨어졌는데 그로 인해 자연스럽게 객체지향의 끝판왕인 자바가 객체지향 설계의 장점들을 잃어버리게 되었다.
그래서 등장한 말이 POJO인 것이다.
특정 라이브러리나 컨테이너의 기술에 너무 종속되지 말자!
자바의 장점을 잘 활용하자! 이정도로 이해하면 되겠다.
(참고>> 자바빈즈는 POJOs 중의 하나다.)
- MVC(Model - View - Contorller) 패턴 (모델-뷰-컨트롤러)
스프링 MVC는 웹 개발을 하면 대부분 많이 사용하는 웹 프레임워크다.
스프링 MVC가 컨트롤러, 핸들러 매핑, 뷰 리졸버 등을 정의하면 의존성 주입과 와이어링을 통해 서블릿 기반 웹 애플리케이션을 보다 간단하게 만들 수 있다.
기존에 사용했던 JSP로만 MVC를 구성할 때보다 훨씬 수월할 뿐만 아니라 스프링 자체에 간편하고 강력한 도구가 많기 때문에 개발 난이도를 낮춰준다.
- DI(Dependency Injection) - 의존성 주입
의존 관계 주입을 통해 느슨하게 연결된 애플리케이션을 쉽게 개발할 수 있다.
느슨한 관계를 통해 단위테스트에 용이하고, 유지 보수가 훨씬 수월해진다는 장점이 있다.
- IoC(Inversion of Control)
Inversion of Control은 번역하면 제어의 역전이라는 말이다.
스프링 프레임워크를 사용하기 이전에는 개발자가 모든 작업을 제어해야만 했다. 그래서 개발자가 할 일이 너무 많아지고 프로그램 자체가 복잡해진 것이다. IoC는 이 개념을 뒤집어버린 것이다.
스프링 프레임워크는 객체를 만들고 연결하는 책임을 IoC 컨테이너로 넘겨서 의존 관계를 제어한다. 풀어서 말하자면, 제어의 흐름을 개발자가 관여하지 않고 IoC 컨테이너 객체에 맡기는 것이다. 덕분에 사용자는 프로그램 제어의 부담을 줄일 수 있고, 비즈니스 모델에 집중할 수 있다.
- 트랜잭션
추상화된 트랜잭션 관리을 지원한다. 설정파일(xml, java, properties)을 이용하면 시스템이나 데이터베이스가 항상 정확하고 일관된 상태를 유지하는 것에 도움이 된다.
- AOP(Aspect-Oriented Programming)
관점 지향 프로그래밍이라는 의미로 OOP(Object-Oriented Programming)을 보완하기 위해 생긴 개념이다.
트랜잭션, 보안, 로깅 등 여러 모듈에서 함께 사용하는 기능을 분리하여 관리할 수 있게 도와주는 것이다.
- 안정성
속도가 빠른 Node.js가 있지만 왜 아직도 스프링을 사용할까?
정답은 안정성이다. Node.js는 속도도 정말 빠르고 손 쉽게 개발도 할 수 있어 좋은 프레임워크라고 생각하지만 약점이 있다. 안정성이 부족한 프레임워크라는 점이다.
Node는 싱글스레드로 돌아가는데, 만약 서버에 오류가 발생하면 전체 서버가 한꺼번에 죽어버릴 수도 있다.
반면 자바 스프링은 멀티스레드 방식을 사용하기 때문에 하나의 프로세스가 죽어도 다른 자원으로 대체가 가능하기 때문에 안정성이 훨씬 좋다. 보안과 안정성이 중요한 정부나 금융권에서는 Spring을 사용한다.
3. 스프링을 구성하는 다양한 프로젝트 - Spring Ecosystem
스프링 생태계는 스프링 부트와 스르링 프레임워크를 중심으로 20가지가 넘는 프로젝트로 구성되어있다.
위의 그림파일에 있는 프로젝트 외에도 Spring AMQP, Sprint CredHub 등 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 강력한 도구들이 많다.