Spring Web Layer


오늘은 Spring Web Layer에 대해 알아보자.

스프링-웹-앱-아키텍처

위 사진을 보면 Web, Service, Repository, DTOs, Domain Model이 존재하는데 각 Layer계층 속 controller, service, 등이 포함되어 있고 프로젝트를 구성할 당시 각 레이어에 목적에 맞게 나누어 개발을 진행한다

스프링 웹 아키텍처와 관련하여 아래 레퍼런스 문서를 살펴보면 가장 크게 두가지 원칙을 따르는 것이 기본으로 소개한다.

 

1. 관심사 분리(SoC(Separation of concerns)) 원칙

 

  • 참고문서 - (https://en.wikipedia.org/wiki/Separation_of_concerns)
  • 관심분리라는 원칙을 간단하게 알고넘어가자면 각 부분(클래스 혹은 기능)이 별도의 관심사를 다루도록 컴퓨터 프로그램을 섹션분리하기 위한 설계원칙이다.
  • 여기서 관심사란 무엇일까? 를 한번 생각해보자. 관심사는 쉽게 말해 행동이라고 정의하고 이해하면 조금 더 이해하기 쉬웠던 것 같다.
    public void First(Object o) {
      log.info("First Function Call");
      System.out.println("My Parameter : " + o.toString());
      // Logic ...
    }
    public void Second(Object o) {
      log.info("Second Function Call");
      System.out.println("My Parameter : " + o.toString());
      //Logic ...
    }
    공통된 코드(관심사)를 확인할 수 있을 텐데 이러한 관심사들을 적절하게 나누는 것을 의미한다.
    public void printInfo(String functionName, Object o) {
      log.info("{} Function Call", functionName);
      System.out.println("My paramter : " + o.toString());
    }
    
    public void first(Object o) {
      printInfo("First", o);
      // Logic ...
    }
    public void second(Object o) {
      printInfo("Second", o);
      //Logic ...
    }
    이렇게 공통된 관심을 하나의 함수로 구현하여 분리했다
  • 위 코드의 로그와 프린트 부분을 하나의 함수로 바꾸어 구현한다면 다음과 같이 구현할 수 있다.
  • 아래 코드를 확인해 보자

위 사항을 조금 더 Spring입장으로 바라본다면 횡단 관심사(Cross-cutting concerns)라고 부르고 이 횡단관심사는 핵심로직이 아닌 위와 같이 로그, 프린트, 파라미터객체, 트랜잭션 등 을 의미한다.

이런 횡단관심사는 다시 또 AOP를 통해 횡단 관심사 분리를 할 수 있으니 AOP에 대한 설명을 한번 더 확인해 보면 좋을 것 같다.

 

2. KISS(Keep It Simple Stupid) 원칙

 

참고문서 - (https://en.wikipedia.org/wiki/KISS_principle)

 

  • 키스원칙이라 불리며 KISS는 "Keep it simple, stupid", "keep it short and simple", "keep it short and sweet" 의미이다
  • 간단하게 말하자면 코드를 단순하게 만드는 것이 좋고 불필요하게 장황하거나 복잡해지는 것을 피하라는 의미로 이해하면 좋겠다.

본론으로 돌아와서 위 두 가지를 간단하게 요약하자면 한 가지 기능만을 작동하도록 함수를 구현하되 단순하게 코드를 구성하라는 의미가 된다.

이러한 원칙을 따르며 각 레이어에 대한 특징을 살펴보자.

  1. Web Layer
    • 가장 앞단으로써 Spring MVC의 동작과정 속 DispatcherServlet처럼 클라이언트의 요청을 가장 처음으로 응답받는 곳이다. 그래서 이 WebLayer가 포함하고 있는 요소들도 Controller를 포함한 예외나필터가 포함되어 있다.
    • 또한 클라이언트의 첫 요청이기에 인증 및 권한 관련 부분도 여기에 해당한다.
  2. Service Layer
    • Web Layer보다 아래 속하며, 트랜잭션 경계 역할을 수행한다 또 서비스계층의 공용 API를 제공하고 권한부여등의 기능을 담당한다 쉽게 말해 WebLayer단에서 필요한 작은 기능단위들을 구현되어 있는 Layer라고 생각하면 좋을 것 같다.
  3. Repository Layer
    • 웹 애플리케이션의 최 하위계층으로 사용되는 데이터의 저장소와 통신을 담당합니다 쉽게 말해 데이터베이스와 통신역할을 수행한다.
  4. DTOs
    • DTO들의 집합을 의미한 것이고 DTO(Data Transfer Object)는 데이터 전송을 목적으로 하는 객체다
    • 이 객체는 애플리케이션 계층 간 데이터를 전달하는 용으로 사용된다.
  5. Domain Model
    • 도메인 모델은 다시 3가지로 나눌 수 있다
      1. 도메인 서비스
        • 도메인 서비스는 쉽게 말해 비즈니스로직이라 말하는 로직적인 관점들이 포함된 작업을 제공하는 비저장 클래스이다.
      2. 엔티티
        • 엔티티는 전체 수명주기동안 변경되지 않고 유지되는 개체이다.
      3. 개체
        • 개체는 속성이나 사물 등을 설명하며 고유 ID나 수명 주기가 없다

 

각 레이어 중 웹 레이어는 데이터 전송 개체만 처리해야 하고 서비스계층은 DTO를 매개변수로 사용해야 한다.

 

또 레포지토리계층은 엔티티를 매개변수로 사용해야 하며 각 계층에서의 구현을 통해 적절한 계층의 요소를 사용하는 것에 익숙해진다면 지금 설명하는 것들이 이해하는데 큰 도움이 될 거라 생각된다.

 

마지막으로 DTO사용이 필수적인지에 대한 질문에 따른 답변을 확인해 보자

 

실제로 구현시에 엔티티를 그냥 컨트롤러에서 반환하는 식으로도 구현을 진행할 수 있는데 이러한 DTO가 반드시 사용해야 하는 건지 의문을 가질 수 있다. 실제로 나도 VO와 DTO가 많이 헷갈리기도 했고...

그러나 위 사진을 자세히 보게 된다면 Public, Private으로 표현된 부분이 이 의문에 대한 시원한 답변이라 생각한다.

 

말 그대로 엔티티, 도메인모델들은 클라이언트입장에서는 감춰지고 보이지 않아야 하며 이 모델들 역시나 클라이언트 친화적으로 생성된 것이 아니기에 DTO를 통해 도메인을 숨기며 맞춤형 DTO로 제공할 수 있다는 점에서 사용한다

 

그리고 DTO를 변경하지 않는 한 도메인 모델의 변화에도 상관없이 제공될 수 있기에 운영, 유지보수 측면에서 장점이라 생각이 들었다.

 

 

오늘은 이것으로 Spring Web Layer에 대하여 알아보았다.

 

 

Reference

  1. https://www.petrikainulainen.net/software-development/design/understanding-spring-web-application-architecture-the-classic-w ay/
  2. https://velog.io/@smallcherry/Spring-스프링-웹-계층-Spring-Web-Layer
  3. https://jiwondev.tistory.com/122

'Spring, Spring Boot' 카테고리의 다른 글

Spring MVC 동작과정  (0) 2023.01.11
SOLID 객체지향 설계의 5가지 원칙  (0) 2022.05.13
Spring AOP 정리  (0) 2022.01.01
Spring 어노테이션(Annotation) 정리  (0) 2021.12.28

Spring MVC동작과정


Spring MVC는 어떤 순서로 동작할까?

이를 설명하기에 앞서 MVC라는 것이 무엇인지 모르는 분들을 위해 간략하게 설명하고 넘어가고자 한다.

MVC(Model, View, Controller)를 뜻하는 소프트웨어 설계 디자인패턴 중 하나다.

MVC-Design-Pattern

[이미지 출처] (https://hanamon.kr/mvc%EB%9E%80-mvc-design-pattern/)

위 그림과 같이 각 목적에 맞게역할을 나누어 개발함으로써 운영, 관리 측면에서 효율적이고 디버깅이나 가독성이 증가하게 된다.

 

실제로 우리가 옷장에 옷을 정리할때 그리고 주방에 식기류를 정리할 때 등 옷장, 주방 등의 공간을 나누어 해당 공간에 맞게 물건을 정리하는 것처럼 Controller, View, Model 역할에 맞게 소스코드를 정리해 두어 나중에 더 찾기 쉽고 관리하기 편해진다.

 

본론으로 돌아와 Spring MVC는 그럼 어떤형태를 가지고 있을까?

위 MVC 디자인패턴의 구조를 그대로 "Spring으로 가지고온다면 어떤 형태 일까?"를 생각해 보자

img

[이미지출처] (https://velog.io/@solchan/Spring-Spring-MVC%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80)

다음과 같은 형태로 구성되어 있다 잘 보면 처음 설명했던 MVC 중 Model이 무엇인지 모를 수 있는데 Service가 Model의 역할을 한다고 보면 된다.

 

스프링 공식문서에도 이 Spring MVC에 대해 자세한 설명이 나와있으니 한번 참고해 보면 좋을 것 같다.

[공식문서] (https://docs.spring.io/spring-framework/docs/current/reference/html/index.html)

 

위 그림을 자세하게 살펴본다면 처음으로 Client의 요청은 DispatcherServlet과 만나게 된다.DispatcherServlet은 클라이언트의 여러 요청에 맞는 공유 알고리즘을 제공하며 다양한 요청에 맞는 응답을 제공한다.

 

정리하자면 HTTP Protocol을 통해 들어오는 클라이언트의 여러 가지 요청을 제일 앞단에서 받아 적합한 컨트롤러에게 위임하는 프론트 컨트롤러(Front Controller)로 이해하고 넘어가자. (DispatcherServlet하나만 가지고 게시글 한 개를 쓸 만큼의 내용이 많기 때문에 지금은 간단하게만 이해하고 넘어간다)

 

 

이처럼 이 DispatcherServlet이 Spring MVC pattern에서 함께 사용된다.

 

이후 HandlerMapping과 ControllerAdapter(HandlerAdapter)를 알아보자.

 

이 HandlerMapping은 위 DispatcherServlet을 설명하던 중 여러 요청에 따라 특정 컨트롤러를 찾아서 알맞은 응답을 반환해 준다 라는 말 중 "특정 컨트롤러를 찾는"부분에 해당한다.

 

이 HandlerMapping이 선택한 Controller를 가지고 맞는 BLO(비즈니스로직)을 HandlerAdapter가 호출하며 요청에 맞는 로직이 작동하는 방식이다.

 

마지막으로 ViewResolver를 통해 결과를 보여줄 화면에 해당하는 View를 가지고 DispatcherServlet이 응답 결과를 생성한다.

 

 

이 하나의 과정이 Spring MVC가 동작하는 방식이며 단순히 글만 보고서는 완벽하게 이해가 안 될 수 있으니 동작과정 속 키워드를 한 번씩 검색해 보길 바란다.(DispatcherServlet, HandlerMapping, HandlerAdapter, ViewResolver 등)

오늘은 Spring MVC의 동작과정에 대하여 알아보았다.

Reference

  1. https://docs.spring.io/spring-framework/docs/current/reference/html/index.html
  2. https://mangkyu.tistory.com/18
  3. https://velog.io/@hsw0194/Spring-MVC-HandlerMapping의-동작방식-이해하기-1편

'Spring, Spring Boot' 카테고리의 다른 글

Spring Web Layer  (0) 2023.01.12
SOLID 객체지향 설계의 5가지 원칙  (0) 2022.05.13
Spring AOP 정리  (0) 2022.01.01
Spring 어노테이션(Annotation) 정리  (0) 2021.12.28

Git Flow 란?


  • 나처럼 Github에서 push, merge, pull 정도만 해본 초급개발자라면 이 Git flow라는 말을 한 번쯤은 들어보았을 수도 있다. (한 번도 들어보지 못했다면 이번 기회에 알아두는 것이 좋겠다)
  • 실무에서도 역시나 Git을 사용하는곳이 많고 각 회사별로 깃을 사용하는 방법도 다양할 것이라 생각한다. 그중에서도 규칙(?)처럼 "우리는 Git을 이러한 규칙으로 사용한다"는 전략이 존재한다.
  • 그 전략중 Git-flowGitHub-flow 그리고 *Gitlab-flow *세 가지 전략을 설명하려고 한다.

우선 이러한 전략(규칙)이 왜 필요한지에 대한 이야기부터 해보자.

Git Branch 전략이란?

  • 우리가 일반적으로 프로그램 혹은 어플리케이션을 개발할 때 혼자서 모든 것을 개발하지는 않는다. 그러면 공용저장소를 사용하게 될 것이며 이 공용저장소의 소스코드파일을 구현이 끝날 때마다 업데이트를 해줄 것이다.
  • 이러한 협업은 대부분은 Git을 사용해서 관리할 것이고 저장소는 GitHub, Gitlab 혹은 일반 서버컴퓨터의 Git만을 설치해서 활용하는 등의 여러 파일관리방법이 존재할 것이다.
  • 이때 이 Git을 여러 개 발자가 보다 잘 활용하기 위한 전략(규칙)으로써 생겨난 것이라 생각하면 좋겠다.

결론적으로 1개의 저장소에서 소스코드를 효율적으로 관리하고 협업을 수월하게 할 수 있도록 도와주는 규칙이다.

이제 각각 전략이 어떠한 특징과 차이점이 있는지 알아봅시다.

1. Github Flow

github flow는 git flow보다는 간결하게 활용할 수 있도록 등장한 전략입니다.

Screen Shot 2014-03-08 at 23.07.36img

[이미지 출처] (https://lucamezzalira.com/2014/03/10/git-flow-vs-github-flow/)

위 그림과 같이 main 브렌치를 항상 배포가능한 최신상태로 유지하는 방법이며 브렌치를 생성할 경우 브렌치이름을 명확하게 정해야 합니다. 특별하게 feature 브렌치나 develop브렌치가 존재하지 않기 때문에 그때그때마다 상황에 맞게 특정 브렌치를 생성 -> 작업 -> 반영 -> 삭제 순으로 흘러가야 합니다. 또한 반영할 때 Pull Request를 생성하여 팀원들과의 코드리뷰 후 반영해야 합니다.

마스터브렌치는 라이브환경의 서버와 자동으로 동기화되어 있고 CI/CD가 자동화되어있어야 합니다. 수동으로 매번 main 브렌치를 반영하기에는 비효율적입니다.

이처럼 Github flow는 소규모 팀에서 선택하기 좋은 전략입니다.

2. Git Flow

git flow

[이미지 출처] (https://lucamezzalira.com/2014/03/10/git-flow-vs-github-flow/)

git flow전략은 위 그림과 같이 5개의 브렌치로 master, hofixes, release, develop, feature 브렌치가 존재합니다.

브렌치의 순서는 feature -> develop -> release -> master순으로 가게 되며 master브렌치의 운영 중 이슈가 발생할 경우 hotfixes브렌치로 이동합니다.

  • master : 라이브(운영) 서버에 제품으로 출시되는 브렌치
  • develop : 다음 출시 버전을 대비하여 개발 중인 브렌치
  • feature : 추가기능 개발 브렌치
  • release : 다음 버전 출시를 준비하는 브랜치 주로 QA, Test과정이 진행된다
  • hotfix : master브렌치에서 발생한 이슈를 수정하는 브렌치

브렌치는 위와 같이 목적에 맞게 사용되어야 하는 방식으로 이루어져 있습니다.

git flow의 흐름으로는 가장 핵심이 되는 master, develop 두 개를 운용해야 합니다. 나머지 feature, release, hotfix 브렌치는 사용하지 않는다면 지우더라도 문제가 되지 않기 때문에 프로젝트를 어떤 방식으로 활용하느냐에 따라 달라진다.

대부분의 작업은 develop에서 취합한다 생각하면 되며 테스트를 통해 정말 확실하게 변동사항이 없을 때 master와 병합한다.

3. Gitlab Flow

GitLab Flow Model - environment branch

[이미지 출처] (https://ujuc.github.io/2015/12/16/git-flow-github-flow-gitlab-flow/)

gitlab flow는 github flow에서 main 브렌치를 병합 후 바로 배포할 수 있는 상태로 만들어야 하지만 이를 gitlab flow에서는 바로배포하지 못하는 경우를 고려하여 production 브렌치라는 것이 존재하는 상황이고 이 production 브렌치역시나 master브렌치 사이의 preproduction 브렌치를 두어 브렌치반영에 시간을 두는 방식이다. 그림으로만 보게 되면 github < gitlab < git flow 순으로 복잡한 구조를 나타내는 것 같다

여러 Git Flow방법들 중 각 상황과 개발 목표에 맞춰 적절한 전략을 활용하는 것이 중요할 것이라 생각하며 나와 같은 초급개발자는 전략보다는 오히려 커밋, 푸쉬, 풀, 풀리퀘, 리베이스 등등.. 기본적인 기능을 더 명확하게 잘 사용할 수 있는 것이 우선이라 생각한다.

오늘은 여러 Git Flow 전략에 대하여 알아보았다.

Reference

  1. https://inpa.tistory.com/entry/GIT-%E2%9A%A1%EF%B8%8F-github-flow-git-flow-%F0%9F%93%88-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EC%A0%84%EB%9E%B5
  2. https://brownbears.tistory.com/603
  3. https://docs.gitlab.com/ee/topics/gitlab_flow.html
  4. https://lucamezzalira.com/2014/03/10/git-flow-vs-github-flow/
  5. https://ujuc.github.io/2015/12/16/git-flow-github-flow-gitlab-flow/

MSA란 무엇일까?


MSAMicroService Architecture의 줄임말이다 즉 아주 작은 마이크로 단위의 서비스로 구성된 프레임워크라고 볼 수 있다.

기존에는 하나의 프로젝트에 모든 기능들을 구현해두었다면 여러 개의 작은 프로젝트를 조합하여 하나이 큰 프로젝트와 같이 구성하는 것이다.

MSA의 등장 배경

  • MSA는 언제부터 사용된 개념일까?
  • Monolithic Architecture라는 개념이 있다 쉽게말해 MSA가 등장하기 전 모든 서비스들은 Monolithic Architecture로 구성되어 제공했고 위 설명과 같이 모든 서비스들이 하나의 프로젝트에 통합되어있는 형태를 뜻한다.
  • 당연히 하나의 프로젝트에 모든 서비스가 포함되어있을 경우에 문제점도 존재하며 다음과 같다
    1. 프로젝트가 커지면 커질수록, 영향도 파악 및 전체 시스템구조 파악에 어려움이 있다.
    2. 각 서비스들을 부분적으로 scale-out 하기 힘들어진다.
    3. 부분의 오류가 서비스 전체의 오류로 이어지는 경우가 발생할 수 있다.
    4. 프로젝트 빌드 및 테스트 시간이 길어지고 배포파일 자체의 절대적인 시간이 늘어난다(당연히 용량이 커지기때문이라 생각한다)

이 두가지 Microservices Architecture와 Monolithic Architecture를 그림으로 보자면 아래와 같다.

Figure 1: Architecture differences between traditional monolithic applications and microservices

[이미지출처] (https://www.suse.com/c/rancher_blog/microservices-vs-monolithic-architectures/)

위 단점들을 보완, 해결 하고자 MicroServices Architecture를 사용하기 시작했고 장단점을 정리하자면 다음과 같다.

장점

  1. 각 서비스가 모듈화되어있기 때문에 모듈끼리 RPC 또는 message-driven API 등을 이용하여 통신한다.
  2. 각 서비스에따라 개발하기 때문에 유지보수가 쉽고 팀단위로 적절한 수준에서 기술스택을 선택할 수 있다.
  3. java Spring 기반으로 MSA를 적용하더라도 node.js 모듈과 연동함에 무리가 없다.
  4. 각 서비스별로 독립적인 배포가 가능하며 각서비스별 단위테스트 역시나 가능해진다.

단점

  1. MSA구조는 모놀리식에 비해 상대적으로 복잡하다.
  2. 서비스가 모두 분산되어있고 서비스별 통신이 필요하기에 개발과정에서 내부시스템의 통신을 어떤 방식으로 사용할지 표준을 정의해야 한다.
  3. 서버부하에 따라 transaction을 유지할지 결정하고 구현해야 한다.
  4. 단위테스트에는 장점이 있으나 통합테스트과정이 매우 어렵다.
  5. 또한 운영환경에 배포하는 것 또한 쉽지 않다.( 만들어두었던 모든 서비스들을 묶어서 배포해야 하고 유지보수측면에서 각서비스업데이트마다 배포파일을 교체해주어야 하는 작업이 필요하다 또한 업데이트순간 모든 서비스들이 정상작동하는지를 한번 더 확인해야 하기 때문에)

장점과 단점 모두 실무에서는 도메인에 맞게 활용할 수도 활용하지 않을 수도 있다고 생각한다.

무엇보다 고객의 트랜잭션관리 부분이 가장 어려울 거라 생각이 든다.

오늘은 MSA구조가 무엇인지 알아보았다.

Reference

  1. https://mydream72.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%B3%B4%EB%8B%88-MSA%EB%9E%80
  2. https://hahahoho5915.tistory.com/71

'지식 창고' 카테고리의 다른 글

REST API란?  (0) 2022.09.12
HLS protocol 이란 무엇일까?  (2) 2022.09.11
프레임워크랑 라이브러리는 뭐가 다를까??  (0) 2022.09.03

+ Recent posts