백엔드 개발자 김재녕
Introduce
Email : jaenyeong.dev@gmail.com
Github : https://github.com/jaenyeong
여러 스타트업에서 설계부터 개발, 배포 자동화까지 직접 수행하며 경험을 쌓아온 7년 차 현실주의자 개발자입니다.
기술적 성장에 관심이 많아 강의, 스터디를 업무에 활용, 응용하려 노력하고 있습니다.
함께 성장하는 것을 좋아하여 주니어 개발자를 대상으로 Java 강의를 진행하며 이력서 피드백과 멘토링을 진행한 이력이 있고,
개발 문화에 관심이 많아 코드 리뷰와 팀 내 스터디를 리딩한 경험이 있습니다.
Skill
- Language : Kotlin, Java
- Framework : Spring Boot, Exposed(JPA), Kotest(JUnit)
- Database : MySQL
- Cloud : AWS (EC2, ALB, RDS-Aurora, S3)
- ETC : K8s, Kafka, Jenkins, Argo CD, Git, Jira, Slack
Career
에어프레미아랩스 (2024.05~현재) 플랫폼 스쿼드 - 백엔드 개발
항공 도메인 기업의 서비스를 개발하며, 플랫폼 관련 업무와 일부 기능을 개발했습니다.
엔비티 (2024.01~2024.04) G파티 - 백엔드 개발
리워드 서비스인 캐시 슬라이드의 API 서버 구축 및 멀티모듈 구성, 기능 개발과 CI/CD 파이프라인을 구성하였습니다.
에이치디정션 (2021.07~2022.12) 백엔드팀 - 백엔드 개발(DevOps)
헬스케어 소프트웨어를 개발하는 스타트업의 의료 진료 서비스를 개발하며 운영에 필요한 인프라 관리와 기술 영역의 업무를 수행했습니다.
서비스의 API 개발과 실시간 의료 데이터 ETL을 구축하였으며 배포 테스트를 위한 스테이지 서버를 구축했습니다.
스페이스컬쳐 (2019.09~2020.01) 백엔드팀 - 백엔드 개발
인테리어 가구 판매 서비스를 개발하는 스타트업의 스타팅 멤버로 합류, 백엔드 팀을 리딩하며 프로토타입 수준 서비스의 API를 개발했습니다.
프로젝트의 아키텍처와 DB 설계, AWS 인프라 구축과 API 서버 구현 등 개발 프로세스 전반을 직접 수행하며 엔젤 투자 유치에 기여했습니다.
애드오피 (2018.09~2019.09) 개발팀 - 백엔드 개발(AWS 인프라 관리)
광고 미디에이션 서비스 기업에서 광고 비용 정산 서비스, AMP 변환 서비스 등을 개발, 운영했습니다.
레거시 코드를 리팩터링하며 AWS 인프라 관리, 비용 최적화를 통해 클라우드 비용을 절감하였습니다.
미림미디어랩 (2017.04~2018.01) 플랫폼 개발팀 - 앱, 백엔드 개발
이러닝 서비스 기업 스타트업에서 동영상 콘텐츠 재생 서비스의 하이브리드 앱과 API 서버를 구축, 개발했습니다.
한국방송통신전파진흥원 지원사업 방송 콘텐츠 부분 최우수상을 수상하며 회사에 기여했습니다.
진코퍼레이션 (2015.02~2016.07) SCM 솔루션팀 - 윈도우 앱 개발
물류, 풀필먼트를 위한 SCM 서비스 기업에서 제품 피킹, 검품 서비스의 윈도우 앱 개발, 운영했습니다.
Experience
에어프레미아랩스
레거시 레디스를 발키로 마이그레이션 전환 작업 (2개월 / 2025.03~2025.05)
설명: 기존 스탠드얼론 레디스를 안정성, 확장성을 위해 새로 구축하여 전환
개발 환경: AWS Elasticache(Redis OSS, Valkey), Kotlin(Spring Boot, Exposed)
- 많은 모듈, 서비스에서 참조하게 되어 클러스터모드(CME)로 구축
엘라스틱캐시는 중간에 CME로 변경할 수 없어 새로 구축하며 라이센스 등의 문제로 발키로 진행 - 레투스 클러스터모드 커넥션 설정
스프링 데이터 레디스 및 스프링 세션을 사용함에 따라 발키 클라이언트로 레투스를 사용 - 세션 마이그레이션 API 구현
플랫폼 스쿼드 업무 및 다른 스쿼드 지원 (2024.05~현재)
개발 환경: Kotlin(Spring Boot, Exposed), AWS(RDS-Aurora, Elasticache, S3), K8s, CloudFlare
- 레거시 공지사항 API를 신규 개발하며 프로젝트 전체에서 사용할 Exposed의 Page 데이터 스펙(응답) 정의
범용적으로 사용할 수 있게 공통 페이징 쿼리 구현 - 부스팅 이벤트를 통해 서버 확장 시 파드 수 조정 및 모니터링 진행
모니터링 시 필요한 데이터독 대시보드 생성 - 탑승객 설문조사 발송 메시지 배치 구현
탑승객이 메시지 수신에 대해 부정적인 경험을 주지 않기 위해 편도, 왕복을 확인하여 도착지역의 명일 오후 12시를 기준으로 발송 - 앱 개발 관련 플랫폼 설정 및 API 개발 지원
Contribute
백엔드 리드 부재 이후 위클리 리딩
1인 플랫폼 스쿼드로 데브옵스, 인프라 엔지니어와 협업하며 CSP, K8s 관련 업무 진행
다른 스쿼드에 해당하지 않는 도메인 영역에 대한 업무 개발
회원 도메인 영역 CS 대응
엔비티
리워드 광고 서비스의 신규 기능 서버 구축 및 개발 (4개월 / 2024.01~2024.04)
설명: 캐시슬라이드와 다른 리워드 광고 서비스에서 함께 사용할 API 서버 신규 구축(레거시 대체)
개발 환경: Kotlin(Spring Boot, JPA), GCP
- 멀티 모듈 구성과 스프링부트 설정, 젠킨스 CI/CD 파이프라인 구성 등 기능 개발을 위한 진행
- 테스트 코드 작성을 위해 필요한 테스트 더블 설계와 테스트 컨테이너 등 설정
Contribute
CSP, CI/CD 경험이 적은 팀원들을 대신하여 프로젝트 설정과 아키텍처, 인프라 관련 작업을 진행
멀티 모듈과 테스트 코드에 대한 리딩 진행
에이치디정션
의료 진료 서비스 API 서버의 트래픽 부하 증가 시 서버의 내결함성 개선 (1개월 / 2022.12~2022.12)
개발 환경: Kotlin(Spring Boot, JPA), K8s
- API 호출 트래픽 증가 시 API 서버의 K8s 파드 OOMKilled(137) 에러로 발생한 파드 다운 장애 개선
스프링 서버의 메모리 max 설정값이 K8s 파드의 메모리 limit 설정값보다 높아 발생 - 리부팅된 API 서버로 여러 API 요청이 라우팅 된 경우 발생한 서버의 데드락 문제 개선
멀티 스레드로 JPA QueryDSL의 QClass의 초기화가 진행될 때 QClass 간 순환 참조로 데드락 발생
의료 진료 서비스 API 서버의 배포 테스트용 스테이지 서버 구축 (1개월 / 2022.11~2022.11)
설명: 변경된 DB 스키마의 무결성 검증과 QA 등 운영 테스트를 목적으로 운영 환경과 유사하게 구축
개발 환경: Kotlin(Spring Boot, JPA), K8s, Jenkins, ArgoCD, Xen citrix(가상화 솔루션)
- Xen citrix를 사용해 VM 노드 환경(K8s 마스터 노드1대, K8s 워커 노드 3대)을 K8s 최소 환경에 맞게 구축
- 각 VM 노드의 K8s와 운영에 필요한 서비스 모듈 설정, Jenkins와 ArgoCD를 통한 CI/CD 파이프라인 구축
K8s 파드의 추가 메모리 요청을 막기 위해 메모리의 limit, request 값을 동일하게 설정
실시간으로 FHIR 포맷 의료 데이터를 네이버 서버로 연동하는 서비스 구축 (6개월 / 2022.05~2022.10)
설명: 네이버에서 헬스케어 사업의 활용할 목적으로 필요한 FHIR(의료 데이터 국제 기술 표준) 포맷 의료 데이터를 네이버 FHIR 서버로 전송하는 ETL 구축
개발 환경: Kotlin(Spring Boot, JPA), Kafka(K8s Strimzi)
- 네이버 서버로 전송할 의료 데이터를 API 서버에서 카프카 브로커에게 이벤트 메시지를 전송하는 기능 구현
서비스 간 결합도를 낮추기 위해 카프카 도입, JPA의 엔티티 리스너에서 제로페이로드 방식으로 이벤트 메시지를 생성하는 형태 - 위 작업으로 발생된 JPA 엔티티 모듈의 카프카 의존성을 제거하여 서브 모듈의 불필요한 의존성을 없애는 리팩터링
JPA 엔티티 모듈의 이벤트 메시지 프로듀싱 부분을 인터페이스화하여 해당 구현 로직을 API 서버 모듈로 이동하여 리팩터링 - 브로커의 이벤트 메시지의 PK를 통해 의료 데이터를 조회/변환하여 네이버 서버로 전송하는 컨슈머 모듈 구현
데이터의 조회를 컨슈머에서 실행하여 데이터를 최대한 최신 데이터를 전송하도록 처리 - Jenkins와 ArgoCD로 컨슈머 모듈의 CI/CD 설정
의료 데이터를 FHIR 포맷으로 변환, 일괄 전송하는 모듈 개발 (6개월 / 2021.10~2022.04)
설명: 자사 서비스에서 생성된 의료 데이터를 헬스케어 사업 전반에 범용적으로 활용하기 위해 개발
개발 환경: Kotlin(Spring Boot, JPA), K8s, NCP(Container Registry), ArgoCD
- HL7 FHIR 문서와 HAPI FHIR 프레임워크를 활용해 의료 데이터를 FHIR 포맷으로 변환하는 로직 구현
- 네이버 FHIR 서버에 데이터 전송 시 보안을 위해 FHIR 프레임워크 계층에 데이터 암복호화 인터셉터 구현
AES-GCM(Advanced Encryption Standard Galois/Counter Mode) 사용 - 기존 의료 데이터 약 1만 건을 FHIR 포맷으로 변환, 네이버 FHIR 서버로 일괄 전송하는 기능 구현
전송 데이터의 조회/변환 시(약 50초 소요) 발생하는 DB READ Timeout(30초)을 코틀린 컬렉션의 parallel(CommonThreadPool)과 스프링 @Async를 활용해 처리(약 10초) - 변환 로직과 전송 기능을 테스트 하기 위한 FHIR 테스트 서버를 도커 컨테이너로 온프레미스에 구축
의료 진료 서비스의 타이머 측정과 진단과 처방 코드 묶음 지원 등 기능 구현 (3개월 / 2021.07~2021.09)
개발 환경: Kotlin(Spring Boot, JPA), MySQL, MongoDB
- 여러 진료과가 있는 병원에서 질병에 따라 기본 진료과가 결정되는 기능 구현
진료과 배정 시간을 단축하여 진료 업무 환경 개선 - 수많은 복잡한 약물을 쉽게 확인하기 위해 용법코드, 용법명, 투여경로, 횟수 등을 기준으로 정렬하는 기능 구현
- 진단검사의학과 전문의 데이터를 기준으로 검체 검사(알레르기 검사 등)의 코드를 자동으로 산정하는 기능 구현
- 잦은 빈도로 같이 사용되는 진단과 처방 코드를 한 번에 사용하는 묶음 기능 구현
- 새로 추가된 정신과에서 진료비를 산정하기 위한 진료 시간 측정 타이머 기능 구현
불필요한 요청을 막기 위해 최초 데이터 생성 이후에는 진료 시간이 기존보다 큰 경우만 업데이트하도록 처리
Contribute
신규 입사자 대상으로 Git(사내 브랜치 전략 등) 온보딩 진행
코드 리뷰를 리딩하며 팀원들의 코드 리뷰 참여도를 높이는데 기여
OOP, 클린코드 등과 효율적인 테스트 케이스 작성 권장
팀원들의 실력 상향 평준화를 위해 코틀린, OOP 등 스터디 진행
스페이스컬쳐
인테리어 가구 판매 서비스를 개발, 인프라 구축 (5개월 / 2019.09~2020.01)
설명: 엔젤 투자를 받기 위한 프로토타입 수준의 서비스 개발
개발 환경: Java(Spring Boot, MyBatis), AWS
- 결제 서비스인 Bootpay의 API를 활용하여 결제와 검증, 취소 API 구현
- FireStore(구글 실시간 DB)에 채팅 데이터 삽입 기능 구현
채팅 데이터 특성상 수정이 불가능하고 앱 간 데이터 동기화 등을 위해 구글의 문서형 NoSQL인 FireStore 사용 - 그 외 상품 조회, 카트 등 기능 구현
- AWS를 사용하여 3Tier(ELB-EC2-RDS) 형태로 서비스 운영 환경 구축
- API 서버 로그 롤링 설정 시 결제, 채팅 등 주요 기능별로 로그 파일을 생성하도록 설정
모니터링, 알람 등과 같은 기능이 없는 상황에서 쉽게 버그에 대한 로그 확인과 추후 메트릭 수집 등 기능 확장을 위해 처리
Contribute
스타팅 멤버로 합류하여 엔젤 투자 유치에 기여
백엔드를 메인으로 개발하며 백엔드 팀의 주니어 개발자 리딩
애드오피
인사 관리 시스템의 전자 결재, 휴가 관리 기능 유지보수 (1개월 / 2019.08~2019.08)
개발 환경: PHP(CI), AWS(S3)
- AWS S3 SDK를 활용해 전자 결재 시 영수증 파일 업로드 기능 유지보수
- 직원의 연차별 휴가 일수 산정 기능 유지보수
광고 수익 정산 서비스의 수익 정산, 수익 이월 등 주요 기능 유지보수 (4개월 / 2019.04~2019.07)
개발 환경: Java(Spring Boot, MyBatis), AWS(S3)
- 국가별 환율에 따라 부가세 계산, 매체별 배분율 계산 등 수익 정산 기능 유지보수
- 정산 이월, 지급일 변경, 광고 수익 지급 내역 메일 전송 등 기능 유지보수
- AWS S3 SDK, Apache POI를 활용해 매체별 광고 수익 데이터 파일 업로드 기능 구현
수동으로 입력하던 매체별 광고 수익을 파일 업로드 처리로 대체하면서 운영팀의 업무 시간 개선 - 기능별 중복 코드 제거 리팩터링하면서 템플릿 메서드 패턴 등을 활용해 클래스 구조 개선
AWS 인스턴스 관리, 비용 최적화 (2개월 / 2019.02~2019.03)
- RDS 서버 스케일 업 (r4 > r5), S3 백업 설정 추가
- EC2 스케일 아웃 시 해당 AZ의 가용 리소스가 부족한 경우 오토 스케일링 그룹에 다른 AZ 추가 설정
같은 리소스 스펙이라 하더라도 AZ에 따라 성능 차이가 존재하여 기존에는 특정 AZ만 사용 - RDS의 log_queries_not_using_indexes 옵션으로 인덱스를 사용하지 않아 약 10초 이상이 소요되는 슬로우 쿼리를 찾아 1초 미만으로 개선
slow_query_log 설정으로는 동시에 실행되는 진짜 느리지 않은 쿼리까지 기록에 남아 확인이 어려움 - 미사용 서비스 모듈을 제거하면서 약 3개의 EC2 인스턴스를 함께 제거하여 월 기준 약 $200 절약
- 메가존 빌링 서비스를 활용해 월별 지출 비용 확인, 관리하며 최적화 방향 논의
일반 웹 페이지를 AMP(Accelerated Mobile Pages)로 변환하는 서비스 개발, 유지보수 (5개월 / 2018.09 ~ 2019.01)
설명: 더욱 빠른 AMP 페이지로 고객들의 이탈 방지를 위한 서비스
개발 환경: Java(MyBatis), Jsoup(크롤링 라이브러리), AWS(RDS-Aurora)
- Jsoup를 사용하여 대중매체가 제공하는 RSS(Rich Site Summary)를 AMP 데이터로 변환하는 크롤링 모듈 개발, 크론탭으로 반복 실행 처리
- AMP 변환 모듈을 Jenkins(execute shell)와 Bitbucket(web hook)을 사용하여 CI/CD 설정
- 구현한 스크래핑 모듈과 기능이 비슷한 모듈 6개를 모아 멀티 모듈로 구성, 기능 병합을 통해 소스 저장소를 1개로 줄이면서 관리 포인트 개선
- AMP 데이터를 가져와 AMP 페이지로 퍼블리싱 하는 서버 유지보수
AMP 가이드를 기준으로 유효성을 확인하는 로직 구현, AMP(+AMP Story) 템플릿 수정 - 구글 SEO(Search Engine Optimization)를 위한 가이드 적용, 사내 문서화
검색 시 해당 페이지를 상단에 노출 시켜 더욱 더 많은 클릭 유도, 광고 노출을 위해 SEO 적용
Contribute
평상 시 진행한 AWS 스터디로 AWS 담당자 부재 시 클라우드 인프라 관리 업무를 임시로 수행
미림미디어랩
콘텐츠 동영상 재생 서비스의 하이브리드 앱과 API 서버 개발 (10개월 / 2017.04~2018.01)
개발 환경: Java(Spring Boot, MyBatis), AWS, TypeScript(Ionic)
- Ionic 프레임워크를 활용해서 하이브리드 앱 개발, 화면 레이아웃 렌더링 구현
네이티브 앱 개발자의 부재로 하이브리드 앱으로 개발 - 채널, 시청 기록, 구독, 코멘트 등 기능 CRUD API 개발
- 운영 API 서버를 AWS의 3Tier(ELB-EC2-RDS) 형태로 구축하여 서비스 론칭
- ehCache(캐시 라이브러리)를 사용하여 영상 데이터 캐싱 처리를 통해 Vimeo(동영상 파일 서버) API 호출 제한 횟수 초과 장애 처리
Contribute
한국방송통신전파진흥원 지원사업 방송 콘텐츠 부분 최우수상 수상
주니어 개발자 채용 면접 참여
낭비되는 유휴 데스크탑에 OS, Git 등을 설치하여 사내 소스 저장소로 활용
진코퍼레이션
VB6, PowerBuilder, Oracle, MS Access
- 아모레퍼시픽 오산 물류센터 B2B 관리 시스템 유지보수 (2개월 / 2016.06~2016.07)
엑셀파일 업로드 기능 구현, 데이터 운송장 출력 기능 구현 - 아모레퍼시픽 김천 물류센터 B2C 검품 시스템 개발 (6개월 / 2015.12~2016.05)
피킹 제품 일치 여부 확인, 배송 정보 조회, 운송장 출력 등 기능 구현
개발한 검품 프로그램을 현장 PC에 설치, 환경 설정을 위해 고스트를 활용해 약 50대 PC의 세팅 시간을 약 30분에서 15분 이하로 개선 - 아모레퍼시픽 오산 물류센터 PCS(Picking Cart System) 유지보수 (4개월 / 2015.08~2015.11)
피킹 프로세스 변경과 운송장, 주문 내역서 등 출력 데이터 포맷 변경, 제품/랙 위치 등 화면 레이아웃 변경 - 아모레퍼시픽 TMS(Transport Management System) 배송 앱 메시지 전송 기능 유지보수 (1개월 / 2015.07~2015.07)
앱 문자 송신 기능 버그 수정, 메시지 내용 변경 - 아모레퍼시픽 미국 물류센터 B2B 검품, PCS(Picking Cart System) 개발 (4개월 / 2015.03~2016.06)
- 아모레퍼시픽 BMS(Buy-Move-Sell) 자재 입출고 관리 시스템 유지보수 (1개월 / 2015.02~2015.02)
Contribute 미국 1개월, 경북 김천 6개월 등 장기 출장으로 현장 통합테스트 수행 시스템 안정화에 기여
Activity
원티드 프리온보딩 백엔드 챌린지 6월 과정 Java 강의 진행 (2023.06)
- 함께 성장하기 위한 목적으로 진행하였으며 JVM 메모리구조, GC, 스레드 동기화 등을 주제로 진행
- 원티드 프리온보딩 백엔드 챌린지 6월
- 강의 자료
Learn
교육자 양성 과정 2기 / NEXTSTEP (2022.09~2022.10)
- 이를 통해 동료에게 주입식 교육이 아닌 스스로 사고할 수 있도록 리딩하는 방법 학습
- 우아한 테크코스 수강생에게 코드리뷰 문화 개선 주제로 강의
도커/쿠버네티스 온라인 부트캠프 with 카카오엔터프라이즈 1기 (2021.08~2022.01)
- K8s를 실습을 통해 학습하여 에이치디정션의 의료 진료 서비스 운영과 스테이지 서버 구축 시 활용
우아한테크캠프 Pro 1기 / NEXTSTEP & 우아한형제들 (2020.12~2021.01)
- TDD(Test Driven Development), ATDD(Acceptance TDD), JPA, 레거시 리팩터링 방법을 하여 에이치디정션에서 개발, 코드 리뷰 시 활용
- 수강생(지원자 약 200명 중 약 40명 선발) 중 우수 수료생(20명)으로 최종 수료
Education
- [2020.03 ~ 2020.08] 국가평생진흥교육원 컴퓨터 공학과
- [2009.03 ~ 2015.02] 인하공업전문대학 컴퓨터 정보과
License
일자 | 자격증명 | 발급 기관 |
---|---|---|
2018.07.10 | SQLD | 한국 데이터 산업 진흥원 |
2016.11.21 | 정보 처리 기사 | 한국 산업 인력 공단 |