Backend Developer
Contact
Email [email protected]
Phone 010-4589-5148
Blog https://velog.io/@tlarbals824/posts
Github https://github.com/tlarbals824
Introduce
- 다양한 스터디 참여를 통해 꾸준히 학습을 해왔으며, 학습한 내용을 최대한 프로젝트에 적용하기 위해 노력하고 있습니다.
- 혼자 자라기보다 함께자라기가 의미 있다고 생각합니다. 경험 공유를 통해 함께 성장할 수 있는 개발자가 되고 싶습니다.
- 궁금증을 해결하기 위해 꾸준히 학습하고 있습니다. 또한 해결한 내용을 블로그를 통해 공유하고 있습니다.
- 이유가 있는 코드를 추구합니다. 이유를 찾기 위해 토론과 논의를 아끼지 않으려 합니다.
- 테스트하기 좋은 코드를 만드는 것에 관심이 많으며, 이를 위해 유연하고 확장성 있는 코드가 무엇인지 항상 고민하고 있습니다.
Skills
- Java, Kotlin, Spring(Boot, JPA, Security, Modulith), DB(MySQL, Redis), AWS(EC2, RDB, S3, Lambda, ECS, ECR)
Project
애완견 공동 육아를 위한 서비스, Pawith
혼자가 아닌 함께 애완동물을 육아를 하며 공동 육아자간 업무 분배를 위한 서비스
사용 기술 스택 : java, SpringBoot, Spring Data JPA, MySQL, JUnit5
📅 2023.07 ~ 2024.01
🔗 Github : https://github.com/TEAM-SAMSION/Backend
🏆 Award:
- 캠퍼스타운 창업동아리 네트워크 창업캠프 입상(3등)
담당 업무
- 이미지 업로드 성능 최적화를 통한 응답 시간 60% 개선
- 데이터를 저장하는 과정에서 이미지 업로드가 포함되어 있었고, 이미지 요청이 많을 경우 응답 시간이 최대
500ms
까지 지연되었음
- 기존 로직은 이미지를 하나씩 업로드하는 방식으로 구성되어, 응답 시간 중 대부분이 네트워크 I/O에서 발생하는 문제가 있었음
- 이를 개선하기 위해 자바의
CompletableFuture
를 활용하여 이미지 업로드를 비동기 및 병렬 처리로 전환했음
- 그 결과, 응답 시간이
160ms
에서 98.3ms
로 최대 60%까지 단축되었음
- 간접 참조 최적화를 통한 대규모 데이터 조회 성능 5000% 개선
- 도메인 간 모듈이 분리되어 있었고, 도메인 간 직접 참조가 아닌 간접 참조로 연결되어 있었음. 이로 인해 조인(fetch join) 사용이 어려워졌으며, 많은 양의 레코드를 조회할 때 응답 시간이 최대
41초
까지 지연되는 문제가 발생하였음
- 이 문제를 해결하기 위해 간접 참조 대상의
pk
를 추출한 뒤, IN
쿼리를 사용해 모든 레코드를 조회하였음. 이후, 조회한 레코드들을 <domainId, domain>
형식의 Map
자료구조로 변환하여 필요한 레코드를 효율적으로 조회하도록 로직을 개선
- 그 결과, 응답 시간이 최대
41초
에서 800ms
로, 약 5000% 개선되었음
- JWT 갱신 동시성 문제 해결을 통한 로그아웃 이슈 방지
- JWT를 저장하는 수단으로 Redis가 아닌 RDB인 MySQL을 사용하고 있었음
- JWT를 갱신하는 과정에서 클라이언트로부터 동시에 5개의 요청이 들어왔고, 이때 JWT를 조회하고 삭제한 후 갱신된 토큰을 저장하는 과정에서 동시성 문제가 발생했음. 이로 인해 갱신 요청이 에러로 처리되어 사용자가 매번 로그아웃되는 문제가 있었음
- MySQL의 네임드 락(Named Lock)을 사용해 갱신 요청을 순차적으로 처리하였으며, 첫 번째 요청의 결과를 로컬 메모리에 캐싱하여 일정 시간 내 들어오는 동일한 갱신 요청에 대해서는 캐싱된 값을 반환하도록 하였음
- 그 결과, 사용자는 더 이상 로그아웃되는 문제를 경험하지 않았음