미리보기
기본 정보

안녕하세요! 백엔드 개발자 김민석입니다. 익숙한 기술만을 사용하기보다는 새로운 기술이어도 항상 프로젝트에 맞는 기술을 배우고 적용하기 위해 노력하고 있습니다. 좋은 테스트 작성과 테스트 주도 개발(TDD)에 깊은 관심을 가지고 있습니다. 현재 개발 중인 개인 프로젝트는 약 150개의 테스트 케이스가 작성되어 있으며, Jacoco 측정 기준으로 95% 이상의 커버리지를 만족하고 있습니다. 문제 해결을 위한 CS에 대한 깊은 이해, 신기술에 대한 지속적인 관심, 의사소통 능력을 갖춘 개발자를 지향합니다.
기술 스택
Java, Kotlin, Spring, MySQL, Docker, Redis, Elasticsearch
프로젝트
Min-Ticketing
개인
2024.07. ~ 진행 중
사용자가 쉽게 공연을 검색하고 좌석을 예매할 수 있는 공연 예매 플랫폼
개발 내용
공연 정보 조회 API 개선(Peak RPS 230%, p95 응답시간 68% 개선)
Redis + Database Unique Constraint 를 사용한 이중 중복 체크 로직 개발
비동기 메서드에 ThreadLocal의 값을 전파하는 기능 개발
Grafana, Prometheus를 사용한 모니터링 시스템 구축
ELK Stack + RabbitMQ를 사용한 로그 시스템 구축
TDD와 BDD을 융합한 개발 방법론 적용(Test Case 약 140개, Test Coverage 약 95%)
문제 해결 과정
공연 정보 조회 API 개선(링크)
문제 : 공연 정보 조회 API는 본 프로젝트에서 가장 많이 호출되는 API임에 불구하고, Slow Query로 인해 정상적인 조회가 어려운 문제가 발생함.
문제 해결
Slow Query 해결을 위해 explain을 활용한 쿼리 분석, 쿼리 분리와 반정규화를 통해 쿼리 개선(Peak RPS 450, p95 응답 시간 1400 ms)
2차 테스트 결과 Connection Pool의 갯수가 병목 지점으로 파악되어 Caffeine local cache 적용(Peak RPS 842, p95 응답시간 970 ms)
3차 테스트 결과 불필요한 NGINX와 잘못된 로그 아키텍쳐로 인해 CPU가 낭비되는 문제 발생, 이를 해결하기 위해 NGINX를 제거하고 filebeat 대신 rabbitMQ를 도입(Peak RPS 1483, p95 응답시간 450ms)
Redis + Database Unique Constraint 를 사용한 이중 중복 체크 로직 개발(링크)
문제 : 특정 공연의 좌석에 대해 동시성 문제 발생 가능성이 있음을 인지함.
문제 해결
1차적으로 공연의 동등성은 공연 날짜와 좌석으로 결정됨을 파악하고 DB의 Unique Constraint를 사용하여 중복 예약 방지
위 방식은 DB에 많은 INSERT 문으로 부하를 줄 수 있다고 판단하여 Spring AOP에 Redis를 도입하여 2차 중복 예약 방지 로직을 기존 코드의 변경 없이 구현
비동기 메서드에 ThreadLocal의 값을 전파하는 기능 개발(링크)
문제 : 비동기 메서드에 Proxy 형태의 Request Scope Bean을 사용할 수 없는 문제가 발생함.
문제 해결
Request Scope Bean를 ThreadLocal로 변경하고, ExecutorService의 TaskDecorator를 사용하여 비동기 메서드가 새로운 Thread에서 실행되기 전에 이전의 ThreadLocal 값을 새로운 ThreadLocal로 이관하도록 함.
CareerSupport
개인
2024.09. ~ 진행 중
개발자 역량 향상을 도와주는 AI 기반 웹 플랫폼
개발 내용
프로젝트의 특성을 고려하여 Kotlin Coroutine + WebFlux 도입
Custom Github Action Script를 사용한 Github Pull Request에 대한 AI 코드리뷰 기능 개발
LLM 모델이 토큰 단위로 반환하는 문자열을 실시간으로 보여주기 위해
SSE 적용
BlockHound를 사용하여 테스트 환경에서 블로킹 코드 검출
문제 해결 과정
프로젝트의 특성을 고려하여 Kotlin Coroutine + WebFlux 도입
문제 : 본 프로젝트 설계 과정에서, 본 프로젝트의 API 응답시간의 대부분이 AI 추론 및 응답시간이라는 것을 인지함. 또, 프로젝트의 특성 상 읽기와 쓰기 작업이 많고 데이터간의 관계가 복잡하지 않음.
문제 해결
비동기 논블로킹 I/O를 기반으로 하는 Spring WebFlux를 도입하여 Thread 가용성을 향상시키도록 함.
Read/Write 작업에 특화되어 있는 Document형 NoSQL인 MongoDB를 주 저장소로 채택함.
Polingo
금오공과대학교 졸업프로젝트
2024.03. ~ 2024.06.
번역과 언어 학습을 하나의 앱에서 제공하는 올인원 애플리케이션
개발 내용
Flask와 Docker를 사용하여 LLM 및 OCR API 서버 구축 및 연동
Github Action의 스케줄러를 사용한 크롤링 시스템 구축
Docker Compose와 nginx를 사용한 Scale Out 및 Load Balancing 기능 개발
React를 이용한 Admin Page 개발
전체 프로젝트 아키텍쳐 설계
요구사항 도출 및 기획 문서 작성
문제 해결 과정
Github Action의 스케줄러를 사용한 크롤링 시스템 구축
문제 : 외국어 학습 콘텐츠 제공을 위해 해외 뉴스를 크롤링하고, LLM 모델을 사용해 외국어 문장 분석 기능이 요구사항으로 존재함.
문제 해결:
Meta-llama3-instruct-8B 모델과 Flask를 사용하여 LLM 서버를 구축하고, 프롬프트 엔지니어링(역할 부여, Few-shot)을 통해 문장 분석 기능을 구현함.
Python의 News 라이브러리를 사용해 해외 뉴스 사이트에서 뉴스를 10개씩 크롤링해오고, 이를 문장 단위로 분리해 LLM 모델로 전달해 문장 분석 수행
Github Actions를 사용하여 별도의 서버 구축 없이 매일 00시에 크롤링 및 문장 분석을 수행하도록 함.
크롤링 및 문장 분석 시간 개선을 위해 Docker Compose를 사용해 LLM 서버 컨테이너를 2개 만들고 GPU를 나누어 할당, NGINX의 로드밸런싱 기능을 활용하여 처리 시간 50%개선
포트폴리오
자격증
정보처리기사
한국산업인력공단
2024.09.
교육
금오공과대학교
대학교(학사) | 컴퓨터공학과
2019.03. ~ 현재 | 재학 중
대외활동
Flab 백엔드 멘토링 과정
F-Lab
Java Backend 멘토링 과정 수료
Java Spring과 기초 컴퓨터 과학(CS)에 대한 심도 있는 학습
Kotlin + Spring 기반 개인 프로젝트 진행 및 코드 리뷰 경험을 통한 개발 역량 향상
해커톤 1회 참여, 팀 프로젝트 진행을 통해 실무 경험 및 협업 역량 강화
멋쟁이 사자처럼 11기
멋쟁이사자처럼
멋쟁이사자들 Java 백엔드 트랙 수료
Java Backend 관련 필수 요소들을 동아리 부원들과 토론하며 학습
총 2회의 해커톤 참여
인지지능연구실
금오공과대학교
1인 백엔드 개발 (Java) - 외주 프로젝트
Java 기반 백엔드 개발을 단독으로 진행, 프로젝트 요구 사항 분석부터 구현, 배포까지 담당
클라이언트, 프론트엔드 개발자와 주기적인 소통을 통해 요구사항 및 개선사항 소통 경험
AI 모델 연동 및 배포 (Flask, Docker)
Flask와 Docker를 활용하여 다양한 AI 모델과 연동 및 배포 경험
AI 모델의 안정적 운영을 위한 환경 설정 및 배포 자동화 경험