macOS + zsh 환경 설정 완벽 가이드 (.zprofile vs .zshrc)
PATH를 .zprofile에 넣었더니 IntelliJ 터미널에서만 안 잡히는 이유를 두 파일의 실행 시점 차이로 갈라 정리하고, 잘못된 설정 한 줄로 터미널이 죽었을 때의 진단·복구 절차까지 붙였다.
2024년부터 2025년까지 쓴 기록 52편입니다.
전체 52편
PATH를 .zprofile에 넣었더니 IntelliJ 터미널에서만 안 잡히는 이유를 두 파일의 실행 시점 차이로 갈라 정리하고, 잘못된 설정 한 줄로 터미널이 죽었을 때의 진단·복구 절차까지 붙였다.
rebase가 미추적 파일을 덮어쓸까 봐 멈추는 이유를 워킹 트리 보호 원칙으로 짚고, squash로는 왜 풀리지 않는지와 stash -u로 치운 뒤 이어가는 해결 순서를 정리했다.
JUnit 5 애노테이션과 Assertion부터 Mockito의 스터빙·호출 검증·ArgumentCaptor, 테스트 더블 다섯 종류까지 실제로 쓰는 문법만 예제로 모아둔 장문의 레퍼런스다.
이미 원격까지 올라간 .gradle·build 디렉터리를 되돌리려고 git rm --cached로 인덱스에서만 걷어내고 commit --amend로 마무리한 기록. 마지막 커밋·과거 커밋·이력 완전 삭제까지 상황별 명령을 표로 갈라 두었다.
마스터-디테일, 다대다 해소, 이력 관리, 소프트 삭제 같은 테이블 패턴과 페이징·배치·비동기 API 패턴을 예제 SQL과 함께 모아, 어떤 문제에 어떤 패턴을 고를지 기준을 세운 정리.
다른 스키마의 객체를 자기 것처럼 부르게 해주는 SYNONYM의 PUBLIC/PRIVATE 차이와, 객체 위치가 바뀌어도 애플리케이션 쿼리를 고치지 않아도 되는 이유를 정리했다.
파일 하나가 곧 데이터베이스가 되는 SQLite3의 서버리스·제로 설정 특성을 일반 RDBMS와 견줘 정리한 짧은 소개 글.
getter 없는 응답 객체가 빈 JSON이나 406을 뱉는 이유를 Jackson의 직렬화 우선순위(게터 우선, 그다음 public 필드)로 짚은 짧은 정리.
Request에서 Command, Entity를 거쳐 Response로 이어지도록 계층별 객체를 갈라 스프링 부트 패키지 구조를 잡고, 같은 기준으로 Vue 3 쪽 구조와 견줘본 정리.
ARM 맥에서 colima로 도커 런타임을 올리고 gvenzl/oracle-xe 이미지를 컴포즈로 띄워 로컬 오라클 개발 환경을 확보한 설정 기록.
create-vue로 만든 Vite 기반 Vue 앱의 빌드 결과물을 스프링 부트 static에 실어 한 번에 배포하는 구성을 정리하고, 프론트·백엔드를 따로 띄우는 방식과 비교했다.
네임스페이스가 Terminating에서 멈춰 지워지지 않는 이유를 Finalizer 동작 구조로 설명하고, 컨트롤러가 죽어 정리가 끝나지 않을 때 finalizer를 걷어내 강제 삭제한 절차와 그 위험을 남겼다.
장애가 나면 반사적으로 치게 되는 kubectl 명령을 상태 확인 → 이벤트·로그 진단 → 재시작 → 재확인 순서로 묶어둔 짧은 명령어 모음.
Loki와 Grafana가 통신하지 못하는 장애를 거슬러 올라가니 Calico ServiceAccount에 RBAC 권한이 없어 CNI가 아예 동작하지 못한 것이었고, ClusterRoleBinding으로 권한을 주자 아래 서비스들이 연쇄로 복구된 진단 기록.
프로메테우스와 Loki를 올렸는데 Pod가 READY 1/1이 되지 않고 멈춘 원인이 CNI 플러그인 부재였음을 확인하고, Calico를 설치해 Pod IP 할당부터 되살린 기록.
의미 없는 `.` 커밋이 원격까지 올라간 상태에서 기여용 PR을 내기 위해, interactive rebase로 커밋을 squash하고 amend로 메시지를 다듬어 이력을 정리한 기록.
GStreamer를 네이티브로 다루려고 x86_64 노트북에 우분투를 듀얼부팅으로 올린 준비 기록. SATA를 RAID에서 AHCI로 바꾸기 전에 윈도우를 안전모드로 먼저 부팅시켜 드라이버를 잡아두는 순서가 핵심이다.
GStreamer에 기여하려고 코어·플러그인 개발 패키지와 파이썬 바인딩까지 설치한 기록. 미디어 런타임 중심의 준비가 자바·스프링의 빌드 도구 중심 준비와 어떻게 다른지 견줘봤다.
GitHub Actions가 저장소 파일을 지운 뒤 git pull로 로컬까지 날아간 상황을, 마지막 정상 커밋에서 recovery 브랜치를 따고 develop을 reset --hard로 되돌려 복구한 기록.
불변 객체를 만드는 두 방법을 상속 가능 여부, 접근자 제어, 생성자 형태로 갈라 비교하고 Record의 compact constructor로 값 검증까지 넣는 예제를 붙였다.
시퀀스의 다음 값을 한 행만 받아오려고 DUAL을 쓰는 이유(항상 정확히 한 행을 돌려주는 특수 테이블)를 짚고, 다중 행이 필요할 때는 실제 테이블을 쓰는 구분까지 정리했다.
중앙집중식 SVN과 분산형 Git이 커밋 시점, 네트워크 의존성, 브랜치 전략에서 어떻게 갈리는지 실무 작업 순서를 나란히 놓고 비교한 정리.
update 중 충돌이 나면 SVN이 만들어 두는 .mine·.rNNN 파일이 각각 무엇인지 짚고, mine-full·theirs-full·수동 편집 세 갈래로 해결한 뒤 resolved로 닫는 절차를 정리했다.
브랜치 작업 중 trunk를 따라가는 병합과 작업을 끝내고 trunk로 되돌리는 병합을 구분하고, 리비전 범위·재통합·체리픽 세 가지 병합 유형과 TortoiseSVN 조작 순서를 정리했다.
trunk·리비전·재통합처럼 SVN 문서와 실무 대화에서 바로 튀어나오는 용어들을 저장소·버전 관리·작업 상태·병합·접근 제어 다섯 갈래로 묶어 정리한 용어집.
보안 정책 때문에 Git을 쓸 수 없는 현장에서 SVN을 맡게 되어, 클라이언트-서버 모델과 trunk/branches/tags 저장소 구조부터 짚고 들어간 시리즈의 첫 글.
서버 사이드(JSP·Thymeleaf)와 클라이언트 사이드 템플릿 엔진이 HTML을 완성하는 지점이 어디서 갈리는지 렌더링 흐름으로 구분한 개념 정리.
도커 컴포즈로 주키퍼와 카프카를 띄우고 토픽 생성부터 프로듀서·컨슈머 통신까지 직접 확인한 실습 기록. 끝에서 RabbitMQ와 메시지 큐 성격을 비교했다.
rabbitmq:3-management 이미지를 도커로 올려 관리 UI에서 큐를 만들고 메시지를 넣어보며 익스체인지에서 큐로 이어지는 흐름을 눈으로 확인한 실습 기록.
도커로 레디스를 띄워 문자열·리스트·해시·TTL 명령을 직접 쳐보고, 실무에서 쓸 키 네이밍 규칙(계층 구조, 환경 구분, 임시 키)까지 정리했다.
구글·페이스북·네이버·카카오가 제각각 주는 소셜 로그인 응답을 enum의 추상 메서드로 하나의 사용자 객체로 변환해, 제공자가 늘어도 분기문이 늘지 않게 만든 개발일지.
토스가 말하는 '가치 있는 테스트'의 기준(선택적·실용적·목적 중심)을 정리하고, 도메인 정책은 경계값 중심 단위 테스트로 좁혀 쓰는 전략과 그 테스트를 설계하는 순서를 따라가며 옮겨 적은 탐구 기록.
자바 Record를 코틀린 Data Class와 나란히 놓고, 계층 사이 데이터 전달(DTO) 지점에서 두 언어가 같은 문제를 어떻게 푸는지 비교한 정리.
비즈니스 로직 중간에 에러가 나면 이벤트가 유실되는 문제를 29CM가 아웃박스 테이블과 TransactionalEventListener의 BEFORE_COMMIT/AFTER_COMMIT 분리로 푼 방식을 따라가며 정리한 탐구 기록.
실시간 응급실 조회 서버를 뜯어보며 application·domain·infra 멀티모듈 분리와, CQRS·파사드 패턴으로 기능 함수를 조합해 비즈니스 로직을 드러내는 방식을 정리한 분석 기록.
공연 티켓 판매 서버의 Api·Domain·Infrastructure 멀티모듈 구성을 따라가며, 파사드 패턴과 커스텀 어노테이션으로 도메인 개념을 코드에 드러내는 방식과 FeignClient 사용을 정리한 분석 기록.
29CM와 컬리의 검색 전환기를 나란히 읽고, 원천 데이터와 변경 데이터를 카프카 발행/구독으로 흘려 검색엔진 인덱싱 파이프라인을 만드는 공통 구조를 뽑아낸 탐구 기록.
컬렉션에 비즈니스 규칙을 붙일 때 자바처럼 일급 컬렉션으로 감쌀지 코틀린 확장 함수로 열어둘지를 코드로 비교하고, 어느 쪽이 레이어 구조에 더 잘 얹히는지 따져봤다.
설계한 주문 생성 API를 implement 레이어에 구현체를 두고 모든 흐름이 비즈니스 레이어로 향하도록 구현한 과정. 정합성을 맞추는 방법은 장기 트랜잭션과 개별 트랜잭션 조합 두 갈래를 놓고 저울질하는 데서 멈춘다.
연관관계를 웬만하면 걸지 않고 id로만 매핑하는 지침을 세우고, 엔티티와 도메인 객체가 1:1일 필요가 없는 이유를 리뷰·이미지 모델링 예로 풀었다.
팀 프로젝트를 리팩터링하기 전에 '지속 성장 가능한 소프트웨어' 방법론을 클린 아키텍처·헥사고날과 견주고, 레이어 참조 규칙과 모듈 분리 기준을 우리 프로젝트 구조로 옮겨 그려본 글.
코드리뷰가 끝난 PR이 메인 브랜치와 충돌했을 때 merge 대신 rebase로 이력을 일직선으로 유지하며 푼 과정. GitHub의 세 가지 머지 방식 차이도 함께 짚었다.
주문번호처럼 그냥 문자열로 흘러다니던 값을 코틀린 value class로 감싸 도메인 값 객체임을 타입으로 드러내고, data class와 무엇이 다른지 비교했다.
계층 사이 DTO 변환 코드가 서비스에 흩어지는 걸 막으려고 코틀린 확장 함수로 Converter를 분리하고, 관심사 분리와 재사용 측면에서 얻은 효과를 주문 서비스 코드로 정리했다.
주문 생성 API가 재고와 배송 상태를 제대로 바꿨는지 검증하려고, Database Rider로 인메모리 DB에 데이터셋을 심고 기대 데이터셋과 비교하는 방식으로 통합 테스트를 짠 기록.
로컬 메인과 원격 메인이 어긋난 두 상황을 나눠, 기능 브랜치는 rebase로 원격 메인 위에 다시 얹고 어긋난 로컬 메인은 초기화해 정리한 기록.
교보문고·예스24 같은 주문 서버를 맡아 코드를 짜기 전에, 회원·주문·상품·장바구니·결제·배송 여섯 도메인의 관계와 주문 프로세스의 트랜잭션·자동복구·성능 지점을 먼저 그려본 기록.
여섯 도메인이 얽힌 주문을 멀티모듈 안에서 어떻게 나눌지, 내부 통신과 외부 결제 연동을 어디서 끊을지 정하고 분산 트랜잭션과 재처리 전략까지 시퀀스 다이어그램으로 확정한 설계 기록.
AWS 데이터베이스 접속 정보를 원격 저장소에 올려야 하는 상황에서 Jasypt로 application.yml 속성을 암호화하고, 복호화 키는 실행 환경변수로 분리한 적용 기록.
컨트롤러에 스웨거 애노테이션이 뒤엉켜 서버 코드가 읽히지 않자, 인터페이스 분리 원칙을 적용해 문서용 인터페이스를 떼어내고 반복되는 정의는 커스텀 어노테이션으로 묶은 개선기.
컨테이너 서비스를 비교해 Fargate를 고른 이유부터 시작해, JWT 검증용 레디스 캐시와 외부 통신(NAT), 이미지 관리, 상태 점검을 하나씩 붙여가며 배포 자동화와 클라우드 구조를 키워간 설계 기록.
프론트에 넘길 API 문서를 만들면서 테스트를 강제하는 Spring REST Docs와 UI가 좋은 Swagger UI를 굳이 둘 다 붙인 구성을 정리했다. OAS로 두 문서를 하나로 합치는 방안은 설계만 그려두고 후속 과제로 남겼다.
조건에 맞는 글이 없습니다.