배경 및 목표
잡플래닛과의 연동이 단방향(자사 → 잡플래닛)이어서, 잡플래닛에서 자체적으로 공고 상태를 변경해도 감지할 수 없었습니다. 예를 들어 잡플래닛에서 공고를 마감 처리했는데 자사 시스템에서는 여전히 “게시 중”으로 표시되는 등, 양쪽 공고 상태가 불일치하는 상황이 지속될 위험이 있었습니다.
목표
- 단방향 연동으로 감지 못하던 외부 데이터 변경을 주기적으로 반영한다.
- 정합성 오류를 조기에 발견해 빠르게 대응한다.
해결 방법과 해결 후보군
후보군 비교
| 방식 | 설명 | 한계 |
|---|---|---|
| 실시간 양방향 동기화 | 변경 즉시 반영 | 외부 웹훅 의존, 구현·결합도 큼 |
| 조회 시마다 외부 확인 | 조회 때 외부 대조 | 매 조회 외부 호출 → 지연·부하 |
| 주기 배치 대조 (채택) | 주기적으로 비교·업데이트 | 준실시간이나 외부 결합 없이 안정적 |
1. 주기적 정합성 배치 구축
Spring Batch를 활용하여 주기적으로 잡플래닛 API에서 공고 데이터를 조회하고, 자사 DB의 공고 상태와 비교하는 배치를 구축했습니다.
@Component
class ExternalPlatformSyncBatch(
private val externalClient: ExternalPlatformClient,
private val entityRepository: EntityRepository,
private val slackNotifier: SlackNotifier
) {
fun syncStatus() {
val externalEntities = externalClient.fetchAll()
val internalEntities = entityRepository.findAllLinked()
externalEntities.forEach { external ->
val internal = internalEntities.find { it.externalId == external.id }
if (internal != null && internal.status != external.status) {
internal.updateStatus(external.status)
slackNotifier.notify(
"상태 불일치 감지: ${internal.title}" +
" (자사: ${internal.status} → 외부: ${external.status})"
)
}
}
}
}잡플래닛 측의 공고 상태(게시 중, 마감, 삭제 등)와 자사 시스템의 공고 상태를 대조하여, 불일치가 발견되면 자사 DB를 잡플래닛 상태에 맞게 업데이트합니다.
2. Slack 알림 대응 체계
상태 불일치가 발견되면 어떤 공고가 어떤 상태에서 어떤 상태로 변경되었는지를 Slack 채널로 자동 알림하도록 했습니다. 운영팀이 변경 사항을 빠르게 인지하고, 필요시 고객사에 안내하거나 추가 조치를 취할 수 있는 대응 체계를 마련했습니다.
sequenceDiagram participant Batch as 정합성 배치 participant Ext as 잡플래닛 API participant DB as 자사 DB participant Slack as Slack loop 4시간마다 실행 Batch->>Ext: 공고 데이터 조회 Ext-->>Batch: 공고 목록 + 상태 Batch->>DB: 자사 공고 상태 조회 Batch->>Batch: 양측 공고 상태 비교 alt 상태 불일치 발견 Batch->>DB: 자사 공고 상태 업데이트 Batch->>Slack: 변경 내용 알림 end end
결과
| 지표 | 결과 |
|---|---|
| 상태 정합성 | 양측 불일치 해소 |
| 대응 체계 | Slack 알림 자동화 |
| 사용자 영향 | 잘못된 공고 상태 노출 방지 |
모니터링
- 배치 실행별 불일치 감지 건수와 업데이트 건수를 관측한다.
- 불일치 발생 시 Slack 알림으로 즉시 대응한다.