채용공고 올리기

Dongyuen Kim님을 응원해보세요!

이직/구직 중이에요
혁신적
창의적
협업 지향
자기 주도적
리더십

미리보기

기본 정보

이름
Dongyuen Kim
직업
백엔드 개발자
이메일
fruturum@gmail.com
간단소개

우아한 테크 코스 5기에서 백엔드 과정을 수료하였습니다. 해당 과정에서 행록 프로젝트를 진행하며 패키지간 의존성 분리, 여행 조회 및 경비 조회의 쿼리 성능 개선 
등을 담당하였습니다. 또한 서버 분리 및 로드 밸런싱을 통해 불필요한 서버 자원을 정리하고 효율적으로 scale out한 경험이 
있습니다. 마피아 투게더 프로젝트를 진행하면서 애그리거트 정의 및 패키지 의존성 분리, Redis를 통한 Repository 
구현, CI/CD 구축을 담당하였습니다. 또한 Redis의 동시성 문제를 해결하기 위해 Lock을 직접 구현한 경험이 있습니다.

기술 스택

기술 스택

프로젝트

소속/기관명

개인

프로젝트명

마피아 투게더

프로젝트 내용

About


웹을 통해 실시간으로 온라인 마피아 게임을 즐길수 있는 서비스입니다.
로그인이나 어플 설치 없이 실시간으로 게임을 즐길 수 있습니다.

