백엔드 개발자 유재용

#Intro

자바와 스프링을 주력으로 개발해 온 5년차 개발자 유재용입니다.
HR인사시스템, 소스코드 정적분석 및 검증, OTA 여행사 등 다양한 분야에서 개발했으며 새로운 환경에 적응도 빠른 편입니다.
항상 심심하지 않게 개발하고 싶어서 사내 개발 문화를 개선하고 새로운 기술을 적용하는 것을 좋아합니다.
무엇이든 배우는 걸 좋아하고 배운 걸 함께 이야기하며 나누는 건 더 좋아하는 편입니다.

#Skill

  • Language: java, typescript
  • Framework: spring boot, spring webFlux, spring mvc, myBatis, angular
  • Database: oracle, postgresql, redis
  • Etc: git, jenkins

#Career

노랑풍선(2021.11 ~ ) FIT플랫폼개발팀 - 백엔드 개발, 프론트엔드 개발, 서비스 운영
패키지여행 및 실시간 항공권, 호텔 등 다양한 여행정보를 제공하는 여행사의 OTA(Online Travel Agency) 플랫폼의 항공 시스템을 개발하였고 운영 중 발생하는 다양한 이슈에 대응하였습니다. 그 외 API 문서 자동화, 코딩 컨벤션 정리, git merge 템플릿 작성, 사내 토이프로젝트를 운영하여 점심식사 봇 구현 등 개발 문화 개선에 기여하였습니다.

  • java(spring webFlux, myBatis, junit), oracle, redis, typescript(angular), jenkins, git(Gitlab)

코드마인드(2019.07 ~ 2021.04) SW연구소 정적분석팀 - 백엔드 개발
소프트웨어 분석 및 검증을 전문적으로 하는 기업의 정적분석팀 선임연구원으로 오픈소스 수집기 개발과 윈도우용 오픈소스 라이선스 분석 프로그램, 분석엔진의 개선작업을 하였습니다. 또한 기업의 주력 솔루션인 정적분석 도구 CodeMind CSI/CQI의 기능개발, 개선 업무를 하였습니다.

  • java(spring boot, myBatis), oracle, postgresql, c#, python, scala

휴먼컨설팅그룹(2017.04 ~ 2019.03) Solution Division - 풀스택 개발
웹기반 인사시스템인 E-HR 솔루션을 개발하는 회사에서 인사,근태,급여 등 관련 모듈의 풀스택 개발과 각 고객사의 커스텀 개발, 운영 및 유지보수를 진행하였습니다.

  • java(Struts, jsp), oracle

#Edu

  • [2011.03 ~ 2017.02] 성공회대학교 소프트웨어공학과 졸업

#License

취득일 자격증명 발급기관
2019.08.16 정보처리기사 한국산업인력공단

#Learn

비트교육센터(2016.07 ~ 2016.12) JAVA Enterprise 고급양성과정 E
교내에서 진행한 청년취업아카데미 연수과정으로 Java 기반의 웹개발자 양성을 위한 기초부터 심화과정을 교육받았습니다.
졸업팀플로 Node.js와 Socket.io를 사용하여 채팅 프로그램을 구현하고 HTML Canvas를 사용하여 UML다이어그램으로 설계 후 Spring MVC 패턴의 스켈레톤 코드를 생성하는 프로그램을 개발했습니다.


#Work

노랑풍선

여행사의 OTA 실시간 항공권 조회,예약 시스템 개발 및 운영, 유지보수 업무

