JungHoon Control Center backend-portfolio.local
← Projects
LEAD · 24.01 ~ 25.10 · 백엔드 5명

00항공 물리 보안 통합 시스템

임직원·협력사·방문객의 출입 권한 신청/승인, 방문 관리, 출입 이력, 주차, 보안 카드·게이트 연동, 외부 인사 시스템 연동을 통합 제공하는 MSA 기반 출입보안 플랫폼입니다. 요구사항 정의·서비스 범위 분리·시스템 설계·개발환경 인프라·CI/CD를 총괄했고, HR·출입권한·Auth·파일 서비스와 개발환경 Gateway를 직접 개발했습니다.

24.01~25.10Spring Boot 3KubernetesArgoCDPostgreSQLRedis

Role & Scope

출입보안 MSA 플랫폼의 요구사항 정의부터 인프라·배포·핵심 서비스 개발까지 총괄했습니다.

LEAD 24.01 ~ 25.10
기간
2024.01 ~ 2025.10
역할
개발 총괄 (백엔드 5명)
대상 규모
임직원 약 20,000명 · 협력사 약 300명
기술 스택
Spring Boot 3 · Java 17 · QueryDSL · K8s · ArgoCD · Argo Rollouts · PostgreSQL · Redis · S3 · Spring Cloud Gateway
  • 프로젝트 초기 요구사항 정의 및 서비스 범위 분리
  • 온프레미스 Kubernetes 클러스터 설치 및 설정
  • ArgoCD + Argo Rollouts 기반 GitOps 배포 체계 구성
  • Spring Cloud Gateway + DiscoveryClient 개발환경 Gateway 구성
  • Kubernetes CoreDNS 기반 서비스 간 통신 구조 설정
  • HR · 출입권한 · Auth · 파일 서비스 직접 개발
  • 고객사 개발환경(Jira · Jenkins · Bitbucket) 이관 대응

Architecture

약 10개 서비스를 단일 namespace에서 운영하는 MSA 구조와, 각 서비스 단에서 처리하는 공통 인증·인가 및 결재 callback 흐름입니다.

아키텍처 1 — 전체 MSA 및 GitOps 배포 구조

flowchart TB
  User["관리자 / 임직원 포털"] --> Entry["Gateway (dev)<br/>운영은 Apigee로 대체"]
  subgraph K8s["On-Prem Kubernetes Namespace"]
    HR["HR 서비스"]
    AUTH["Auth 서비스<br/>물리카드 · 모바일사원증 · 안면인식"]
    ACCESS["출입권한 서비스"]
    APPROVAL["결재 서비스"]
    PARKING["주차 서비스"]
    NOTI["알림 서비스"]
    DOOR["출입문 서비스"]
    MENU["메뉴 서비스"]
    VISITOR["방문객 서비스"]
    FILE["파일 서비스"]
    PG[("PostgreSQL")]
    REDIS[("Redis")]
    S3[("S3")]
  end
  Entry --> HR
  Entry --> AUTH
  Entry --> ACCESS
  Entry --> APPROVAL
  Entry --> PARKING
  Entry --> NOTI
  Entry --> DOOR
  Entry --> MENU
  Entry --> VISITOR
  Entry --> FILE
  ExternalHR["외부 인사 시스템 API"] --> HR
  ACCESS --> DoorAPI["외부 출입문 시스템 API"]
  AUTH --> DoorAPI
  FILE --> S3
  HR --> PG
  AUTH --> PG
  ACCESS --> PG
  APPROVAL --> PG
  PARKING --> PG
  NOTI --> PG
  DOOR --> PG
  MENU --> PG
  VISITOR --> PG
  FILE --> PG
  HR --> REDIS
  ACCESS --> REDIS
  APPROVAL --> REDIS
  VISITOR --> REDIS
  GitHubActions["GitHub Actions"] --> ArgoCD["ArgoCD"]
  ArgoCD --> Rollouts["Argo Rollouts"]
  Rollouts --> K8s
          

아키텍처 2 — 공통 인증·인가 및 결재 callback 흐름

sequenceDiagram
  participant C as Client
  participant S as Domain Service
  participant R as Redis (HR Cache)
  participant A as Approval API
  participant D as External Door System
  C->>S: JWT + 암호화 사번 + 요청 대상
  S->>S: JWT 유효성 검증<br/>(서명 · 만료 · issuer · audience)
  S->>S: 암호화 사번 복호화
  S->>R: HR 기준정보 조회
  S->>S: JWT 사번 = 복호화 사번 = 요청 대상 검증
  S->>A: 결재 요청 / 승인 판단 요청
  A->>A: 승인권자 여부 판단
  alt 최종 결재 완료
    A->>S: callback 호출
    S->>D: 사용자 · 카드 · 권한 반영
  else 중간 결재 단계
    A-->>S: 대기 상태 유지
  end
          

What I Did · 문제 해결

