미리보기
기본 정보
개발에 정답은 없다고 생각합니다. 항상 더 나은 해결 방안을 찾고 다양한 도전 과제들에 유연하게 대처할 수 있는 개발자가 되겠습니다.
자기소개
공식 문서를 적극 활용하고, 오픈소스 코드를 분석하며 성장합니다.
초기에는 강의 시청이 빠른 학습에 도움이 되었지만, 시간이 지나면서 새로운 라이브러리와 고급 기능을 학습해야 할 일이 많아졌습니다. 강의에서는 반복되는 내용이 많아 문서나 코드를 직접 분석하는 것이 더 효율적임을 느끼게 되었고, 공식 문서와 소스를 참조하는 빈도가 점차 늘었습니다. 예를 들어, CircuitBreaker
기능을 설정할 때 slidingWindowType
을 TIME_BASED
로 설정하면 slidingWindowSize
단위가 초인지 밀리초인지 불확실해서 소스 코드를 직접 분석한 결과, 초 단위로 입력된다는 사실을 확인할 수 있었습니다. 이처럼, 문제 상황에 맞는 정보를 찾아가며 깊이 있는 학습을 지향하고 있습니다.
스터디와 토론을 통해 사고를 확장합니다.
정기적으로 참여하는 스터디에서 다양한 주제를 토론하며 시야를 넓히고 있습니다. 최근에는 객체지향 설계에서 순환 참조에 대해 논의했는데, 저는 서비스 위에 레이어를 하나 더 두어 순환 참조를 피하는 방식을 사용해 왔습니다. 그러나 책에서 소개한 예시를 통해, JPA의 다대일 양방향 연관 관계 역시 순환 참조를 일으킬 수 있다는 점을 깨닫게 되었습니다. 이로 인해 1:N 관계에서 어느 쪽이 연관 관계를 가져야 하는지에 대해 팀원들과 의견을 나누었고, 이를 통해 알고 있던 지식을 재점검하고 더 나은 설계 방식을 모색할 수 있었습니다. 이렇게 다양한 스터디와 토론을 통해 사고를 확장해 나가고 있습니다.
두려움 없이 질문하며 배움을 쌓습니다.
Post-Comment 1:N 관계에서 Post
에 CommentCount
가 반정규화되면서 동시성 문제가 발생했는데, 비관락을 적용해도 CommentCount
가 1로 고정되는 상황이었습니다. 커뮤니티에 질문을 남긴 후, 문제의 원인을 파악하는 데 도움을 받았습니다. 첫 번째 문제는 Converter
가 동작하며 자동으로 첫 번째 조회 쿼리가 발생했기 때문이었는데, 이는 예상치 못한 동작이었습니다. 특히, 이 Converter
는 데이터 형식을 변환하는 역할을 했으나, 클래스와 메서드명에서 그 동작이 명확히 드러나지 않았습니다.
두 번째 문제는 제가 Repeatable Read에서 Lock이 걸리는 시점을 제대로 이해하지 못한 것입니다. Repeatable Read
에서 첫 번째 쿼리가 조회되는 순간 Record Version
이 고정이 됩니다. 이로 인해 이후 쿼리에서도 동일한 버전을 계속 조회하면서 CommentCount
가 제대로 갱신되지 않는 상황이 발생했습니다. 이런 예처럼, 저는 조언을 구하는데 거리낌이 없고 적절한 질문을 할 수 있어 좀 더 깊은 지식과 빠른 답을 찾아 갑니다.
기술 스택
Spring Boot, Java, Kotlin, docker-compose, Docker, MySQL, PostgreSQL, NestJS, vmware, nginx, Firebase, AWS, Redis
포트폴리오
프로젝트
List-it 관리자 페이지 개발
외주
2024.09. ~ 2024.10.
프로젝트 소개
스포츠 컬렉션 전문 사이트 List-it의 관리자 페이지 개발
팀 구성 및 역할
프론트 개발자 1명, 기획 겸 디자인 1명, 백엔드 개발자 3명
관리자 페이지 백엔드 담당
기술스택
React, React Native, NestJS
EC2, S3, Coolify
링크
사이트 : 리스트잇 홈페이지
코드 : 비공개
주요 구현 내용
프로젝트 기초 세팅 (TypeORM, Swagger 설정)
공통 모듈 구현 (페이지네이션 기능, 트랜잭션 기능, 우선순위 정렬 기능)
추천 상품, 추천 상품 카테고리, 배너, 푸터 관리 페이지 구현
FCM 알림 배치 발송, 취소 기능 구현
상품 대량 업로드 기능 구현
S3 이미지 업로드 기능 구현
핵심 구현 내용과 학습 포인트
빠른 NestJS 학습과 첫 실무 투입
Problem
고객사 개발자가 Nest, Django 기술스택을 사용중이기 때문에 Nest, Django 중 선택 요청
Solve
Spring Framework와 비슷한 NestJS를 선택
공식문서를 읽으면서 Controller, Injectable, HTTP Method 등 NestJS의 주요 동작 학습
IoC Container, .env 로드 방식 등 이해가 가지 않는 내용은 인터넷 강의를 통해서 학습
주변 NestJS 개발자에게 조언 요청해서 프로젝트 구조 및 Typescript 유틸리티 타입에 대해 학습
게시판 프로젝트로 간단한 POC 진행 후 실무 프로젝트 투입 - 게시판 프로젝트 POC 내용
FCM 알림 배치 발송 구현
Problem
전체 유저 대상 공지 알림을 즉시, 예약된 시간, 반복 발송할 수 있는 기능
서비스가 배포될 때 서버가 재시작되면 CronJob이 초기화 된다는 점과 예약된 알림의 경우 취소하는 기능을 구현해야 한다는 점이 주요 이슈사항
Solve
Nest Module의 LifeCycle에 대해서 학습 후 onModuleInit()에서 PENDING 상태의 BatchNotificationHistory를 불러와서 CronJob에 재등록하는 로직 구현
BatchNotification에서 User가 제대로 맵핑되지 않는 버그 발생 -> M:N 연관관계에서 @JoinTable을 한쪽에만 명시해줘야 한다는 Stack Overflow 이슈 읽고 수정 후 해결
BatchNotificationHistory ID를 Key로 CronJob을 Value로 하는 HashMap을 static 변수로둬서 취소 구현
Spettrum
Unpeil
프로젝트 소개
반려동물 사진 AI 모델링 스타트업
팀 구성 및 역할
기획 1명, 디자이너 2명, 프론트 개발자 2명, 백엔드 개발자 3명, AI 개발자 1명
백엔드 개발자로 참여해서 시큐리티 고도화 및 리팩터링 진행
기술스택
React, React Native, Spring Boot
EC2, S3, Runpod, Github Action
링크
사이트 : Unpeil 홈페이지
코드 : 비공개
주요 구현 내용
서비스 국제화 진행 및 DB 마이그레이션
Security 및 Filter 고도화
Cors 설정 통합, JWT 필터 등록 및 JWT 검증 로직 통합
Prefix를 통한 권한 분리
테스트 코드 작성
롤링 배포 구현
핵심 구현 내용과 학습 포인트
API 변경에 따른 인프라 설계 및 배포 방식 구현
Problem
Prefix를 통해서 권한을 분리하는 과정에서 API 주소가 전체적으로 변경되게 되어서 구버전 API 서버를 남겨야 함
Solve
docker compose에 이전버전 서버를 blue 서버로 최신버전 서버를 green 서버로 올릴 수 있도록 변경
Nginx를 도입해서 "api", "open-api", "admin-api" 등 신버전 API의 Prefix에 따라서 경로를 라우팅 하도록 설정
green 서버를 2개 둬서 첫 번째 서버가 배포가 완료되면 두 번째 서버가 배포되는 형식으로 롤링 배포 구현
겜문철
팀 프로젝트
2024.02. ~ 2024.08.
프로젝트 소개
한문철 변호사님의 유튜브를 모티브로 게임 유저간의 갈등 해소를 위한 투표 서비스 플랫폼
팀 구성 및 역할
디자이너 1명, 프론트 개발자 2명, 백엔드 개발자 2명
프로젝트 기획을 하고 팀원을 모집해서 팀장 및 백엔드 개발자로 참여
기술스택
NextJS, Spring Boot
EC2, S3, Github Action
링크
주요 구현 내용
회원 가입 및 로그인 구현 (Spring Security 활용 Google, Apple OAuth 인증 개발)
게시물 작성, 댓글 작성, S3 이미지 업로드 및 동영상 업로드 구현
Riot API 및 Youtube Upload API 구현
핵심 구현 내용과 학습 포인트
Cache Aside Pattern 적용으로 API 응답 속도 개선
Conclusion
10건의 동시 요청에 대해서 965ms → 40ms 약 20배 개선
Solve
Redis Out of memory 방지를 위해서 Ram 4096으로 설정하고 메모리 관리 정책을 volatile-lru로 설정
사용자가 어떤 게시물에 관심을 가질지 예측 불가능하기 때문에 Cache Aside Pattern을 활용해서 API 응답 속도 향상
동시성 문제 해결
Problem
Comment의 개수는 Post에 반정규화 되어있는데 Comment가 생성이 될 때마다 Post의 Comment Count를 올려줘야 함 -> 동시성 문제 발생
Conclusion
비관락보다 낙관락의 동작속도가 더 빠름 → 최종적으로 낙관락 적용
Solve
동시 접속자 수 100명으로 설정 후 테스트 결과 낙관락 42s vs 비관락 40s로 비관락 우세 -> 비관락 선택
낙관락을 잘못 설정했으며 실제 서비스 상황에서 동시에 투표를 진행할 확률이 굉장히 낮다는 피드백을 받음
낙관락의 Retryable 시간 설정을 Random으로 한 후 테스트 재진행 -> 낙관락 203ms vs 비관락 331ms
낙관락 사용하기로 결정
경력
이글루코퍼레이션
사원
2020.12. ~ 2023.06. (2년 7개월)
보안관제 및 공격분석: SIEM을 사용한 보안관제, 공격 분석 및 신규 분석 룰 등록
장애 처리: Kibana, Logstash, Elastic Search의 상태 확인 및 재기동을 통해 AI 데이터 수집 문제 해결
악성메일 분석: 악성메일 분석 및 보고서 작성
홈페이지 모니터링: 18개 시도 홈페이지 모니터링 및 상황 전파
씨앤아이인포테크
사원 | 전산실
2018.02. ~ 2019.10. (1년 9개월)
네트워크 및 웹 관제 : Watch Pro 및 IDC 관제를 통해 네트워크와 웹 모니터링
업무 자동화 : VBA로 업무 자동화 솔루션 개발, 업무 프로세스 개선
C언어 소스 수정 : Watch Pro 장애 시 C언어 코드 수정으로 모니터링 정상화
대외활동
면접 스터디
기타
컴퓨터 기초지식을 좀 더 심도있게 공부하기 위한 컴퓨터 공학 면접 스터디 입니다. 총 진행 인원은 4명이었습니다. 4명이 번갈아가면서 무작위 1명을 지목해서 질문을 하고 답변을 하는 면접형식으로 진행이 되었습니다.
이 스터디를 통해서 운영체제, 네트워크, 자료구조, 데이터베이스, Java, Spring 등 전반적인 백엔드 개발자로써 갖춰야 할 기본 소양들을 재점검하고 좀 더 심도 깊은 내용들에 대해서 공부하게 되었습니다.
자격증
정보처리산업기사
한국산업인력공단
2024.06.
네트워크 관리사
2급 | 한국정보통신자격협회
2018.04.
교육
학점은행제
대학교(학사) | 컴퓨터공학
2022.02. ~ 2024.08. | 졸업
i2sec
사설 교육 | 정보보안
2016.11. ~ 2017.03. | 졸업