노랑풍선 OTA 항공시스템 운영 및 개선
Java(spring webFlux), Nginx

  • 네이버 국내선 입점 후 트래픽 과부하 개선
    • 네이버 항공시스템에 입점개발을 완료하여 오픈하니 트래픽이 기존보다 대략 10배 가까이 증가하여 응답시간이 지연되고 과부하 발생
    • Thread 전환 개선
      • 리액티브 방식으로 체인을 연결하고 redis나 webClient를 호출할 경우 현재 스레드가 변경되고 작업이 끝나더라도 원래의 스레드로 자동 전환되지 않아서 다른 용도의 스레드가 비즈니스 로직을 처리할 때도 사용되는 경우 발생
      • 다른 외부 서비스 요청에 사용할 스레드를 반환하는데 지연이 발생하여 전체적인 성능저하가 발생
      • redis와 webClient 호출 후 boundedElastic스케줄러로 전환되도록 publishOn 적용
    • 항공 스케줄 조회 시 redis에 원문을 캐싱해두는데 용량이 너무 커서 네트워크 리소스가 부족하여 http요청헤더와 redis 설정에 gzip 압축 옵션을 추가하여 용량을 줄임
    • 운항중인 노선 필터 개발
      • 항공사별로 취항노선이 다른데 필터링 없이 전체 항공사 웹서비스를 호출하고 있어서 취항노선을 검색서비스 앞단에서 필터링하여 요청 자체를 줄임
    • nginx의 로드밸런싱 기본설정은 라운드로빈 방식이라 순차적으로 요청이 할당되지만 항공사별, 노선별 요청의 처리시간이 달라 특정 인스턴스에 처리가 지연될 수 있음
      • least connection 으로 설정을 변경하여 클라이언트 연결 개수가 적은 쪽으로 할당되도록 설정함
    • 서버별 was 인스턴스를 10개씩 띄워놨는데 한개 인스턴스는 6코어를 사용하도록 되어있어서 트래픽이 몰릴경우 서버의 CPU 사용률이 99%를 찍고 서버가 일시중지되는 경우가 발생
      • was 인스턴스를 줄여서 CPU 사용률이 80%대를 초과하지 않도록 조정
  • 비회원 인증처리 개선
    • 비회원의 예약관련 API 호출 전 조회 필수값을 JWT토큰으로 발급하여 인증처리 강화
    • 백오피스에서 호출하는 비회원 인증토큰과 구분하도록 webFilter의 인증로직 분기처리
  • 프로모션 코드 서비스 모듈 구현
    • 프로퍼티로 주입받던 프로모션 코드를 oracle DB에 저장하고 redis에 동기화 후 캐싱
    • 서비스 재기동 없이 유연하게 프로모션 코드를 변경할 수 있게 되었고 redis에서 캐싱된 데이터를 가져와 속도저하를 최소화 시킴
  • 항공사 오류로그 백오피스 관리 기능 구현
    • 전체 원문을 저장하는 트랜잭션 로그와 별개로 예외 발생 시 백오피스에서 확인할 수 있는 관리자메모 기능 구현
    • 저장이 필요한 API의 Handler에서 처리하도록 구현하였으나 이미 구현된 일부 서비스의 메서드에서 Mono로 감싸지 않은 로직에서 의도치않은 런타임 예외가 발생하니 Handler의 error연산으로 오지 않고 바로 GlobalErrorAttributes 로 넘어감
    • 해당 이슈가 예상되는 로직을 Mono로 감싸서 보완하고 운영에서 지속적으로 보강
  • restDocs API 문서 자동화
    • API 스펙과 관련된 라이브러리를 json-schema 만 사용중이라 공유하고 읽기 쉬운 표준화된 API 문서가 없는 상황
    • restDocs를 도입하여 테스트코드를 기반으로 API문서를 생성하도록 구현
    • 팀내 TDD가 완전히 자리잡지 않은 상황이라 다른 팀원들이 샘플로 참고할 수 있도록 항공 일부 API에만 우선 적용
    • 외부의 웹서비스 호출이 주를 이루는 항공 시스템 비스니스 특성을 고려하여 MockBean으로 Request, Response를 고정하도록 구성

스카이스캐너 태그 트래킹 개발 (1개월 / 2023.05 ~ 2023.05)
Typescript(Angular)
스카이스캐너의 SAT(SkyScanner Analytics Tag)트래킹 방식이 변경되서 신규 DownStream Visibility 태그방식의 트래킹 스크립트 구현

  • 랜딩, 예약완료 화면에서 로깅을 위해 Promise를 사용하여 자바스크립트 라이브러리를 동적으로 로딩하는 서비스 구현
  • 기존 Enum 으로 작성된 타입들은 번들러에서 트리쉐이킹이 되지 않아서 union Type으로 모두 리팩토링