서비스 경계 정의, 공통 검증 패턴, 외부 시스템 실패 재처리와 정합성 보정까지 직접 설계·구현했습니다.

  1. MSA 개발환경 및 배포 체계 구축

    약 10개 Spring Boot 서비스를 하나의 namespace로 운영하는 온프레미스 Kubernetes 환경을 구성했습니다.

    GitHub Actions · ArgoCD · Argo Rollouts로 서비스별 자동·점진 배포가 가능하게 했고, 이후 고객사 표준 개발환경(Jira · Jenkins · Bitbucket)으로 이관했습니다.

  2. Gateway 및 서비스 간 통신 구조 설계

    개발환경에서는 Spring Cloud Gateway + DiscoveryClient로 프론트의 단일 호출 규칙을 각 서비스로 라우팅하는 진입점을 구성했습니다.

    운영에서는 Apigee가 Gateway를 대체하므로, 인증·인가·CORS는 Gateway에 집중시키지 않고 각 서비스 단에서 처리하도록 설계했습니다. 서비스 간 통신은 CoreDNS 기반 서비스 DNS로 처리했습니다.

  3. HR 서비스 개발

    외부 인사 시스템 API를 주기 배치로 호출해 임직원 정보·조직도·부서·직책·재직 상태를 동기화하고, 내부 도메인 모델로 재구성했습니다.

    신규 입사·정보 변경 이벤트를 기준으로 사원증 생성·기본 출입권한 부여 등 후속 프로세스의 기준 데이터로 활용했고, 신규 도입된 협력사 직원 관리 도메인을 직접 설계·개발했습니다.

  4. Auth 서비스 개발

    물리 사원증·모바일 사원증·안면인식 정보를 통합 관리하는 Auth 서비스를 개발했습니다. 실제 출입 인가는 외부 출입문 시스템이 수행하고, 본 서비스는 인증매체를 외부 시스템이 요구하는 카드 형태로 등록·관리했습니다.

    모바일 사원증은 사번 기반 가상 카드번호를 생성해 외부 카드 정보로 매핑했고, 물리 사원증은 분실·재발급·반납 등 생애주기 로직을 유지했습니다.

  5. 출입권한 서비스 설계 및 개발

    출입문을 최소 단위로 모델링하고, 여러 출입문을 묶는 권한 그룹을 설계했습니다. 개인·부서·부/실 3종 권한 체계와 기본권한 자동 부여, 신청/승인 후 부여, 관리자 수동 부여를 모두 지원했습니다.

    부서 이동 시 변경된 조직 기준으로 권한을 재계산·재부여하고, 방문객 권한은 기간 만료 후 회수되게 했습니다. 외부 출입문 시스템의 대량 요청 처리 제약 때문에 전체 임직원 기본권한 반영은 새벽 배치로 분리했습니다.

  6. 외부 출입문 시스템 연동 안정화

    외부 API 요청·응답을 모두 DB에 저장해 감사 추적이 가능하게 했습니다. 호출 실패 시 애플리케이션 내부 재시도 큐로 1차 실패 → 재시도 → 2차 실패 → 재시도 형태로 최대 4회 재시도했습니다.

    최종 실패 건은 관리자에게 메일로 통지해 전용 클라이언트에서 수동 보정하게 하고, 새벽 보정 배치로 내부 권한 상태와 외부 반영 상태의 정합성을 맞췄습니다.

  7. 공통 인가 패턴 설계

    각 서비스는 요청 시 JWT·암호화 사번·요청 대상 식별자를 함께 받았습니다. 서비스 단에서 JWT 서명·만료·issuer·audience를 검증한 뒤, JWT 사번 = 복호화 사번 = 요청 대상이 일치하는지 검증했습니다. 고객사 표준 개발환경으로 이관한 뒤에는 JWT 대신 Apigee 토큰으로 검증했습니다.

    민감정보·결재 요청 등 추가 검증이 필요한 endpoint는 어노테이션 기반으로 검증 로직을 명시했고, HR 기준정보는 Redis에 캐싱해 매 요청마다 HR 서비스를 직접 호출하지 않도록 했습니다.

  8. 결재 및 callback 기반 후속 처리 구조 설계

    결재 승인은 각 도메인 서비스가 직접 판단하지 않고, 요청자 사번·결재 ID를 결재 API에 전달해 결재 서비스가 승인권자 여부를 판단하도록 책임을 분리했습니다.

    최종 결재 차수가 완료되면 결재 서비스가 모바일 사원증 신청·출입권한 신청 등 원 도메인의 callback을 호출해 후속 비즈니스 로직을 진행하는 구조로 설계했습니다.

  9. 파일 서비스 개발

    공통 파일 업로드/다운로드 API와 메타데이터 관리를 담당하는 파일 서비스를 개발했습니다.

    파일은 S3에 저장하고 다운로드는 S3 Presigned URL을 발급해 애플리케이션 서버가 바이너리를 직접 중계하지 않도록 했으며, 업로드 시 확장자·용량 제한을 적용했습니다.

Impact · 성과

면접에서 강조할 핵심 어필 포인트입니다.

  • 임직원 약 20,000명, 협력사 약 300명 규모의 출입보안 도메인을 다루는 MSA 플랫폼을 총괄했습니다.
  • 인프라·배포·인증/인가·HR 기준정보·인증매체 관리·권한 설계·외부 시스템 연동 안정화까지 연결되는 백엔드 리드 경험을 보여줍니다.
  • 단순 기능 개발이 아니라 서비스 경계 정의, 공통 검증 패턴, 실패 재처리 절차, 정합성 보정 배치까지 포함한 아키텍처 설계 역량을 증명한 프로젝트입니다.
Action completed