미리보기
기본 정보
안정적인 환경보다는 발전할 수 있는 환경을 스스로 만들어 항상 발전하고 싶어 하는 개발자 강인재입니다.
기술 스택
Java, Kotlin, Spring Boot, mybatis, spring-jpa, querydsl, MySQL, Redis, Docker, s3, GitHub, spring-boot-actuator, Prometheus, grafana, github-actions
경력
도우커뮤니티
사원 | 개발팀 | 재직 중
2024.04. ~ 재직 중 (11개월)
[서비스 링크]
[기술 스택 구성]
서버: linux + docker + nginx
백엔드: Kotlin + SpringBoot + JPA/Query DSL + MySQL + Redis + Github Actions + jib
프론트엔드: Next.js + Chakra UI + React Query + Vercel
[한깡 및 한깡 파트너(백오피스) 플랫폼 개발]
현재 한깡이라는 스쿠버 다이빙 플랫폼 풀스택 개발 및 개발 및 유지 보수와 배포 등의 전반적인 개발 업무를 담당하고 있습니다.
한깡 프로젝트는 진행되는 중에 입사하여 개발을 진행하게 되었습니다. 최대한 빠른 개발 참여를 위해 코드 분석에 집중하여 수습기간이 끝나기 전부터 개발에 참여할 수 있었습니다.
3가지 핵심 기능을 중점으로 서비스하고 있습니다.
첫 번째로 원하는 국내 또는 해외 다이빙 샵을 검색하여 원하는 날짜에 예약 및 결제를 할 수 있는 기능을 제공하며 업체 측에서도 사용 가능한 파트너 플랫폼을 제공하여 사용자 입장에서는 쉽게 예약하고 업체 입장에서는 예약 관리가 편하도록 기능을 제공하고 있습니다.
두 번째로는 커뮤니티 활성화를 위해 "한깡 같이 하실래요?" 기능을 제공하여 회원끼리 모집을 통해 다이빙을 할 수 있고 다이버끼리 쪽지를 통해 소통도 할 수 있도록 제공하고 있습니다.
마지막으로 다이빙을 많이 다닌 다이버라도 모든 다이빙 포인트를 알 수 없기에 다양한 포인트 정보 제공을 위해 기존 DB의 포인트와 신청을 받는 포인트를 모두 등록하여 국내/해외에 어떤 다이빙 포인트가 있는지 정보를 제공하고 있습니다.
[한깡 쇼핑몰 개발]
현재 한깡 쇼핑몰이라는 스쿠버 다이빙 장비 쇼핑몰 프로젝트의 풀스택 개발 및 유지 보수와 배포 등의 전반적인 개발 업무를 담당하고 있습니다.
한깡이 기능적으로 안정화된 이후 이전에 예정되었던 다이버 전용 쇼핑몰(한깡 쇼핑몰) 개발을 진행하였고 이전과 달리 1인 개발로 진행하였습니다.
3가지 핵심 기능을 중점으로 서비스하고 있습니다.
한깡 쇼핑몰에서는 회원/비회원 상품 구매와 취소 기능을 핵심으로 제공
비회원은 판매가에 구매 가능하지만 회원은 일반 회원/강사 회원 여부에 따라 추가적인 할인이 적용되도록 제공
쿠폰은 모든 상품, 특정 브랜드, 특정 상품 다양한 경우에 사용할 수 있도록 제공
[프로젝트 참여 내용]
백엔드 참여 내용
기존 API의 에러에 대한 조치
비용 이슈로 인한 배포 환경 변경(aws -> cafe24) with 도커
웜업 로직 등록(초기 화면 fetching latency 이슈)
코드 가독성 향상을 위한 코드 수정
한깡 posttask(비동기 알림톡 전송) 작성
한깡 쇼핑몰 상품 목록/조회 기능
한깡 쇼핑몰 쿠키 활용한 익명 사용자의 장바구니 기능
한깡 쇼핑몰 비밀 상품 문의 내용의 마스킹(권한별)
상품 회원/비회원 주문(포인트, 쿠폰, 배송지) 기능
프론트엔드 참여 내용
한깡 모바일 반응형 작업
한깡 공지사항/이벤트/게시판 등 고객지원화면 작업
한깡 쇼핑몰 화면
아이컴테크놀러지
사원 | 개발3팀
2022.11. ~ 2023.06. (8개월)
[기술 스택 구성]
서버: linux
백엔드: java + springBoot + mybatis+ mariadb + Redis
프론트엔드: nuxt.js + es6 + lodash + axios
[행사 관리 플랫폼 삐빅 개발]
개발 3팀 소속 풀스택 개발자로서 중도 참여하여 전반적인 개발 및 유지 보수를 담당하였습니다.
행사 관리 플랫폼의 주요 서비스 항목
행사 주최자의 초대 인원 관리(좌석 지정, 권한 변경 등)
초대 인원에게 문자 및 알림톡을 이용한 초대장 전송
마스터 계정에서의 행사 주최자 등록 및 말소 기능
[사내 문서 시스템 개발]
개발 3팀 소속 풀스택 개발자로서 프로젝트 구성부터 시작하여 전반적인 개발 및 유지 보수를 담당하였습니다.
사내 문서 시스템의 주요 기능
구글 로그인 제공(기존 teams 계정을 사용하기 위함) 및 구글 API 제공 기능 활용
로그인 후 출/퇴근 근태관리 기능
휴가신청서, 시말서 등의 다양한 사내 문서 양식 관리 및 결재 기능
연차 관리를 통해 반차, 반반차를 사용할 수 있으며 대시보드를 통한 연차 사용자 확인 기능
프로젝트
초로(초보 개발자의 로그)
개인
2023.08. ~ 진행 중
[레포]
못다한 이야기를 확인 할 수 있습니다!
[서비스 링크]
[기술 스택 구성]
서버: linux + docker + nginx
백엔드: Kotlin + SpringBoot + JPA/Query DSL + MySQL + Redis + Github Actions + jib + websocket(stomp) + envers + flyway + discord webhook
프론트엔드: Next.js + Chakra UI + React Query + Vercel + PWA
[프로젝트를 진행한 이유]
여러 블로그를 참고하면서 능력있는 개발자들의 블로그는 보통 직접 개발한 경우가 많다고 느껴서 진행하게 되었습니다.
이전까지 배운 내용들을 활용해보고 중간중간 알게된 새로운 기술도 익히기 위해 진행하였습니다.
[주요 기능]
인증/인가
일반/소셜 로그인을 제공하며 로그인 시 발행된 JWT 토큰 타입의 access_token, refresh_token을 이용해 인증 처리하도록 하였습니다.
요청 시 OncePerRequestFilter를 통해 SecurityContext의 인증 객체를 통해 인가 처리를 수행하도록 하였습니다.
웜 업
애플리케이션 재시작 시 JVM 특성상 최소한의 클래스를 로드해서 시작하기 때문에 첫 API 호출 시 latency 발생하여 애플리케이션 시작 시 자주 사용되는 API를 호출하여 로드될 수 있도록 하였습니다.
warmer 인터페이스를 통한 추상화로 해당 인터페이스 구현하고 빈으로 등록하면 해당 로직이 애플리케이션 시작 시 실행될 수 있도록 하였습니다.
github actions
main 브랜치 푸시 이벤트에 트리거 하여 makefile에 정의된 커맨드를 통해 jib로 도커 이미지를 빌드 하고 docker hub에 푸시할 수 있도록 하였습니다.
이후 서버에 접속하여 makefile에 정의된 커맨드를 통해 도커 이미지를 풀 받아 재배포를 할 수 있도록 하였습니다.
amazon s3 presigned url
파일을 업로드할 때 해당 파일을 서버에서 전달하고 서버에서 저장소로 저장하는 것은 비효율 적이며 성능 저하를 초래할 수 있습니다.
또한 인가받지 않은 요청에 대해 검증이 필요하기 때문에 S3 presigned url을 통해 인가받은 사용자는 파일 첨부 가능한 링크를 받아 업로드를 할 수 있고 해당 파일 저장된 URL만 서버에 저장하여 파일 전송으로 인한 성능 저하를 방지하였습니다.
로깅
로컬에서 발생하는 에러 로그 발생 시 바로 확인할 수 있지만 운영 서버에서 발생하는 에러 로그는 서버에 즉각적인 확인이 어려웠습니다.
이를 위해 Webhook을 사용해 로그를 받을 수 있는 서비스(Discord, Slack 등)가 있다는 것을 알게 되었고 Discord 채널에서 에러 로그를 받도록 설정하였습니다.
또한 에러 로그를 제외하고도 유용한 로그가 많다고 생각되어 loki를 이요해 grafana 대시보드에서 확인할 수 있도록 구성하였습니다.
포트폴리오
교육
창원기계공업고등학교
고등학교 | 기계계
2016.03. ~ 2019.02. | 졸업
자격증
정보처리산업기사
산업기사 | 한국산업인력공단
2022.09.
자기소개
끊임없는 노력으로 항상 발전하자
저의 가치관은 끊임없이 노력하지 않으면 자기 발전도 없다.
입니다. 실제로 고등학교 2학년 때 독서감상문 대회에 참가한 적이 있는데 수상의 결과는 얻지 못했습니다. 하지만 이를 계기로 꼭 수상하겠다는 목표가 생겼습니다. 이 목표를 실행하기 위해 두 가지를 구체적으로 설정하였습니다. 첫째, 수상작들을 읽고 비교하며 문맥에서 어떤 차이가 있고 어떤 표현을 사용하였는지 스스로 분석하였습니다. 둘째, 폭넓고 다양한 지식과 표현을 습득하기 위해 소설이나 에세이 등 다양한 분야의 문학 작품들을 접하였습니다. 이렇게 능력을 개발하던 중 교내 논술대회가 열린다는 것을 듣고 주저하지 않고 신청하였습니다. 그렇게 대회에 참가하였고 결과적으로 은상(2등)에 입상하는 큰 성취감을 느낄 수 있었습니다. 또한, 이러한 경험을 통해 끊임없이 노력한다면 원하는 결과를 얻을 수 있다는 것을 배우게 되었고 입사하게 된다면 가치관을 바탕으로 초심을 잃지 않고 항상 발전하는 사원이 되겠습니다.
작은 배려의 중요성
고등학교 2학년 때 방과 후 6시에 매일 2시간씩 원하는 제품을 제작하는 팀 프로젝트에 팀장으로 참여한 적이 있습니다. 당시 분리수거를 위해 리어카를 만들기로 하였습니다. 하지만 역할을 분담하던 중 갈등이 발생하였습니다. 자재 절단 담당인 팀원이 용접을 하고 싶다고 했기 때문입니다. 팀장으로서 그 친구의 의견도 존중해야 하지만 공동의 목표를 이루기 위해 갈등은 오히려 목표 진행에 역효과를 줄 수 있다고 생각했기 때문에 8명이 회의 시간을 가졌습니다. 각자의 의견은 일리가 있었으나 하고 싶은 역할을 두고 시간을 지체할 수 없었습니다. 우리의 목표를 성취하기 위해서는 개인의 능력보다 중요한 것이 팀워크라고 강조하며 “좋은 제품을 만들기 위해 어느 정도의 희생은 모두 감수해야 한다.”라며 설득했으며, 매일 역할을 바꿔가며 진행한 결과 팀원들의 역할분담에 대한 만족도도 높았습니다. 프로젝트를 마치며 그 친구는 배려해 줘서 고맙고 덕분에 잘 마무리된 것 같다는 말을 통해 뿌듯함을 느꼈고 이를 통해 공동체 생활에서는 꼭 필요한 것이 배려와 존중이라는 것을 느꼈습니다. 이러한 느낀 점을 바탕으로 입사하게 된다면 사원으로서는 상급자를 잘 따르며 리더가 되었을 때는 잘 이끌어 주고 싶습니다.
함께 성취하는 즐거움
고등학교 3학년 교내 농구 대회에 참여한 적이 있습니다. 평소 농구를 좋아하여 매일 점심시간이나 학교 시간 외에도 연습하던 친구들과 팀을 이루어 참여하게 되었습니다. 당시 실력이 조금 좋았기 때문에 주장으로서 참여하게 되었는데 팀원들과 토의를 해봤을 때 상대적으로 전력이 부족하다고 생각하였습니다. 그렇기 때문에 더 많은 연습량과 시간을 가져야 한다는 팀원들의 의견이 나왔고 방과 후에도 체육관에 모여 매일 1~2시간씩 연습을 하였습니다. 당시 팀원들에게 가르쳐 줬던 것을 팀원들이 연습경기 중에 해낼 때 모두가 기뻐하고 성취감을 느끼는 좋은 분위기를 유지하려고 노력하였습니다. 또한 공동의 목표를 이루기 위해 함께 노력하는 것이 너무 행복한 일이라는 것을 느꼈습니다. 이렇게 연습을 하고 대회 경기를 치렀고 노력에 보답하듯 1등을 할 수 있었습니다. 당시 함께 어렵다고 생각한 상황에서 함께 노력하여 헤쳐나가는 과정에서 함께 성취해나가며 즐거움과 뿌듯함을 느꼈습니다.
문제해결의 과정
자체 서비스인 한깡, 한깡 쇼핑몰의 1인 개발을 하면서 비회원 이력 관리, 주문 및 관리, 스케줄링, 외화/원화 등의 다양한 요구사항을 경험하였습니다. 과정에서 많은 사례를 참고하며 여러 가지 시도를 통해 문제를 해결하며 즐거움을 느꼈습니다. 대표적으로 한깡 쇼핑몰을 개발하면서 오늘의 집, 무신사, 네이버 쇼핑, 쿠팡 등의 참고 자료와 API 응답 등을 참고하였고 이를 통해 상품 API 구성, 상품 구매 시 옵션 선택을 다양하게 하는 방법, 등급별 할인 적용, 장바구니 및 위시리스트 저장 방법, 배송지 선택, 쿠폰/포인트 적용 로직 등을 참고했던 내용을 적절히 활용하여 구현할 수 있었습니다. 경험을 공유할 수 있는 선임 개발자나 자료가 없는 상황에 대한 아쉬움은 있었지만 스스로 문제상황을 해결해 나가는 과정이 가장 즐거웠던 순간 중 하나였습니다. 이러한 즐거움을 원동력으로 현재 개발자로서 정진하고 있으며 평생 이런 즐거움과 함께 개발하는 개발자가 되고 싶습니다.