들어가며
스프링 기반 프로젝트에서 좋은 설계 구조와 테스트 전략은 소프트웨어 품질과 유지보수성에 직결됩니다. 최근 학습한 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와 레이어별 테스트 작성법을 학습하며, 각 계층이 명확한 책임을 가지고 협력할 때 유지보수가 용이하고 확장성 높은 소프트웨어를 만들 수 있음을 다시 한번 확인했습니다. 앞으로의 프로젝트에서도 이 내용을 지속적으로 적용하고 발전시키며 더 좋은 소프트웨어 개발자가 되도록 노력하겠습니다. 감사합니다!
출처