3-Layer Architecture를 적용한 프로젝트 구조 설계
📌 들어가며
최근 진행한 프로젝트에서 코드의 유지보수성과 확장성을 높이기 위해 3-Layer Architecture를 적용했다. 이번 포스팅에서는 각 계층별 구현 내용과 그로 인해 얻은 이점들을 공유하고자 한다.
🎯 3계층 구조란?
프로젝트를 Controller, Service, Repository 3개의 계층으로 나누어 각각의 역할과 책임을 분리하는 아키텍처 패턴이다.
💡 각 계층별 구현 내용
1. Controller 계층
class ReviewController {
createReview = async (req, res, next) => {
const { orderId, content } = req.body;
const userId = req.user.id;
// Service 계층으로 비즈니스 로직 위임
}
}
Controller 계층의 역할
- HTTP 요청/응답 처리를 담당했다
- 요청 데이터 추출을 수행했다
- 응답 형식을 결정했다
- 에러 처리 미들웨어와 연동했다
이렇게 구현한 이유
- HTTP 통신 관련 로직을 한 곳에서 관리하여 일관성을 확보할 수 있었다
- 요청/응답 형식 변경 시 Controller만 수정하면 되어 유지보수가 용이했다
- 비즈니스 로직과 분리되어 테스트가 쉬워졌다
2. Service 계층
class ReviewService {
createReview = async ({ userId, orderId, content }) => {
// 주문 존재 여부 확인
// 리뷰 중복 검사
// 권한 확인
// 데이터 검증
}
}
Service 계층의 역할
- 비즈니스 로직 처리를 담당했다
- 데이터 유효성 검증을 수행했다
- 트랜잭션을 관리했다
- 에러 처리를 담당했다
이렇게 구현한 이유
- 비즈니스 규칙을 한 곳에서 관리하여 일관성을 유지할 수 있었다
- 복잡한 비즈니스 로직을 응집도 있게 관리할 수 있었다
- Repository 계층과 분리되어 데이터베이스 독립성을 확보할 수 있었다
3. Repository 계층
class ReviewRepository {
findReviewById = async (reviewId) => {
return this.prisma.review.findUnique({
where: { id: Number(reviewId) }
});
}
}
Repository 계층의 역할
- 데이터베이스 작업을 전담했다
- 데이터 CRUD 작업을 수행했다
- 쿼리 최적화를 담당했다
이렇게 구현한 이유
- 데이터 접근 로직을 한 곳에서 관리하여 일관성을 확보할 수 있었다
- ORM 변경 시 Repository만 수정하면 되어 유지보수가 용이했다
- 쿼리 최적화와 캐싱을 중앙에서 관리할 수 있었다
🎁 얻은 이점
1. 코드 품질 향상
- 각 계층의 책임이 명확해져 코드 가독성이 증가했다
- 유지보수가 용이해졌다
- 테스트 작성이 쉬워졌다
2. 확장성 확보
- 새로운 기능 추가가 용이해졌다
- 기존 코드 수정 없이 기능 확장이 가능해졌다
- 다른 개발자와의 협업이 수월해졌다
3. 재사용성 증가
- 비즈니스 로직을 재사용할 수 있게 되었다
- 데이터 접근 로직을 재사용할 수 있게 되었다
- 공통 기능의 중복 구현을 방지할 수 있게 되었다
🔨 향후 개선 사항
01. DI(Dependency Injection) 패턴을 적용할 예정이다
02. 테스트 코드를 작성할 예정이다
03. 로깅 시스템을 구축할 예정이다
04. 캐싱 전략을 수립할 예정이다
📝 마치며
3-Layer Architecture를 적용함으로써 코드의 구조가 더욱 체계적으로 개선되었고, 유지보수성과 확장성이 크게 향상되었다. 앞으로도 더 나은 구조를 위해 지속적인 리팩토링을 진행할 예정이다.
참고 자료
- Clean Architecture
- Node.js Best Practices
- Prisma Documentation
'부트캠프' 카테고리의 다른 글
| 50일차 TIL (0) | 2025.01.13 |
|---|---|
| WIL (0) | 2025.01.10 |
| 48일차 TIL (0) | 2025.01.09 |
| 47일차 TIL (Today I Learned (0) | 2025.01.08 |
| 46일차 TIL (Today I Learned) (0) | 2025.01.07 |