[BE] 레이어드 아키텍처 알아보기

Kwanni·2025년 5월 10일
0

BackEnd

목록 보기
1/4

들어가며

데이터 분석 부트캠프를 수료하면서 다양한 데이터에 대해 분석도 해보고 AI를 활용한 흥미로운 프로젝트들을 진행하였다. 과정을 거듭하며 데이터들의 흐름을 알고 싶어 백엔드 개발에 발을 들이고자 한다. 프레임워크는 SpringBoot로 선택하였고 실습에 들어가기 전 스프링 부트의 레이어드 아키텍처를 알아보고자 한다.



레이어드 아키텍처(Layered Architecture)란?

소프트웨어 시스템을 여러 계층으로 분리하여 각 계층이 특정 역할과 책임을 수행하는 구조

먼저 각 계층의 역할을 알아보자. 그림과 같이 일반적으로 3개의 계층으로 나뉜다.

  1. 프레젠테이션 계층
    • 애플리케이션의 최상단 계층으로, 클라이언트의 요청을 해석하고 응답하는 역할
    • UI나 API 제공
    • 비즈니스 계층으로 요청을 위임하고 받은 결과를 응답하는 역할
  2. 비즈니스 계층
    • 애플리케이션이 제공하는 기능을 정의하고 세부 작업을 수행하는 도메인 객체를 통해 업무를 위임하는 역할을 수행
  3. 데이터 접근 계층
    • 데이터베이스에 접근하는 작업 수행

특징도 알아보자.

  • 관심사의 분리: 각 계층이 특정 역할에 집중하므로 코드의 이해도와 유지 보수성이 향상
  • 재사용성: 각 계층의 코드를 다른 모듈이나 애플리케이션에서 재사용할 수 있음
  • 안정성: 각 계층별로 독립적인 테스트가 가능하여 코드의 안정성을 높일 수 있음

각 계층은 역할별로 분리되어 있고 특정 책임만 수행하며 인접한 계층과 상호작용한다. 이를 통해 시스템의 유지보수성, 재사용성, 확장성 등을 높일 수 있다. 레이어드 아키텍처에 대해 간단히 알아 보았다. 이제 레이어드 아키텍처를 스프링에 적용해보자.



스프링 - 레이어드 아키텍처

내부적으로 그림과 같이 구성되어 있다. 각 계층의 구성요소를 먼저 알아보자.

1. 프레젠테이션 계층

클라이언트의 요청을 받아들이고, 애플리케이션의 응답을 클라이언트에게 표시하는 역할

  • Dispatcher Servlet

    • Spring MVC의 핵심 컴포넌트로서, 들어오는 모든 웹(HTTP) 요청을 받아 적절한 핸들러에 전달하는 프론트 컨트롤러 역할
  • 핸들러 매핑

    • 들어온 요청 URL과 컨트롤러 메서드를 연결해주는 역할
  • Controller

    • 실제 사용자의 요청을 받아 처리하고 비즈니스 계층(서비스)를 호출한 뒤, 결과를 View에 전달하거나 응답 데이터를 생성.

    • @Controller 어노테이션이 붙은 클래스를 의미.

      @Controller
      public class HelloController {
      
        @GetMapping("/hello")
        public String hello(Model model) {
            model.addAttribute("message", "안녕하세요!");
            return "hello";
        }
      }
  • ModelAndView

    • 컨트롤러가 처리 결과와 View에 대한 정보를 담는 객체. Dispatcher Servlet에 반환
  • View Resolver

    • ModelAndView에서 지정한 View 이름을 실제 View 파일로 매핑. JSP, Thymeleaf 템플릿 등을 찾아주는 역할
  • View

    • 최종적으로 사용자에게 보여줄 화면 생성

