Categories: 개발일지

실용적인 테스트 가이드: Layered Architecture 레이어드 아키텍처

들어가며

스프링 기반 프로젝트에서 좋은 설계 구조와 테스트 전략은 소프트웨어 품질과 유지보수성에 직결됩니다. 최근 학습한 Layered Architecture를 통해 레이어별 책임을 명확히 나누고, 각 레이어의 특징과 역할을 깊이 이해하게 되었습니다.

이번 글에서는 제가 수강중인 “Practical Testing: 실용적인 테스트 가이드” 강의를 통해 학습한 Layered Architecture에 대한 내용과 함께 각 레이어별로 테스트를 작성하는 방법까지 정리하고, 추가로 미션을 수행하며 깨달은 내용을 덧붙이겠습니다.

Layered Architecture (계층형 아키텍처)

Layered Architecture는 소프트웨어의 각 기능을 명확한 역할과 책임을 기준으로 여러 계층(layer)으로 분리하여 관리하는 구조적 접근법입니다. 이는 유지 보수성, 확장성 및 이해의 용이성을 높이는 데 목적이 있습니다. 일반적으로 계층은 다음과 같은 세 가지 주요 계층으로 나뉩니다.

1. Presentation Layer (표현 계층)

역할
  • 사용자의 요청을 받고 처리된 결과를 사용자에게 표현하는 역할을 담당합니다.
  • 사용자 인터페이스(UI) 또는 API 엔드포인트를 제공합니다.
  • 입력값 검증, 요청 데이터의 변환, 사용자 요청에 따른 적절한 응답을 생성합니다.
  • 주로 사용자와 직접적으로 상호작용하는 계층으로, 외부의 시스템과 내부의 비즈니스 로직을 연결하는 중간자 역할을 수행합니다.
특징
  • 웹 애플리케이션에서는 주로 컨트롤러(Controller), 프론트엔드 페이지, API 게이트웨이 등이 포함됩니다.
  • 애플리케이션의 비즈니스 로직을 직접 수행하지 않고, 입력과 출력의 처리에 집중합니다.
테스트 방법
  • 계층을 독립적으로 검증하는 통합 또는 단위 테스트를 수행합니다.
  • HTTP 요청/응답을 모의(mock) 환경에서 검증하거나, UI/UX 테스트 도구를 사용하여 실제 사용자 경험을 평가할 수도 있습니다.

2. Business Logic Layer (비즈니스 로직 계층)

역할
  • 시스템의 핵심 기능과 비즈니스 규칙을 관리합니다.
  • 업무 도메인의 주요 로직을 수행하며, 시스템이 제공하는 서비스의 본질적인 역할을 담당합니다.
  • 비즈니스 로직 계층은 주로 서비스(Service) 클래스나 도메인(Domain) 모델 클래스 형태로 존재합니다.
특징
  • 비즈니스 규칙의 구현과 유효성 검증, 데이터 가공 및 처리 로직을 담당합니다.
  • 표현 계층과 영속성 계층 사이의 중재자로서, 독립적이며 유지보수가 용이하게 설계하는 것이 중요합니다.
테스트 방법
  • 비즈니스 로직은 다른 계층과 독립적으로 검증 가능한 형태로 구현합니다.
  • 주로 단위 테스트로 로직의 정확성을 철저히 검증하며, 필요한 경우 모의(mock) 객체를 이용하여 외부 의존성을 제거하고 테스트의 신뢰성을 높입니다.

3. Persistence Layer (영속성 계층)

역할
  • 데이터를 저장하고 조회, 수정, 삭제 등 데이터와 관련된 모든 처리를 담당합니다.
  • 데이터베이스 또는 파일 시스템 등 다양한 형태의 저장소와 상호작용합니다.
  • Repository나 Data Access Object(DAO) 형태로 설계될 수 있습니다.
특징
  • 데이터의 영속화(persistence) 책임을 명확히 합니다.
  • 데이터 접근 방법을 추상화하여, 특정 데이터베이스 기술에 종속되지 않도록 설계할 수 있습니다.
테스트 방법
  • 데이터의 저장, 조회, 수정 등의 기능이 정확하게 동작하는지 독립적으로 검증합니다.
  • 실 데이터베이스와 유사한 환경에서의 통합 테스트 또는 데이터 접근 객체에 대한 단위 테스트를 수행할 수 있습니다.
  • 데이터베이스 종류나 환경에 따라 내장 데이터베이스 또는 모의 데이터 저장소를 활용하여 테스트할 수도 있습니다.

