북스터디 : 스프링 부트 핵심가이드 (1)

윤장원·2023년 3월 12일
0

1. 스프링부트란?

스프링 프레임워크

자바 언어를 이용해 엔터프라이즈급 개발을 편리하게 만들어주는 '오픈소스 경량급 애플리케이션 프레임워크'.
자바로 애플리케이션을 개발하는데 필요한 기능을 제공하고 쉽게 사용하도록 돕는 도구.

제어 역전(IOC)

IOC를 적용한 환경에서는 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 스프링 컨테이너 또는 IOC 컨테이너에 위임한다. 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 제어 역전이라고 부르며, 제어 역전을 통해 의존성 주입(DI), 관점 지향 프로그래밍(AOP) 등이 가능해진다.

의존성 주입(DI)

제어 역전의 방법 중 하나로, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식.

스프링에서 의존성을 주입받는 방법

  • 생성자를 통한 의존성 주입
  • 필드 객체 선언을 통한 의존성 주입
  • setter 메서드를 통한 의존성 주입

스프링 공식 문서에서 권장하는 의존성 주입 방법은 생성자를 통해 의존성을 주입하는 방식이다. 다른 방식과는 다르게 생성자를 통해 의존성을 주입받는 방식은 래퍼런스 객체 없이는 객체를 초기화할 수 없게 설계할 수 잇기 때문이다.

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

관점을 기준으로 묶어 개발하는 방식. 관점이란 어떤 기능을 구현할 때 그 기능을 '핵심 기능'과 '부가 기능'으로 구분해 각각을 하나의 관점으로 보는 것을 의미한다. '핵심 기능'은 비즈니스 로직을 구현하는 과정에서 비즈니스 로직이 처리하려는 목적 기능을 말한다.
스프링 AOP의 목적은 OOP와 마찬가지로 모듈화해서 재사용 가능한 구성을 만드는 것이고, 모듈화된 객체를 편하게 적용할 수 잇게 함으로써 개발자가 비즈니스 로직을 구현하는 데만 집중할 수 있게 도와주는 것이다.

스프링 부트

스프링 프레임워크는 기능이 많은 만큼 설정이 복잡한 편이다. 필요한 모듈들을 추가하다 보면 설정이 복잡해지는 문제를 해결하기 위해 등장한 것이 스프링 부트(Spring Boot)이다.

스프링 부트 특징

  1. 의존성 관리
    스프링 부트에서는 'spring-boot-starter'라는 의존성을 제공한다. 각 라이브러리의 기능과 관련해서 자주 사용되고 서로 호환되는 버전의 모듈 조합을 제공한다. 이를 통해 개발자는 라이브러리 호환 문제를 해결할 수 있다.
  2. 자동 설정
    스프링 부트는 스프링 프레임워크의 기능을 사용하기 위한 자동 설정을 지원한다. 애플리케이션에 추가된 라이브러리를 실행하는 데 필요한 환경 설정을 알아서 찾아준다.
  3. 내장 WAS
    스프링 부트의 각 웹 애플리케이션에는 내장 WAS(Web Application Server)가 존재한다. 웹 애플리케이션을 개발할 때 가장 기본이 되는 의존성인 'spring-boot-starter-web'의 경우 톰캣을 내장한다.
  4. 모니터링
    스프링 부트에는 스프링 부트 액추에이터(Spring Boot Actuator)라는 자체 모니터링 도구가 있다.

2. 개발에 앞서 알면 좋은 기초 지식

서버 간 통신

어떤 포털 사이트를 하나의 서비스 단위로 개발한다고 가정하면, 개발에 보수적인 입장을 취할 수밖에 없고, 서비스 자체의 규모도 커지기 때문에 서비스를 구동하는 데 걸리는 시간도 길어진다.
이 같은 문제를 해결하기 위해 나온 것이 마이크로서비스 아키텍처(MSA)이다. 마이크로서비스 아키텍처는 서비스 규모를 작게 나누어 구성한 아키텍처를 뜻한다. 서비스 기능별로 구분해서 독립적인 애플리케이션을 개발하게 되면 각 서비스 간에 통신해야 하는 경우가 발생한다.
서버 간 통신은 한 서버가 다른 서버에 통신을 요청하는 것을 의미하며, 한 대는 서버, 다른 한 대는 클라이언트가 되는 구조이다. 몇 가지 프로토콜에 의해 다양한 통신 방식을 적용할 수 있지만 가장 많이 사용되는 방식은 HTTP/HTTPS 방식이다.

스프링 부트의 동작 방식

