스프링 부트

정민교·2024년 5월 28일
0

spring-boot

목록 보기
1/1

📒목표

스프링 부트를 이해하는 시간을 가져보자

📒스프링 부트

스프링 부트는 스프링을 기반으로 실무 환경에 사용 가능한 수준의 독립실행형(standalone) 애플리케이션을 복잡한 고민 없이 빠르게 작성할 수 있게 도와주는 여러가지 도구 모음

스프링을 기반으로 동작하는 애플리케이션을 잘 만들게 도와주는 도구가 스프링 부트다.

🚨스프링 != 스프링 부트

📒스프링 부트의 목표

- 빠르고 광범위한 영역의 스프링 개발 경험 제공:
현재 있는 주요한 기술들을 빠르게 적용 가능.

- 강한 주장을 가지고 즉시 적용 가능한 기술 조합을 제공하면서, 필요에 따라 원하는 방식으로 손쉽게 변형 가능
스프링 부트가 '이런 이런 것들을 사용하고 어떤 방식으로 구성해서 사용하면 돼' 하고 권장 방식이 정해져 있고, 이대로 따라하면 큰 고민없이 빠른 개발이 가능함.
하지만, 원한다면 원하는 방식으로 변경해서 사용할 수 있도록 함.

- 프로젝트에서 필요로 하는 다양한 비기능적인 기술(내장형 서버, 보안, 메트릭, 상태 체크, 외부 설정 방식 등) 제공

- 코드 생성이나 XML 설정을 필요로 하지 않음

📒스프링 부트 역사와 Servlet containerless

ContainerLess 웹 애플리케이션 아키텍처를 스프링이 지원해줬으면 좋겠다는 요청에서부터 스프링 부트 프로젝트가 시작되었음

✔️Containerless

이는 서버리스(서버에 대한 설치와 관리를 개발자가 신경쓰지 않고 서버 애플리케이션을 개발하고 운영하는 구조)와 유사함.

스프링은 IoC 컨테이너다(스프링 프레임워크를 스프링 컨테이너라고도 부름).

웹 서버를 개발하는 것은, 서버에서 동작하는(기능을 제공하는) 여러 가지 웹 컴포넌트(회원가입을 담당하는 컴포넌트 등)를 만드는 것이다.

웹 컴포넌트를 만들어도 혼자서는 일을 할 수 없음. 앞에 웹 클라이언트가 필요함.

클라이언트가 요청을 하면 웹 컴포넌트가 일을 하는 구조.

웹 컴포넌트의 목적은 Dynamic Content를 만들기 위한 목적임. 이 동적인 컨텐츠를 웹 클라이언트에게 응답으로 제공한다.

그런데 웹 컴포넌트는 항상 독립적으로 존재할 수 없고, 웹 컨테이너 안에 들어있어야 함.

📌Web Container

웹 컨테이너는 웹 컴포넌트를 관리한다.

👉웹 컨테이너는 어떤 역할을 할까?

  1. 웹 컴포넌트를 생성하고, 메모리에 올리고, 서비스가 동작하는 동안 웹 컴포넌트가 메모리에 있도록 관리해주는 역할, 즉 웹 컴포넌트의 라이프 사이클을 관리해 주는 것이 웹 컨테이너다. 웹 컨테이너는 여러 웹 컴포넌트들을 관리하고 있다.

  2. 클라이언트의 요청을 어느 컴포넌트가 담당해서 해야하는지 연결해주는 작업을 한다.(어떤 컴포넌트가 요청을 처리할지 결정, 선택하는 작업을 라우팅 혹은 맵핑이라고 한다)

👉자바에서는 웹 컴포넌트를 뭐라고 부르는가?

자바에서는 웹 컴포넌트를 서블릿이라고 부른다. 그리고 이 서블릿을 관리해주는 컨테이너가 서블릿 컨테이너다. 톰캣 같은 게 서블릿 컨테이너다.

서블릿은 자바의 표준 기술이고, 이 표준 기술을 구현한 컨테이너 제품들이 많이 나와있다.

더 나은 방법으로 개발하고 싶어서 나온 것이 스프링이다.

👉스프링 컨테이너

스프링도 컨테이너다. 스프링은 스프링 빈을 관리한다.

스프링 컨테이너는 서블릿 컨테이너 뒤에 존재한다. 스프링 컨테이너는 서블릿을 통해서 들어온 웹 요청을 받아서, 어느 빈이 이 요청을 처리할지 결정한다.