미션 수행: 레이어별 특징과 테스트를 자기만의 언어로 정리하기

각 레이어별로 특징과 테스트 방법을 나만의 언어로 정리해보겠습니다.

Presentation Layer

  • 특징: 컨트롤러는 시스템의 ‘프론트 데스크’로, 사용자의 요청을 정확히 받아들이고 응답을 명확히 돌려주는 것이 중요합니다.
  • 테스트 방법: 컨트롤러 테스트는 실제 요청과 동일한 환경에서 데이터 유효성과 예외 처리를 명확히 검증해야 합니다. 마치 고객의 질문에 정확히 답변하고 있는지를 확인하는 것과 유사합니다.

Business Logic Layer

  • 특징: 서비스 계층은 시스템의 ‘뇌’와 같습니다. 업무 프로세스나 정책이 잘 적용되는지를 책임지며, 시스템의 주요 흐름을 관리합니다.
  • 테스트 방법: 서비스 테스트는 비즈니스 로직이 예상된 흐름대로 정확히 동작하는지 확인하는 과정입니다. 비즈니스가 정한 규칙대로 진행되는지를 철저히 검증해야 합니다.

Persistence Layer

  • 특징: 영속성 계층은 데이터를 안전하고 정확히 보관하는 ‘기억 장치’ 역할입니다. 데이터의 무결성과 신뢰성이 무엇보다 중요합니다.
  • 테스트 방법: 리포지토리 테스트는 데이터를 저장하고 정확히 꺼내오는지를 철저하게 확인하는 과정으로, 정확한 데이터 기록과 관리가 핵심입니다.

미션을 통해 느낀 점

레이어별로 책임과 역할을 명확히 이해하고 그에 따른 테스트 전략을 수립하니, 코드를 작성하거나 유지보수할 때 훨씬 명확하고 효율적일 것 같습니다. 미션을 통해 각 레이어를 나의 언어로 다시 정리해보니 개념이 더욱 명확해졌고, 앞으로 복잡한 기능 추가나 리팩토링 작업 시에도 더욱 자신감을 가지고 진행할 수 있을 것 같습니다.

마치며

Layered Architecture와 레이어별 테스트 작성법을 학습하며, 각 계층이 명확한 책임을 가지고 협력할 때 유지보수가 용이하고 확장성 높은 소프트웨어를 만들 수 있음을 다시 한번 확인했습니다. 앞으로의 프로젝트에서도 이 내용을 지속적으로 적용하고 발전시키며 더 좋은 소프트웨어 개발자가 되도록 노력하겠습니다. 감사합니다!

출처
suover

Recent Posts

그림으로 쉽게 배우는 자료구조와 알고리즘: 미션1 | 메모리 검색

들어가며 소프트웨어를 개발할 때 메모리 관리 방식은 프로그램의 안정성과 성능을 좌우하는 핵심 요소입니다. 특히 자바스크립트,…

3일 ago

만들면서 쉽게 배우는 컴퓨터 구조: 미션1 | 진리표부터 회로 구현까지

들어가며 소프트웨어 개발자는 코드가 어떻게 실행되는지 정확히 이해해야 할 필요가 있습니다. 우리가 작성한 프로그램은 결국…

5일 ago

웹 서버(Web Server)와 WAS(Web Application Server) 알아보기

서론 현대 웹 애플리케이션 아키텍처에서 웹 서버(Web Server) 와 웹 애플리케이션 서버(WAS, Web Application Server)…

1개월 ago

HTTP 헤더(Header)란 무엇인가?

HTTP 헤더(Header)란? HTTP(Header)는 클라이언트와 서버 간에 교환되는 메타데이터로, 요청(Request)과 응답(Response)에 부가적인 정보를 실어 나르는 역할을…

2개월 ago

인프런 워밍업 클럽 스터디 3기 – 백엔드 클린 코드, 테스트 코드 후기

Readable Code: 읽기 좋은 코드를 작성하는 사고법Practical Testing: 실용적인 테스트 가이드 강의와 함께한 인프런 워밍업 클럽…

2개월 ago

인프런 워밍업 클럽 스터디 3기 – 백엔드 클린 코드, 테스트 코드 4주차 회고

Readable Code: 읽기 좋은 코드를 작성하는 사고법Practical Testing: 실용적인 테스트 가이드 강의와 함께한 인프런 워밍업 클럽…

2개월 ago