서블릿은 클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술이다. 일반적으로 서블릿은 서블릿 컨테이너에서 관리한다. 서블릿 컨테이너는 서블릿 인스턴스를 생성하고 관리하는 역할을 수행하는 주체로서 톰캣은 WAS의 역할과 서블릿 컨테이너의 역할을 수행하는 대표적인 컨테이너이다. 서블릿 컨테이너의 특징은 다음과 같다.

  • 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
  • 서블릿 객체는 싱글톤 패턴으로 관리된다.
  • 멀티 스레딩을 지원한다.

스프링에서는 DispatcherServlet이 서블릿의 역할을 수행한다. 일반적으로 스프링은 톰캣을 임베드해 사용한다.
(1) DispatcherServlet으로 요청(HttpServletRequest)이 들어오면 DispatcherServlet은 핸들러 매핑을 통해 요청 URI에 매핑된 핸들러를 탐색한다. 여기서 핸들러는 컨트롤러(Controller)를 의미한다.
(2) 그리고 핸들러 어댑터로 컨트롤러를 호출한다.
(3) 핸들러 어댑터에 컨트롤러의 응답이 돌아오면 ModelAndView로 응답을 가공해 반환한다.
(4) 뷰 형식으로 리턴하는 컨트롤러를 사용할 때는 뷰 리졸버를 통해 뷰를 받아 리턴한다.

핸들러 매핑은 요청 정보를 기준으로 어떤 컨트롤러를 사용할지 선정하는 인터페이스이다.

뷰 리졸버는 뷰의 렌더링 역할을 담당하는 뷰 객체를 반환한다.

<뷰를 사용하는 DispatcherServlet의 동작 방식>

<@RestController를 사용하는 DispatcherServlet의 동작 방식>

레이어드 아키텍처

애플리케이션의 컴포넌트를 유사 관심사를 기준으로 레이어로 묶어 수평적으로 구성한 구조를 의미한다. 일반적으로 레이어드 아키텍처라 하면 3계층 또는 4계층 구성을 의미한다. 이 차이는 인프라 레어의 추가 여부로 결정된다. 각 계층은 다음과 같이 구분된다.

1. 프레젠테이션 계층

  • 애플리케이션의 최상단 계층으로, 클라이언트의 요청을 해석하고 응답하는 역할.
  • UI나 API 제공
  • 비즈니스 계층으로 요청을 위임하고 받은 결과를 응답하는 역할만 수행.

2. 비즈니스 계층

  • 애플리케이션이 제공하는 기능을 정의하고 세부 작업을 수행하는 도메인 객체를 통해 업무를 위임하는 역할을 수행.
  • DDD(Domain-Driven Design) 기반의 아키텍처에서는 비즈니스 로직에 도메인이 포함되기도 하고, 별도로 도메인 계층을 두기도 한다.

3. 데이터 접근 계층

  • 데이터베이스에 접근하는 일련의 작업을 수행.

<스프링의 레이어드 아키텍처>

Rest API

Rest API는 대중적으로 가장 많이 사용되는 애플리케이션 인터페이스이다. 이 인터페이스를 통해 클라이언트는 서버에 접근하고 자원을 조작할 수 있다.

  1. REST란?
    'Representational State Transfer'의 약자로, 월드 와이드 웹(WWW)과 같은 분산 하이퍼미디어 시스템 아키텍처의 한 형식이다. 주고받는 자원에 이름을 규정하고 URI에 명시해 HTTP 메서드(GET, POST, PUT, DELETE)를 통해 해당 자원의 상태를 주고받는 것을 의미한다.

  2. REST API란?
    API는 'Application Programming Interface'의 약자로, 애플리케이션에서 제공하는 인터페이스를 의미한다. REST API는 REST 아키텍처를 따르는 시스템/애플리케이션 인터페이스라고 볼 수 있다. REST 아키텍처를 구현하는 웹 서비스를 'Restful하다'라고 표현한다.

  3. REST의 특징

  • 유니폼 인터페이스
  • 무상태성
  • 캐시 가능성
  • 레이어 시스템
  • 클라이언트-서버 아키텍처
  1. REST의 URI 설계 규칙
  • URI의 마지막에는 '/'를 포함하지 않는다.
  • 언더바(_)는 사용하지 않는다. 대신 하이픈(-)을 이용한다.
  • URL에는 행위(동사)가 아닌 결과(명사)를 포함한다.
  • URI는 소문자로 작성해야 한다.
  • 파일의 확장자는 URI에 포함하지 않는다.

0개의 댓글