🌱 서버 간 통신
▪ 한 서버가 다른 서버에 통신을 요청하는 것
➡️ 독립적인 애플리케이션 개발 시, 각 서비스 간에 통신해야 하는 경우를 생각해 볼 수 있다.
효율적인 유지보수와 경량화된 서비스를 사용하기 위해서는 서비스의 규모를 작게 나눠 가져갈 필요가 있다.
▪ 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를 사용할 경우>
▪ 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에 포함하지 않는다. (헤더 사용 권장)
출처 : 스프링 부트 핵심 가이드 [장정우 지음]