백엔드 개발자 김재녕
Introduce
Email : jaenyeong.dev@gmail.com
Github : https://github.com/jaenyeong
코틀린과 스프링을 주력으로 개발하는 6년 차 백엔드 개발자 김재녕입니다.
스타트업에서의 경험을 통해 설계부터 배포 자동화까지 직접 수행하며 경험을 쌓았습니다.
다양한 기술에 대한 관심이 많아 강의를 꾸준히 수강하며 업무에 활용하려 노력하고 있습니다.
함께 성장하는 것을 좋아하여 주니어 개발자를 대상으로 Java 강의를 진행하며 이력서 피드백과 멘토링을 진행했습니다.
개발 문화 개선에도 관심이 많아 코드 리뷰와 팀 내 스터디를 리딩한 경험이 있습니다.
Skill
- Language : Kotlin, Java
- Framework : Spring Boot, JPA, JUnit
- Database : MySQL
- Cloud : AWS (EC2, ALB, RDS-Aurora, S3)
- ETC : K8s, Jenkins, Argo CD, Git, Jira, Slack
Career
에이치디정션 (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
에이치디정션
의료 진료 서비스 API 서버의 트래픽 부하 증가 시 서버의 내결함성 개선 (1개월 / 2022.12~2022.12)
개발 환경: Kotlin(Spring Boot, JPA), K8s(Docker)
- 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(Docker), 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(Docker), NCP(Container Registry), Jenkins, 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, Git(Bitbucket)
- 결제 서비스인 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), Git(Bitbucket)
- 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 | 정보 처리 기사 | 한국 산업 인력 공단 |