목표 성취를 위해 다른 사람과 함께 일하는 것을 좋아하여 여러 프로젝트에서 주로 리더를 맡아 프로젝트를 이끌었으며 때론 주변 상황을 따라가는 유연함을 갖추기 위해 노력합니다. 또한 기록의 중요성을 알고있기에 공부한 것들에 대해 노션, 깃허브 등에 기록하는 습관을 가지고 있습니다. SpringBoot를 사용해 개발하는 것과 DevOps에 관심이 많습니다.
$\large\color{black}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━$
Notion - 공부한 내용들을 정리하는 Notion 링크
Github - 깃허브 링크
Stack - Kotlin, Java, SpringBoot, TypeScript, Express, Jest, Junit, Mockito, JPA, MySQL, Docker, AWS
$\large\color{black}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━$
2023.10.06 ~ 2024.01.04(3개월)
Daum 우편번호 서비스가 다운됐을 경우를 대비한 우편번호 조회 서비스입니다.
3명으로 구성된 BE 팀에서 SpringBoot(Kotlin) + JPA를 사용해 주소 검색 및 초성 검색 API를 개발했습니다. 도로명주소 DB에서 최신 주소 데이터를 받기 위해 매월 ZipFile을 압축 해제하여 파일로 다운로드 후 SpringBatch Tasklet 방식을 이용하여 약 1300만건의 데이터를 저장하는 스케줄러를 구현했습니다. MySQL의 FullText, 세컨더리 인덱스 설계 후 적용시켜 검색 성능을 최적화 했습니다.
검색 키워드 자동완성 기능
도로명주소 검색 기능
쿼리 실행 시간 98% 단축
약 30만건 데이터에서 주소, 지번 조회 위해 관리번호 통한 Self Join 쿼리 작성중
ON절에 사용되는 관리번호에 인덱스가 존재하지 않았고 쿼리 실행시 약 28초 소요
관리번호 컬럼 인덱스 생성을 통해 쿼리 실행 시간을 약 0.6초(98%)로 단축
쿼리 수 절반 감소
JPA에서 PK에 UUID(0, 0)을 넣었을 때 persist가 아닌 merge로 동작
→ 불필요한 select 쿼리가 나가 배치 작업 실행 시간이 2배 이상 걸리는 문제 발생
Persistable의 isNew 메소드를 재정의 → insert만 실행하게 하여 쿼리 수 절반 감소
OutOfMemory 해결