Error 와 Exception 의 차이와 혼동
Exception Exception 은 로직 상에서 예측 가능하고 의도적으로 처리할 때 사용한다. 예를 들어 NestJS 에 빌트인되어있는 NotFoundException, BadRequestException 은 각 상황에 따라 예외 처리를 할 때 사용한다. 예를 들면, 로그인 시 비밀번호가 틀렸을 때나 게시글 ID 가 중복되었을 때 말이다. 이때는 개발자가 이런 오류 상황이 예측 가능하므로 코드 상에 Exception 을 이용해서 예외 처리를 한다. Error반면 Error 는 개발자가 예측 불가능한 상황에 사용한다. 예측 불가능한 상황은 코드 내에서 구현할 수가 없고 미리 조치를 할 수 없기 때문에 보통 try-catch 문의 catch 내에서 사용된다. 혹은, 외부 API 를 호출하는 로직에서도..
2025.09.19
no image
이 서버는 API를 하루에 얼마나 처리해봤나요?
한 기술 면접에서 면접관님이 여쭤보셨다. "이 서비스의 백엔드는 API를 하루에 얼마나 처리해봤나요?" (다소 의역) 그대로 굳었다. 그냥 API 를 만들고 서비스를 개발하는 것만 신경쓰다보니 백엔드 개발자로서 응당 신경써야 할 이런 부분을 놓치고 있었다. 면접에서는 "그 부분에 대해 체크할 생각을 못해봤습니다. 잘 모르겠습니다." 라고 말할 수 밖에 없었다. 면접장에서 나오자마자 "이걸 당장 만들어봐야겠다" 라는 생각이 들었다. 현재 서비스 중인 프로젝트에 이 API 를 통계내는 시스템을 만들어보기로 했다. 인프라 구조백엔드로 요청오는 API 를 로깅하고 가공하기 위해선 인프라 구조에 대한 이해가 필요하다.현재 프로젝트는 아래와 같은 구조로 돌아가고 있다. 백엔드 서버는 프론트엔드 서버와 하나의 ..
2025.09.17
no image
S3 키 유출 사건
메일로 AWS 에서 연락이 왔다. 정리하자면, 프로젝트에서 사용하고 있는 S3에 액세스하는 계정의 키가 유출되었다는 내용이다. AWS 에서 이런 노티도 해주는지 몰랐는데 참 좋은거같다. 아마 이게 없었다면 평생 몰랐을 것 같다. 긴급 조치당황스러운 마음을 뒤로 하고 메일에서 안내해준대로 먼저 액세스 키를 변경하기로 했다. IAM 계정은 액세스 키를 2개 만들 수 있다는 사실을 이번에 처음 알았다. 아마 이렇게 액세스 키를 교체해야 하는 상황을 위해 되어있는 것 같은데 변경에 걸림돌이 되지않아 좋았다. [IAM -> 계정 선택 -> 보안 자격 증명] 에서 액세스 키를 생성하고 삭제할 수 있다. 액세스 키를 교체한 후엔 어플리케이션에도 변경된 액세스 키를 적용해주기 위해 Github secret 에서 ..
2025.09.05
no image
Git / 원격저장소에서 커밋 관련 파일 삭제하기
1. 로컬에서 삭제git filter-branch --force --index-filter "git rm --cached --ignore-unmatch 특정파일명" --prune-empty --tag-name-filter cat -- --all// 예시git filter-branch --force --index-filter "git rm --cached --ignore-unmatch .env.prod" --prune-empty --tag-name-filter cat -- --all 2. 원격저장소 동기화git push origin --force --all
2025.08.31
etc
no image
Mongoose aggregate (Find 와 차이)
이번에 사이드 프로젝트를 하며 검색 기능을 구현하게 되었는데 이때 Mongoose 의 aggregate 메소드를 사용했다. 검색 기능 구현을 위해 Atlas Search 를 이용했는데, 이를 이용하려면 데이터 조회 시 find 대신 aggregate를 사용해야 했다. ($search) 구현을 위해 알아본 aggregate 에 대한 정보를 find 와 비교하여 정리했다. 1. aggregate 란aggregate 는 모으다, 집합, 집계 등의 의미를 가지고 있는 단어이다. Mongoose 에서는 find 와 같이 데이터를 조회할 때 사용하는 메소드이지만 find 보다 더 복잡한 처리를 지원하는 파이프라인 메소드라고 이해하면 된다. 복잡한 계산, 변형, 조인, 통계 분석에 최적화되어있다. 2. agg..
2025.07.12
no image
Mongoose Geo-Query / Geo-JSON 사용법
이번에 사이드 프로젝트에서 지도 기능을 만들면서 지도에서 위치 탐색을 해야하는 일이 있었다. 현재 DB로 MongoDB, ODM으로 Mongoose 로 사용하고 있는데 Mognoose가 2차원 구체에서의 Geo-Query를 지원하기 때문에 사용하여 구현하기로 했다. 1. location 필드2차원 위치 탐색은 경도, 위도 정보를 가진 location 필드가 필요하다. @Prop({ type: { type: String, enum: ['Point'], default: 'Point', }, coordinates: { type: [Number], required: true, }, }) location: { type: 'Point'; coordinates: [..
2025.06.19
no image
Github actions Organization runner 도입
Repository runner의 한계진행 중인 프로젝트에서 하나의 머신으로 여러 개의 서버를 실행시키고 있습니다. 여러 개의 repo 에서 하나의 머신을 바라보도록 actions runner를 설정해놓았는데.. 문제가 생기기 시작했습니다. 첫번째, 지저분합니다. 각 레포의 갯수만큼 runner 설정이 늘어나다보니 관리해야 할 runner 수가 많아져 지저분하고 번거로운 상황이 종종 생겼습니다. 둘째, 리소스 낭비가 있습니다. 보통 runner 를 실행할 때만 켜두지않고 백그라운드로 돌아가게 설정해놓고 있습니다. 이 때 백그라운드에서 돌아가는 runner 의 수가 많아지니 종종 CPU 점유율이 100%를 치고 서버가 죽어버리는 경우가 종종 생겼습니다. Organization runner 설정 방법1. ..
2025.06.05
no image
NginX 413 Request Entity Too Large 에러 해결
리뷰 작성 페이지에서 이미지 첨부 후 API 를 쐈더니 413 Request Entity Too Large 에러가 발생했다. 원인nginx 리버스 프록시는 요청의 최대 크기를 기본적으로 1MB 로 제한하고 있기 때문이였다. 내가 작성한 리뷰는 1MB 이상이라 해당 에러가 발생했던 것이였다. 해결 방법nginx.conf 에서 요청 최대 크기 설정을 변경해주면 된다. linux 기준 nginx.conf 는 /etc/nginx 디렉토리에 있다. 1. nginx.conf 설정먼저 nginx.conf 에서 설정을 변경해주어야한다. 여기서 선택할 수 있는 옵션은 3가지가 있다. http 블록모든 http 요청에 대해 size 설정을 하겠다, 하면 http 블록 내에 설정하면 된다.http { ... ..
2025.05.23
no image
서버 하나로 프론트/백 배포하기 (w. NginX 리버스 프록시)
사이드 프로젝트를 배포하고 운영하며 느낀 점 중 하나는 AWS는 비싸다입니다. 고작 1GB 메모리에, 1vCPU 짜리 EC2와 Https 를 위한 ELB 만 해도 매달 45달러.. 한화로 64,089원이 나갑니다. 물론 ELB는 트래픽에 비례하기 때문에 사용자가 많아지면 많아질 수록 이용료는 더욱 늘어나겠죠.. 팀은 금전적 문제로 인해 하나의 서버에서 프론트/백을 모두 서비스하기로 결정했습니다. 하나의 서버에서 프론트와 백을 모두 서비스하려면 리버시 프록시를 이용하면 됩니다. 리버스 프록시란리버스 프록시에 대해 내가 설명하는 것보다 설명을 더 잘해주시는 분이 계시니 굳이 제가 할 필요는 없는 것 같습니다. 리버스 프록시 설정프론트와 백은 현재 Docker 로 서비스하고 있는데 프론트는 포트번호 5..
2025.04.20