본문 바로가기
  • A space that records me :)
Framework & Library/Spring & String boot

Spring과 Spring Boot란?

by yjkim_97 2024. 3. 10.

Java 개발자가 함께 공부해야 하는 프레임워크는 Spring과 Spring Boot이다.

같은 것 같으면서도 서로 다른 두 프레임워크에 대해서 알아본다.

 

결론부터 적어보자면 Spring은 엔터프라이즈 애플리케이션을 위한 개발 환경(틀)을 제공해 주는 것이고

Spring Boot는 Spring의 단점을 보안해 개발자가 비즈니스 로직 개발에만 집중할 수 있게 해주는 거다.

여기서 알 수 있는 것은 Spring Boot에는 Spring이 포함되어 있다는 것이다.

 


1. Spring의 등장

소프트웨어 분야가 발전하면서 엔트라이즈 애플리케이션은 점점 복잡해졌고
개발자들은 점점 사용자의 요청을 동시에 처리해야 하는 등의 서비스 안정성, 보안, 성능 등을 고려하게 되었다.

점차 기능 개발에만 집중하기 힘들어졌고 이때 2003년에 스프링 프레임워크가 나왔다.

 

스프링 프레임워크는 서버 성능, 안정성, 보안을 매우 높은 수준으로 제공하는 도구로 스프링 덕분에 개발자들은 기능 개발에 좀 더 집중할 수 있게 되었다.

❓엔터프라이즈 애플리케이션
 ▶️ 대규모의 복잡한 데이터를 관리하는 애플리케이션

Spring의 특징

1) Framework

  • 개발자에게 개발 틀을 제공해 준다.
  • 개발자는 제공된 틀 안에서만 개발할 수 있다.

2) 오픈 소스

  • 소스코드가 공개되어 있어 spring이 어떻게 동작하는지 내부 코드를 볼 수 있다.

3) ⭐️ (제어의 역전) IoC Container가 존재

IoC (Inversion of control) : 제어의 역전
  • 제어의 주도권이 Spring에게 있다.
  • 스프링 컨테이너가 객체를 관리, 제공하는 역할을 한다.
  • Bean이 생성되고 소멸되기까지의 생명주기를 관리한다.
    개발자가 객체를 생성(new)하면 스프링이 스캔해 heep 메모리에 올리고 객체주소를 관리한다.

2024.03.10 - [Framework & Library/Spring & String boot] - [Spring] 제어의 역전 - IoC(Inversion of Control)

 

[Spring] 제어의 역전 - IoC(Inversion of Control)

IoC란? IoC : Inversion of Control (제어의 역전) IoC는 의존성 주입 (DI)로 알려져있다. Spring은 Bean을 생성하고 의존성을 관리하고, 개발자 대신 메모리에서 관리한다. 개발자가 개발에만 몰두 할 수 있도

yjkim97.tistory.com

 

4) ⭐️ (의존성 주입) DI를 지원

DI (Dependency injection) : 의존성 주입
  • DI(의존성 주입)이란 개발자가 Spring이 관리하는 Bean을 사용하는 행위를 뜻한다.
  • Spring에서 관리하는 객체를 Bean이라고 하며, 개발자가 사용하려는 Bean은 사용되는 위치와 시점에 관계없이 모두 같은 객체이다.
💡 IoC & DI와 싱글톤의 관계
1️⃣ Spring은 개발자가 생성한 객체를 직접 메모리에 관리하고, 이를 IoC라고 한다.
2️⃣ 이 객체를 개발자는 어느 곳에서나 가져와서 사용한다. 이를 DI라고 한다.
3️⃣ DI를 통해 개발자가 객체를 가져다가 쓸 때 항상 새로운 객체가 아닌 동일한 객체를 사용하게 되는데 이 이유는 싱글톤으로 관리되기 때문이다.

 

5) Filter

  • Filter는 Request를 검열한다. ▶️ 권한을 가진 Request를 필터링한다.
  • 검열하는 구간은 크게 2군데 Tomcat 입구와 Spring 컨테이너 입구가 있다.
    이때 Tomcat의 필터는 말 그대로Filter, Spring 컨테이너의 필터는 Intercepter라고 한다.

6) Annotation

  • 컴파일 시 컴파일러가 읽고 사용하는 주석 ▶️ 컴파일 체킹
  • Spring에서는 주로 Annotation을 통해 객체를 생성한다.
    미리 약속된 Annotation이 붙은 Class는 컴파일시 스캔 및 로딩된다.
    @Component @Bean @Controller @Service @Autowired 등...
  • Spring의 IoC, DI는 Annotation 기법을 사용한다.
💡 IoC & DI & Annotation
Spring은 IoC와 DI를 Annotation 기법을 사용해 제공한다.

1️⃣ Spring이 @Component @Controller 등  특정 Annotation이 붙은 Class를 스캔해 메모리에 객체를 생성하고 이것을 IoC라고 한다.
2️⃣ Spring이 특정 Class를 리플렉션(클래스 스캔 시 내부 분석 -메서드, 매개변수, 어노테이션 등을 체크 및 추가 설정 수행-) 한 후 @Autowired가 존재하면 IoC 컨테이너에 해당 타입의 객체를 주입한다. 이것을 DI라고 한다.

 

7) Message Converter가 존재

 

