과거의 배움을 오늘의 성장으로, 성장하는 개발자 신온유입니다.
과거의 배움을 오늘의 성장으로,
성장하는 개발자 신온유입니다.
Preview
- Git과 Github를 활용해 이슈 및 Pull Request를 체계적으로 관리하고, 명확한 커밋 메시지와 문서화로 팀 협업을 효과적으로 지원
- 스타트업에서 인턴으로 근무하며 Elastic Search를 활용한 자동완성 솔루션 구현
- 삼성 청년 소프트웨어 아카데미에서 프로젝트를 진행하며 백엔드 역량 향상
- Redis 캐싱 도입으로 알림 조회 서비스의 평균 응답 시간을 최대 93% 단축하며, 처리량을 12% 향상
- QueryDSL 도입을 통해 복잡한 JPQL 쿼리를 리팩토링하여 성능을 16% 개선하고, 동적 쿼리의 가독성과 유지보수성을 확보
Work Experience.
42Maru
Intern2020. 12 - 2021. 06
Elastic Search를 활용한 자동완성 솔루션 구현 (영어/한글)
참여인원
2명
주요작업
-
한국어 종목명 자동완성 기능 구현
- JavaCafe Plugin을 활용해 자음 및 초성 분석기를 기반으로 한 자동완성 기능 개발.
- 중간 일치, 초성 일치 등의 다양한 검색 방식을 추가하여 검색 범위를 확장하고 사용자의 검색 만족도를 개선.
-
하이라이트 최적화 기능
- 검색 방식에 맞춘 하이라이트 필드(중간 일치, 초성 일치 등)를 설정해, 한글과 영문 종목명 검색 시의 직관성을 강화.
- 검색어 일치 부분을 시각적으로 표시하여, 검색 결과의 가독성을 높임.
-
종목 코드 및 영문 종목명 자동완성 기능
- 종목 코드에 전방 일치 방식을 적용하여 빠르고 정확한 자동완성 결과를 제공.
- 영문 종목명 검색에 대한 자동완성 기능을 구현하여, 검색 속도와 정확성을 동시에 개선.
-
예시 사진
-
참고
Java Cafe Plugin
Team Project.
브레멘 음악대
2024. 04 - 2024. 05
동영상(숏폼)을 활용한 합주 동영상 공유 SNS 플랫폼
참여인원
담당 포지션
아키텍쳐
ERD
주요 작업
QueryDSL 도입을 통한 복잡한 JPQL 쿼리 리팩토링을 통한 성능 및 유지보수성 향상
-
문제상황
- 로그인한 사용자의 팔로워 및 팔로잉 관계를 고려한 게시글 조회 기능 구현에서, JPQL로는 복잡한 동적 쿼리를 처리하기 어려웠고, 코드의 가독성과 유지보수성이 낮아 개발 효율이 떨어지는 문제가 발생함.
-
해결 과정
- 도입 이유: 복잡한 동적 쿼리를 처리해야 하는 게시글 조회 기능에서 기존 JPQL로는 코드가 비대해지고 가독성이 떨어져 유지보수가 어려운 상황이었음. 더불어, 다양한 정렬 조건(예: 인기순, 최신순)을 추가해야 했기 때문에, 더 유연하고 타입 안전한 쿼리 작성이 가능한 QueryDSL 도입이 필요했음
- QueryDSL 도입: 기존 JPQL을 QueryDSL로 전환하여 코드 직관성과 안정성을 높였으며, 동적 쿼리 생성을 유연하게 처리할 수 있도록함
- 정렬 기준 구현: 인기순, 최신순 등 다양한 정렬 조건을 열거형(Enumeration)으로 추상화하여 관리함으로써, 확장성과 일관성을 확보함.
-
결과
- 성능 향상: 평균 응답 시간이 13% 감소하고, 처리율이 16% 증가하여 동시 요청 처리량을 개선함.
- 유지보수성 향상: QueryDSL 도입으로 코드 재사용성과 가독성이 높아졌으며, 프로젝트 확장 시 유지보수가 용이해짐.
- 추가 개발 용이성: 열거형 정렬 방식으로 새로운 정렬 기준을 쉽게 추가할 수 있어, 요구사항 변화에 유연하게 대응할 수 있도록 함.
-
JPQL 사용 (전)
-
Query DSL 도입(후)
알림 조회 서비스 최적화
-
문제상황
- 알림 조회 서비스의 초기 성능 테스트에서 사용자 수가 증가함에 따라 평균 응답 시간이 크게 늘어나고, 처리량이 감소하는 문제가 발견되었습니다. 이로 인해 서비스가 많은 사용자를 동시에 지원하지 못하고, 사용자 경험이 저하되는 우려가 있었습니다.
-
해결과정
-
성능테스트
- JMeter를 사용하여 1000명과 10000명의 동시 요청을 시뮬레이션하며 성능 테스트를 진행한 결과, 서비스가 동시 요청을 효율적으로 처리하지 못하고 성능 저하가 발생함을 확인함.
-
Redis 도입
- 성능 문제를 해결하기 위해 Redis 캐싱을 도입하여 동일한 요청에 대한 데이터베이스 조회를 줄여 응답 속도를 높임. TTL 설정으로 최신 알림 상태를 유지하면서 효율적인 캐싱이 가능하도록 구현함.
- 캐싱 전략:
notification:{username}:page:{pageNumber}
형식으로 페이지별 캐싱. 삭제 시 해당 사용자의 모든 캐시 데이터를 일괄 삭제하여 일관성 유지.
-
결과
- Redis 도입 후 성능 테스트를 재실행한 결과, 다음과 같은 개선 효과를 확인함.
- 응답 시간 93% 감소: 10000명 동시 요청 시 평균 응답 시간이 93% 단축됨.
- 처리량 12% 증가: 캐싱 적용 후 처리량이 12% 증가하여 다수의 동시 요청을 효율적으로 처리할 수 있게 됨.
참여인원
5명 (백엔드 3명, 프론트엔드 2명)
담당포지션
아키텍쳐
주요 작업
Spring Security 설정 중 순환참조 문제 해결
-
문제상황
- Spring Security 설정 과정에서 JwtFilter와 UserDetailsService 간에 순환 참조 문제가 발생하여 애플리케이션이 정상적으로 실행되지 않는 오류가 발생함.
-
원인분석
- UserDetailsServiceImpl이 빈으로 명시적으로 등록되지 않았기 때문에 발생한 문제로 확인됨.
- UserDetailService는 Spring Security에서 추상화된 상태로 제공되며, 세부 구현은 개발자가 직접 정의해야 함.
- 이러한 상황에서, Jwt 토큰을 검증하는 필터인 JwtTokenFilter에서 토큰검증을 위한 유저네임 로드를 하였음.
- JwtTokenFilter에서 JWT 토큰 검증 시 유저 정보를 로드하려고 UserDetailService를 호출했으나, 기본 구현체인 InMemoryUserDetailsManager가 로드되며 Spring Security 설정 코드까지 호출하게 되어 순환 참조 문제가 발생함.
-
해결과정
- 순환 참조 문제 확인 및 원인 탐색
- PasswordEncoder 빈 설정이 문제의 원인일 가능성을 발견하고 이를 별도의 클래스로 분리하여 임시적으로 해결했으나 근본적인 해결책은 아니었음.
- UserDetailsService 빈 설정 문제 점검
- UserDetailsServiceImpl 클래스에 @Service 어노테이션이 누락되어 있어, 기본 구현체인 InMemoryUserDetailsManager가 빈으로 참조된 문제를 발견함.
- JwtFilter
- UserDetailServiceImpl
- InMemoryUserDetailsService
-
어노테이션 추가 및 빈 설정 수정
- UserDetailsServiceImpl 클래스에 @Service 어노테이션을 추가하여 JwtFilter가 올바른 구현체를 참조하도록 수정함.
- 이를 통해 순환 참조 문제를 근본적으로 해결하고 애플리케이션이 정상적으로 실행되도록 함.
관련하여 작성한 포스팅
냉장고 데이터 수집과 AI 모델 구축의 문제 해결 및 최적화
- 문제상황
- 냉장고 내부 식재료 데이터를 수집하여 탐지 모델을 구축해야 했으나, 실제 냉장고를 섭외하지 못하는 물리적 제약과 식재료 데이터 확보의 어려움이 존재함.
- 적절한 식재료 인식 모델이 부족하여 데이터를 직접 수집하고 라벨링해야 하는 상황이 발생함.
- 해결과정
- 대체 냉장고 환경 구성
- 실제 냉장고 대신 택배 박스를 냉장고 형태로 개조하고, 카메라와 IoT 장비(Arduino, Raspberry Pi)를 부착하여 데이터를 수집함.
- 식재료 데이터 수집에는 방송용 모조 과일 및 채소를 사용하여 실제 데이터를 대신함.
- AI 모델 학습
- 상용 API가 대부분 B2B용이거나 커스터마이징이 제한적이어서 YOLOv5 모델을 채택해 자체 라벨링한 데이터를 학습함.
- 비닐 포장된 식재료도 인식할 수 있도록 추가 학습을 진행하여 다양한 상태의 식재료를 효과적으로 탐지할 수 있도록 학습시킴.
- 결과
- 제한된 예산과 자원 내에서 데이터 수집 시스템을 성공적으로 구축함.
- 대체 냉장고 환경을 활용하여 향후 다양한 실내 IoT 프로젝트에도 적용 가능한 기반을 마련함.
- 라벨링 이미지
Soft Skill.
Git
Git
-
Commit Message: 커밋 메시지를 체계적으로 작성하고, 이슈 번호와 기능을 명시하여 코드 변경 사항을 일목요연하게 관리함.
-
Issue : 작업의 목적과 배경, 변경 사항을 명확히 정의하고, 관련 작업을 체계적으로 관리함.
-
Pull Request : 코드 리뷰와 변경 사항을 명확히 알리기 위해 Pull Request를 작성하고, 변경 사항에 대한 상세 설명을 포함하여 팀원들과 효과적인 협업을 촉진함.
참고자료 - 커밋
참고자료 - 이슈
참고자료 - 풀리퀘스트
문서화
Wiki
- 프로젝트를 진행하며 정리가 필요한 내용(기술사용이유/기능명세 등)을 정리하여 팀내 문서화 문화를 촉진시킴.
컨벤션 문서 작성
- 백엔드 컨벤션 문서를 작성하여 일관성있는 코드네임 및 코드작성방향을 유지하고자 하였음.
참고문서