스프링 부트 살펴보기!

들어가며


  • 해당 포스팅은 토비의 스프링 부트 - 이해와 원리를 학습하며 정리한 글입니다.
  • 토비님의 강의 내용과 제가 이해한 방식대로 작성된 부분이 혼합 되어 작성되어 있습니다.

스프링 부트 소개


  • 스프링스프링 부트, 둘은 절대 같은 것이 아닙니다.

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

  • 기존의 스프링으로 애플리케이션을 개발하는 것은 복잡한 고민이 필요하여, 개발을 빠르게 시작할 수 없었습니다.

    • 스프링을 어떻게 사용할지에 대한 많은 고민을 해야했기 때문입니다.

    • 스프링이 제공하는 많은 선택지, 함께 사용하는 표준 기술 라이브러리 중 어떤것을, 어떻게 사용할 지 결정을 해야 스프링 애플리케이션을 만들수 있었습니다.

  • 스프링 부트를 통해 빠르게 만들 수 있으며, 운영환경에서 꼭 필요한 기술들을 모두 구비하면서 대규모의 기업의 시스템에도 적용할 수 있게 돕습니다.

스프링 부트 핵심 목표


  • 매우 빠르고 광범위한 영역의 스프링 개발 경험 제공합니다.

  • 강한 주장을 가지고 즉시 적용 가능한 기술 조합을 제공하면서, 필요에 따라 원하는 방식으로 손쉽게 변형 가능합니다.

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

  • 코드 생성이나 XML 설정을 필요로 하지 않습니다.

컨테이너리스(Containerless)


Containerless, Serverless

  • 서버에 대한 설치/관리 를 개발자가 신경쓰지 않고 개발-배포-운영하도록 가능하게 하는 Serverless유사합니다.

Servlet Container


  • ServletWeb Component이고, Servlet ContainerWeb Container입니다.

  • Servlet Containerweb client의 요청을 받아들이고, 적절한 응답을 생성해서 돌려줍니다.

  • Servlet Container어떤 Servlet이 작업을 할지 결정해주는 routing / mapping 를 담당합니다.

Spring Container (IOC Container)


  • 스프링컨테이너 = IOC(Inversion of Control) 컨테이너

  • 객체의 생명주기를 관리하고 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것입니다.

  • 스프링 프레임워크의 IOC 컨테이너가 객체를 생성, 관리, 의존성을 관리해줍니다.

  • 인스턴스의 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 합니다.

  • 객체관리의 주체가 컨테이너가 되어 개발자는 개발에 집중할 수 있습니다.

Containerless 웹 애플리케이션 아키텍쳐


전통 방식

  • Spring containerServlet Container의 뒤에 존재하며, Servelt을 통해서 웹에서 들어온 요청Spring Container에게 전달이 됩니다.

  • Spring container도 마찬가지로 Servlet을 통해서 웹으로 들어온 요청을 받아서, 어떠한 기능을 담당하는 **component(bean)**들 중 어떤 bean이 작업을 할지 결정해줍니다.

  • 하나의 bean다른 bean을 호출하기도 합니다.

  • 이처럼 애플리케이션 동작을 위해서는 Spring containerServlet Container 모두 필수적으로 필요합니다.

  • 하지만 Servlet Container를 구성하는 것은 오래된 기술인 만큼 간단하지 않습니다.

    • 서블릿 컨테이너의 설치, WAR 폴더 구조, web.xml, WAR 빌드, 컨테이너로 배치, 포트 설정, 클래스로더, 로깅 등과 같은 번거로운 작업이 필요합니다.

    • 서블릿 컨테이너는 한가지만 있는게 아니다, 이를 구현한 제품을 사용해야 합니다.

    • 널리 알려진 tomcat을 쓸 수도 있고, 다른 제품을 사용할 수도 있습니다.

    • 이를 위해 진입장벽이 높은 학습량을 뚫고 학습을 해야하고, 프로젝트 한번 시작할때만 사용하기 때문에 학습해서 크게 유용하지 않습니다

  • 그래서 Servlet Container 가 필요는 하지만, 이것을 설치-관리하기 위해 개발자가 시간을 들여 지식을 학습하고 적용하는 수고를 없이 하면 좋겠다는 생각에서 Containerless가 적용이 됩니다.