용어도 생소하고 구성요소 하나하나 봐서는 잘 이해가 되지 않는다. 프레젠테이션 계층은
Spring MVC의 동작방식과 거의 동일하다. Spring MVC가 뭘까? Spring MVC는 자바 기반의 웹 애플리케이션을 개발하기 위한 프레임워크로 Model-View-Controller 아키텍처를 제공한다. 이 구조는 애플리케이션을 세 가지 주요 부분으로 분리하여 개발의 효율성과 유지보수성을 높인다.
이제 프레젠테이션 계층의 핵심 동작 원리를 알아보자.

  1. 클라이언트가 HTTP요청을 보내고
  2. Dispatcher Servlet이 모든 요청을 받아 분석
  3. 핸들러 매핑을 통해 받은 요청을 어떤 Controller가 처리할지 결정
  4. Controller가 요청을 처리하고, 필요한 경우 비즈니스 계층의 서비스와 데이터 접근 계층의 DAO를 호출한다.
  5. 처리된 결과를 ModelAndView 객체에 담아 DispatcherServlet에 반환
  6. ViewResolver가 어떤 View를 사용할지 결정(예를 들어 jsp 또는 Thymeleaf)
  7. View가 최종적으로 Dispatcher Servlet을 통해 사용자에게 응답 전송

위의 과정을 거쳐 클라이언트는 요청에 대한 응답을 받게 되는데 JSP, Thymeleaf를 예시로 선택하였다. 레이어드 아키텍처에 대해 기술하기 때문에 자세히 설명하지는 않고 표로 간단히 넘어가겠다.

특징JSP (JavaServer Pages)Thymeleaf
기반 기술Java ServletJava (HTML, XML, JavaScript, CSS 처리 가능)
파일 확장자.jsp.html (Natural Templates), .xml, .js, .css
문법HTML 내에 <% ... %> 형태로 Java 코드 삽입HTML 속성 형태로 Thymeleaf 표현식 (th:*) 사용
가독성Java 코드와 HTML 혼합으로 가독성 저하 우려Natural Templates 지원으로 HTML 구조 유지, 가독성 우수
유지보수Java 코드 변경 시 재배포 필요, HTML과의 분리 어려움HTML 구조 유지로 디자인 변경 용이, Java 코드와의 분리 용이

2. 비즈니스 계층

프레젠테이션 계층으로부터 전달받은 요청을 처리하고, 필요한 데이터를 가공하여, 데이터 접근 계층을 통해 데이터를 조회하거나 저장

  • 서비스
    • 애플리케이션의 핵심 비즈니스 로직을 구현하는 컴포넌트. 트랜잭션 관리, 유효성 검사, 외부 시스템 연동 등의 작업을 수행.
    • 데이터베이서 접근이 필요한 경우 데이터 접근 계층의 DAO를 호출. 이때 엔티티 객체를 사용하여 데이터베이스와 상호작용.
    • @Service 어노테이션을 사용하여 정의.

3. 데이터 접근 계층

데이터베이스와 같은 데이터 저장소에 접근하여 데이터에 CRUD 작업을 수행하는 역할

  • DAO(Data Access Object)
    • 데이터베이스에 접근하는 로직을 캡슐화한 객체
    • JPA, MyBatis, JDBC 등 다양한 데이터 접근 기술을 추상화해 제공
    • @Repository 어노테이션을 사용하여 정의

4. DTO(Data Transfer Object)

  • 계층 간 데이터 전달을 위해 사용하는 객체
  • 컨트롤러와 서비스, 서비스와 DAO 간 데이터 전달에 활용

5. 엔티티

  • 데이터베이스 테이블과 매핑되는 도메인 객체
  • 실제 비즈니스 데이터를 담고 있고, 데이터베이스 구조와 1:1로 매핑



마치며

Spring Boot의 레이어드 아키텍처를 통해 견고하고 확장 가능한 백엔드 시스템의 기본 구조를 이해할 수 있었다. 각 계층의 명확한 역할과 Spring MVC의 흐름을 파악함으로써 본격적인 실습에 들어가기 전, 중요한 배경지식을 알게 되었다. 실습을 하면서도 필요하다고 생각되는 지식을 블로깅할 예정이다.



참고자료

profile
Success is not an accident, Success is actually a choice.

0개의 댓글