백엔드 엔지니어
✉️ E-mail
[email protected]
📎 Github
https://github.com/leegwichan
Introduce
[문제를 명확히 정의하는 사람]
물리학과 수학을 공부하며 현상을 수식과 모델로 명확히 정의하고, 그 정의를 토대로 문제를 해결하는 과정을 익혔습니다. 이러한 경험을 통해 논리적이고 체계적으로 사고하는 습관을 키웠습니다. 소프트웨어에 관심을 가지며 만드는 서비스의 문제점을 명확히 파악하는 데 집중했습니다. 예를 들어 멀티스레드 환경에서 발생한 중복 저장 문제를 테스트를 통해 재현하고 원인을 분석한 경험이 있습니다.
[시간과 상황을 고려한 해결]
쓸 수 있는 시간과 주어진 상황을 생각하고 그에 맞는 방법으로 문제를 해결합니다. 문제의 근본적인 해결도 중요하지만, 주어진 시간과 해야할 일들의 우선순위를 파악하고 지금 할 수 있는 일 중 가장 중요한 일을 처리합니다. 예를 들어 멀티스레드 환경에서 동시성 문제가 발생했을 때, 해당 트랜잭션의 격리 수준을 올려 30분 안에 해결한 뒤에, 여러 방안들을 비교하며 최적의 방법을 찾은 경험이 있습니다.
[편의성과 공유를 바탕으로한 협업]
협업 과정에서는 팀원의 편의성과 문서를 통한 공유를 중요하게 생각합니다. 협업하는 팀원들이 더 쉽게 작업할 수 있도록 작업합니다. 새로운 기술 도입시에는 문서화를 통해 누구나 해당 기술을 쉽게 이해할 수 있도록 도와줍니다. 예를 들어 Rest Docs와 Swagger UI를 활용해 항상 최신 상태의 API 명세서를 제공하며 프론트엔드와의 소통 효율을 높였고, 테스트 정책을 문서로 만들어 팀원들이 손쉽게 테스트 문화를 받아들일 수 있도록 도왔습니다.
Projects
🗓 24.12 ~ (진행 중)
👥 BE 3명, FE 3명
Design 1명
[디베이트 타이머] - 더 쉬운 토론 진행을 위한 타이머 서비스
사이드 프로젝트 / Backend 담당
💻 Java 17, Spring Boot 3.0, MySQL 8.0, Spring Data JPA, AWS(EC2, RDS)
멀티스레드 테스트 기반 검증 및 개선으로 6개월 간 동일 이슈 0건 달성
- Problem : 토론 시간표 수정 요청을 짧은 시간 내 중복 요청 시 시간표 내 구성이 간헐적으로 중복 저장됨
- 시간표 수정 시, 타임 박스(시간표 내부 구성 정보)를 전부 삭제하고 수정된 정보로 추가하는 로직에서 동시성 이슈 발생
- How : 해당 상황을 재현하기 위한 멀티스레드 테스트 작성, 다양한 방법을 시도하고 각 방법의 성능 비교한 결과를 팀원들과 공유
- 문제 파악 직후, 해당 로직의 격리 수준을 올리는 임시 방안을 채택한 후 배포함
- 이후 논의를 통해 ‘조회 → 조회 객체 삭제 → 추가’ 형식에서 ‘특정 조건 객체 삭제 → 추가’ 형식으로 바꾼 개선안을 선택함
- Result : 작업 후 6개월 간 동일한 문제 발생 0건, 관련 테스트를 추가하여 해당 문제 재발 방지
DB 형상 관리 도구 Flyway를 도입하여 배포 성공률 100% 달성
- Problem : DB 스키마 불일치로 배포 환경 다운 타임 30분 이상 지속됨
- How : Flyway 도입하여 스키마 관리, Flyway에 작성한 스크립트와 JPA Entity의 형식 일치를 검사하는 테스트 추가
- Result : DB 스키마 불일치로 인한 배포 실패 방지, 작업 이후 배포 성공률 100% 달성
Datadog을 이용한 모니터링을 구축하여 서버 문제 파악 소요 시간 98% 단축
- Problem : 유저 피드백을 받았을 때, 해당 사용 시간대 서버의 상태를 파악하기 어려움
- How : Datadog의 서버 모니터링 대시보드와 APM을 구축하여 서버의 상태와 받은 요청을 모니터링 함
- Result : 서버 문제를 파악하는데 걸리는 시간이 평균 30분에서 평균 30초로 개선
RestDocs + Swagger UI를 통한 API 문서 생성을 자동화하여 항상 최신화된 문서를 제공
- Problem : 개발 서버와 API 명세서의 불일치로 FE 개발자들의 개발 속도가 늦어짐
- How : Rest Docs를 통한 테스트 기반 명세서 작성, Swagger UI를 통해 가독성과 사용성이 좋은 명세서 제공
- Result : 서버의 실제 API와 항상 일치하는 명세서 제공, FE와 BE 개발자 간 소통 시간 30% 감소
🗓 24.06 ~ 25.01
👥 BE 4명, FE 3명
[땅콩] - 밸런스 게임을 통한 대화 주제 제공 서비스
우아한테크코스 6기 / Backend 담당
💻 Java 17, Spring Boot 3.0, MySQL 8.0, Spring Data JPA, AWS(EC2, RDS)
어드민 API 개발을 통해 질문지 추가 과정을 4단계에서 1단계로 간소화
- Problem : 서버의 게임 질문을 추가하는데 ‘질문 취합’ → ‘회의’ → ‘SQL문으로 변경’ → ‘DB에 반영’하는 과정이 필요하여 질문을 추가하기 힘듦
- How : 어드민 전용 인증/인가과 질문지 수정/추가/삭제 API를 구현
- Result : 팀원 누구나 쉽게 어드민 페이지에서 질문지를 추가할 수 있게 됨
Logback 라이브러리를 이용하여 에러 파악 및 해결 기간 95% 개선
- Problem : 서버에서 내부 에러가 발생을 FE 개발자와 유저를 통해서만 인지가 가능했음
- How : Logback 라이브러리 설정을 통해 info 이상의 로그는 파일로 남기고, error 로그는 메신저에 알림을 보내도록 함
- Result : 에러 파악 ~ 해결까지 걸리는 기간이 평균 2일에서 2시간 이내로 개선
Nginx를 통한 Blue-Green 배포를 통해 다운 타임 99% 감소
- Problem : 유저가 ‘땅콩’ 서비스를 사용 중에 배포로 인한 타운타임이 발생하여 게임이 중단됨
- How : EC2 내부에 Nginx를 설치하고 비어있는 포트에 새로운 버전의 서버를 실행한 후 Nginx를 재실행함
- Result : 추가 비용 없이 blue-green 배포를 구성, 다운 타임 6초 → 0.04초로 개선
🗓 25.05 ~ 25.08
👥 BE 2명, FE 2명
Design 2명, PM 1명
[잇다] - 나만의 맛집을 기록하고 공유하는 서비스
YAPP IT 연합동아리 / Backend 담당
💻 Java 21, Spring Boot 3.0, MySQL 8.0, Spring Data JPA, AWS(EC2, RDS)
Presigned URL 조회 로직에 In-memory Cache 도입하여 이미지 관련 GET 요청 성능 평균 60% 개선
- Problem : 이미지 URL 조회 시, S3에 Presigned URL을 발급받아서 제공하여, 조회 요청에 포함된 이미지 개수마다 S3와의 통신 비용이 생김
- How : WAS 내부에서 운용 가능한 CaffineCache 라이브러리를 사용하여 Presigned URL의 유효 시간만큼 TTL을 설정하여 사용
- Result : 이미지 10장 조회 기준 조회 시간이 평균 1.2초 → 0.5초로 개선, 인프라 관리 포인트가 따로 추가되지 않음
백엔드 팀에 테스트 문화를 도입하여 테스트 커버리지 95.7% 달성
- Problem : 이전 프로젝트에서 각 기능이 정상작동하는지 파악하기 어려워 성능 개선과 리팩토링에 어려움을 겪음
- How : 테스트 정책 및 작성 방법 문서화, 각 레이어 별 테스트 초기 설정을 공통 파일로 분리, 코드 리뷰를 통한 테스트 개선
- Result : 테스트 커버리지 95.7% 달성, 테스트에 익숙하지 않은 팀원도 같이 테스트 작성하여 팀 문화로 정착함
Stacks
💻 [Programming Languages] : Java, Kotlin
🛠 [Frameworks & Libraries] : Spring Boot
🗄 [Database] : MySQL, H2
☁️ [Deployment & DevOps] : AWS (EC2, RDS), GitHub Actions, Nginx
🔧 [Tools & Collaboration] : Git, Notion, Discord
Activity & Study