본문 바로가기
독서

[독서 - 스프링 부트 핵심 가이드] 02. 개발에 앞서 알면 좋은 기초 지식

by jenlve 2024. 1. 28.

🌱 서버 간 통신

한 서버가 다른 서버에 통신을 요청하는 것  

➡️ 독립적인 애플리케이션 개발 시, 각 서비스 간에 통신해야 하는 경우를 생각해 볼 수 있다.

 

 

효율적인 유지보수와 경량화된 서비스를 사용하기 위해서는 서비스의 규모를 작게 나눠 가져갈 필요가 있다.

 

MSA (Microservice Architecture)

➡️ 위의 문제를 해결할 해결책

      ▪ 서비스의 규모를 작게 나누어 구성한 아키텍처

 


 

🌱 스프링 부트의 동작 방식

<앞서 알아둘 용어>

서블릿(Servlet) 

      ▪ 클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술이다. 

      ▪ 서블릿 컨테이너(Servlet Container)에서 관리한다. 

 

서블릿 컨테이너(Servlet Container) 

        대표적인 컨테이너로 톰켓이 있다.

 

        특징 

             서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.

             서블릿 객체는 싱글톤 패턴으로 관리된다.

             멀티 스레딩을 지원한다.

 

 

  스프링에서는 DispatcherServlet이 서블릿의 역할을 수행하고,

   톰켓이 WAS와 서블릿 컨테이너의 역할을 수행한다. 

 


스프링 부트 동작  구조 - (서블릿 : DispatcherServlet)

스프링 부트의 동작 구조

 

      1.  DispatcherServlet 으로 요청(HttpServletRequest)이 들어오면

           DispatcherServlet은 핸들러 매핑(Handler Mapping)을 통해

           요청 URL에 매핑된 핸들러(Controller)를 탐색한다.

 

      2 핸들러 어댑터(HandlerAdapter)로 앞서 탐색한 핸들러(Controller) 를 호출한다. 

 

      3 핸들러 어댑터에 핸들러(Controller) 의 응답이 돌아오면 ModelAndView로 응답을 가공해 반환한다.

 

      4 뷰 형식으로 리턴할 경우, 뷰 리졸버(View Resolver)를 통해 뷰(View)를 받아 리턴한다. 

 


 

<뷰가 없는 REST 형식의 @ResponseBody를 사용할 경우>

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

 

        MessageConverter를 통해 JSON 형식으로 변환해서 응답하는 구조이다.

              여기서 MessageConverter 는 요청과 응답에 대해, Body값을 변환하는 역할을 수행하는데,

         스프링 부트의 자동 설정 내역을 보면 HttpMessage Converter 인터페이스를 사용하고 있다. 

 


 

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

         핸들러 매핑은 여러 구현체를 가질 수 있다.

 

             대표적인 구현체

                   BeanNameUrlHandlerMapping

                        빈 이름을 URL로 사용하는 매핑 전략

                         빈을 정의할 때 슬래시('/')가 들어가면 매핑 대상이 된다. 

                         예) @Bean("/hello")

 

                   ControllerClassNameHandlerMapping

                         URL과 일치하는 클래스 이름을 갖는 빈을 컨트롤러로 사용

                         이름 중 Controller를 제외하고 앞부분에 작성된 suffix를 소문자로 매핑한다.

 

                   SimpleUrlHandlerMapping

                         URL 패턴에 매핑된 컨트롤러를 사용하는 전략

 

                   DefaultAnnotationHandlerMapping

                         어노테이션으로 URL과 컨트롤러를 매핑하는 전략

 


 

🌱 레이어드 아키텍처

애플리케이션의 컴포넌트를  유사 관심사를 기준으로 레이어로 묶어, 수평적으로 구성한 구조