스프링 컨테이너 안에서 우리가 만든 스프링 애플리케이션이 동작한다.

스프링 컨테이너가 서블릿 컨테이너를 대체하지는 못한다. 기본적으로 자바의 표준 웹 기술을 사용하려면 어쨌든 서블릿 컨테이너가 필요하다.

우리는 스프링 애플리케이션만 잘 개발하고 싶은데, 스프링 애플리케이션을 동작하게 하기 위해서는 서블릿 컨테이너가 무조건 필요하다. 그런데 서블릿 컨테이너를 띄우는게 간단하지가 않다.

우선 web.xml을 작성해야 하고, 폴더 구조도 중요하고, 톰캣 같은 서블릿 컨테이너를 우리 서버 환경에 맞게 설치를 하고 실행해서, war 파일로 압축된 서블릿 애플리케이션을 배포하고... 등등 이 외에도 신경쓸게 굉장히 많다.

서블릿 컨테이너라고 불리는 제품이 굉장히 많다. 즉, 서블릿 컨테이너는 표준 스펙이고 이걸 구현한 제품을 사용해야 하는 것인데 대표적으로 알고있는 것이 톰캣이고 이 외에도 다른 제품들도 많다.

📌결론(Conatinerless)

containerless 웹 아키텍처를 만들어줬으면 좋겠다는 이야기는, 서블릿 컨테이너를 거치지 않고 스프링 컨테이너가 바로 웹 요청을 받아서 처리할 수 있도록 해달라는 이야기가 아니다.

서블릿 컨테이너가 필요는 하지만, 이걸 설치하고 관리하기 위해 개발자가 시간을 들여 학습하고 적용하는 것이 없었으면 좋겠다는 말이다.

스프링 부트를 통해 컨테이너리스 웹 아키텍처 구조가 되면, 서블릿 컨테이너를 위한 기본적인 설정(web.xml, war, 배포 등)이 스프링 부트를 통해서 알아서 제공이 된다. 따라서 일단 개발을 시작하여 서버를 띄울 수 있다.

📒스프링 부트와 Opinionated

이렇게 정해져 있어, 이대로 일단 개발해

✔️스프링 프레임워크의 설계 철학

  • 극단적인 유연함 추구:
    다양한 기술을 교체해가며 사용할 수 있지만, 작성한 애플리케이션에 미치는 영향이 최대한 적도록(추상화된 서비스를 통해 다양한 구현체에 일관된 방식으로 접근)
  • 수 많은 선택지를 다 포용(Not opinionated):
    정해져 있지 않고, 원하는 대로 적용

하지만 이러한 이유로 어떤 기술을 어떻게 사용해야 할 지 고민하는 시간이 많이 필요하게 되는 경우가 생김

✔️스프링 부트의 설계 철학

  • opinionated:
    이렇게 정해져 있으니 일단 정해진 대로 빠르게 개발을 시작할 수 있음
  • 유연한 확장:
    스프링부트에 내장된 디폴트 구성을 커스터마이징 하는 자연스럽고 유영한 방법을 제공.
    스프링 부트가 스프링을 사용하는 방식을 이해한다면 언제든지 스프링 부트를 제거하고 원하는 방식으로 재구성 가능.

📌스프링 부트가 결정해주는 것

  • 우리가 만들 애플리케이션에서 사용할 기술, 어떤 라이브러리, 라이브러리의 버전을 정해준다.
  • DI 구성(스프링 빈을 설정하는 방식), 디폴트 설정값 제공

📒스프링 부트를 이용한 개발

스프링 부트가 결정한 기술, 구성, 기본 설정들을 수용하여 빠르게 개발하고, 외부 설정 파일을 이용해서 설정을 변경할 수도 있다.

나아가서

스프링 부트가 스프링의 기술을 어떻게 활용하는지 배울 필요가 있으며,

스프링 부트가 선택한 기술, 자동으로 만들어주는 구성, 디폴트 설정이 어떤 것인지 확인하고, 필요할 때 기본 구성을 수정할 수 있어야 한다.

또한 나아가 나만의 스프링 부트 모듈을 만들어 활용할 수 있어야 한다.

📒참고

토비의 스프링 부트 - 이해와 원리

profile
백엔드 개발자

0개의 댓글