이새힘 Saehim Lee

Github : @new-pow
Blog : new-pow.tistory.com
Email : i.newpow@gmail.com

About me

🙌
함께 성장하는 것을 즐거워하는 이새힘입니다.
  • 기능을 구현하고 조금씩 개선시키는 것을 진정으로 좋아합니다.
  • 개발자를 꿈꾸기 이전에는 커뮤니티/교육 기획자로서 일하며 다양한 영역에 대해 관심을 가지고 학습한 결과를 업무에 녹여냈습니다. 이 기간동안 여러 분야의 전문가들과 협업 경험을 쌓을 수 있었습니다.
  • 함께 일하고 싶은 사람이 되고 싶습니다. 동료로서 솔직하게 소통하고, 서로의 성장의 버팀목이 되는 것을 지향합니다.

Projects


RSS Reader

RSS를 구독하여 한 피드에서 업데이트 사항을 확인하고, SNS처럼 서로 리액션을 나눌 수 있는 플랫폼 서비스입니다.
동료들의 분산된 블로그의 새로운 뉴스를 확인하고 정독해보고 싶은 니즈로부터 출발한 토이 프로젝트입니다.

• 2023. 11. ~ 진행중 | BE 3명
• 주요 기술
Java Springboot ORM(Spring data JPA) MySQL Redis
Nginx Docker Compose Docker AWS EC2 RDS S3 Lambda

👩🏻‍💻 Github : Rss-reader
🗂️ API docs

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

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

• Github 이슈 관리 기능을 모티브로 진행한 이슈 관리 토이 프로젝트입니다.

• 2023. 05. | BE 2명, FE 2명
• 주요 기술
Java Springboot ORM(Spring data JDBC) MySQL
Nginx AWS EC2 RDS S3 Code deploy

👩🏻‍💻 Github

주요 기능 및 이슈 사항

  • 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
Nginx
Docker compose Docker AWS EC2 RDS S3 ECR ELB
  • 프리랜서 백엔드 개발자로서 참여한 프로젝트. 백엔드 파트를 1인이서 맡아 서버 구축부터 CI/CD, DB 모델링, WAS 구현 전체를 담당하였습니다.
  • 여러 타입의 사용자 응답을 하나의 엔드포인트로 받아 동적으로 바인딩하여 작업 로그를 하나의 테이블에 저장하도록 하였습니다. 더불어 상속을 적절히 활용하여 코드 중복을 최소화하고, 다형성을 통해 유연하고 확장 가능한 시스템을 구축하였습니다.
  • Redis를 이용한 Global session을 적용하여 추후 Scale-out 시 서버간 session 공유를 용이하게 하였습니다.

Others.

Education


코드스쿼드 · 마스터즈 코스 Backend

2023.01.~2023.06.
• 데이터베이스, 네트워크, 운영체제, 클라우드 환경 등 전반적인 CS 학습
• 미션 기반의 Java, Spring framework 학습
• 백엔드와 프론트엔드, 백엔드와 모바일 개발자 간 프로젝트, 코드리뷰 등 협업 경험