Containerless 개발 방법


  • 스프링 부트를 통해 Containerless가 적용이 된다면 다음과 같이 됩니다.

  • 실제로는 Servlet Container가 작동을 합니다.

  • web.xml 등 모두 알아서 스프링 부트를 통해 제공이 되어 이러한 설정을 신경 안쓰고 서버를 띄우고 동작시킬 수 있습니다.

  • 원하면 Servlet설정을 커스터마이징 할 수 있습니다.

  • 스프링 부트를 이용하면, main 메서드만 호출하면 이 전체가 다 동작합니다.

  • 이를 독립실행형 애플리케이션이라고 부릅니다.

Opinionated


  • 스프링 부트는 Opinionated, 자기의견을 강하게 고집합니다.

  • 유연함을 추구하는 스프링 프레임워크와는 반대됩니다.

  • 스프링 버전, 스프링 생태계의 프레임워크, 표준 자바 기술, 오픈소스 라이브러리의존 관계를 확인하고 버전 호환성을 체크하는 작업은 고되고 성공적으로 잘 해내기 쉽지 않습니다.

  • 스프링 부트는 이러한 고된 작업을 대신 해줍니다.

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


  • 극단적인 유연함을 추구합니다.

  • 다양한 관점을 수용합니다.

  • Not Opinionated

  • 수많은 선택지를 모두 포용합니다.

스프링 부트의 설계 철학


  • Opinionated

  • 정해주는 대로 빠르게 개발하고 고민을 후에 합니다.

  • 스프링을 잘 활용하는 뛰어난 방법을 제공합니다.

사용 기술과 의존 라이브러리 결정


  • 업계에서 검증된 스프링 생태계 프로젝트, 표준 자바 기술, 오픈소스 기술의 종류와 의존관계, 사용버전을 정해줍니다.

  • 각 기술을 스프링에 적용하는 방식(DI 구성)과 디폴트 설정값을 제공합니다.

  • 원한다면 스프링 부트가 제시한 구성을 오버라이드 하거나 재구성하는 것이 가능한데, 이는 안전하고 명료한 방법을 통해서 진행할 수 있습니다.

스프링 부트를 이용한 개발 방법


  • 물론, 스프링 부트가 제공하는 기술 조합과 구성으로 빠르고 간편하게 시스템 개발을 시작할 수 있습니다.

  • 하지만 스프링 부트가 어떻게, 무엇을 제공하는지를 잘 모르면 작은 기술적인 요구 변화에도 당황하게 됩니다.

    • 그래서 애플리케이션 기능 코드만 잘 작성하면 된다고 생각하면 안됩니다.

    • 스프링을 몰라도 개발을 잘 할 수 있다고 생각하면 안됩니다.

    • 스프링 부트가 직접적으로 보여주지 않은 것은 몰라도 된다고 생각하면 안됩니다.

    • 기술적인 필요가 생기면 검색을 통해서 해결만 해서는 안됩니다.

  • 따라서 스프링 부트가 어떻게 무엇을 제공하는지이해해야 합니다.

    • 이해한다는 것은 스프링 부트가 제안하는 스프링 사용 방법을 이해하는 것입니다.

    • 스프링 부트가 스프링의 기술을 어떻게 활용하는지 배우고 응용할 수 있습니다.

    • 스프링 부트가 선택한 기술, 자동으로 만들어주는 구성, 디폴트 설정이 어떤 것인지 확인할 수 있습니다.

    • 필요할 때 부트의 기본 구성을 수정하거나 확장할 수 있습니다.

    • 나만의 스프링 부트 모듈을 만들어 활용할 수 있습니다.