가. 통합 인증 시스템 풀스택 개발
풀스택 개발, 서비스 설계, 인프라 구성을 경험하여 개발 전반에 대한 안목을 키웠습니다.
1) Vue 기반으로 SPA를 개발할 수 있습니다
Vue를 활용하여 SPA(Single Page Application)를 개발할 수 있습니다. 더불어 프런트엔드 개발 경험을 토대로 서비스 개발 전반에 대한 이해가 높아졌습니다. API 설계 시 API 사용자 관점에서 중복이나 불필요한 리소스의 낭비를 줄일 수 있습니다. 로그아웃이나 소셜 연동 해제 구현 시 사용자 인증 정보의 전달 없이도 구현할 수 있습니다. 또한 API 응답 시 에러 코드를 세분화하고, 꼭 필요한 데이터만 포함하는 부분에 대한 안목을 키웠습니다.
2) 인프라 구성에 필요한 핵심 컴포넌트를 설계할 수 있습니다
인증 시스템 설계 및 구현 경험을 바탕으로 시스템의 핵심 컴포넌트를 설계하고 구성할 수 있습니다. 특히 요구사항에 따라 AWS의 다양한 서비스를 구성하여 인프라를 구축할 수 있습니다. 더불어 범용적으로 사용되는 카프카 기반의 메시징 시스템과 이미지 분산 처리 시스템을 구성할 수 있습니다. 통합 인증 시스템에서는 사용자 정보의 변경사항을 연동 서비스에 실시간으로 전달하기 위해 카프카 기반의 메시징 시스템을 활용합니다.
통합 인증 시스템 구성도
graph TD WEB[Web Client] -->|HTTP API 요청| FAUTH[Front Auth Server] FAUTH --> PGW[GW Server / Routing] PGW --> MAUTH[Main Auth Server] MAUTH -->|데이터 조회 및 갱신| RDS[RDB / AWS Aurora] MAUTH -->|사용자 수정 이벤트 발생| KAFKA[Message Broker / Kafka] KAFKA -->|이벤트 전달| S1[연동 서비스 1] KAFKA -->|이벤트 전달| S2[연동 서비스 2] KAFKA -->|이벤트 전달| S3[연동 서비스 3] subgraph "Private VPC" PGW MAUTH RDS KAFKA S1 S2 S3 end class WEB,FAUTH,PGW publicStyle class MAUTH,RDS,KAFKA privateStyle class S1,S2,S3 targetServiceStyle classDef publicStyle fill:#008000,stroke:#333, stroke-width:2px, color:white classDef privateStyle fill:#800000,stroke:#555,stroke-width:2px, color:white classDef imageStyle fill:#000080,stroke:#555,stroke-width:2px, color:white classDef targetServiceStyle fill:#505050,stroke:#666,stroke-width:2px, color:white
Mermaid
복사
3) 다양한 인증 기능을 구현할 수 있습니다
사용자를 인증(authentication)하는 다양한 방법을 구현할 수 있습니다. 대표적으로 PASS 기반 본인 인증, OAuth 기반 소셜 인증, 대칭키 기반의 AES 기본 인증 등을 구현했습니다. 인증 서버의 보안성과 사용자의 편의성을 고려하여 다양한 인증 방식을 비교하며 설계하였습니다.
나. 저비용 고가치 중심의 테스트 설계 역량 향상
저비용 고가치의 테스트를 중심으로 지속 가능한 테스트 스위트(suite)를 유지할 수 있습니다.
1) e2e 및 통합 테스트를 토대로 API를 설계할 수 있습니다
e2e 테스트와 통합 테스트를 토대로 HTTP API의 핵심 동작을 설계할 수 있습니다. 테스트를 정의하기 전에 API의 핵심 동작에 대한 순서도를 작성하고, e2e 테스트를 작성하며 API의 요청과 응답을 설계하는 방법을 선호합니다. 구현의 경우, 가장 간단한 방식(Happy Path)으로 동작하도록 구현합니다. 이후 순서도의 분기를 검증하는 통합 테스트를 작성하고 이를 통과하도록 코드를 수정하며 기능을 완성합니다.
순서도 예시
e2e 테스트 예시 코드
통합 테스트 예시 코드
2) 테스트 코드와 구현 코드의 결합을 최소화하여 저비용의 통합 테스트를 작성할 수 있습니다
API 내부 구현을 수정해도 테스트 코드를 수정할 필요가 없는 형태로 통합 테스트를 작성할 수 있습니다. 특히, Mock 사용을 최소화하는 방향으로 통합 테스트를 작성할 수 있습니다. Mock이 필요한 경우는 오직 외부 시스템과 상호작용 하는 로직으로 한정하여 테스트를 정의합니다. 이하의 예시 테스트 코드와 같이 외부 시스템과의 상호작용하는 로직의 예로 AWS 이메일 전송 서비스 호출이 있습니다.
참고로 테스트 철학과 방법론은 Unit Testing by Vladimir Khorikov의 영향을 받았습니다.
Mocking 통합 테스트 예시 코드
3) 비지니스 정책 중심의 저비용 고가치 단위 테스트를 작성할 수 있습니다
비지니스 로직이 정의된 도메인 모델을 중심으로 단위 테스트를 작성할 수 있습니다. 저비용 고가치의 단위테스트는 다른 모듈에 의존성이 없고 비지니스 정책을 다루는 도메인 모델을 중심으로 작성합니다. 도메인 모델의 핵심 동작과 상태 그리고 예외 등에 대해 단위 테스트를 작성합니다.
단위 테스트 예시 코드
다. 장애 모니터링 및 대응 역량 향상
서비스 장애에 24시간 대응할 수 있고, 장애 발생 요인에 따라 원인을 빠르게 특정할 수 있습니다.
1) 24시간 서비스 장애에 대응할 수 있습니다
서비스 장애에 24시간 내내 반응하고 대응할 수 있습니다. 24시간 장애에 즉시 반응하기 위해서는 장애 알람 발생 시스템과 알람 반응 환경이 구축되어야 합니다. 장애 알람 발생 시스템은 서버 에러가 짧은 시간 동안 여러 번 발생하는 상황을 포착하여 메신저로 장애 메시지를 전송하도록 구성할 수 있습니다. 알람 반응 환경은 24시간 스마트워치를 착용한 상태에서 장애 메시지에 즉각 반응하는 방향으로 만들 수 있습니다.
장애에 즉시 대응하기 위해서는 업무용 맥북을 항상 지참해야 합니다. 더불어 어떤 환경에서도 사내 네트워크에 접속하기 위해 집과 휴대전화 네트워크의 IP를 서버 네트워크 인바운드 정책에 포함시켜야 합니다.
2) 지표와 로그를 토대로 장애 원인을 빠르게 특정할 수 있습니다
장애 원인을 빠르게 특정하는 것을 목적으로 지표와 로그를 설계할 수 있습니다. 플랫폼 시스템의 경우, 다수의 연동 서비스가 존재하기 때문에 장애 포인트가 플랫폼 자체일 수도 있고 각각의 연동 서비스일 수 있습니다. 따라서 장애 포인트를 제대로 파악하기 위해서는 플랫폼 서비스를 포함한 서비스별 API 응답 시간의 평균과 최대치를 지표로 삼아서 이상 징후를 포착할 수 있습니다.
지표를 토대로 이상 서비스를 분류했다면 로그를 토대로 세부적인 장애 포인트를 파악할 수 있습니다. 특히 API별 응답 시간에 대한 로그를 남긴다면 문제가 되는 API를 쉽게 특정할 수 있습니다. 또한 외부 시스템과 통신하는 로직에 반드시 로그를 남기는 것이 중요합니다. 내부 시스템에 원인이 있는 경우에는 예외 콜스택을 타고 들어가 세부 원인을 쉽게 파악할 수 있지만, 외부 시스템은 그렇지 못한 경우가 많기 때문입니다.
라. 지식 공유 기반 동반 성장 추구
지식은 공유할 때 가장 가치있다고 믿습니다. 실무 지식과 경험을 동료와 적극적으로 공유합니다.
1) 신기술 도입을 먼저 제안하고 상세한 가이드 문서를 공유하여 실무에 빠르게 도입할 수 있습니다
신기술을 리서치하고 조직의 환경에 맞게 지식을 정제하여 동료와 나누는 것을 즐깁니다. Java에서 Kotlin으로 전환하는 과정에서 Kotlin과 궁합이 좋은 테스트 프레임워크와 린터를 도입하는 것을 제안했습니다. 테스트 프레임워크로 Kotest, 린터로 Ktlin를 선정했고, 조직의 환경에 맞게 설정하고 활용하는 방법에 대해 아래와 같이 정리하여 공유했습니다. 결과적으로 두 가지의 도구는 사내 대부분의 프로젝트에 적용되었고, 협업에 따른 개발 비용을 줄였다는 평가를 받았습니다.
참고) 신기술 적용 가이드 문서
2) 실무 경험을 정제하여 동료과 효과적으로 공유할 수 있습니다
경험의 품질을 높이고, 그 가치를 인정 받는 방법은 공개하고 공유하는 것입니다. 이 믿음에 따라 OGQ에 재직하는 기간 동안 두 번의 개발자 컨퍼런스에서 발표했습니다. 더불어 가치있는 실무 경험과 지식을 동료들과 공유했습니다.
참고) 동료들과 공유한 지식