레이어드 아키텍처 기반 설계의 특징

      ▪ 각 레이어는 가장 가까운 하위 레이어의 의존성을 주입받는다.

      ▪ 각 레이어는 관심사에 따라 묶여 있으며, 다른 레이어의 역할을 침범하지 않는다.

            ▪ 위 역할의 이점 : 가독성, 기능 구현 유리, 확장성 및 단위 테스트에 용이

 

스프링 레이어드 아키텍처

 

 프레젠테이션 계층

      ▪ 애플리케이션의 최상단 계층으로, 클라이언트의 요청을 해석하고 응답하는 역할

      ▪ UI나 API를 제공한다.

      ▪ 별도의 비즈니스 로직을 포함하고 있지 않으므로, 비즈니스 계층으로 요청을 위임하고

         받은 결과를 응답하는 역할만 수행한다. 

 

 비즈니스 계층 (Service 계층)

      ▪ 핵심 비즈니스 로직 기능을 구현하고, 세부 작업을 수행하는 도메인 객체를 통해

        업무를 위임하는 역할을 수행한다.

      ▪ 트랜잭션 처리나 유효성 검사 등의 작업을 수행한다.

      ▪ 주로 도메인 계층에서 담당하는 것이 일반적이다.

 

 데이터 접근 계층 (Persistence 계층)

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

      ▪ DAO 역할로 쓰인다.

 


 

🌱 디자인 패턴

 소프트웨어를 설계할 때 자주 발생하는 문제들을 해결하기 위해 고안된 해결책

  GoF 디자인 패턴

      ▪ 생성 패턴 - 객체 생성에 사용, 객체를 수정해도 호출부에 영향 받지 않게 한다.

      ▪ 구조 패턴 - 객체를 조합해서 더 큰 구조를 만드는 패턴이다.

      ▪ 행위 패턴 - 객체 간의 알고리즘이나 책임 분배에 관한 패턴이다. 객체 하나로는 수행할 수 없는 작업을 여러 객체를 이용해 작업을 분배한다. 

 


 

🌱 REST API

REST (Representational State Transfer)

  주고 받는 자원에 이름을 규정하고 

   URI에 명시해 HTTP 메서드 (GET, POST, PUT, DELETE)를 통해 해당 자원의 상태를 주고 받는 것 

 


REST  API

  API(Application Programming Interface) - 애플리케이션에서 제공하는 인터페이스

  REST API : REST 아키텍처를 따르는 시스템/애플리케이션 인터페이스

 

  REST 의 특징

      ▪ 유니폼 인터페이스

            ▪ 플랫폼 및 기술에 종속되지 않고 일관된 인터페이스를 제공해야 한다.

 

      ▪ 무상태성

            ▪ 서버에 상태 정보를 따로 보관하거나 관리하지 않는다.

 

      ▪ 캐시 가능성

            ▪ HTTP 표준을 그대로 사용하므로 HTTP 캐싱 기능을 적용할 수 있다.

              이를 통해 서버의 트랙젝션 부하를 줄이고, 사용자의 UX를 향상시킬 수 있다.

 

     ▪ 레이어 시스템

            ▪ REST 서버는 네트워크 상의 여러 계층으로 구성될 수 있다.

              그러나 클라이언트는 서버의 복잡도와 관계 없이 서버와 연결되는 포인트만 알면 된다.

 

      ▪ 클라이언트 - 서버 아키택처

            ▪ 클라이언트와 서버의 구조를 분리하여 서로에 대한 의존성을 낮출 수 있다.

 

  URL 설계 규칙

      ▪  URL의 마지막에는 '/'를 포함하지 않는다.

      ▪  언더바(_) 대신 하이픈(-)을 사용한다.

      ▪  URL은 동사가 아닌 명사로 작성해야 한다.

      ▪  URL는 소문자로 작성해야 한다.

      ▪  파일 확장자는 URI에 포함하지 않는다. (헤더 사용 권장)

 


출처 : 스프링 부트 핵심 가이드 [장정우 지음]