미리보기
기본 정보

발로 뛰며 배우고, 적극적으로 피드백을 수용하는 실행형 인간입니다.
포트폴리오
자기소개
더 나은 비즈니스를 위해 고객의 입장을 우선으로 서비스를 구현합니다.
사용자 경험을 우선으로 고려하고, 서비스에 애정을 갖는다면 자연스럽게 더 좋은 결과물이 따라온다고 믿습니다.
사람들과의 소통을 통해 솔루션을 찾는 것을 즐기며, 팀원과 적극적인 소통을 통해 문제 해결 경험을 쌓았습니다.
타인의 의견과 아이디어를 주고받으면서 제 개발 역량이 한 층 성장할 수 있었습니다.
코드는 사람들과 서로 의사소통하는 언어라고 생각합니다. 명확한 의도를 가지고 코드를 작성하는 것이 가독성을 향상시킨다고 믿으며, 직관적이고 이해하기 쉬운 코드를 지향합니다.
대외활동
구름톤 트레이닝 풀스택 개발자 양성과정
구름 (goorm)
KAKAO x GOORM 기업 연계 프로젝트 개발 부문 우수상 수상 (총 8팀 참여)
팀 스터디 및 프로젝트 진행
코드 리뷰 및 페어 프로그래밍을 통한 협엽 경험
교육
삼육대학교
대학교(학사) | 컴퓨터공학과
2017.03. ~ 2024.02. | 졸업
기술 스택
Java, Spring Boot, JPA, GitHub, MySQL
프로젝트
누구든지 작가가 되어, 자신의 예술성을 뽐낼 수 있는 플랫폼, D’ART
구름톤 풀스택 과정
2024.05. ~ 2024.07.
사용자가 자신의 예술 작품을 등록하고 전시를 열 수 있으며, 온라인 전시를 관람할 수 있는 서비스입니다.
💪 SKILLS: Java, Spring Boot, JPA, MySQL, Redis, WebSocket, SSE, AWS-EC2, AWS-RDS, Docker
🧑🏻💻 ROLE: 채팅, 알림, 배포
[ 배포 프로세스 간소화 및 서비스 독립성 확보 ]
CodeDeploy와 S3를 사용한 기존 방식은 서비스 간의 의존성 관리나 배포 과정을 단순화하는 데 한계가 있다고 판단했습니다. 그래서 Docker Compose를 도입하여 각 서비스를 개별적으로 관리하는 대신, 일괄적으로 배포가 가능하게 했습니다. Docker 이미지를 활용함으로써 각 구성 요소가 독립적으로 실행되며, 다른 구성 요소와의 간선 없이 안정적으로 운영할 수 있어 다양한 환경에서도 손쉽게 배포할 수 있었습니다.
[ CI & CD 최적화 및 빌드 시간 단축 ]
GitHub Actions를 활용하여 지속적 통합 및 지속적 배포를 보다 효과적으로 구현하였습니다. PR 단계에서 자동으로 빌드 및 테스트가 실행됨으로써 코드 품질을 검증하고, Merge 전에 문제를 조기에 발견할 수 있었습니다. Merge 후에는 안정적인 코드만 프로덕션 환경에 배포되도록 설정하여 배포 안정성을 더욱 높였습니다. 또한 Gradle Caching 도입을 통해 PR 단계에서의 빌드 시간을 1분 8초에서 29로 단축할 수 있었습니다.
[ SWAP 메모리 설정을 통한 EC2 인스턴스 성능 향상 ]
프리티어 EC2 인스턴스를 사용하면서 서버 메모리 부족으로 개발 환경이 불안정한 상황이 발생했습니다. 이를 해결하기 위해 1GB RAM의 한계를 극복하고자 디스크 용량을 활용하여 2GB의 SWAP 메모리를 설정하였습니다. 이로 인해 서버의 메모리 부족 문제를 완화하고, 전반적인 성능과 안정성을 향상시킬 수 있었습니다.
[ 채팅 데이터 저장 및 성능 최적화 ]
수많은 채팅 메시지를 RDB에 직접 저장하면 서버에 부하가 걸릴 수 있다고 판단했습니다. 따라서 데이터를 Redis에 저장하여 빠른 데이터 처리 속도를 확보하고, 스케줄러를 활용해 5분마다 RDB에 데이터를 일괄 저장하도록 구현했습니다. 이를 통해 RDB 접근 빈도를 줄이고 성능을 개선하며, 데이터 무결성을 유지할 수 있었습니다.
[ SSE를 통한 실시간 알림 시스템 구현 ]
알림은 서버에서 클라이언트 측으로 단순 이벤트를 전달하는 목적을 가지고 있어 양방향이 아닌 단방향 통신이 필요하다고 판단했습니다. 그래서 Server-Sent Event(SSE)를 활용하여 실시간으로 알림을 전송하도록 구현하였습니다.
매일 자정마다 스케줄러를 통해 데이터베이스에서 발행 가능한 쿠폰 여부를 판단하고, 이를 바탕으로 클라이언트에게 실시간으로 쿠폰 발행 알림을 전송할 수 있도록 하였습니다.
코딩 테스트를 인스타그램처럼, 함께 공유하고 나눌 수 있는 플랫폼, ThinkTank
구름톤 풀스택 과정
2024.04. ~ 2024.05.
직접 코딩 테스트 문제를 만들고 풀면서 인스타그램처럼 다른 사람들과 서로 공유할 수 있는 서비스입니다.
💪 SKILLS: Java, Spring Boot, JPA, SpringSecurity, JWT, MySQL
🧑🏻💻 ROLE: 보안 및 회원 관리
[ AuthenticationPrincipal 커스터마이즈 및 AuthUser 도메인 설계 ]
SecurityContext에 저장된 사용자 정보를 가져오는 중복 코드를 줄이기 위해 @AuthenticationPrincipal를 커스터마이즈하였습니다. 또한 Spring Security의 기본 인증 방식을 확장하여 AuthUser 도메인을 설계함으로써 인증된 사용자 정보를 간편하게 주입받고 사용할 수 있도록 하였습니다. 이 과정에서 인증 관련 로직의 가독성을 높이고, 향후 추가적인 속성 확장에 유연하게 대응할 수 있는 기반을 마련했습니다.
[ ThreadLocal을 통한 데이터 일관성 유지 ]
여러 스레드가 동시에 정보를 요청할 경우 데이터 일관성에 문제가 발생할 수 있다고 판단했습니다. 이를 해결하기 위해 ThreadLocal을 사용하여 각 스레드가 독립적인 사용자 정보를 가질 수 있도록 하였습니다. 이로 인해 두 개의 스레드가 동시에 요청하더라도 데이터 충돌이나 일관성 문제를 효과적으로 방지할 수 있었습니다. 또한, ThreadLocal의 메모리 누수 문제를 방지하기 위해 요청이 완료된 후 저장된 데이터를 명시적으로 삭제하였습니다.
[ 세션 관리 최적화 및 보안 강화 ]
기존 세션 방식에서는 서버가 클라이언트의 상태를 유지함으로써 메모리 사용량이 증가하고, 많은 세션 정보 를 저장해야 하므로 스케일 아웃에 어려움이 발생할 수 있다고 판단했습니다. 이를 해결하기 위해 모든 정보가 토큰에 포함된 JWT를 도입하였습니다. 또한, 리프레시 토큰을 활용하여 사용자가 지속적인 인증 없이도 원활하게 서비스를 이용할 수 있도록 사용자 경험을 개선했습니다.
[ 인증 요청 최적화 및 서버 부하 감소 ]
많은 수의 인증 요청으로 서버 부하가 증가할 것으로 판단하여, 기존 RDB에 저장하던 리프레시 토큰을 Redis로 변경했습니다. 이를 통해 매 인증 요청 시 RDB 접근을 줄였고, Hash 기반 자료구조를 활용하여 데이터 접근 속도를 높였습니다. 또한 TTL 설정을 통해 만료된 토큰에 대한 접근을 자동으로 관리하여 서버 부하를 분산시켰습니다.