네이버 국내선 서비스 개발 (3개월 / 2023.02 ~ 2023.05)
Java(spring webFlux)
네이버 여행상품의 항공 카테고리의 국내선 서비스 입점하기 위해 필요한 API 구현

  • 네이버에서 호출하는 항공 스케줄 조회 API 구현
    • 기존 노랑풍선의 항공스케줄 조회는 전체스케줄 목록을 캐싱해두고 사용중이었으나 네이버 연동 API는 운임조회부터 발권까지 모든 프로세스를 캐시없는 완전 실시간 조회로 새롭게 구현
      • 캐싱 사용 시 목록의 인덱스로 실제 예약 전, 캐싱해둔 전체스케줄목록과 데이터를 검증을 하였으나 완전 실시간 전환 후 검증할 전체스케줄목록이 매번 새로 조회되서 기존 인덱스 매칭으로 검증할 수 없음
      • 항공사에서 실시간으로 조회되는 전체스케줄 목록과 프론트에서 선택된 예약데이터를 비교하여 검증하는 로직 구현
  • 네이버 예약데이터 연동 서비스 구현
    • 예약,발권,결제,취소 등 예약데이터가 생성,수정될 경우 네이버로 예약데이터를 연동시키기 위한 서비스를 구현
    • spring Event 로 구현하여 직접 의존성을 주입하지 않고 ApplicationContext에 이벤트를 넘겨줘서 Listener로 처리하여 서비스간의 의존성을 줄이고 추후 다른 제휴사로 확장해서 사용할 수 있도록 개발
  • 상태타입 Enum으로 리팩토링
    • 노랑풍선과 네이버의 예약,결제,발권 등 시스템코드가 달라서 매핑하는 작업이 필요한데 if문을 중첩시켜서 매핑되는 상태값을 사용하도록 구현되어 있어서 리팩토링 진행
    • Enum으로 시스템코드들을 그룹화하여 각 타입은 본인이 수행해야할 기능만 책임지도록 하고 입출력을 Enum으로 하여 별도의 추가검증로직이 필요없어 side-effect를 줄임

네이버 프라이싱 리포트 개발 (1개월 / 2023.01 ~ 2023.01)
Typescript(Angular), Java(spring webFlux)
네이버에서 조회되는 전체 항공권 정보를 가져오는 API를 사용하여 백오피스에서 확인가능하도록 개발

  • 특정 날짜 범위에선 데이터가 너무 커서 오류 발생
    • WebClient Buffer의 기본사이즈에 담을 수 없어서 10MB로 메모리 할당
  • 네이버 응답값을 파싱하여 노랑풍선 키와 매칭시켜야 하여 서비스 시작 시 DB에서 미리 매핑에 필요한 데이터를 가져와 HashMap으로 메모리에 들고 있다가 응답값을 키로 map에서 찾는 방식으로 구현하여 매핑 시간 단축
  • 백오피스 화면은 angular와 kendo-UI를 사용하여 구현

BC카드 페이북,에어머니,VIP 서비스 개발 (2개월 / 2022.10 ~ 2022.12)
Typescript(Angular), Java(spring webFlux)
BC카드 입점을 위한 항공,호텔 화면 개발 및 API 개선 작업

  • BC카드 메인 컨테이너, 항공,호텔 컴포넌트 리팩토링
    • 각 제휴사의 메인, 검색관련 컴포넌트들 구현
    • 기존 구현은 BC카드 제휴사별 컨테이너(껍데기) -> 공통 컴포넌트(api호출) -> 항공,호텔 컴포넌트(데이터가공, 랜더링)의 구조로 만들어놔서 유지보수하기 힘듬
    • 항공,호텔 컨테이너(api조회) -> BC카드 제휴사별 컴포넌트(데이터가공) -> 공통 컴포넌트(랜더링) 구조로 전체 구조 리팩토링 진행
    • 관심사를 분리하여 불필요한 if문 분기처리를 줄이고 각자 책임지는 기능에 충실할 수 있고 공통 컴포넌트의 재사용성이 증가하여 유지보수하기 편해짐
  • 항공 검색 오류처리 개선
    • 느린 항공사 웹서비스와 자사의 캐시로 인해 빈번하게 발생하는 Timeout을 Custom Exception으로 새로 구현
    • 오류 발생 시 Handler에서 정상응답으로 변환하여 처리
    • fillInStackTrace() 메서드를 오버라이드하여 불필요한 StackTrace를 만들지 않도록 구현
    • 단순히 정보성으로 동일한 예외를 발생시키기 때문에 미리 예외를 캐싱해두고 사용
    • 빈번하게 발생하는 불필요한 오류를 걸러내서 모니터링의 효율을 높임

