대규모 전자상거래 플랫폼에서 마이크로서비스 간 불필요한 의존성으로 인해 성능 저하 문제가 발생했습니다.
특히 주문 처리 시스템에서 초당 처리량(TPS)이 목표치의 60% 수준에 그쳤으며, 주문 피크 시간대에는 응답 시간이 급격히 증가하는 현상이 관찰되었습니다.

성능 테스트를 통해 다음과 같은 문제를 확인했습니다:
성능 프로파일링 결과, 다음 병목 지점이 확인되었습니다:
클래스와 메서드의 접근 제한자를 분석하고 필요한 경우 package-private로 변경했습니다.
public class OrderProcessor {
public void processOrder(Order order) {
// 주문 처리 로직
}
}
package com.example.order;
class OrderProcessor { // package-private
void processOrder(Order order) {
// 주문 처리 로직
}
}
변경 내용: OrderProcessor를 package-private으로 변경하여 외부에서의 불필요한 참조를 차단.
효과: 외부 의존성을 줄여 캡슐화를 강화.
모듈 간 명확한 경계를 설정하고 도메인 계층, 어댑터 계층, 애플리케이션 계층을 구분하는 헥사고날 아키텍처를 도입했습니다.
com.example.order
- OrderProcessor.java
- OrderService.java
- OrderRepository.java
com.example.order
├── domain
│ ├── model
│ └── service
├── adapter
│ ├── web
│ └── persistence
└── application
└── service
모듈별 빌드 스크립트를 분리하고 명시적인 의존성을 정의했습니다.
dependencies {
implementation project(':common')
implementation project(':order')
implementation project(':payment')
}
dependencies {
implementation project(':common')
implementation project(':order-api')
// 명시적 의존성 관리
}
ArchUnit 라이브러리를 도입하여 의존성 규칙을 테스트했습니다.
@Test
void validateOrderModuleArchitecture() {
HexagonalArchitecture.boundedContext("com.example.order")
.withDomainLayer("domain")
.withPackages("model", "service")
.withAdaptersLayer("adapter")
.incoming("web")
.outgoing("persistence")
.withApplicationLayer("application")
.services("service")
.check(new ClassFileImporter()
.importPackages("com.example.order.."));
}
이번 사례를 통해 접근 제한자가 단순한 캡슐화 도구를 넘어 시스템 아키텍처의 품질과 성능에 직접적인 영향을 미친다는 것을 확인할 수 있었습니다.
개발자로서 이러한 문제를 해결한 경험은 앞으로도 지속적인 성능 최적화와 아키텍처 개선에
공부할 계획입니다.