'분류 전체보기' 카테고리의 글 목록
게으른 개발자
개발 기록
axios.post()만 써도 충분한가요? async/await로 감싸는 이유와 API 구조화 패턴 비교
2025.07.02
프론트엔드에서 API를 호출할 때 가장 많이 쓰는 패턴은 아래와 같다.axios.post('/auth/login', { email, password });하지만 실제 운영 환경에서는 다음과 같은 고민이 생긴다.왜 async/await로 한 번 더 감싸야 하지?에러 핸들링은 어디까지 하는 게 좋을까?res.data.data.data 같은 코드, 어떻게 해결하지?API 클라이언트를 어떻게 구성해야 유지보수가 쉬울까?이 글에서는 위와 같은 질문에 답하면서 현업에서 쓰는 API 호출 방식의 구조화된 패턴을 소개한다.1. 기존 방식 – 단순 호출export const login = (email: string, password: string) => { return axios.post('/auth/login', {..
개발 기록/트러블슈팅 · 환경 설정
http-proxy-middleware에서 onProxyRes만 썼는데 500 에러가? 이유는 selfHandleResponse 때문
2025.06.30
문제 상황: 예상치 못한 500 에러 발생Express + http-proxy-middleware 조합으로 API Gateway를 구성하는 도중, 단순히 로그만 찍기 위해 onProxyRes를 사용했음에도 불구하고 500 Internal Server Error가 발생하는 현상을 마주하게 되었습니다.onProxyRes: (proxyRes, req, res) => { logger.info(`Proxy response from ${req.url}`);}응답을 직접 가공하거나 처리하는 코드는 없었는데도, 프록시가 응답을 제대로 전달하지 못하고 요청이 실패했습니다.이 문제는 다음 옵션을 명시한 뒤에야 해결되었습니다:selfHandleResponse: false배경 지식: selfHandleResponse란?ht..
백엔드 개발
Chat 도메인에서 TypeORM을 제거한 이유: 도메인 객체와 Persistence의 분리
2025.06.09
왜 처음엔 TypeORM을 그대로 사용했을까?처음 chat-service를 설계할 때는 익숙한 방식대로 TypeORM의 @Entity를 활용해 곧바로 테이블 구조를 정의하고, 그 위에서 도메인 로직을 작성했습니다. 아래는 그 당시 사용하던 ChatRoom 엔티티의 일부입니다.@Entity()export class ChatRoom { @PrimaryGeneratedColumn() id: number; @Column() type: 'PUBLIC' | 'PRIVATE'; @Column({ nullable: true }) itemId: number; @Column() createdBy: number; @Column({ default: true }) isActive: boolean; @Crea..
GIT
Git stash 실전 예제로 이해하기: 작업 저장 → 브랜치 이동 → 복원까지
2025.06.05
Git stash란? 언제 사용하면 좋을까?Git을 사용하다 보면, 작업 중이던 걸 잠깐 보류하고 다른 작업을 해야 할 때가 있다.이럴 때 유용하게 쓰는 명령어가 바로 git stash.언제 stash를 사용할까?브랜치를 이동해야 하는데 작업 중인 코드가 있음→ 작업을 커밋하지 않으면 checkout이 안 되거나 충돌 가능성이 있음커밋하기엔 애매한 상태지만, 지금 상태를 저장해두고 싶을 때→ 반쯤 완성된 코드인데 커밋하기엔 부자연스러울 때비유로 이해해보기지금 짐을 싸는 중인데 갑자기“잠깐 다른 데 좀 다녀와야 해!” 라는 상황이 생겼다고 상상해보자.짐을 다 정리하긴 애매하니까일단 가방에 넣고 옆방에 두는 느낌나중에 돌아와서 다시 짐을 꺼내 정리 후 계속 작업을 이어가는 것이게 바로 git stash의 개..
GIT
Git 커밋은 왜 나누고, 왜 squash로 합칠까?
2025.06.05
커밋을 왜 나누고 squash는 왜 하는 걸까?Git을 처음 배우는 분들이 자주 묻는 질문이 있다.“그냥 다 작업하고 나서 한 번에 커밋하면 되는 거 아니에요?”기술적으로는 가능하다.하지만 협업을 고려한다면, 그리고 코드 리뷰를 받는다면 상황은 달라진다.커밋은 '저장'이 아니라 '작업 설명서'다예를 들어 feature/sandwich 브랜치에서샌드위치를 만드는 기능을 구현하고 있다고 가정하자.C1: 샌드위치 준비C2: 빵 추가C3: 속 재료 넣기C4: 머스터드 바르기이렇게 커밋을 나눈 이유는 단순히 "파일을 나눠서"가 아니다.각 커밋이 하나의 의미 있는 작업 단위이기 때문이다.즉, 커밋은 단순 저장 스냅샷이 아니라작업의 흐름을 설명하는 일종의 설명서라고 볼 수 있다.그 결과, 리뷰어 입장에서도 다음과 같..