반응형
마이크로서비스 아키텍처의 데이터 참조 전략
🔍 현재 상황 분석
프로젝트 구조
- Communication
- Board
- Identity
- Recruitment
- Schedule
- Feedback
주요 문제점
- 도메인 간 Entity 직접 참조
- 다중 데이터베이스 조회 제한
- 강결합(Tight Coupling) 발생
- JPA Entity 매핑 한계
1. API 기반 통신 방식
구현 예시
@Service
class JobPostingService(
private val webClient: WebClient,
private val jobPostingRepository: JobPostingRepository
) {
fun getJobPostingWithUser(id: Long): JobPostingDetailDto {
val posting = jobPostingRepository.findById(id)
val userInfo = webClient.get()
.uri("/api/users/${posting.userId}")
.retrieve()
.bodyToMono(UserInfoDto::class.java)
.block()
return JobPostingDetailDto.from(posting, userInfo)
}
}
장점
- 느슨한 결합 구현
- 도메인 독립성 유지
- 구현 직관성
- 실시간 데이터 조회
단점
- 네트워크 오버헤드
- 연속 API 호출 시 성능 저하
- 서비스 간 의존성
- 장애 대응 메커니즘 필요
2. Event Driven Architecture (EDA)
구현 예시
@Service
class UserEventPublisher(
private val kafkaTemplate: KafkaTemplate<String, UserUpdatedEvent>
) {
fun publishUserUpdated(user: User) {
val event = UserUpdatedEvent(
id = user.id,
name = user.name,
email = user.email
)
kafkaTemplate.send("user-updates", event)
}
}
@Service
class UserEventConsumer {
@KafkaListener(topics = ["user-updates"])
fun handleUserUpdated(event: UserUpdatedEvent) {
userCacheRepository.update(event)
}
}
장점
- 느슨한 결합
- 우수한 확장성
- 실시간 데이터 동기화
- 성능 부하 분산
단점
- 시스템 복잡도 증가
- 이벤트 관리 부담
- 데이터 정합성 보장 어려움
- 모니터링 복잡성
3. CQRS 패턴
구현 예시
@Configuration
class DatabaseConfig {
@Primary
@Bean
fun writeDataSource(): DataSource {
return DataSourceBuilder.create()
.url("jdbc:mysql://write-db:3306/withu_recruitment")
.build()
}
@Bean("readDataSource")
fun readDataSource(): DataSource {
return DataSourceBuilder.create()
.url("jdbc:mysql://read-db:3306/withu_all")
.build()
}
}
장점
- 읽기/쓰기 최적화
- 우수한 확장성
- 복잡한 조인 쿼리 해결
- 도메인 독립성 유지
단점
- 높은 구현 복잡도
- 데이터 동기화 지연
- 인프라 비용 증가
- 운영 복잡도 증가
4. Database View/Federation
구현 예시
-- Identity DB
CREATE VIEW user_info_view AS
SELECT id, name, email
FROM user_info;
-- Recruitment DB
CREATE DATABASE LINK identity_link
CONNECT TO root IDENTIFIED BY 'password'
USING 'jdbc:mysql://identity-db:3306/withu_identity';
장점
- 구현 단순성
- 실시간 데이터 접근
- 최소한의 코드 수정
- 트랜잭션 처리 용이
단점
- DB 간 강결합
- 성능 이슈
- 제한된 확장성
- DB 의존성 증가
반응형
'MSA > MSA와 소프트웨어 아키텍처의 관계' 카테고리의 다른 글
Hexagonal Architecture (0) | 2024.03.13 |
---|---|
Layered Architecture (0) | 2024.03.13 |
소프트웨어 아키텍처 (0) | 2024.03.12 |