이번에는 Spring과 Spring Boot에 대해 정리하겠습니다.
Spring
Spring이란?
Spring이란 Java 애플리케이션 개발을 도와주는 프레임워크 입니다.
좀 더 자세히 말하면 엔터프라이즈용 Java 애플리케이션 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크 입니다. Spring 정의에 대해 좀 더 알아보겠습니다.
오픈소스
스프링은 모든 사용자에게 무료로 열려 있습니다. 어떤 개인 및 기업도 스프링을 사용하여 애플리케이션을 개발 할 수 있습니다. 스프링은 오픈소스로 누구나 이용 가능하지만 스프링소스(SpringSource)라는 IT기업이 관리하고 있습니다. 스프링 개발에는 한정적인 인원만 참여하고 있어서 오픈소스 프레임워크지만 안정적인 개발과 개선이 보장됩니다.
경량급
경량급이란 스프링을 사용했을 때 개발자가 작성해야 할 코드가 단순하다는 의미입니다. 스프링이 등장하기 전에는 EJB(Enterprise Java Bean)라는 기술이 주로 사용했습니다. EJB는 불필요하고 복잡한 코드를 작성해야 했습니다. 복잡성을 줄이기 위해 고민한 결과 탄생한 것이 스프링입니다. 스프링을 사용함으로 불가피하게 작성해야 했던 복잡한 코드를 제거하여 복잡성을 낮췄습니다.
프레임워크
프레임워크란 어떠한 목적을 쉽게 달성할 수 있도록 관련된 코드의 뼈대를 미리 만들어 둔 것입니다. 애플리케이션 프레임워크는 애플리케이션을 개발하는데 필요한 기술과 코드들의 뼈대를 제공한 것입니다.
Spring 특징
- POJO 프로그래밍을 지향한다.
- 제어의 역전 (IoC, Inversion of Control), 의존성 주입 (DI, Dependency Injection)
- 관점 지향 프로그래밍 (AOP, Aspect-Oriented Programming)
- 일관된 서비스 추상화 (PSA, Portable Service Abstraction)
POJO 프로그래밍 지향
스프링의 가장 큰 특징은 POJO 프로그래밍을 지향한다는 것입니다. POJO(Plain Old Java Object)란 순수 Java만을 통해 생성한 객체를 의미합니다. 순수 Java만을 사용한다는 것은 Java와 Java의 스펙에 정의된 기술만 사용한다는 의미입니다. 어떤 객체가 외부의 라이브러리나 외부의 모듈을 가져와 사용하면 그 객체는 POJO가 아닙니다. POJO는 다른 기술을 사용하지 않은 순수한 Java만을 사용해 만든 객체입니다.
외부 기술에 의존하면 외부 기술이 수정되거나 삭제되면 해당 기술을 사용하고 있는 모든 객체들의 코드를 전부 수정해야 합니다. POJO 프로그래밍을 하면 이런 문제를 방지할 수 있으며 외부 기술이나 규약의 변화에 얽매이지 않아 보다 유연하게 변화와 확장에 대처할 수 있습니다. POJO를 사용해 비즈니스 로직을 구현하면 객체지향 설계를 제한 없이 사용할 수 있으며 코드가 단순해져 테스트와 디버깅이 쉬워집니다.
비즈니스 로직을 구현하는데 POJO를 적극적으로 활용하는 프로그래밍 패러다임을 POJO 프로그래밍이라 합니다. 스프링은 POJO 프로그래밍을 위해 IoC, DI, AOP, PSA 기술을 지원합니다.
IoC, DI (Inversion of Control, Dependency Injection / 제어의 역전, 의존성 주입)
Spring이 애플리케이션의 제어권을 가지고 객체를 생성하여 의존 관계를 맺어주는 것이 IoC, 그 과정에서 의존 관계를 주입하는 것을 DI라 한다.
Java는 객체지향 언어로 객체들 간의 관계를 맺어주는 것이 중요한 요소입니다. A 인스턴스가 B 인스턴스의 메소드를 호출하고 있다면 A는 B와 의존 관계를 맺은 것입니다. 의존 관계를 맺을 때 사용하는게 DI 의존성 주입입니다.
의존성 주입은 클래스에서 객체를 생성하는 것이 아니라 외부에서 생성한 객체를 생성자를 통해 받아오는 것입니다. 여기서 외부란 스프링입니다. 개발자가 설정 클래스 파일에 A가 사용할 객체를 C로 설정하면 애플리케이션이 동작하면서 스프링이 설정 클래스 파일을 해석하고, 개발자가 설정해둔대로 C 객체를 생성하여 A의 생성자 인자로 C를 전달해 줍니다.
이처럼 개발자가 아닌 스프링이 A가 사용할 객체를 생성하여 의존 관계를 맺어주는 것을 IoC(Inversion of Control, 제어의 역전)라 하며 그 과정에서 C를 A의 생성자를 통해 주입하는 것을 DI(Dependency Injection, 의존성 주입)이라 합니다.
AOP(Aspect Oriented Programming, 관심 지향 프로그래밍)
공통 관심 사항을 핵심 관심 사항과 분리하고 모듈화하여 사용하는 것이 AOP이다.
애플리케이션 개발할 때 구현해야 하는 기능들은 공통 관심 사항, 핵심 관심 사항으로 분류할 수 있습니다. 핵심 관심 사항은 애플리케이션의 핵심 기능들로 예를 들면 메뉴 등록, 주문 등이 있습니다.
공통 관심 사항은 핵심 공통 사항에 공통적으로 적용되는 관심 사항입니다. 예를 들면 로깅, 보안 등이 있습니다.
공통 관심 사항이 핵심 관심 사항에 있으면 필연적으로 코드 중복이 발생하고 공통 관심 사항 로직에 변경이 발생하면 모든 중복 코드를 찾아 일일이 수정해야 했습니다.
이 문제를 해결하기 위해 공통 관심 사항을 별도의 객체로 분리하여 객체의 메소드를 통해 공통 관심 사항을 실행시켰습니다. 공통 기능을 비즈니스 로직으로부터 분리한 것을 AOP(Aspect Oriented Programming)라 합니다.
PSA(Portable Service Abstraction, 일관된 서비스 추상화)
특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용할 수 있도록 하는 것이 PSA이다.
스프링은 백엔드 개발에 핵심적인 역할을 수행하며 필연적으로 DB 소통하여 작업을 처리합니다. DB의 종류는 MySQL, Oracle, Maria DB 등 다양합니다. MySQL로 개발을 완료했는데 MariaDB로 변경해야 하는 상황이 발생했습니다. DB가 변경되었으니 코드를 다시 만들어야 할 것 같지만 스프링은 동일한 사용 방법을 유지한 채로 DB를 바꿀 수 있습니다. 그 이유는 스프링이 데이터베이스 서비스를 추상화한 인터페이스를 제공하기 때문입니다. Java를 사용하여 DB에 접근하는 방법을 규정한 인터페이스인 JDBC를 제공하고 있습니다. JDBC를 기반으로 코드를 작성하면 DB가 바뀌어도 구현체만 바뀌고 인터페이스에서 제공하는 메소드는 그대로여서 기존 코드를 변경하지 않고 사용할 수 있습니다.
이러한 JDBC처럼 특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용할 수 있도록 하는 것을 PSA(Poratble Service Abstraction, 일관된 서비스 추상화)라 합니다.
Spring Boot
스프링부트는 스프링 애플리케이션을 만들 때 필요한 설정을 간편하게 처리해주는 프레임워크 입니다. 복잡한 스프링 초기 설정을 자동화하여 개발자가 비즈니스 로직에 집중하게 도와줍니다. 스프링부트를 사용하면 스프링보다 더 빠르고 쉽게 웹 애플리케이션을 개발할 수 있습니다.
Spring Boot 특징
- 의존성 관리 (버전 관리)
- 자동 설정으로 복잡한 설정 자동화
- 내장 서버(tomcat) 보유하여 편리한 실행, 빠른 배포 가능 (독립형 애플리케이션)
의존성 관리 (버전 관리)
의존성에는 기본적으로 버전이 존재합니다. 여러 도구들의 버전을 올바르게 조합하지 않으면 예상치 못한 오류가 발생할 수 있습니다. 스프링부트는 이러한 문제점을 해결하기 위해 의존성의 버전을 관리합니다. maven이나 gradle 같은 빌드 도구에 버전을 명시하지 않아도 적합한 버전을 찾아옵니다.
자동 설정으로 복잡한 설정 자동화
개발을 진행하다보면 JSON 메세지 변환, property 설정 등 다양한 공통적인 설정들이 필요합니다. 스프링부트는 개발을 위한 필요한 공통적인 부분들을 자동으로 구성해줍니다. 그러므로 스프링부트를 만들면 별도의 설정 없이 서버를 띄울 수 있습니다.
스프링부트는 ElasticSearch, Redis, Gson 등 자주 사용되는 외부 라이브러리들 자동 설정을 제공합니다. 해당 의존성을 추가하면 클래스 패스 기준으로 의존성이 존재하는지 파악하여 자동으로 설정해줍니다.
내장 서버(tomcat) 보유하여 편리한 실행, 빠른 배포 가능 (독립형 애플리케이션)
Spring으로 배포를 할 때는 별도의 외장 웹 서버를 설치하고 프로젝트를 War 파일로 빌드하여 배포를 진행했습니다. 이러한 방식은 처리 속도가 느리며 번거롭다는 단점이 있었습니다.
Spring Boot는 자체적인 웹 서버(Tomcat)을 내장하고 있어, 빠르고 간편하게 배포를 할 수 있습니다. 독립적으로 실행 가능한 Jar 파일로 프로젝트를 빌드할 수 있어 클라우드 서비스 및 도커와 같은 가상화 환경에서 빠르게 배포할 수 있습니다.
즉, Spring은 외장 웹 서버를 설치해야 했지만 Spring Boot는 내장 웹 서버(Tomcat)을 보유하고 있어 빠르게 실행 가능하고 배포할 때도 편하게 빌드할 수 있어 빠르게 배포할 수 있습니다.
마무리
이번에는 Spring과 Spring Boot에 대해 정리했습니다.
Spring은 Java 기반 애플리케이션 개발을 도와주는 프레임워크 입니다.
이를 위해 IoC, DI, AOP, PSA 등 다양한 기능을 지원합니다
.
Spring Boot는 Spring을 쉽게 사용하게 해주는 프레임워크 입니다.
자동 설정을 통해 복잡한 설정을 자동화하고 의존성 관리하여 호환되는 버전으로 자동으러 설정해줍니다. 또한 내부 WAS인 톰캣을 보유하여 독립적으로 실행 가능하게 하고 쉽고 빠르게 배포할 수 있게 해줍니다.
이번 글을 여기서 마치겠습니다.
감사합니다.
참고 사이트
https://velog.io/@falling_star3/SpringBoot-스프링과-스프링-부트
https://www.codestates.com/blog/content/스프링-스프링부트
https://yjksw.github.io/spring-pojo/
https://www.ibm.com/kr-ko/topics/java-spring-boot
https://mangkyu.tistory.com/208