이새힘 Saehim Lee

Github : @new-pow
Blog : new-pow.tistory.com
Email : i.newpow@gmail.com
About me
🙌
함께 성장하는 것을 즐거워하는 이새힘입니다.
- 기능을 구현하고 조금씩 개선시키는 것을 진정으로 좋아합니다.
- 개발자를 꿈꾸기 이전에는 커뮤니티/교육 기획자로서 일하며 다양한 영역에 대해 관심을 가지고 학습한 결과를 업무에 녹여냈습니다. 이 기간동안 여러 분야의 전문가들과 협업 경험을 쌓을 수 있었습니다.
- 함께 일하고 싶은 사람이 되고 싶습니다. 동료로서 솔직하게 소통하고, 서로의 성장의 버팀목이 되는 것을 지향합니다.
Projects
RSS Reader
Second hand
당근 마켓을 모티브로 진행한 중고 물품 거래 플랫폼 프로젝트입니다. 이전에는 구현해보지 못한 생소한 요구사항이 많았지만 비즈니스 문제를 쪼개 작은 문제로 만들고 단계별로 기능을 구현하였습니다.
• 2023. 06. ~ 2023. 08 | BE 2명, FE 2명, iOS 2명
• 주요 기술
Java Springboot ORM(Spring data JPA) MySQL Redis
Nginx Docker Compose Docker AWS EC2 RDS S3 Lambda
👩🏻💻 Github : second-hand-BE
🗂️ API docs
🕸️ fivehands-but-iiiiii.site
• 2023. 06. ~ 2023. 08 | BE 2명, FE 2명, iOS 2명
• 주요 기술
Java Springboot ORM(Spring data JPA) MySQL Redis
Nginx Docker Compose Docker AWS EC2 RDS S3 Lambda
👩🏻💻 Github : second-hand-BE
🗂️ API docs
🕸️ fivehands-but-iiiiii.site
OAuth 회원가입 및 토큰 기반 회원 인증/인가 구현
- 사용자 데이터에 대한 보안과 편의성을 위해 OAuth 2.0을 이용하여 회원가입 구현하였습니다.
- session을 이용하여 인증 사실을 저장하고, 사용자로부터 추가 정보를 입력받아 회원가입 로직 완료(DB 반영)할 수 있습니다.
- 인증/인가를 위해 Jwt 토큰을 이용하여 토큰 기반 인증 방식을 사용합니다. 서버는 무상태성을 유지하므로 각 요청에 대해 개별적으로 처리할 수 있고, 서버 확장과 분산처리에 유리합니다. <- 이부분이 모순이지 않을까...
실시간 채팅 기능 구현
- STOMP 를 사용하여 간편하고 가독성 있는 서버 요청/응답 구조 구현하였습니다.
- STOMP의 각 command를 트리거로 회원 접속 여부, 안 읽은 채팅 집계 등의 로직을 비동기 스레드에서 처리하여 별도 요청을 위한 네트워크 비용을 줄이고자 하였습니다.
- Redis pub/sub을 이용하여 서버 확장성 있는 글로벌 메시지 브로커 구조를 구현하였습니다.
- 실시간으로 클라이언트에 이벤트 전송을 위한 SSE(Server Sent Event) 적용하였습니다.
- 이용자가 집중적으로 채팅하는 웹소켓 통신 외에는 비교적 가벼운 단방향 HTTP 프로토콜 통신으로 실시간 데이터를 업데이트 받을 수 있습니다.
SpringEvent를 활용한 코드 품질 관리
- 채팅 메시지 구현 시, 도메인 서비스 간의 결합도가 높고 라이프사이클이 다름에도 한 트랜잭션에 묶이는 문제가 있었습니다.
- 이를 해결하기 위해
SpringEvent
를 활용하여 어플리케이션 내 이벤트 발생시 연관 서비스 호출을 비동기로 처리하도록 구현하였습니다. - 성능을 향상시키고 도메인 간 의존성을 최소화하여 유지보수에 유리한 코드를 작성하고자 노력하였습니다.
테스트 환경 구축
- 실제 배포 환경과 테스트 환경을 일치하기 위해
Testcontainers
를 도입해 개발 및 테스트 환경과 실제 배포 환경을 재현하여 통합 테스트를 진행합니다. - 중복되는 Fixture 생성 코드를 간소화하기 위해
Fixture Monkey
를 사용하여 테스트 작성의 효율성을 높였습니다.
라우팅/로드밸런싱 서버 안정성 향상 시도
- Nginx로 클라이언트의 요청을 web server와 WAS 컨테이너로 라우팅하도록 하여 WAS의 안정성을 향상시켰습니다.
- nGrinder 초당 300개 요청 테스트 시 WAS로 직접 요청할 경우, WAS가 중지되는 문제가 해결되었습니다.
- 동시에 리버스 프록시를 도입함으로써 보안을 강화할 수 있었습니다.
- 2개의 WAS 컨테이너를 각각 다른 포트로 라우팅하여 트래픽을 분산시키는 로드밸런싱을 시도해보았습니다. <- 컨테이너 여러개 돌리다가... EC2 엄청 느려졌던 적이 있어요....ㅠㅠ
서버 성능향상
- 하나씩 동기 처리하였던 S3 이미지 업로드/삭제 I/O작업을 10개 크기의 thread pool을 분배하여 비동기 처리하도록 하여 성능개선하였습니다.
CompletableFuture
타입을 사용하여 통해 모든 스레드 작업이 끝난 후 이후 로직을 처리합니다.- 10개 고화질 이미지 업로드시 2.38초 걸리던 응답 시간을 540ms로 약 450%개선하였습니다.
- 서버 처리 성능 향상을 위해
Redis template
을 사용하여 Read through, Write back 을 구현하였습니다.
쿼리 개선
- nGrinder 성능 테스트 분석 결과를 기반으로 페이징 방식을 cursor 방식으로 변경하여, 실행 시간을 10배 개선했습니다.
- 200만 건의 데이터 중 40,000번째 페이지 조회 시, 응답 속도 약 1300ms → 약 130ms로 90%개선
Issue Tracker
주요 기능 및 이슈 사항
- Domain Driven Design에 대해 학습하고 Spring data JDBC 프레임워크의 특징인 Aggregate의 개념을 살려 도메인을 설계하고 구현하였습니다.
AWS Lambda
를 이용하여 이미지 리사이징 작업을 서버리스로 처리하여 서버 부하를 줄이고 처리 전 이미지 로딩을 평균 1개당 44ms에서 16ms 로 최적화하여 페이지 로딩 성능을 개선 하였습니다.
Work Experiences
Dev : Freelancer.
Labeling tool REST API 개발 (2023.09 ~ 2023.10)
• 바이오리서치AI&알밤, 재활 동작 영상 데이터 라벨링 위한 REST API 프로젝트
• 2023. 09. ~ 10 | BE 1명, FE 2명
• 주요 기술Java
Springboot
ORM(Spring data JPA)
QueryDsl
PostgreSql
NginxDocker compose
Docker
AWS EC2
RDS
S3
ECR
ELB
- 프리랜서 백엔드 개발자로서 참여한 프로젝트. 백엔드 파트를 1인이서 맡아 서버 구축부터 CI/CD, DB 모델링, WAS 구현 전체를 담당하였습니다.
- 여러 타입의 사용자 응답을 하나의 엔드포인트로 받아 동적으로 바인딩하여 작업 로그를 하나의 테이블에 저장하도록 하였습니다. 더불어 상속을 적절히 활용하여 코드 중복을 최소화하고, 다형성을 통해 유연하고 확장 가능한 시스템을 구축하였습니다.
- Redis를 이용한 Global session을 적용하여 추후 Scale-out 시 서버간 session 공유를 용이하게 하였습니다.
Others.
- 2019.01.~2021.12. 무중력지대 성북, 커뮤니티 기획자
Education
코드스쿼드 · 마스터즈 코스 Backend
2023.01.~2023.06.
• 데이터베이스, 네트워크, 운영체제, 클라우드 환경 등 전반적인 CS 학습
• 미션 기반의 Java, Spring framework 학습
• 백엔드와 프론트엔드, 백엔드와 모바일 개발자 간 프로젝트, 코드리뷰 등 협업 경험