※ 개인 프로젝트 문서 정리 중 모르거나 명확하게 알지 못하는 용어들이 있어서 정리해본다.
1. 계층 구조의 구분: 3-Tier과 Backend Layering
계층 구조(Tier Architecture)와 계층 분리(Layering)은 서로 다른 범주다.
| 구분 | 용어 | 대상 | 목적 |
| 물리적 계층 | 3-Tier (3계층 구조) | 서로 다른 물리적/논리적 서버에 위치하는 주요 구성 요소 | 시스템 전체의 확장성, 분산, 네트워크 분리 |
| 논리적 계층 | Backend Layering | 단일 서버(Spring Boot) 내에서 논리적 역할에 따라 코드를 분류 | 유지보수, 관심사 분리, 테스트 용이성 |
예시:
- 3-Tier: React(프레젠테이션/클라이언트 Tier) - Spring Boot (애플리케이션/비즈니스 Tier) - MySQL (데이터 Tier)로 구성되어 시스템 전체의 확장성을 확보했다.
- Backend Layering: Spring Boot 내부에서 Controller-Service-Repository로 분리하여 코드를 조직화하고 논리적 역할을 명확히 했음을 강조한다.
2. 관심사 분리 (Separation of Concerns, SOC)
관심사 분리란 소프트웨어를 설계할 때 서로 다른 기능을 수행하는 코드를 명확하게 분리하는 원칙을 말한다.
계층별 관심사
| 계층/컴포넌트 | 주된 관심사 |
| React (프론트엔드) | 사용자 경험(UI/UX), 사용자 입력 처리, 데이터 표시 |
| Controller | HTTP 요청/응답 처리, 데이터 유효성 검사, Service 호출 |
| Service | 비즈니스 로직(핵심 기능), 여러 Repository 조합, 트랜잭션 관리 |
| Repository (JPA) | DB 접근 방식 (CRUD), 데이터 맵핑 |
관심사 분리가 중요한 이유:
- 유지보수: UI를 수정하더라도 비즈니스 로직(Service)에는 영향을 주지 않으므로, 한 부분의 수정이 다른 부분의 오류를 일으키는 것을 방지한다.
- 재사용성: Service 계층의 비즈니스 로직은 Controller가 아닌 다른 곳(예: 배치 작업)에서도 재사용될 수 있다.
3. 테스트 용이성 (Testability)
Conroller-Service-Repository가 테스트 용이한 이유는?
가장 큰 이유는 MOCKING이 가능하기 때문이다. (*MOCKING: 가짜 객체)
- Service 계층 테스트: Service의 비즈니스 로직을 테스트할 때, 실제 DB에 접근할 필요가 없다. Repository 인터페이스를 Mocking(가짜 객체)하여 Service에 주입하면, Service는 가짜 Repository가 반환하는 데이터를 가지고 순수한 비즈니스 로직만 테스트할 수 있다.
- Controller 계층 테스트: Controller를 테스트할 때, 복잡한 비즈니스 로직을 수행할 필요가 없다. Service를 Mocking하여 Controller가 HTTP 요청을 올바르게 처리하고 올바른 Service를 호출하는지만 확인하면 된다.