네이버페이 결제수단 연동 개발 (3개월 / 2022.03 ~ 2022.06)
Java(spring webFlux)
노랑풍선 OTA 국내선 노선 결제수단에 네이버페이 연동 개발

  • 왕복 스케줄 예약 시 화면에선 단건이지만 내부적으론 두건으로 분리되는 항공 특성상 단건결제는 불가능하여 정기,반복결제를 사용하여 각 항공사의 예약, 결제 후 등록해지 하는 방식으로 구현
  • 기존 패키지 구조와 분리하여 도메인형 패키지로 구성하고 DDD를 최대한 지키기 위해 예약, 결제, 취소 등 비즈니스 도메인으로 분리하여 의존성을 최소화하여 구현

대한항공 본인인증 모듈 구현 (1개월 / 2022.02 ~ 2022.02)
Java(spring webFlux), TypeScript(angular)
대한항공 국내선에 PASS 인증모듈을 추가하여 본인인증 로직 구현

  • PASS 인증솔루션에서 인증완료 후 POST 로 결과값을 전송해주는데 프론트에서 POST 요청을 받을 수 없음
  • angular-universal을 사용하여 서버사이드랜더링 후 Node.js 서버로 실행하고 서버에서 POST 요청을 callback으로 받아 결제 후처리용 빈페이지로 리다이렉트 시켜 응답값에 대한 검증 후 기존 에약 프로세스 수행하도록 구현

코드마인드

소프트웨어 정적분석용 솔루션의 기능개선과 저작권위원회에서 제공하는 오픈소스 라이선스 분석 프로그램인 CodeEye의 고도화 작업을 진행
CodeEye는 프로젝트 소스파일을 업로드하여 서버로 전송하면 해당 소스파일의 오픈소스SW 라이선스 준수 여부를 비교,분석,검증 해주는 프로그램

CodeMind CSI/CQI 개선 (1개월 / 2021.03 ~ 2021.03)

Java(spring mvc), derbyDB
SpringBoot 기반 시큐어코딩 및 코드품질 검증용 정적분석 도구 개발

  • Cert Secure Coding 규칙에 대한 보안취약점 검출 로직 구현

저작권위원회 오픈소스 분석엔진 개선 (6개월 / 2020.06 ~ 2020.12)

Node.js, Scala, postgreSql
오픈소스 SW 라이선스 분석엔진의 개선작업

  • 오픈소스 수집기로 모은 오픈소스를 검사용DB로 구축
    • scala slick 라이브러리를 사용하여 postgresql에 구축
    • 수집된 오픈소스 프로젝트 파일의 전체 해시값을 생성하여 중복여부 체크
    • 파일명, 크기, 확장자 등 필요한 정보를 추출하고 소스코드를 토크나이징하여 분석용 해시코드 생성
  • 검증데이터의 경량화 버그 수정
    • 경량화를 위해 토크나이징한 문자열을 MD5함수로 인코딩하고 해시값을 다시 절반으로 압축하는 로직에서 버그 확인
    • 압축대상이 되는 DB데이터가 수십억건이 넘다보니 해시인코딩까진 괜찮았지만 그 해시코드를 다시 압축하면서 값의 범위가 좁아져서 중복된 코드가 발생
    • 이중 압축로직을 제거하고 byteArray를 Hex String으로 변환하여 저장하여 유니크한 코드값으로 생성
  • 검사용DB 파티셔닝 적용
    • 색인정보가 지속적으로 누적되서 저장된 테이블의 용량이 너무 커져서 읽고 쓰는데 성능이 저하됨
    • postgresql에서 제공하는 파티셔닝을 적용하여 10개의 파티션 테이블 생성하여 성능 향상

저작권위원회 코드아이 윈도우 앱 기능개선 (2개월 / 2020.04 ~ 2020.05)

