채용공고 올리기

Dongyuen Kim님을 응원해보세요!

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

미리보기

기본 정보

이름
Dongyuen Kim
직업
백엔드 개발자
간단소개

우아한 테크 코스 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.

재학 상태

졸업

댓글