미리보기
기본 정보
안녕하세요. 4년차 서버 개발자 송윤민입니다.
기술 스택
Node.js, Spring Boot, GraphQL, MySQL, PostgreSQL, NestJS, AWS
경력
노리코리아
사원 | 개발팀 | 재직 중
2021.01. ~ 재직 중 (3년 10개월)
[PostgreSQL 마이그레이션 프로젝트]
기존 MySQL로 운영 중인 서버를 Fork 하여 PostgreSQL을 지원하는 새로운 서버로 마이그레이션 하는 프로젝트를 진행했습니다. 이 프로젝트는 사내에서 단독으로 수행했습니다.
역할
- 프로젝트 전반을 단독으로 수행하여 MySQL에서 PostgreSQL로의 마이그레이션 주도
- 외부 API 연동 제거 및 MySQL Pool 로직을 PostgreSQL에 맞게 수정
사용 기술
- 프로그래밍 언어: JavaScript, TypeScript
- 백엔드 프레임워크: Node.js, Express, Apollo Server
- 데이터베이스: MySQL, PostgreSQL
- ORM: Sequelize
- 클라우드 서비스: AWS (Supabase, Lambda, API Gateway, Code Pipeline)
- 기타 도구: Git, Docker,
진행 방식
- 서버 Fork:기존 MySQL 서버를 Fork 하여 새로운 PostgreSQL 서버로 마이그레이션
- 서버 로직 및 SQL 수정: MySQL Pool로 연결되어 있던 로직을 PostgreSQL에 맞게 수정
- 데이터 마이그레이션: 기존 CMS 데이터베이스를 애플리케이션 데이터베이스로 마이그레이션하는 도구 개발 및 데이터 이전
- 검증 및 테스트: 철저한 테스트와 검증을 통해 데이터 무결성과 안정성 확보
문제 해결 경험
- 데이터 타입 이슈 해결:
- 문제: MySQL의 TINYINT 및 여러 타입이 PostgreSQL에서 지원되지 않음
- 해결: ORM을 사용하여 TINYINT 타입을 Boolean 타입으로 변환하고, PostgreSQL에서는 Boolean 타입으로 처리하여 문제 해결
- 비표준 SQL 쿼리 문제 해결:
- 문제: 기존 레거시 코드에 포함된 비표준 SQL 쿼리가 PostgreSQL의 엄격한 검사로 인해 테스트에서 통과되지 않음
- 해결: 비표준 SQL을 표준 SQL로 변환하고, PostgreSQL에서 지원하지 않는 MySQL 함수를 대체하여 쿼리 수정
성과 및 기여도
- MySQL 데이터베이스 스키마와 데이터를 PostgreSQL로 성공적으로 이전하여 데이터 통합을 원활하게 수행
- MySQL과 PostgreSQL 간의 호환성 문제를 해결하여 애플리케이션의 원활한 동작 보장
- PostgreSQL의 고급 기능을 활용하여 쿼리 성능을 최적화하고 시스템 효율성을 향상
- 마이그레이션 후 철저한 테스트와 검증을 통해 데이터 무결성과 안정성을 확보
기여도 100%: 프로젝트 전반을 단독으로 수행하여 MySQL에서 PostgreSQL로의 성공적인 마이그레이션을 완료했습니다.
[영어 교육 제품 서버 개발 및 운영]
영어 교육 제품 서버팀에서 메인 서버 개발을 담당했습니다. 기존 API 유지보수 및 신규 기능 개발을 수행하며, 비용 절감을 위해 AWS SAM(Serverless Application Model)을 사용하여 Lambda로 배포했습니다. Lambda를 사용하면서 발생하는 Time Limit, Payload Limit 등의 문제를 해결하기 위해 비즈니스 로직 최적화에 집중했습니다.
역할
메인 서버 개발 및 유지보수 담당
신규 기능 론칭 및 기존 기능 최적화
진행 방식
AWS Lambda와 GraphQL을 사용하여 효율적인 데이터 요청 및 응답 시스템을 구현
기존 CMS 데이터베이스를 애플리케이션 데이터베이스로 마이그레이션하는 도구를 개발하여 데이터 통합을 원활하게 수행
외부 API와의 통합을 위해 안전하고 효율적인 인증 및 인가 시스템을 구축
CloudWatch와 같은 모니터링 도구를 사용하여 시스템 성능을 지속적으로 측정하고, 성능 개선을 위한 최적화를 진행
새로운 기능을 성공적으로 론칭하여 사용자 수를 20% 증가시킴
문제 해결 경험
Lambda 제약 해결:
Time Limit 문제: 일부 요청이 Lambda의 최대 실행 시간을 초과하는 경우, 요청을 더 작은 작업 단위로 분할하고, 비즈니스 로직을 최적화하여 실행 시간을 단축했습니다. 중요한 작업은 비동기적으로 처리하여 응답 시간을 개선했습니다.
Payload Limit 문제: Lambda의 Payload 크기 제한으로 인해 대용량 데이터 처리에 어려움이 있었습니다. 데이터를 압축하고, 페이징을 사용하여 문제를 해결했습니다. 대용량 데이터는 S3와 같은 외부 스토리지를 활용하여 처리했습니다.
변경되는 리포팅 요구사항 해결: 매달 본사에 전달하는 학습 로그 및 로그인 로그의 연산 크기가 예상보다 커지면서 데이터베이스가 부담을 겪었습니다. EXPLAIN을 통해 인덱스가 제대로 설정되지 않은 테이블을 분석하고 인덱스를 재지정하여 문제를 해결했습니다.
Lambda의 Batch 처리: 신규 기능 론칭 시 실시간 데이터를 처리하기 어려워 새벽 배치 작업으로 전환했습니다. 기존 Lambda 인프라로는 대규모 데이터 처리가 어려워 Dockerize 후 Fargate에서 일회성 Job을 실행하여 문제를 해결했습니다.
Heap Out Of Memory 문제: 특정 학생의 데이터가 쌓여 로그인 시 OOM 문제가 발생했습니다. SoftDelete를 통해 임시 해결한 후, Lambda 메모리를 늘려 근본적인 문제를 해결했습니다. 향후 ECS로 서버를 이동하는 방안을 고려 중입니다.
데이터 통합: 기존 컨텐츠 데이터를 CMS 데이터로 마이그레이션하는 도구를 개발했습니다. 데이터 형식 변환과 중복 데이터 제거 작업을 수행하여 일관된 데이터 구조를 유지했습니다.
외부 API 연동: 외부 API와의 연동을 위해 인증 및 인가 시스템을 구축했습니다. 이를 통해 안전하게 외부 서비스와 연동할 수 있었으며, 인증 토큰의 만료 및 갱신 로직을 구현하여 보안성을 높였습니다.
성능 모니터링 및 최적화: CloudWatch를 활용하여 시스템 성능을 지속적으로 모니터링하고, 주요 성능 지표를 분석하여 병목 현상을 파악했습니다. 쿼리 최적화, 캐싱 전략 도입 등 다양한 최적화 작업을 수행하여 서버 응답 시간을 단축했습니다.
기여도 60%: 프로젝트 전반에서 핵심적인 역할을 수행하며, 팀의 성공에 기여했습니다.
편의를 위해 진행한 업무
영어제품 헤드리스 CMS 서버 개발 및 운영
영어 교육제품 서버팀에서 CMS(Content Management System) 서버 개발을 담당했습니다. Strapi를 사용하여 콘텐츠 관리 및 API 개발을 신속하게 진행하였으며, 다양한 기능과 커스터마이징 옵션을 통해 프로젝트 요구사항을 충족시켰습니다.
Strapi로 GraphQL API를 생성하여 초기 개발 속도를 향상시켰습니다.
콘텐츠 모델링을 통해 다양한 콘텐츠를 효율적으로 관리했습니다.
Strapi 플러그인과 미들웨어를 활용하여 기능을 확장하고 최적화했습니다.
지속적인 성능 모니터링과 최적화를 통해 안정적인 서비스를 제공했습니다.
운영 데이터 마이그레이션
신규기능 개발에 필요한 운영 데이터 마이그레이션 작업 다수 수행
마이그레이션 대상 운영 데이터 수에 따라 데이터 처리 방법 선택
Chunk, Temporary table, 트랜잭션 분리 등
백업 스크립트를 함께 개발하여 안정성에 기여
Dump, File System
재직 중 7회의 대규모 마이그레이션 경험 보유
자동 학습 유틸 프로그램 개발
교육 제품 특성상 복잡한 컨텐츠 구조를 가지고 있으며, 늘어가는 커리큘럼 및 넓어지는 학생 풀로 신규 기능 개발 테스트의 어려움을 겪음
Skill: Node.JS
원하는 조건을 초기화 한 후, 자동으로 학습과정을 수행하는 유틸 프로그램을 개발하여 클라이언트 및 QA 생산성 증가에 기여
해당 프로그램을 이용한 테스트 진행으로 테스트 코드 복잡성 감소
프로젝트
티켓 예매 서비스 백엔드 API 개발 및 운영
NEXTERS 24기
2024.01. ~ 2024.03.
NEXTERS 24기 사이드 프로젝트에서 '불티' 티켓 예매 서비스의 백엔드 개발을 담당했습니다. 서버 비용을 아끼기 위해 인스턴스 사양을 최소화하고, 이를 위해 쿼리 최적화 및 비 효율적인 SQL 로직들을 개선하는 것에 초점을 두고 개발했습니다.
역할
NEXTERS 24기 사이드 프로젝트에서 '불티' 티켓 예매 서비스의 APP용 API 개발 담당
사용 기술
Back End: Spring Boot 3.2, QueryDSL, MySQL 8.0, FCM Notification, Toss Payment API, Flyway
Infra: NCP Computing, Docker Compose, Github Action
진행 과정
공연 등록 및 예매 서비스에 대한 DB 모델링 및 백엔드 API 개발
QueryDSL을 사용하여 높은 복잡성의 SQL 처리
FCM을 활용한 Push 알림 서비스 개발
스케줄러를 사용하여 동적 스케줄 등록 및 정적 스케줄 배치 처리
Toss Payment API를 이용한 결제 및 결제 취소 기능 개발
문제 해결 경험
Toss Payment API 사용 중 트랜잭션 문제 해결: Toss Payment API 사용 시, 결제는 완료되었지만 서버 쪽 플로우에서 에러가 발생하는 문제가 있었음. 이때 트랜잭션을 전체 롤백하면 안 되는 상황이 발생함. 왜냐하면 결제가 완료된 정보를 서버에 유지해야 했기 때문임. 이를 해결하기 위해 트랜잭션을 나누어 관리하여 문제를 해결함.
복잡한 SQL 처리 최적화: QueryDSL을 도입하여 복잡한 SQL 쿼리를 효율적으로 처리하고, 성능을 최적화함.
스케줄링 문제 해결: FCM Push 알림 서비스를 구현하면서 스케줄러를 활용해 동적 스케줄 등록 및 정적 스케줄 배치 처리 문제를 해결
포트폴리오
자기소개
안녕하세요! 3년 차 백엔드 소프트웨어 엔지니어 송윤민입니다.
저는 3년 차 백엔드 소프트웨어 엔지니어로, Node.js와 GraphQL API와 Spring Boot를 주로 다루며 다양한 프로젝트를 성공적으로 이끌어왔습니다. 영어 교육 제품 서버 개발과 유지보수, DBMD 및 여러 데이터 마이그레이션 경험을 통해 다양한 기술을 실제로 적용하고 최적화하는 데 주력해 왔습니다. 특히, AWS SAM과 Lambda를 활용한 서버리스 아키텍처 도입을 통해 비용 절감과 성능 향상을 실현하였고, Strapi를 사용한 헤드리스 CMS 서버 개발을 통해 콘텐츠 관리와 API 개발을 효율적으로 수행했습니다.
노리코리아에서 근무하며 메인 서버 개발을 담당하면서 신규 기능 론칭을 통해 사용자 수를 20% 증가시키는 성과를 거두었습니다. 또한, 사내 CMS 시스템 개발 프로젝트에서는 PHP에서 Node.js로의 서버 마이그레이션을 성공적으로 수행하고, 마이크로 서비스 아키텍처를 도입하여 안정성과 효율성을 높였습니다.
다양한 사이드 프로젝트에서도 기술적 역량을 발휘해 왔습니다. 사이드 프로젝트에서는 주로 Spring Boot를 이용한 여러 프로젝트에서 백엔드 API 개발 경험을 쌓았습니다. 티켓 예매 서비스 프로젝트에서는 QueryDSL을 활용하여 복잡한 SQL 쿼리를 처리하고, FCM을 이용한 Push 알림 서비스 개발을 통해 사용자 경험을 개선했습니다. 또한, 다양한 결제 시스템 연동 및 성능 최적화를 성공적으로 수행했습니다.
기술적인 역량뿐만 아니라, 13년간 야구 선수로 활동하며 얻은 빠른 문제 해결 능력과 끈기는 새로운 기술을 배우고 적용하는 데 큰 도움이 되었습니다.
앞으로도 더욱 성장하여 제가 있을곳에서 더 큰 성과를 이루고 싶습니다.
감사합니다!