영어, 한국어, 일본어 등 다양한 언어가 있듯이 인터넷상에서도 주고받는 언어(메시지 타입)가 다양하다.
예를 들면 Java 프로그램과 Python 프로그램이 통신 시 Java의 객체와 Python의 객체는 서로 다르다.
이를 해결하기 위해 중간언어(현재는 Json이 많이 사용됨)를 두고 메시지 통신시 java Object -> Json -> python Object로 변환하는 과정을 거친다.

 

  • Spring은 기본 Message Converter 라이브러리가 존재하고 이는 Jackson이다. (Jackson : json데이터로 변환)
  • 기본 Jackson이 존재하므로 개발자는 요청, 응답 시 메시지 변환을 신경 쓸 필요가 없다.

 

8) BufferdReader/Writer를 쉽게 사용

 

Spring은 Byte Stream 통신 시 BuffredReader/Writer를 사용하는데, 개발자는 이를 @RequestBody@ResponseBody Annotation을 통해 쉽게 사용할 수 있다.

  • @RequestBody : BufferdReader가 동작
  • @ResponseBody : BufferdWriter가 동작
✚ 통신 단위 변천사

기본 UTF-8(3byte) 통신
1️⃣ 통신은 기본적으로 전기선(전류)으로 bit 단위(0,1)이다.
2️⃣ 영어권에서 통신이 발전하면서 전류단위는 사람이 이해하기 힘드니 영어 1 문자 단위로 통신할 수 있는 8bit(1byte) 단위가 개발되었다.
      ▶️ 이후 1byte가 통신 단위로 정해짐
3️⃣ 그러나 8bit로는 전 세계 언어 통신이 불가능하다.
      ▶️ 이 문제를 해결하기 위해, 유니코드에서 UTF-8(3byte) 통신을 제공하기 시작했다.

BufferReader/Writer의 등장

1️⃣ Byte Stream(1byte)를 전송하면 자바 프로그램에서는 InputStream으로 읽는다.
      ▶️ 1byte 단위로 읽은 후 char로 캐스팅하는데 복잡하다..
2️⃣ 1번을 해결하기 위해 InputStreamReader가 나왔다.
      ▶️ 문자를 배열로 받아서 읽는다. 이때 문제는 배열은 size가 정해져 있어야 하니.. 메모리 낭비가 심했다.
3️⃣ 2번을 해결하기 위해 BufferdReader가 나왔다.
      ▶️ 가변길이 문자열을 받아서 읽는다.

💡 개발 시 문자열 읽고 쓸 때는 BufferdReader/Writer를 사용하자!!

 

 

9) ⭐️ 관점 지향 프로그래밍 (AOP)

 

관점 지향 프로그래밍은 AOP(Aspect Oriented Programming)로 프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화 하는 것을 의미한다.

  • 핵심 관점 코드에만 집중할 수 있게 해 줌
  • 프로그램의 변경과 확장에도 유연하게 대응할 수 있다.

 

10) 이식 가능한 서비스 추상화 (PSA)

 

이식 가능한 서비스 추상화는 PSA(Portable Service Abstraction)로 스프링은 다양한 기술들을 추상화해 인터페이스로 제공하고 개발자는 이를 쉽세 사용할 수 있게 해 준다.

 

아래는 대표적인 예이다.

  • 데이터베이스 접근 인터페이스 제공 : JPA, MyBatis, JDBC...
  • WAS 인터페이스 제공 : Tomcat, Undertow, Netty...

 

스프링은 위 내용처럼 장점이 많지만 설정이 매우 복잡하다는 단점이 있다.


이로 인해 스프링 개발팀에서도 이런 단점을 인식하고 보안하고자 출시한 것이 Spring Boot이다.

 

2013년에 첫 공개되었으며 스프링 부트는 스트링 프레임워크를 더 쉽고 빠르게 이용할 수 있도록 만들어주는 도구로서
개발자가 조금 더 비즈니스 로직 개발에만 집중할 수 있도록 만들어준다.

 

2. Spring Boot의 등장

Spring Boot는 Spring에 속한 도구이다.

Spring Boot 특징

1) WAS 내장

  • WAS (Web application server) : 톰켓, 제티, 언더토우 등
  • WAS가 내장되어 있어 따로 설치를 하지 않아도 독립적으로 실행할 수 있다.

2) spring boot starter를 제공

  • 빌드 구성을 단순화하는 spring boot starter를 제공한다.

3) xml 설정을 JAVA 코드로 모두 대체 가능

  • xml 설정을 하지 않고 자바 코드로 모두 작성 가능하다.

4) Jar 배포 가능

  • Jar를 이용해서 자바 옵션만으로도 배포가 가능하다.

5) spring actuator를 제공

  • 애플리케이션의 모니터링 및 관리 도구인 spring actuator를 제공한다.

 

3. Spring 🆚 Spring Boot

차이점 Spring Spring Boot
목적 Application 개발을 더 쉽게 하기 위함 Spring 개발을 더 빠르고 쉽게 하기 위함
설정 파일 개발자가 수동으로 구성 자동 구성 (Spring의 Core와 MVC 모든 기능을 자동으로 load)
XML 일부 파일은 XML로 직접 생성하고 관리함 사용하지 않음 (JAVA 코드로 모든 설정 가능)
인메모리 DB 지원하지 않음 자동 설정 지원
WAS 내장 없음 (톰켓 등 WAS 서버를 별도로 수동 설정 해야함) 내장되어 있음 (자체적으로 가지고 있음)

 


Reference

[인프런] 스프링부트 개념정리(이론) - 최주호

📖 스프링 부트 3 백엔드 개발자 되기_자바 편