채용공고 올리기

김설영님을 응원해보세요!

INFCON 참여
지금 만족하고 있어요
책임감
협업 지향
자기 주도적
열정적
긍정적

미리보기

기본 정보

이름
김설영
직업
백엔드 개발자
간단 소개

근본적인 문제 해결을 위해 노력하는 개발자

자기소개

자기소개

업무적 강점

  • 문제가 생겼을 경우 이를 근본적으로 해결하기 위한 과정을 좋아합니다.

  • 다른 사람들의 의견을 듣고 수용하는 것을 좋아합니다.

  • 커뮤니케이션을 잘 하기 위한 소프트 스킬에 관심이 많습니다.

  • 모르는 것을 부끄러워하지 않고 오히려 성장의 기회로 여깁니다.

  • 회사에서 사용하는 기술들과 기본기 학습을 꾸준히 하고 있습니다.

기술적 역량

  • Java, Spring을 이용해 API를 구현할 수 있습니다.

  • JPA, QueryDSL을 활용한 데이터베이스 접근 기술을 사용할 수 있습니다.

  • 서비스 레이어 메서드 구현 시 트랜잭션을 고려할 수 있습니다.

  • Junit5, RestAssured를 활용한 테스트 코드를 작성할 수 있습니다.

기술 스택

기술 스택

Java, Spring Boot, JPA, MSSQL, querydsl, MongoDB, junit5

경력

회사명

미스터블루(주)

직급 | 부서 | 근무 유형

연구원 | 개발팀 | 재직 중

근무 기간

2023.03. ~ 재직 중 (1년 11개월)

담당 업무

미스터블루는 웹툰과 웹소설 컨텐츠 서비스를 제공하는 기업입니다.

프로모션 서비스 개발과 작품 전시 서비스 개발 및 레거시 개편 작업을 수행하고 있습니다.

프로젝트

프로젝트명

프로모션 서비스 유지보수

소속/기관명

미스터블루(주)

프로젝트 기간

2023.03. ~ 진행 중

프로젝트 내용

팀 구성 및 역할

  • 2명 | 신규 서비스 기능 개발 및 유지보수

프로모션 서비스

  • 사용자에게 작품 구매 관련 미션을 제공하고 미션 등급에 따라 보너스 머니를 지급하는 서비스

    • 일정 금액 기준 이상을 사용하면 보너스 머니를 지급

    • 일정 금액 기준 이상을 사용하면 선착순으로 보너스 머니를 지급

  • 프로모션에 관련된 작품들을 전시하는 서비스

기존 프로모션 서비스의 문제점

  • 각 관계자들 간 서로 다른 용어를 사용해 발생되는 커뮤니케이션 문제

  • 확장성과 유지보수성이 떨어지는 프로젝트 구조

  • 관리가 되지 않는, 추가되지 않는 테스트 코드

  • 로그&모니터링 시스템의 부재로 인한 디버깅의 어려움

문제점 개선 및 성과

  • 관련 용어를 정리하여 문서화 및 공유

    • 관계자들 간 소통을 원활하게 할 뿐만 아니라, 비 관계자 또한 해당 도메인을 쉽게 이해할 수 있도록 개선하였습니다.

  • 변경의 여파가 너무 넓었던 레거시 프로젝트의 아키텍처 개선

    • 기존 시스템은 외부 시스템의 변경이 비즈니스 로직에까지 영향을 미치는 문제가 있었습니다. 이를 효율적으로 변경하기 위해 적절한 아키텍처가 필요하다고 생각했고, 헥사고날 아키텍처의 포트-어댑터 개념을 차용해 아키텍처를 재구성했습니다. 이를 통해 비즈니스 로직과 외부 시스템과의 결합도를 낮추어 변경의 여파를 제한하였습니다.

  • 사내에 테스트 코드 작성 문화를 선도적으로 도입

    • 테스트 코드가 문서의 역할을 하여 다른 사람이 짠 코드도 이해하기 쉽게 되어 리뷰 사이클이 빨라져 개발 생산성이 크게 향상되었고, 리팩토링을 용기있게 수행할 수 있게되어 전반적인 소프트웨어 품질이 개선되었습니다.

  • 로그&모니터링 시스템을 도입

    • JVM을 모니터링할 시스템이 없어서 Spring Actuator와 Micrometer elatic을 활용해 JVM 모니터링 대시보드를 구성했습니다.

    • 기존에 Docker container에서 직접 로그를 확인하던 비효율을 개선하기 위해 Elastic stack을 이용해 로그를 간편하게 확인할 수 있도록 개선하였습니다.

기술 스택

  • SpringBoot 2.7, JDK 17, Gradle, MS-SQL, Spring data JPA, QueryDSL, OpenFeign, GitLab CI, Elastic stack

프로젝트명

작품 전시 서비스 신규 기능 개발 및 레거시 개편 작업

소속/기관명

미스터블루(주)

프로젝트 기간

2023.10. ~ 진행 중

프로젝트 내용

