[Spring] 스프링(Spring)과 스프링 부트(Spring Boot)
1. 스프링(Spring)이란?
1) 스프링 개요
스프링 프레임워크(Spring Framework)는 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크이며 간단히 스프링(spring)이라고도 불린다. 동적인 웹 사이트를 개발하기 위한 다양한 서비스를 제공하고 있고, 대한민국 공공기관의 전자정부 표준 프레임워크 기반 기술로서 사용되고 있다.
기업에서 운영하는 웹 서비스에는 비즈니스 로직은 기업이 제공하는 서비스를 코드로 구현한 것으로, 사용자의 요구사항을 해결하기 위한 실질적인 코드들을 의미한다. 스프링이 등장하기 이전에는 비즈니스 로직을 구현하기 위해 기술 자체에 대한 공부를 추가적으로 해야만 했다. 비즈니스 로직을 구현하는 기술 자체가 복잡하고 어려웠기 때문이다.
그러나, 스프링은 이전 기술에 비해 사용 방법이 상대적으로 덜 복잡하다. 개발 초기에 기본적인 설정과 적용시킬 기술들만 잘 선택을 해준다면, 기술보다는 애플리케이션의 로직 자체에 더 집중하여 비즈니스 로직을 구현할 수 있다.
(1) 애플리케이션 프레임워크
웹 개발에 있어 프레임워크란, 어떠한 목적을 쉽게 달성할 수 있도록 해당 목적과 관련된 코드의 뼈대를 미리 만들어둔 것을 의미한다. 일반적으로 프레임워크는 특정 업무 분야 혹은 하나의 기술에 집중하여 목적을 편리하게 달성할 수 있게 만들어진다.
반면, 애플리케이션 프레임워크는 특정 업무 분야 및 특정 기술이 아니라, 애플리케이션 개발에 필요한 모든 과정에 집중한다. 다시 말해, 애플리케이션 프레임워크는 애플리케이션을 개발하는 데에 있어 필요한 모든 업무 분야 및 모든 기술과 관련된 코드들의 뼈대를 제공한다.
(2) 오픈 소스
스프링은 모든 사용자에게 무료이며, 필요하다면 스프링의 코드를 일부 수정하여 사용이 가능하다. 이처럼 오픈소스로 프로젝트를 공개해 놓으면 여러 사람이 프로젝트의 코드를 사용해봄으로써 다양한 검증 과정을 거칠 수 있다는 장점이 있다. 스프링은 오픈소스 프레임워크이지만, 안정적인 개발과 개선이 보장된다. 스프링은 스프링 소스(SpringSource)라는 IT기업에서 관리하고 있으며, 스프링의 소스 코드를 수정하거나 개선하는 일에는 스프링 소스의 한정적인 인원만 참여할 수 있다.
(3) 경량급
스프링은 수십개의 세부 모듈 및 수십만줄의 방대한 코드로 이루어진 프레임워크이다. 그럼에도 불구하고 어떻게 스프링을 정의할 때에 경량급이라는 수식어를 사용할 수 있는 것일까? 스프링을 정의함에 있어 경량급이라 함은 기존에 스프링 대신 사용하던 기술들과 비교하여, 스프링을 사용했을 때에 개발자가 작성해야 할 코드가 상대적으로 단순하다는 것을 표현하기 위함이다.
스프링이 등장하기 이전에는 EJB(Enterprise Java Bean)라는 기술이 주로 사용되었다. EJB 또한 EJB 이전에 사용되던 기술의 단점을 보완하여 이전 기술을 대체하기 위해 등장했지만, 그럼에도 여전히 불필요하게 복잡한 코드를 작성해야만 했습니다. 이에 따라, 많이 개발자들이 불필요한 코드들을 어떻게 걷어낼지, 어떻게 코드의 복잡성을 줄일 수 있을지 고민했고, 그 결과 탄생한 것이 스프링이다.
따라서, 스프링을 정의함에 있어 경량급 애플리케이션 프레임워크라 함은, 스프링을 사용함으로써 기존 기술을 사용할 때에 불가피하게 작성해야만 했던 불필요하게 복잡한 코드를 제거하여 코드의 복잡성을 낮출 수 있음을 의미한다.
2) 스프링의 특징
(1) POJO 프로그래밍
POJO란, Plain Old Java Object, 즉 순수 Java만을 통해서 생성한 객체를 의미한다. 순수 Java만을 사용한다는 것은 Java 및 Java의 스펙에 정의된 기술만 사용한다는 의미한다. 즉, 어떤 객체가 외부의 라이브러리나 외부의 모듈을 가져와서 사용하고 있다면, 그 객체는 POJO라고 할 수 없다. POJO는 말 그대로, 다른 기술을 사용하지 않는 순수한 Java만을 사용하여 만든 객체인 것이다.
POJO는 순수 Java만을 사용하여 만든 객체이므로 특정 기술이나 환경에 종속되지 않습니다. 따라서, 외부 기술이나 규약의 변화에 얽매이지 않아, 보다 유연하게 변화와 확장에 대처할 수 있다. 이러한 POJO를 사용하여 비즈니스 로직을 구현하면 객체지향 설계를 제한 없이 적용할 수 있으며, 코드가 단순해져 테스트와 디버깅 또한 쉬워진다. 이처럼 비즈니스 로직을 구현하는 데에 POJO를 적극적으로 활용하는 프로그래밍 패러다임을 POJO 프로그래밍이라고 한다.
(2) 제어의 역행(Inversion of Control, IoC)
비즈니스 컴포넌트를 개발할 때, 항상 신경 쓰는 것이 바로 낮은 결합도와 높은 응집도이다. 스프링은 제어의 역행(Inversion of Control, IoC)을 통해 애플리케이션을 구성하는 객체 간의 느슨한 결합을 유지한다.
IoC가 적용되기 전에는 애플리케이션 수행에 필요한 객체의 생성이나 객체와 객체 사이의 의존관계를 개발자가 직접 자바 코드로 처리했었다. 이런 상황에서는 의존관계에 있는 객체를 변경할 때 반드시 자바 코드를 수정해야 한다. 하지만 IoC가 적용되면 객체 생성을 자바 코드로 직접 처리하는 것이 아니라 컨테이너가 대신 처리한다. 그리고 객체와 객체 사이의 의존관계 역시 컨테이너가 처리한다. 결과적으로 소스에 의존관계가 명시되지 않으므로 결합도가 떨어져서 유지보수가 편리해진다.
(3) 관점 지향 프로그래밍(Aspect-Oriented Programming, AOP)
관점 지향 프로그래밍(Aspect-Oriented Programming, AOP)은 소프트웨어 개발에서 모듈화의 한 형태로서, 관점이라 불리는 특정 관심사(Concern)를 모듈화하고 분리하는 프로그래밍 패러다임이다. AOP는 주로 코드의 횡단 관심사(cross-cutting concerns)를 다루는 데 중점을 둔다. 횡단 관심사란 어플리케이션 내에서 여러 모듈이나 컴포넌트에 걸쳐서 반복적으로 나타나는 기능들로, 로깅, 트랜잭션 관리, 보안 등이 있다. 이러한 횡단 관심사들은 여러 모듈에 영향을 주기 때문에 전통적인 객체지향 프로그래밍에서는 코드의 중복이 발생하고 유지보수가 어려워진다.
AOP는 이러한 횡단 관심사들을 분리하여 모듈화하고, 핵심 비즈니스 로직과의 결합도를 낮추는 방식으로 해결한다. AOP에서는 관점(Aspect)이라는 모듈화된 단위를 사용하여 횡단 관심사를 캡슐화하고, 이를 필요한 곳에 적용시킨다.
2. 스프링 부트(Spring Boot)
스프링 부트는 스프링으로 애플리케이션을 만들 때에 필요한 설정을 간편하게 처리해주는 별도의 프레임워크이다. 스프링 부트를 사용하면 기존에 어려운 초기 설정에 쏟아야 했을 시간과 노력을 절약하여 비즈니스 로직을 구현하는데에 집중할 수 있다.
또한 기존에는 배포를 할 때에 별도의 외장 웹 서버를 설치하고, 프로젝트를 War 파일로 빌드하여 배포를 진행했는데, 이러한 방식은 처리 속도가 느리며 번거롭다는 단점이 있다. 반면, 스프링 부트는 자체적인 웹 서버를 내장하고 있어, 빠르고 간편하게 배포를 진행할 수 있고, 스프링 부트를 사용하면 독립적으로 실행 가능한 Jar 파일로 프로젝트를 빌드할 수 있어, 클라우드 서비스 및 도커와 같은 가상화 환경에 빠르게 배포할 수 있다.
- 참고 자료