개발 인원 : 6 ( BE : 3, FE : 1, DESIGN : 2
2024.4 ~ 2024.5 ( MVP 개발 ), 2024.5 ~
Java, Spring Boot, Nginx, Docker, AWS EC2, Redis, Github Action

SiteLink : https://mafia-together.com
Github : https://github.com/mafia-together/


기능 구현


  • 채팅 조회 및 전송 기능 구현

  • 투표기능 구현

  • 플레이어 직업 구현

  • 투표 조기 종료 기능 구현

  • 상태 변경 로직 설계 및 구현

  • 방 상태 확인 API 구현


어그리거트 분리 및 패키지 분리


[문제 상황]
Room이 모든 객체에 의존성을 가지고 있어 유지 보수성에 문제가 발생

[해결]
분리한 패키지에서 서로 강한 의존성을 가지고 있음
양방향 의존과 직접 객체를 참조하여 강한 의존성을 가지고 있다고 판단
패키지 간 참조를 간접 참조로 바꾸어 의존성을 약화 시킴
논리적으로 의존이 필요한 경우 event를 발행하여 양방향 의존을 해결패키지간 의존성 분리


Redis 도입


[문제 상황]
게임의 데이터가 Spring 서버에 위치하고 있어 SPOF에 취약하고 
Scale out, 무중단 배포시 문제가 있을 것으로 예상
유저가 많아질 수록 많은 메모리가 필요하게 될 것인데 스프링과 같이 관리할 경우 메모리 부족
게임 데이터를 JVM으로 관리하고 있는 것이 원인이라 판단

[해결]
Redis를 도입, Game, Room, Chat, Vote, Job의 저장소를 구현


Redis Lock 구현


[문제 상황]
방에 여러명의 유저가 입장할때 동시성 이슈가 발생

[원인]
기존 사용하던 Spring Redis Library인 Lettuce는 Lock을 제공하지 않기 때문에 해당 이슈가 발생함

[해결]
Pub/Sub구조의 Lock을 구현해둔 Redisson으로 Library 교체
AOP로 Lock을 구현하여 필요한 메서드에서 횡단관심사로 Lock 획득 및 반환 로직 구현
(자세히 보기)


게임 상태 변경 SSE 적용


[문제 상황]
기존 Polling으로 구현되어 있어 게임과 유저수가 늘어날 수록 서버의 부담이
늘어날 것으로 예상


[교체 기술 및 체택 이유]
SSE : 단방향 통신으로 게임 상태 변경시 구독자에게 알리기만 하면 됨
추가적인 라이브러리 없이 구현 가능

[구현]
1. 게임 시작시 방의 모든 유저가 구독
2. 방 상태 변경시 이벤트 발행
3. 방 상태의 경우 scheduler를 통해 현재 시간과 해당 방의 상태 종료 시간을 비교 후 상태 변경

(자세히 보기)


채팅 STOMP 적용


[문제 상황]
기존 Polling으로 구현되어 있던 채팅으로 구현되어 있어 게임과 유저수가 늘어날 수록 
서버의 부담이 늘어날 것으로 예상

[교체 기술 및 체택 이유]
STOMP : 양방향 통신으로 송 수신을 동시에 해야하는 채팅기능에 용이
Polling에 비해 불필요한 요청이 없음


Pub/Sub 구조를 통한 다수의 클라이언트에게 메시지 전송 가능



[구현]
1. 게임 시작시 방의 모든 유저가 방 코드를 topic으로 채널 구독
2. 메시지 발행시 메시지 브로커(Redis)를 통해 발행
3. 발행된 메시지를 구독한 모든 유저에게 스프링 서버를 통해 브로드 캐스팅


인프라


[CI/CD]
Github Action, Github, Docker Hub를 활용하여 파이프라인 작성


프로젝트 기간
2024.04. ~ 진행 중
소속/기관명

우아한테크코스

프로젝트명

행록 - 위치기반 여행 기록 서비스

프로젝트 내용

About


여행에서 느꼇던 설렘과 추억을 장소 기반으로 기록할 수 있도록 도와주는 서비스 입니다
여행의 흐름과 경비, 사진 메모 등을 한눈에 확인할 수 있습니다.
원한다면 나의 여행을 링크, 커뮤니티 등을 통해 타인과 공유할 수 있습니다.

2023.07 ~2023.11
BE : 5, FE : 3
Java, Spring Boot, Spring Data JPA, Rest Assured, Nginx, Docker, AWS EC2, Grafana, K6, Oauth2.0, JWT, MySQL, Jenkins, Github Action
SiteLink : https://hanglog.com
Github : https://github.com/woowacourse-teams/2023-hang-log


기능 구현


  • 소셜 로그인

  • 사용자 단일 여행 경비 조회

  • 공공 환율 api 조회 및 저장

  • 공유 상태 수정

  • 커뮤니티 전체 여행 조회 기능 구현

  • 커뮤니티 단일 여행 조회

  • 커뮤니티 단일 여행 경비 조회


패키지간 의존성 분리


[문제 상황]
엔티티간 의존성이 높아 분리할 필요성을 느낌

[해결]
타 패키지의 엔티티간의 참조가 있을 경우 id를 참조하게 하여 간접 참조로 분리
로직적으로 분리가 불가능할 경우 event 발행


TPS(Transtaion Per Second) 성능 개선


[문제 상황]
API요청 별 중복되거나 불필요한 쿼리 발생

[해결 방안]

JPA N+1
문제
단일 여행 조회 쿼리를 Fetch Join으로 수정하여 요청당 6회에서 3의로 개선

Static한 고정값
조회
경비 조회의 특정 고정값들을 메모리에 Static하게 관리하여 요청당 6회에서 4회로 개선


서버 분리 및 로드 밸런싱


[문제 상황]
각 EC2의 서버 용량이 불필요하게 큼
단일 운영서버로 인해 단일 장애점이 발생시 대체가 불가능하다는 점을 인식
무중단 배포를 위해 운영서버를 확보하기로 함

[해결]
단일 장애점(SPOF)를 피하기 위하여 Nginx를 통해 운영서버를 스케일 아웃
기존 prod, dev의 t2.small 서버 → micro 서버 pord1, prod2, dev, LB 서버로 스케일 아웃


인프라


[서버 모니터링 구축]
Grafana, Prometheus, Loki 등을 통해 서버 모니터링 구축

[부하 테스트]

K6를 통한 부하 테스트 진행
Tomcat과 HikariCP 최적화 진행


프로젝트 기간
2023.06. ~ 2023.11.
(6개월)

포트폴리오

타입

URL

피그마
링크

포트폴리오

교육

소속/기관명

우아한테크코스

종류 | 전공

사설 교육 | BE

재학 기간

2023.02. ~ 2023.11.

재학 상태

졸업

소속/기관명

인하대학교

종류 | 전공

대학교(학사) | 기계공학과

재학 기간

2014.03. ~ 2021.02.

재학 상태

졸업

소속/기관명

부천고등학교

종류 | 전공

고등학교 | 인문계

재학 기간

2014.02. ~ 2014.02.

재학 상태

졸업

댓글