팀 구성 및 역할

  • 3명 | 프로젝트 구조 설계 및 구현 & Stored Procedure를 애플리케이션 로직으로 이동 & 성능 테스트

문제

  • 레거시 프로젝트 내부에서 하나의 개념을 다른 용어로 표현함으로 인해 소통의 어려움을 유발

  • 모든 비즈니스 로직이 Stored Procedure에 있어 발생하는 문제

    • 문제가 발생할 경우 디버깅이 어려워 대처가 늦어짐

    • 신규 기능을 추가하기 매우 어려운 구조

    • 테스트 코드를 작성할 수 없기 때문에 버그 발견이 어렵고 동작을 이해하기 어려움

    • 하나의 변경 사항에 대해 영향을 받는 부분이 매우 많아 기능 확장 및 유지보수가 어려움

문제점 개선 및 성과

  • 이벤트 스토밍 기법을 응용

    • 구성원들 간 용어에 대한 이해도를 빠르게 일치시킬 수 있었고, 이로 인해 전반적으로 의사소통이 수월해졋습니다.

  • 변경의 여파를 제한할 수 있도록 의존성 역전 원칙을 이용해 변경 여파를 최소화

    • 비즈니스 로직과 외부 시스템 간의 의존성을 격리해 외부 시스템의 변경이 비즈니스 로직에 영향을 주지 않도록 구성하였습니다.

  • Stored Procedure를 제거하고 애플리케이션단으로 비즈니스 로직을 이동

    • Stored Procedure를 제거하기 위한 전략

      • 레거시 기능을 신규 기능으로 개편하는 사업건이 있을 때, 관련된 Stored Procedure가 있다면 함께 제거하는 전략을 취했습니다.

      • 동시에, 가장 단순한 Stored Procedure부터 제거하여 점진적으로 걷어내는 전략도 함께 수행하고 있습니다.

    • 비즈니스 로직을 애플리케이션단으로 옮긴 후 성과

      • 전체적으로 코드 가독성이 좋아져 팀원들의 비즈니스 이해도를 높일 수 있게 되었습니다.

      • 테스트 코드를 작성할 수 있게 되어 일부 버그를 미연에 방지할 수 있게 되었습니다.

      • 신규 기능을 추가하거나 정책 변경이 발생해도 빠르게 대응할 수 있게 되었습니다.

  • Jacoco를 활용한 단위 테스트 코드 작성 정책 도입

    • 테스트 작성 방법을 모르는 팀원들에게는 간단한 테스트 기초 교육을 수행하였고, 적절한 강의 추천을 통해 테스트 코드 작성을 할 수 있도록 도왔습니다.

    • Jacoco를 이용해 분기문에 대한 coverage만을 측정하도록 설정해서 일정기준 이상의 coverage가 달성될 경우에만 빌드가 되도록 하여 테스트 코드 작성을 하도록 유도하였습니다.

성능 테스트 및 트러블 슈팅

  • 로컬 캐시를 이용해 DB의 부하를 분산

    • DB 서버에 많은 부하가 가해질 것을 방지하기 위해 거의 변하지 않는 데이터들은 로컬 캐시에 저장해두고 사용하도록 변경하였습니다. 그 결과, 같은 조건의 부하 테스트에 대해 DB CPU 사용률이 90%에서 20% 수준으로 현저하게 낮아짐을 확인할 수 있었습니다.

  • 성능 개선

    • vUser 300 수준에서 TPS가 40, Latency가 3000ms로 성능이 너무 낮게 측정되는 엔드포인트들이 있었습니다. 이를 해결하기 위해 메서드 수행 시간들을 측정하여 병목이 되는 부분들을 찾아 분석하고 개선 해나갔습니다. 그 결과 TPS는 400, Latency는 300ms로 약 10배 정도 개선이 되었습니다.

    • 정리 내용

  • 캐시 만료 시간을 기점으로 OOM이 발생했던 문제

  • 로컬 캐시로 인한 동시성 문제 해결

    • 공용 자원인 로컬 캐시에 스레드 안전하지 않은 Collections.shuffle() 메서드를 사용하여 동시성 이슈가 발생한 문제가 있었습니다. 원인 파악 후 비즈니스 로직에 직접 이용되는 객체가 아닌 DTO 객체를 캐싱하도록 변경 함으로써 해결하였습니다. 혹시 모를 문제를 대비하여 로컬 캐시로 이용중인 객체들을 전부 불변 객체(및 불변 Collection 사용)로 변경하여 같은 문제가 발생하지 않도록 조치하였습니다.

    • 정리 내용

  • MongoDB 조회 개선

    • 작품 Document의 키워드 ID는 Array 형태로 관리되어, 여러 개의 키워드를 가지고 있는 작품 조회 시 성능 저하가 발생할 수밖에 없는 구조였습니다. 이를 인덱스나 다른 방법을 이용해 해결하고자 했으나 근본적인 해결 방안이 아니라고 판단하였고, 앞으로 해당 형태로 조회되는 경우가 빈번해질 것으로 생각되어 새로운 데이터 구조를 추가하여 조회하는 방향으로 개선하였습니다.

    • 정리 내용

