백엔드 개발
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: 머스터드 바르기이렇게 커밋을 나눈 이유는 단순히 "파일을 나눠서"가 아니다.각 커밋이 하나의 의미 있는 작업 단위이기 때문이다.즉, 커밋은 단순 저장 스냅샷이 아니라작업의 흐름을 설명하는 일종의 설명서라고 볼 수 있다.그 결과, 리뷰어 입장에서도 다음과 같..
개발 기록/트러블슈팅 · 환경 설정
학생들과 실제 겪은 merge 충돌 사례와 실무형 해결 전략
2025.05.31
협업 중 merge conflict를 반복해서 겪는 학생에게 전한 이야기요즘 개발 기본을 다질 겸, 과외를 진행하고 있어요최근에 제가 진행하고 있는 개발 과외 수업에서, 학생들이 실제 협업을 해보는 팀 프로젝트를 시작했습니다.그 과정에서 꽤 흥미로운 실전 이슈가 발생했는데요 — 바로 동일 파일에 대해 동시에 여러 명이 commit & push를 하며 발생하는 merge conflict 문제였습니다.학생 A가 main 브랜치에서 작업을 하고, 동시에 학생 B와 C도 같은 파일을 수정해 push를 시도하면서 충돌이 끊임없이 발생하는 상황이었죠.이 문제를 단순히 “주의하세요”로 넘기기보다는, 실제 실무에서는 어떻게 이런 충돌을 방지하고 해결하는지 알려주고 싶었습니다.문제 상황 요약 발생한 상황여러 명이 동시에..
개발 기록
Node.js에서 관례적으로 사용하는 변수 표기법 정리
2025.05.31
1. next vs _next: Express 미들웨어에서 자주 보이는 표기Express에서의 미들웨어 함수는 다음과 같은 시그니처를 가집니다:(req: Request, res: Response, next: NextFunction) => void next – 일반적인 다음 미들웨어 호출용 인자(req, res, next) => { next(); // 다음 미들웨어로 이동}이 표기는 실제로 next()를 호출하는 경우에 사용됩니다. _next – 사용하지 않을 인자에 대한 표시(req, res, _next) => { // 여기서는 next()를 호출하지 않음}변수 앞에 _(언더스코어)를 붙이는 관례는 **“이 변수는 사용되지 않는다”**는 의미ESLint, TypeScript 설정에서 정의한 변수지만 ..