C#
오픈소스 SW 라이선스 윈도우 앱의 개선작업

  • 색인추출 후 전송 기능 구현
    • 일부 사용자 환경에서 보안문제로 실제 회사 소스코드를 업로드하여 전송하는건 어렵다는 의견을 전달받음
    • 기존 분석엔진을 jar로 만들어 c# 라이브러리로 추가
    • 동일한 방식으로 색인정보를 추출하여 json으로 색인정보만 서버로 전송
    • 분석엔진에선 기존 파일의 파싱부분을 건너뛰고 색인정보로 바로 분석이 진행될 수 있도록 구현
  • 자동 업데이트 기능 구현
    • 윈도우 앱이 실행될 때 로컬머신의 설치파일과 원격서버의 설치파일의 해시값을 비교하여 값의 변경이 있을 경우 원격의 파일을 최신이라 판단하여 다운로드하여 설치하도록 구현
    • 설치가 완료되면 윈도우 앱을 재시작하여 최신 버전으로 자동 업데이트 진행

저작권위원회 OLIS 시스템 고도화 (1개월 / 2020.01 ~ 2020.01)

Java(Egov), Apache, Tomcat
오픈소스 SW 라이선스 정보시스템 웹사이트의 개선작업

  • 시큐어코딩, 웹접근성 등 공공기관에서 요구하는 사항들 적용
  • 연동시스템간의 보안문제로 apache, tomcat 버전 업그레이드 후 재설정

저작권위원회 오픈소스 수집기 구현 (6개월 / 2019.07 ~ 2019.12)

Python
오픈소스 SW 라이선스 분석을 위한 소스코드 수집기 개발

  • 오픈소스 검사시스템의 검사용DB를 구축하기 위해 Github, Gitlab 등 오픈소스 호스팅 사이트를 타겟으로 수집기 구현
    • Github 등 openAPI를 제공할 경우 직접 API를 순회호출하여 프로젝트를 다운로드
    • 그 외는 타겟 사이트의 HTML을 분석하여 BeautifulSoup으로 파싱하여 프로젝트를 다운로드
    • 각 타겟사이트 전체를 탐색하고 signal_handler에서 시그널을 수신하여 마지막으로 수집한 프로젝트의 인덱스 정보를 별도로 저장하여 히스토리를 관리하고 프로젝트 URL을 MD5 해싱함수를 사용하여 중복된 오픈소스를 수집하지 않도록 구현

휴먼컨설팅그룹

고객사들의 인사규정에 맞춰 인사,근태,급여 등 여러 인사관련 서비스를 수정개발

CMS에듀 인사시스템 구축 (6개월 / 2018.08 ~ 2019.01)

Java(Struts, jsp), Javascript(jquery), Oracle

  • centOS에 개발서버 구축
  • 전자결재 신청,결제,승인 기능과 첨부파일 기능 구현
  • 퇴직금 중간정산 서비스 구현, 급여명세서를 PDF 암호화 하여 보안메일 발송기능 구현
  • 그룹웨어 출퇴근기록 연동용 프로시저 생성
  • 우리사주 대출관리 서비스 구현, 금융사에서 제공하는 엑셀을 업로드하여 급여계산 시 반영되도록 구현
  • 퇴사자 연차정산을 위해 회계연도 기준으로 연차 집계 후 근로기준법 기준의 연차로 재생성하여 정산하는 서비스 구현

우아한형제들 인사시스템 구축 (4개월 / 2018.04 ~ 2018.08)

  • 복리후생 모듈 개발
  • 연차관리 서비스 구현

한국중부발전 웹표준화 및 고도화 (5개월 / 2017.09 ~ 2018.01)

  • activeX로 구현된 구버전을 웹기반 솔루션으로 전환 후 웹표준화 작업
  • 유연근무제 신청 기능 구현

대림산업 글로벌 인사시스템 구축 (3개월 / 2017.06 ~ 2017.09)

  • 복리후생 관련 서비스 개발

백엔드 개발자 유재용

https://yoo0926.github.io/about/index.html

Author

Jaeyong Yoo

Posted on

2023-06-10

Updated on

2023-06-17

Licensed under