현존하는 문제점과 개선을 위한 고민

  • 로컬 캐시에만 의존적인 부분

    • 해당 프로젝트는 점진적으로 Stored Procedure를 개선하며 앞으로도 더욱 더 커질 프로젝트입니다. 이에 따라, 로컬 캐시 사용량 또한 증가할 것으로 예상되며, 힙 관리 또한 어려워질 것이라고 생각합니다. 따라서, 레디스 등의 글로벌 캐시를 도입하는 방안을 고민 중입니다.

  • Elastic Micrometer + Kibana의 대시보드는 가독성이 별로 좋지 않다. 팀원들이 해당 대시보드를 보는 것을 매우 불편해 하고 있어 이를 개선하기 위해 Prometheus, Grafana 도입을 고민하고 있습니다.

  • 개편한 기능이 올바른지 검증하는 방법을 자동화 할 방법을 고민하고 있습니다.

    • 현재는 각각 호출하여 응답을 비교하는 작업을 통해 검증을 하고 있습니다. 그러다보니 놓치는 부분이 많아 검수 이슈가 많이 올라오게 되고, 개발자의 생산성을 저하시키고 있습니다.

    • 이 문제를 개선하기 위해, 레거시 API와 신규 API에 각각 호출을 보내고 각 API의 응답을 서로 비교하여 동일한 응답을 제공하는지 비교하는 작업을 수행할 서버를 구축해서 검증을 자동화 할 방안을 고민하고 있습니다.

  • 안전하게 포팅할 수 있는 방법을 고민하고 있습니다.

    • 현재 Stored Procedure를 제거하는 작업은 주로 레거시 기능을 신규 기능으로 대체하는 것에 의존해서 수행하고 있습니다. 그러다 보니 포팅에 대한 고민을 잘 하지 않았었는데, 점진적인 개선을 위해 작은 Stored Procedure를 제거하는 작업을 병행하기 시작하면서 부터 포팅에 대한 고민이 필요해졌습니다.

    • 이 문제를 개선하기 위해, 레거시 API와 신규 API를 모두 띄워놓고, Nginx를 이용하여 기존 요청이 신규 API로 전달되도록 하고, 문제가 발생할 경우 레거시 API로 요청이 가도록 변경하는 방법을 검토하고 있습니다.

기술 스택

  • SpringBoot 3, JDK 21, Gradle, Jacoco, MS-SQL, MongoDB, Spring data JPA, QueryDSL, Spring data MongoDB, Caffeine Cache, GitLab CI, Elastic stack, Elastic APM

포트폴리오

URL

link

기술 학습 저장소

노션
link

깃허브

깃허브

교육

소속/기관명

한양대학교

종류 | 전공

대학원(석사) | 바이오나노학과

재학 기간 | 재학 상태

2015.03. ~ 2020.02. | 졸업

대외활동

활동명

만들면서 배우는 Spring 4기

소속/기관명

넥스트스텝

연도

내용

학습 내용

  • Tomcat 구현하기

  • @MVC 구현하기

    • Spring MVC를 직접 구현 해보면서, DispatcherServlet의 역할과 존재 이유에 대해 배웠습니다.

    • Controller 메서드 인자 매핑을 위해 어떠한 작업들이 수반되어야 하는지, MessageConverter는 왜 필요했는지를 배웠습니다.

    • https://github.com/SeolYoungKim/java-mvc/tree/seolyoungkim

  • DI 컨테이너 구현하기

    • Spring의 핵심인 DI Container를 직접 구현하면서, Dependency Injection이 어떠한 원리로 이루어지는지에 대해 배웠습니다.

    • @Configuration 을 통한 주입 방식과 @Component를 통한 주입 방식에 대한 원리를 이해할 수 있었습니다.

    • https://github.com/SeolYoungKim/java-di/tree/seolyoungkim

  • JDBC 라이브러리 구현하기

활동명

ATDD, 클린 코드 with Spring 7기

소속/기관명

넥스트스텝

연도

내용

학습 내용

  • 인수테스트와 단위 테스트에 대해 배울 수 있었습니다.

  • 시나리오 기반의 인수 테스트를 작성하는 방법을 배울 수 있었고, 개발자가 아닌 다른 사람이 봤을 때도 요구사항이 잘 구현되었는지 알 수 있도록 나타내는 것을 연습할 수 있었습니다.

저장소

활동명

우아한 유스방

소속/기관명

우아한 형제들

연도

내용

활동 내용

  • 이력서 작성을 위한 미션 수행 및 기업 조사

  • 페어 프로그래밍 과제 수행

    • https://github.com/woowahan-pjs/java-wordle/pull/35

    • 다른 사람과 협업하며 하나의 프로젝트를 만들어 나가는 과정이 인상깊었습니다. 서로 다른 의견을 취합하여 좋은 방향으로 나갈 수 있는 방법에 대한 토론을 많이 할 수 있는 경험이었습니다.

  • 간단한 쇼핑몰 API 구현 과제 수행

댓글