주재현 (Joo JaeHyeon)
주재현이란?
🍷 일상에서의 불편함을 없애고 싶은 개발자 주재현입니다
Introduce.
안녕하세요!
일상, 취미 등에서 불편하고 귀찮은 일들 또는 반복되는 일을 자동화하고 간편하게 개선하는 것을 좋아합니다.
프로젝트를 진행할 때 항상 목표를 명확히 하고 기술, 스택의 사용 이유를 명확히 하는 것을 좋아합니다.
확장성과 유지 보수성이 높은 아키텍쳐와 패턴에 대해 항상 고민하고 있습니다.
각 구성 요소가 명확한 역할과 책임을 갖도록 설계하는 것을 지향합니다.
기술적 완성도 뿐만 아닌 비지니스적인 측면 또한 고려해왔습니다.
또한 적극적인 커뮤니케이션을 위해 노력하고 있습니다.
Contact.
Email. me@joojae.com
Channel.
Blog. https://blog.joojae.synology.me/
GitHub. https://github.com/joojae02
Experience.
NAVER BoostCamp 8기 웹풀스택
2023.08 ~ 2023.12
ASC (AWS Student Club)
2023.05 ~
42 Seoul 9기
2023.02 ~ 2023.12
숭실대학교 소모임 스플럭
2021.02 ~ 2021.12
Education.
숭실대학교 소프트웨어학부
2021.03 ~ (휴학중)
덕소고등학교 (일반고)
2018.03 ~ 2021.02
Project.
지도로 확인하는 여행 기록, SnapPoint
2023.11 ~ 2023.12
팀프로젝트 (안드로이드 3명, 백엔드 2명)
https://github.com/boostcampwm2023/and01-SnapPoint
SnapPoint는 지도 기반 여행 기록 어플입니다.
주요 기능
- 내 여행을 게시글 형태로 기록할 수 있다.
- 게시글에 추가한 미디어가 촬영된 위치를 핀 형태로 저장할 수 있다.
- 미디어들은 경로로 이어져 지도에서 한 눈에 확인할 수 있다.
구현
- API 서버, File 서버, Media Instace
- TypeScript, NestJS, Prisma를 사용한 API 개발
- NCloud MySQL → NCloud PostgreSQL로 이전
- NCloud Object Storage 이용
- RabbitMQ를 이용한 비동기 미디어 처리 수행
문제사항
-
확장성, 유지 보수성이 높은 구조
문제점
- 변경될 가능성이 높은 요구사항
선택지 및 판단
- 기존 레이어 아키텍처
- DDD 레이어 아키텍처
- CQRS 아키텍처
이유 및 결과
-
기존 레이어 아키텍처
- 변경 사항에 대처하기 힘들것이라 판단
- 한 계층에서 너무 많은 역할과 책임을 가지게 됨
-
CQRS 아키텍처
- 여러 DB를 사용하지 않음
- 높은 복잡성, 도메인이 비대해짐
-
DDD 아키텍처 선택으로 각 도메인, 계층이 각자의 역할과 책임을 가지게 됨
- 변경이 발생할 때 각 계층이 독립적으로 변화할 수 있게 됨
-
응답 속도 개선
문제점
- 현재 위치 근처 핀을 가져오는 api의 느린 응답속도
- 총 4번의 DB 접근 발생
선택지 및 판단
- 서버 성능 업그레이드
- 단일쿼리 → Batch 쿼리
- 캐싱
이유 및 결과
-
Batch 쿼리, 캐싱 선택
- Redis를 이용한 글로벌 캐싱
- 추후 서버 인스턴스가 늘어날것을 고려
-
응답 속도 약 50% 이상 감소
- 현재 위치 근처 핀을 가져오는 api의 느린 응답속도
-
대용량 미디어 파일 업로드
문제점
- 큰 미디어 파일의 경우 OOM 발생
- 저장소는 S3와 같은 api를 이용하는 NCloud Object Storage 사용
선택지 및 판단
- 스트림 업로드
- MultipartFile 업로드
- S3 Presigned Url, Multipart 업로드
이유 및 결과
- 클라이언트에서 업로드 진행도 확인 가능하도록
- 최대한 서버에 부하가 가지 않는 방식 선택
- 바로 S3에 파일이 전송되는 방식 선택
- 큰 미디어 파일의 경우 OOM 발생
-
비동기 미디어 처리
문제점
- 동영상 작업은 매우 부하가 큰 작업
- 작업이 실패하는 경우도 많음
선택지 및 판단
- 별도의 미디어 서비스 이용
- 동기적 미디어 처리
- 비동기 미디어 처리
- 메시지 브로커인 RabbitMQ를 이용해 요청을 보관, 전달
이유 및 결과
-
별도의 미디어 서비스는 추가 과금이 발생
- 많은 요청이 올 경우 많은 금액이 청구될것이라 판단
-
동기적 미디어 처리
- 많은 요청이 올 경우 몇몇 유저 경험이 심각하게 저하될 가능성이 있음
-
실패 시 재요청 가능
-
미디어 처리 인스턴스를 유동적으로 늘릴 수 있음
Obsidian 첨부 이미지 업로드 플러그인 개발
2023.10 ~ 2023.11
개인프로젝트
이미지를 붙여넣기를 하게 되면 자동으로 NAS에 저장되는 3rd party 플러그인을 개발하였습니다.
주요 기능
- 이미지 NAS로 전송
- 이미지 호스팅을 이용한 URL로 이미지 띄우기
구현
- Html, CSS, TypeScript를 사용하여 개발
- 동작 이벤트 관련은 공식 문서 참고하여 개발
- NAS에는 Synology 공식 api 사용하여 전송 및 저장
문제사항
-
처음 접하는 기술, 도구
문제점
- Obsidian의 기능을 사용하기 위한 함수 및 기능들
선택지 및 판단
- 공식 문서 확인
- 기존 존재하는 코드 참고
- 개인 블로그, 인터넷 글 참고
이유 및 결과
- 개인 블로그, 인터넷 글들은 신뢰성이 낮은 정보들
- Obsidian에서 제공하는 공식 문서를 참고해 개발
익숙하지 않은 기술, 도구임 에도 공식 문서를 참고하면서 개발할 수 있었습니다.
새로운 와인 정보 받기 서비스
2022.08 ~
개인프로젝트
주요 기능
- 다양한 구매, 정보 사이트 스크래핑
- 슬랙, 메일을 이용해 이용자에게 정보 전달
구현
- 다양한 사이트 스크래핑 후 데이터베이스에 저장
- Lambda, python, Beautifulsoup, Selenium 사용
- AWS RDS MySQL → 개인 NAS MySQL 로 이전
- 새로운 상품, 정보 Slack, 이메일을 이용해 알림
문제사항
-
잦은 스크래핑, 많은 데이터로 인한 과금
문제점
- AWS의 Lambda, RDS를 이용
- 잦은 스크래핑, 데이터로 인해 과금이 발생
선택지 및 판단
- Backup, 스냅샷 삭제
- 스크래핑 주기 줄이기
- DB 이전
이유 및 결과
- 백업, 스냅샷을 지우는 것은 불가능하다고 판단
- 혹시 모를 문제를 대비
- 새로운 글이 올라오는 주기가 길다는 것을 확인
- 스크래핑하는 주기를 이에 맞춰 조정
- DB 자체를 AWS → NAS 로 이전해 많은 데이터를 직접 관리할 수 있게 변경
- AWS의 Lambda, RDS를 이용
실제 사용자 유치, 모은 데이터를 이용한 이익 실현을 통해 개발에 더욱 큰 관심을 가질 수 있었습니다.
Other Experience.
Ubuntu Korea Community 우분투 한국어 번역 참여
2023.05
우분투에서 제공되는 다양한 패키지의 한국어 지원, 커뮤니티 번역 기여 참여
Skill.
- Backend: NestJS, JavaScript, TypeScript, SpringBoot, Java, Python
- Infra: AWS (EC2, RDS, S3, Lambda 등), NCloud (Server, DB, Object Storage)