미리보기
기본 정보
개발 생산성과 유지보수성을 고려한 설계를 고민합니다. 문제 해결을 위해서라면 적극적으로 새로운 기술을 배웁니다. 코드를 통해 배우고 지식을 공유하며 함께 성장하고자 합니다.
기술 스택
Java, Spring Boot, JPA, querydsl, MySQL, Docker, GitHub, JIRA
프로젝트
취업 지원 블로그 서비스
가천 SW 아카데미
2024.09. ~ 2024.12.
https://github.com/KEA-5th-Myaong
팀 구성
BE 4명, FE 3명, AI 1명
사용 기술
MySQL, H2, Elasticsearch, Kafka (Kafka Connect, Kafka Streams)
Spring Boot (Spring MVC, Spring Data JPA, QueryDSL, Swagger, AWS SDK(S3 Client), Jsoup)
역할
DB, API 설계
도메인 매핑, API 구현 (블로그 홈, 포트폴리오 관리)
CDC 구현
주요 작업 및 문제 해결
불필요한 이미지 저장 최소화
프론트엔드에서 <img> 태그를 사용하여 이미지를 삽입하는 구조로 인해, 삭제된 이미지에 대한 처리 문제가 있었음
HTML 태그 파싱 및 임시 Object Storage를 활용하여 실제 사용되지 않는 이미지를 자동 정리하는 시스템을 설계 및 구현
CDC 구현
Kafka Connect와 Kafka Streams를 사용하여 MySQL 특정 테이블 변경 내용을 Elasticsearch에 반영
Kafka Streams와 Elasticsearch 연결 시 JsonConverter 관련 에러 발생, key 값에 대한 SMT를 추가하여 해결
헤더 중복으로 인한 CORS 문제 해결
Spring Cloud Gateway 사용 시 Access-Control-Allow-Origin, Access-Control-Allow-Credentials 헤더가 중복 정의되어 브라우저가 CORS 오류로 판단하는 문제 발생
API Gateway 서버의
spring.cloud.gateway.default-filters
에DedupeResponseHeader
설정을 추가하여, 해당 헤더가 중복되지 않도록 수정
사내 티켓 관리 서비스
가천 SW 아카데미
2025.01. ~ 2025.02.
https://github.com/WRKR-KEA/backend-tms
팀 구성
BE 5명, FE 2명, Infra 1명
사용 기술
MySQL
Spring Boot (Spring MVC, Spring Data JPA, QueryDSL, Swagger, Logback)
Next.js (React Query, Zustand)
역할
API 설계 및 구현 (상세 문의, 티켓 상세, 부서 티켓 조회)
개발 환경 로깅 구현
UI 버그 수정 (에디터, 토스트 알림 등)
주요 작업 및 문제 해결
API 로깅 구현
Servlet Filter와 Aspect를 활용하여 API 및 서비스 메소드 호출 로깅
API 응답 로깅을 구현하면서,
ContentCachingResponseWrapper
의 사용법을 익힘
SSE 알림 시스템 개선
SSE 연결이 금방 끊기는 문제를 디버깅하여, API 로깅 필터에서 응답에 Content-Length를 설정하는 것이 원인임을 발견
이를 해결하기 위해, API 로깅 필터가 SSE 엔드포인트에 대한 요청은 로깅하지 않도록 수정
AOP를 사용한 알림 관련 공통 로직 구현
각 알림 서비스 호출 시 사용자별 알림 설정 여부 확인 로직과 예외 처리(로깅)를 추가
서비스 호출 시마다 조건문을 넣는 것이 비효율적이고 유지보수성이 떨어진다고 판단하여, Aspect를 활용하여 구현
날씨 기반 코디 추천 개인화 서비스
기타 (졸업 프로젝트)
2024.02. ~ 2024.05.
팀 구성
BE 1명, FE 2명, AI 1명
사용 기술
MySQL
Spring Boot (Spring MVC, Spring Data JPA, Spring Security, JWT, Log4j2, Spring WebFlux(WebClient))
역할
AI 관련 기능을 제외한 백엔드 개발 담당
주요 작업 및 문제 해결
API 요청 로깅 및 예외 처리
프론트엔드와의 통합 과정에서 원활한 디버깅을 위해 요청 내용을 출력
Log4j2와 Filter를 사용하여 API 요청 내용 로깅 구현
ThreadContext(MDC + NDC)를 사용하여, 에러 로깅 시에 예외 발생 위치까지 확인할 수 있도록 함
Security Filter보다 외곽의 필터에서 Controller Advice가 잡지 못하는 예외를 잡아 처리하도록 함
기상청 API 연동 로직 개선
기존에는 HttpURLConnection을 사용하여 동기적으로 연동 및 데이터 가공
하나의 API가 여러 개의 기상청 API를 동기적으로 요청하며 성능이 떨어지고 있다고 판단
WebClient와 CompletableFuture를 활용하여 API를 비동기적으로 요청하도록 변경
외부 API 자체의 응답 시간으로 인하여 성능에는 큰 차이가 없었으나, Java에서 제공하는 비동기 처리 방식에 대해 학습할 수 있었음
관리자, 사용자 접근 권한 분리
Spring Security를 처음 사용하는 상황에서
.hasAuthority()
의 사용법을 학습하여 적용할 시간이 없다고 판단하여,InMemoryUserDetailsManager
사용관리자는
InMemoryUserDetailsManager
에 등록된 계정으로만 사용 가능하도록 구현
포트폴리오
URL
교육
가천대학교
대학교(학사) | 컴퓨터공학과
2021.03. ~ 2025.02. | 졸업
부흥고등학교
고등학교 | 자연계
2018.03. ~ 2021.02. | 졸업
자격증
정보처리기사
한국산업인력공단
2024.12.
네트워크관리사2급
2급 | 한국정보통신자격협회
2022.12.
자기소개
성장 과정
중학생 때 스크래치를 가지고 간단한 게임을 제작하여 교내 대회에서 상을 탄 경험이 있어, 개발에 대한 좋은 기억을 가지고 컴퓨터공학과로 입학했습니다. 이후 다양한 전공 수업을 들으며 웹 개발에 친숙해졌고, DB와 서버 개발 관련 수업을 흥미롭게 들었던 경험을 바탕으로 백엔드 개발자를 희망하게 되었습니다.
대학 생활을 하면서 선배들이 멘토로 참여하는 교내 해커톤에 참가한 적이 있습니다. 백엔드 개발자인 것으로 알고 있던 선배가 프론트엔드 멘토링을 해주고 있는 것을 보고 의문이 들었는데, 선배로부터 ‘개발 경력 11년 차면 프론트도 알아야지’라는 답변을 들었습니다. 그 이후로 프론트엔드, AI 등 분야에 상관없이 필요한 지식을 습득하고 응용할 수 있는 개발자가 되어야겠다는 장기적 목표를 갖게 되었습니다.
역량 및 직무 경험
백엔드 개발자로서 여러 프로젝트를 수행하며 다양한 기술을 익히고 문제 해결 능력을 키워 왔습니다. 그 예시로 졸업 프로젝트에서는 여러 개의 외부 API를 동기적으로 호출하는 부분에 WebClient를 적용하여 성능 개선을 시도하였습니다. 현장미러형 프로젝트에서는 Kafka Streams와 Elasticsearch 연결 시 발생했던 JsonConverter 관련 에러를 분석하고, key 값에 대한 SMT를 추가하여 해결하였습니다. 기업실무 프로젝트에서는 토스트 알림 UI 개선 과정에서 중복 저장 문제를 디버깅하여 해결하였으며, AOP를 활용해 알림 서비스의 설정 확인 및 예외 처리를 일관되게 적용하였습니다.
또한 현장미러형 프로젝트 당시, 한 팀원의 제안으로 트러블 슈팅 및 개발 문서 작성을 활발하게 수행하였습니다. 저는 QueryDSL 세팅, Local Object Storage (MinIO) 구성, Elasticsearch 구성 및 매핑 방법 등과 기타 트러블 슈팅 과정에 대한 문서를 작성했습니다. 이 문서들은 비슷한 문제가 발생했을 때 참고하거나 팀원이 작업한 내용을 학습하는 데에 사용할 수 있었습니다. 이를 통해 개발 문서 작성의 중요성을 알게 되어 이후 진행한 프로젝트에서도 작업 기록을 최대한 남기기 위해 노력하게 되었습니다.
성격의 장단점
저는 일을 가능하면 효율적으로 처리하고자 하는 성격입니다. 반복적인 텍스트 변환 작업은 파이썬으로 자동화하기도 했고, 구현 시에도 좋은 효율을 내기 위해 코드를 일관성 있고 체계적으로 작성하려고 노력합니다. API 설계 시에도 단순한 명세서 작성에 앞서 작성 규칙을 정리하고 에러 명세서를 함께 작성하여 개발자 간의 이해도를 높이기 위해 노력했습니다. 할당된 작업을 구현할 때도 먼저 로직에 대한 시퀀스 다이어그램을 그리거나 복잡한 예외 케이스에 대한 표를 정리하는 등 체계적인 설계를 바탕으로 구현하려고 노력했습니다. 이렇다보니 다소 산만한 성격임에도 불구하고 팀원들로부터 꼼꼼하다는 이야기를 듣기도 했습니다.
또한 현재 방식의 효율성을 의심하고 더 타당한 방식이 없는지 고민합니다. 기업실무 프로젝트에서 마이크로서비스를 식별할 때, Event Storming 방식은 그 의미를 이해하기 어렵다는 팀원의 의견이 있었습니다. 저도 이에 동의하여 도메인을 최대한 작게 쪼개어 작성하고 관련된 것끼리 묶어 결합도가 낮은 영역을 찾는 방식으로 진행하였고, 짧은 시간 내에 효과적으로 결과를 얻을 수 있었습니다.
한편, 프로젝트 진행 중 개선해야 할 점이 보이면 우선순위를 고려하지 못하고 눈에 띄는 문제에 집중하게 되는 성향이 있습니다. 이러한 점을 보완하기 위해 작업 시 우선순위를 계속 정리하는 습관을 들였으며, 이 습관 덕분에 해야 할 작업이 많아질 때에도 놓치는 부분 없이 처리할 수 있었습니다.