압도적인 실행력 🚀 으로 무엇이든 해결하는 사람
하고싶은게 있으면 바로 실행합니다. 18살 쿠팡 셀링을 시작하여 100만+ 의 수익을 실현하였고, 인프런에서 강의를 기획 및 제작하여 하루에 한건 이상의 강의를 판매한 경험이 있습니다.
정의되어 있지 않은 문제들을 보고 문제를 어떻게 하면 해결할 수 있을지 고민하며 문제를 내가 가진 기술을 통하여 해결하고자 고민하고 노력하는 사람입니다.
가끔 허황된 꿈을 꾼다고 사람들은 이야기하지만, 그 끝엔 그 허황된 꿈을 현실로 만드는 사람이 되고자 합니다.
11,835개의 학교 1,307,828명의 학생을 대상으로 “전국 학교 소통을 편리하게 만들겠다” 는 목표를 가지고 “**세계 최초 학교 중점 소통 플랫폼”**을 개발하고 있습니다.
About Me.
Skills
- Kotlin, Java, Python
- Spring Boot
- Spring Data JPA, QueryDSL
- MySQL, MongoDB, Redis
- Docker, Github Action, Jenkins
- Azure, AWS, NCP, Oracle Cloud
Experience.
**더욱 자세한 정보는 양예성 이력서**에서도 확인 가능합니다.
Kotlin, Spring Frameworks, RabbitMQ, MySQL, MongoDB
세계 최초 학교 중점 소통 플랫폼으로 학교 구성원들과 원할한 소통 및 학교생활을 위해 개발된 플랫폼입니다. ”전국 학교 소통을 편리하게 만들겠다” 라는 목표로 7명의 팀원들과 개발중에 있으며, 기획과, 서버, 팀장, 발표를 담당하였습니다.
Velog : 스기 벨로그 시리즈
What did i do?
- 스기 팀의 리더로서 발표(17:30초), 기획, 회고 등과 같은 팀 리딩과 온보딩 문서, **피피티** 제작등과 같은 활동을 하였습니다.
- 대구소프트웨어마이스터고등학교 교내 평가 2등, 교내 학생 36명을 대상으로 한 베타테스트에서 71.4% 라는 높은 만족도와 베타테스트 기간중 하루 평균 34건의 리텐션을 기록한 바 있으며, 32건의 이슈를 하루만에 25건 해결하였습니다.
- 스기의 서버 개발을 담당하였으며, 학교 중점 소통 플랫폼에 걸맞는 채팅, 공지, 학사일정, 급식, 시간표, 캣스기 AI, 배포등 전반적인 서비스 기능 개발 및 배포를 담당하였습니다.
-
채팅
- 내부 메시지 브로커를 사용시 과도한 트레픽이 발생하면 전체 서버에 치명적 이슈 발생 가능성이 있었음
- 내부 메시지 브로커를 RabbitMQ로 변경 후 독립된 서버에서 동작하도록 구성
- STOMP, RabbitMQ를 사용해 대용량 트레픽까지 안전하게 처리할 수 있도록 구성
- 채팅방 읽음 처리에 대한 고민
- 사용자 메시지에 읽음 여부를 포함하여 전달함
- 둘다 채팅방 접속시엔 문제가 없지만 새로운 사용자가 채팅에 접속시엔 읽음 데이터가 반영 안되던 문제가 있었음
- 새로운 참가자 접속시 이벤트 메시지를 통해 다시 데이터를 불러와 데이터 일관성 보장
- 하지만 저장된 모든 메시지에 읽음 값을 추가해야했기에 과도한 업데이트로 인한 디비 부하 문제가 있었음
- 읽음 처리를 Timestamp 기준으로 판단하여 문제를 해결함
- 메세지 유효성 검증에 대한 문제
- 네트워크 문제와 클라이언트의 메시지 재발송에 의한 중복 처리 방지를 위해 ID 기반의 멱등성 보장 로직 구현
- FCM 을 통한 알림 기능 구성
- 캣스기 AI 추가에 따른 채팅 내부에서 급식, 시간표 정보 가져올 수 있도록 구성
- AI 를 통한 다양한 질의응답이 채팅방 내부에서 가능토록 구현
- AI 도입 후 직렬 응답을 통한 요청시간이 2배 이상 느려짐 확인 → 코루틴 도입으로 요청시간 정상화
- 소캣 애러 핸들링 도입
- 소캣상 인증, 비즈니스 예외 모두 SimpMessageBrokerError 로 처리되었음
- 인증오류, 비즈니스 오류 핸들링을 따로 두어 애러 핸들링 구현
- 비즈니스 오류시엔 소켓이 끊어지면 안된다 판단하였고 오류 반환만 하도록 함
- 이 과정에서 오류 반환시 오류가 발생한 사용자에게만 전달하고 싶어 SendToUser를 사용
- SendToUser 사용시 추가 방 구독이 필요하였음 또한 외부 브로커를 사용하지 못함
- 이를 해결하기 위하여 기존 방에 애러를 보내고 세션 ID를 통해 Message 전달시도
- 기존 방에 세션 Id를 전달 후 클라이언트가 처리하는 방안
- 애러 발생하지 않은 유저도 애러를 확인 가능한 문제와 불필요한 전달과정이 발생함
- 애러 빈도가 치명적이지 않을꺼라 판단, 내부 브로커를 사용하며 SendToUser를 사용 추가 방 구독을 통한 애러 메시지 전달 선택
-
학사일정, 시간표, 급식
- 나이스 API를 이용하여 정보를 저장
- 수정 및 변경 가능하도록 CRUD 기능 추가
- 학사 일정 데이터 조회
- K6를 통한 500명 10초 테스트 p90 35s 로 심각한 응답속도에 문제가 있었음
- 학사일정에 학년을 ElementCollection 으로 저장함
- 학사 일정 조회 후 학사일정에 대한 학년 조회시 N+1 문제 발생
- QueryDSL fetchJoin 을 통해 N+1 문제 해결
- Redis cache 적용
- 학사일정의 경우 잘 변동되지 않음에 따른 TTL 1Day Look-aside 전략 사용
- K6를 통한 동일한 환경에서 p90 30s → 621.35ms 요청속도 97.93% 성능개선을 함
-
공지
- CRUD 기능 및 FCM을 통한 알림 기능 구성
- K6를 통한 500명 10초 테스트 (조회기준) p 90 317.29ms 기록
- 캐싱, N+1 해결로 3.53% 성능 개선 (p90 317.29ms → ****p90 306.09ms)
-
캣스기 AI
- 스기의 AI 기능으로서 워크스페이스 정보를 바탕으로 다양한 질의응답이 가능한 챗봇
- SpringAI + OpenAI(ChatGPT) 를 사용하여 개발
- 급식, 시간표, 학사일정등을 물어볼 수 있고 모든 응답은 GPT 기반
- 사용자 응답을 바탕으로 키워드를 뽑아냄 (GPT 4o mini 사용)
- [급식, 공지, 시간표….] 형태로 키워드 반환
- 키워드를 바탕으로 요청된 워크스페이스 디비에서 데이터를 가져옴
- 데이터를 바탕으로 값을 정형화 한 뒤 클라이언트에게 전달
-
배포
- 기존 .jar 파일을 수동 배포를 진행함
- 배포시 시간이 높으며 버전 관리 이슈가 생김
- Docker, Jenkins와 Github Action을 통한 CI/CD 구성
- 244번의 CI/CD 작업을 젠킨스가 진행함 (2024.09.05 기준)
- Jenkins 추가 구성에 따른 비용 부담으로 Github Action으로 전부 이관
Kotlin, Spring Frameworks, MySQL
대구소프트웨어마이스터 고등학교 입학생들을 대상으로 서비스를 진행하고 있으며
원서 접수기간 중 매년 200~300명의 신입생들의 원서를 안전하게 접수하기 위해 노력하고 있습니다.