📢 들어가면서
짧은 기간이지만 여러 프레임워크들을 사용하면서 개발을 해본 경험이 있다. 이 중에서 Spring과 Spring Boot 관련해서는 항상 헷갈리고 무엇을 사용하고 있는 것인지 뭐가 다른 것인지 다른 건 맞는지 등등 여러 질문들을 하게 되었다. 따라서 이번에 제대로 공부를 해보고자 한다.
☘️ Spring이란?
백엔드 개발을 하고 Java를 사용한다고 하면 아마 한번쯤은 무조건 들어봤을 것이다. 이 Spring이 무엇인지에 대해서 알아보자.
📌 계기는?
Spring은 들어봤지만 왜 Spring이라고 지었을지 궁금한 적이 있을 것이다(?)
사실 없어도 상관없다. 난 적을거니까.
Java로 개발을 하던 초기에 EJB(Enterprise Java Beans)라는 기술을 사용했다. 하지만 이 기술은 가격이 비싸고 복잡하고 어렵고 느리다는 단점이 있었다. 이 때문에 EJB로 개발하는 것은 지옥이다! 라는 말이 나올 정도였다고 한다.
그래서 EJB를 써야한다면 차라리 POJO(Plain Old Java Object) 순수한 옛날 자바로 돌아가자는 말이 나왔는데, 이 EJB에 지친 개발자들이 오픈소스 프로젝트로 Spring이라는 기술을 개발하게 되었고, Spring은 EJB의 단점인 복잡하고 어렵고 느리고 비싸다는 단점을 개선하고 많은 편의시설을 제공하게 되었다.
그래서 Spring이라는 이름은 “EJB라는 겨울을 넘어서 새로운 시작, 봄(Spring)이 왔다” 라는 뜻을 가지고 있다고 한다.
📌 정의는?
엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있는 오픈소스 경량급 애플리케이션 프레임워크
개인적으로 Spring을 무엇인지 아주 잘 나타낸 정의라고 생각한다.
엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있는
⇒ 개발 초기에 기본적인 설정과 적용시킬 기술들만 선택해준다면 기술 보다는 애플리케이션 로직 자체에 더 집중하여 비즈니스 로직을 구현할 수 있다!
오픈소스
⇒ 어떤 개인 및 기업도 Spring을 사용하여 웹 애플리케이션을 개발할 수 있으며, 필요하면 Spring의 코드를 일부 수정하여 사용하여도 무관하다! 또한 스프링은 안정적인 개발과 개선을 보장한다! 때문에 스프링의 소스코드를 수정하거나 개선하는 일에는 한정적인 인원만 참여가 가능하다.
경량급
⇒ 기존의 기술들과 비교하여 개발자가 작성해야할 코드가 상대적으로 단순하다!
애플리케이션 프레임워크
⇒ 애플리케이션을 개발하는 데에 있어서 필요한 모든 업무 분야 및 모든 기술과 관련된 코드들의 뼈대를 제공한다!
📌 특징은?
Spring이 무엇인지 알았으니 이젠 어떠한 특징이 있는지 알아볼 차례이다.
사실 Spring은 자바 객체와 라이브러리들을 관리해주며 Tomcat과 같은 WAS가 내장되어 있다, 경량 컨테이너로 자바 객체를 직접 Spring 안에서 관리한다 등의 특징들이 있지만 우리는 가장 큰 특징들에 대해서 살펴보고자 한다.
1. 제어의 역전(IoC, Inversion of Control) / 의존성 주입(DI, Dependency Injection)
이전에 내가 작성했던 글을 잠깐 빌려와보겠다.
제어의 흐름을 컨트롤하는 권한을 내가 아닌 Framework에게 위임하고 그 권한을 받은 Framework는 Application 코드에 대한 지원과 지침을 제공하며 흐름을 결정하게 된다.
위의 말처럼 일반적으로 우리는 객체를 직접 생성하여 메소드를 호출하게 되는데 이것은 사용자가 직접 제어하는 구조이다. 하지만 IoC가 적용이 된 경우 인스턴스의 생성부터 소멸까지 개발자가 아닌 권한을 받은 누군가가 대신 해주게 된다.
@Controller
@RequestMapping("/main/user")
public class UserController {
UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
// 로직 구현
}
위는 간단한 Spring Project의 예시이다. 이렇게 코드를 작성하면 아래에서는 userService라는 객체의 메서드를 호출해서 사용할 수 있다. 우리가 userService라는 객체를 생성해주지 않아도 된다..!
이렇게 개발자가 아닌 Spring이 의존 관계를 맺어주는 것을 IoC라고 하며 그 과정에서 생성자를 통해 주입해주는 것을 DI라고 한다.
2. AOP(Aspect Oriented Programming, 관심 지향 프로그래밍)
관심 지향 프로그래밍에 대해서 알기 위해서는 공통 관심사항과 핵심 관심사항이라는 것에 대해서 먼저 알아야한다.
애플리케이션을 개발할 때 구현해야하는 기능을 분류해놓은 것인데,
핵심 관심사항이란 애플리케이션에 핵심 기능과 관련된 관심사항이다.
공통 관심사항이란 모든 핵심 관심사항에 공통적으로 적용되는 관심사항들을 의미한다.
분류해놓은 것은 알겠는데 그래서 어쩌라고? 라고 생각할 수 있다.
class Reservation {
public void 예약하기() {
// 공통 관심사항
보안 관련 코드
// 핵심 관심사항
예약 관련 코드
}
public void 취소하기() {
// 공통 관심사항
보안 관련 코드
// 핵심 관심사항
취소 관련 코드
}
public void 조회하기() {
// 공통 관심사항
보안 관련 코드
// 핵심 관심사항
조회 관련 코드
}
}
공통 관심사항은 모든 핵심 관심사항에 공통적으로 적용이 되는 관심사항이라고 했다.
그렇다면 만약 위의 코드처럼 구성이 되어있다면? 공통 관심사항 관련 코드는 중복되는 코드가 생길 수 있다.
이 중복되는 코드의 문제는 만일 공통 관심사항의 로직이 변경이 된다면 모든 중복되는 코드를 찾아서 수정을 해줘야한다는 점이다. 하나라도 수정이 되지 않는다면 이상한 동작이 되거나 프로젝트 오류로 이어지게 된다.
따라서 이 코드 중복이라는 문제를 해결하기 위해 공통 관심사항 관련과 핵심 관심사항 관련 기능들을 별도의 객체로 분리한 다음 사용을 해야하는데 이 공통 기능을 비즈니스 로직으로부터 분리해낸 것을 AOP라고 한다.
3. PSA(Portable Service Abstraction, 일관된 서비스 추상화)
이것의 대표적인 예를 들어서 설명을 해보자면 데이터베이스가 있다. 만일 우리가 개발을 MySQL로 진행을 하다가 MariaDB로 바꿔야하는 상황이 생긴다고 했을 때 이 두 데이터베이스 간의 사용방법을 확인하고 다른 부분을 찾아서 일일이 수정을 해줘야 할 것이다.
그러나 Spring은 JDBC(Java DataBase Connectivity) 라는 인터페이스를 사용하여 데이터베이스에 접근을 하는데 이것의 가장 큰 장점은 동일한 사용방법을 유지한 채로 데이터베이스를 바꿀 수 있다는 것이다.
이처럼 특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용될 수 있도록 한 것을 PSA라고 한다!
4. POJO(Plain Old Java Object)
스프링의 가장 큰 특징이라고 볼 수 있는 POJO이다. Spring이 생겨난 계기에 대해서 설명을 할때도 잠깐 나왔지만 POJO란 순수 Java만을 통해서 생성한 객체를 의미한다.
즉, 다른 기술을 사용하지 않고 순수하게 Java만을 사용하여 만든 객체를 뜻하는것이다.
순수 Java만을 사용하여 만든 객체가 중요한 이유는 무엇일까?
만약 외부 기술을 사용하게 되었다가외부 기술이 사라지거나 개선되어 나온다면 그래서 코드의 적용 방식이 달라진다면 모든 객체들의 코드를 바꿔주어야 한다.
하지만 Java만을 사용하여 만든 객체는 외부 기술이나 규약의 변화에 얽매이지 않고 유연하게 변화와 확장에 대처할 수 있다.
또한 객체지향 설계를 제한없이 적용할 수 있고 코드가 단순해져 테스트와 디버깅 또한 쉬워진다.
이렇게 POJO가 좋다는 것은 알았는데 이게 그렇게 큰 특징인가? 라고 생각할 수 있다. 이게 가장 큰 특징인 이유는 IoC/DI, AOP, PSA는 모두 POJO 프로그래밍을 위해 Spring이 지원하는 기술이기 때문이다. 즉, 앞에서 나온 특징들은 사실 POJO를 지향하기 위한 기술이었던 것이다..!
🍀 Spring Boot란?
자 이렇게 열심히 Spring에 관해 알아봤다. 이번엔 Spring Boot에 대해서 알아볼 시간이다!
📌 계기는?
마찬가지로 나오게 된 계기에 대해서 먼저 알아보도록 하겠다. Spring은 “EJB라는 겨울을 넘어서 새로운 시작, 봄(Spring)이 왔다” 라는 의미를 가진 만큼 많은 편리함을 가져왔다. 하지만 이 Spring에도 약간의 단점이 있다면 Spring을 사용하기 위해서는 여러 가지의 사항들을 설정을 해주어야 한다는 것이다..
이 설정에 대한 내용을 줄이기 위해서 Spring Boot가 나왔다!
📌 정의는?
Spring으로 애플리케이션을 만들 때 필요한 설정을 간편하게 처리해주는 도구
이 정의를 읽어보면 알겠지만 Spring과 Spring Boot는 다른 것이다. Spring은 매우 많은 기능들을 제공하지만 설정을 해주어야하는데, 이 설정을 간편하게 처리할 수 있는 Spring Boot가 또 있는 것이다.
결국 Spring Boot는 Spring에서 제공하는 여러 기능들을 자동으로 설정하여 개발자가 보다 쉽게 사용할 수 있도록 해준다.
📌 장점은?
Spring Boot를 대신 사용한다고 했는데 그렇다면 Spring Boot의 장점에는 무엇이 있을까?
- 초기 설정이 쉬움
: 아마 Spring Boot를 쓰는 가장 큰 이유가 아닐까 싶다. Spring은 처음 개발을 진행하기에 개발자들이 많은 곤혹을 겪었다. 또한 Spring의 버전 업이 생기면 설정한 기능이 변경이 되거나 없어지기도 했다. 하지만 Spring Boot는 복잡한 설정을 자동화, 단순화하여 쉽게 프로젝트를 시작할 수 있도록 한다! - 별도의 웹 서버 설치가 필요 X
:Spring Boot는 Tomcat이라는 WAS(Web Application Server)를 내장하고 있어 main() 메소드를 실행하는 것만으로도 서버를 구동시킬 수 있다. 또한 별도의 설정 없이 build.gradle 아래의 의존성을 추가해주면 된다!org.springframework.boot:spring-boot-starter-web
- 독립적으로 실행이 가능
: 웹 애플리케이션을 배포하기 위해서는 war 파일로 패키징을 하여 배포를 해야한다. 하지만 Spring Boot는 내장 Tomcat을 지원하기 때문에 웹 애플리케이션을 jar 파일로 패키징을 하여 웹 어플리케이션을 실행시킬 수 있다!
WAR(Web Application Archive)는 Web Application 압축 파일 포맷으로 실행을 위해서는 별도의 웹 서버 또는 웹 컨테이너가 필요하다. - 라이브러리 관리가 쉬움
: Spring Boot는 의존성 관리 기능을 제공한다. 따라서 프로젝트에서 사용하는 Library의 버전을 쉽게 관리하고 호환성 문제를 최소화 할 수 있다!
💡 JAR와 WAR
JAR(Java Archive)는 Java Application이 동작할 수 있도록 Java 프로젝트를 압축한 파일로 JRE(Java Runtime Environment)만 있어도 실행이 가능하다.
🌲 그래서 뭐 쓰라고?
둘의 차이를 설명하려고 하였으나 그것보다 더 궁금한 건 뭘 써야하는지 일 것 같아서 가볍게 얘기를 하려고 한다.
Spring은 좋은 Framework이다. 다만 초기 설정이 복잡하기 때문에 처음 개발에 도전을 하는 사람들은 설정만 하다가 개발을 포기하게 될지도 모른다. 때문에 현재 많은 개발자들도 Spring Boot를 사용하여 개발을 진행하고 있다..!
따라서 Spring은 Framework를 세밀하게 제어를 하려고 할 때, Spring Boot는 빠르고 간단하게 개발을 진행하려고 할 때 사용을 한다!
🪄 정리하자면
Spring은 POJO를 지향하며 IoC/DI, AOP, PSA 와 같은 특징들이 있다!
다만 Spring은 초기 설정이 복잡하기 때문에 많은 어려움을 겪었다!
따라서 Spring Boot가 나왔고, Spring Boot를 사용하여 빠르게 프로젝트를 시작할 수 있다!
'Web > Spring & Spring Boot' 카테고리의 다른 글
🍃 WAR & JAR란? (1) | 2025.04.27 |
---|---|
🍃 JSP란? (1) | 2025.04.23 |
🍃 Servlet이란? (1) | 2025.04.22 |
🍃 Maven & Gradle이란? (1) | 2025.04.21 |