아카이브

2024년부터 2025년까지 쓴 기록 52편입니다.

2024.082025.10

전체 52편

· 개인

macOS + zsh 환경 설정 완벽 가이드 (.zprofile vs .zshrc)

PATH를 .zprofile에 넣었더니 IntelliJ 터미널에서만 안 잡히는 이유를 두 파일의 실행 시점 차이로 갈라 정리하고, 잘못된 설정 한 줄로 터미널이 죽었을 때의 진단·복구 절차까지 붙였다.

Linux트러블슈팅

· 개인

rebase 도중 untracked 파일 충돌 원인과 해결 방법

rebase가 미추적 파일을 덮어쓸까 봐 멈추는 이유를 워킹 트리 보호 원칙으로 짚고, squash로는 왜 풀리지 않는지와 stash -u로 치운 뒤 이어가는 해결 순서를 정리했다.

Git트러블슈팅

· 개인

JUnit 5 & Mockito 정리

JUnit 5 애노테이션과 Assertion부터 Mockito의 스터빙·호출 검증·ArgumentCaptor, 테스트 더블 다섯 종류까지 실제로 쓰는 문법만 예제로 모아둔 장문의 레퍼런스다.

테스트Java

· 개인

Git 이미 커밋(푸시)된 일부 파일 제외하는 방법

이미 원격까지 올라간 .gradle·build 디렉터리를 되돌리려고 git rm --cached로 인덱스에서만 걷어내고 commit --amend로 마무리한 기록. 마지막 커밋·과거 커밋·이력 완전 삭제까지 상황별 명령을 표로 갈라 두었다.

Git트러블슈팅

· 업무

오라클 SYNONYM이란?

다른 스키마의 객체를 자기 것처럼 부르게 해주는 SYNONYM의 PUBLIC/PRIVATE 차이와, 객체 위치가 바뀌어도 애플리케이션 쿼리를 고치지 않아도 되는 이유를 정리했다.

Oracle

· 개인

SQLite3란

파일 하나가 곧 데이터베이스가 되는 SQLite3의 서버리스·제로 설정 특성을 일반 RDBMS와 견줘 정리한 짧은 소개 글.

SQLite

· 개인

Jackson이 JSON 직렬화하는 방식

getter 없는 응답 객체가 빈 JSON이나 406을 뱉는 이유를 Jackson의 직렬화 우선순위(게터 우선, 그다음 public 필드)로 짚은 짧은 정리.

JavaSpring Boot

· 개인

Spring Boot + Vue3 DDD

Request에서 Command, Entity를 거쳐 Response로 이어지도록 계층별 객체를 갈라 스프링 부트 패키지 구조를 잡고, 같은 기준으로 Vue 3 쪽 구조와 견줘본 정리.

Spring BootVueDDD아키텍처

· 개인

빌드 도구 Vite(비트)

create-vue로 만든 Vite 기반 Vue 앱의 빌드 결과물을 스프링 부트 static에 실어 한 번에 배포하는 구성을 정리하고, 프론트·백엔드를 따로 띄우는 방식과 비교했다.

VueJavaScriptSpring Boot

· k8s

Kubernetes Finalizer 정리

네임스페이스가 Terminating에서 멈춰 지워지지 않는 이유를 Finalizer 동작 구조로 설명하고, 컨트롤러가 죽어 정리가 끝나지 않을 때 finalizer를 걷어내 강제 삭제한 절차와 그 위험을 남겼다.

KubernetesLinux트러블슈팅

· k8s

Pod 문제 해결을 위한 명령어 모음

장애가 나면 반사적으로 치게 되는 kubectl 명령을 상태 확인 → 이벤트·로그 진단 → 재시작 → 재확인 순서로 묶어둔 짧은 명령어 모음.

KubernetesLinux트러블슈팅

· k8s

네트워크 권한 문제로 인한 Pod 연결 장애

Loki와 Grafana가 통신하지 못하는 장애를 거슬러 올라가니 Calico ServiceAccount에 RBAC 권한이 없어 CNI가 아예 동작하지 못한 것이었고, ClusterRoleBinding으로 권한을 주자 아래 서비스들이 연쇄로 복구된 진단 기록.

KubernetesLinux트러블슈팅

· k8s

모니터링 설치 시 CNI 플러그인 이슈

프로메테우스와 Loki를 올렸는데 Pod가 READY 1/1이 되지 않고 멈춘 원인이 CNI 플러그인 부재였음을 확인하고, Calico를 설치해 Pod IP 할당부터 되살린 기록.

KubernetesLinux트러블슈팅

· oss

오픈소스 기여를 위한 Commit 정리

의미 없는 `.` 커밋이 원격까지 올라간 상태에서 기여용 PR을 내기 위해, interactive rebase로 커밋을 squash하고 amend로 메시지를 다듬어 이력을 정리한 기록.

Git오픈소스

· oss

로컬 환경 구축하기

GStreamer에 기여하려고 코어·플러그인 개발 패키지와 파이썬 바인딩까지 설치한 기록. 미디어 런타임 중심의 준비가 자바·스프링의 빌드 도구 중심 준비와 어떻게 다른지 견줘봤다.

Linux오픈소스

· 개인

기술 블로그 구축 — 배포 중 깃 복구 과정

GitHub Actions가 저장소 파일을 지운 뒤 git pull로 로컬까지 날아간 상황을, 마지막 정상 커밋에서 recovery 브랜치를 따고 develop을 reset --hard로 되돌려 복구한 기록.

GitCI/CD트러블슈팅

· 개인

Java Record vs Lombok @Value 비교

불변 객체를 만드는 두 방법을 상속 가능 여부, 접근자 제어, 생성자 형태로 갈라 비교하고 Record의 compact constructor로 값 검증까지 넣는 예제를 붙였다.

Java

· 업무

SVN 병합 충돌은 어떻게 해결할까

update 중 충돌이 나면 SVN이 만들어 두는 .mine·.rNNN 파일이 각각 무엇인지 짚고, mine-full·theirs-full·수동 편집 세 갈래로 해결한 뒤 resolved로 닫는 절차를 정리했다.

SVN트러블슈팅

· 업무

SVN 병합 프로세스

브랜치 작업 중 trunk를 따라가는 병합과 작업을 끝내고 trunk로 되돌리는 병합을 구분하고, 리비전 범위·재통합·체리픽 세 가지 병합 유형과 TortoiseSVN 조작 순서를 정리했다.

SVN

· 업무

SVN 주요 용어 설명

trunk·리비전·재통합처럼 SVN 문서와 실무 대화에서 바로 튀어나오는 용어들을 저장소·버전 관리·작업 상태·병합·접근 제어 다섯 갈래로 묶어 정리한 용어집.

SVN

· 업무

SVN에 대해 알아보자

보안 정책 때문에 Git을 쓸 수 없는 현장에서 SVN을 맡게 되어, 클라이언트-서버 모델과 trunk/branches/tags 저장소 구조부터 짚고 들어간 시리즈의 첫 글.

SVN

· 개인

Template Engine (View Template)에 대해 알아보자

서버 사이드(JSP·Thymeleaf)와 클라이언트 사이드 템플릿 엔진이 HTML을 완성하는 지점이 어디서 갈리는지 렌더링 흐름으로 구분한 개념 정리.

Spring BootJavaScript

· 개인

Kafka Local Hands-on

도커 컴포즈로 주키퍼와 카프카를 띄우고 토픽 생성부터 프로듀서·컨슈머 통신까지 직접 확인한 실습 기록. 끝에서 RabbitMQ와 메시지 큐 성격을 비교했다.

KafkaDockerRabbitMQ

· 개인

RabbitMQ Local Hands-on

rabbitmq:3-management 이미지를 도커로 올려 관리 UI에서 큐를 만들고 메시지를 넣어보며 익스체인지에서 큐로 이어지는 흐름을 눈으로 확인한 실습 기록.

RabbitMQDocker

· 개인

Redis Local Hands-on (feat. redis key 문법)

도커로 레디스를 띄워 문자열·리스트·해시·TTL 명령을 직접 쳐보고, 실무에서 쓸 키 네이밍 규칙(계층 구조, 환경 구분, 임시 키)까지 정리했다.

RedisDocker

· 기업-기술-블로그-탐구-일지

「토스」 가치있는 테스트를 위한 전략과 구현

토스가 말하는 '가치 있는 테스트'의 기준(선택적·실용적·목적 중심)을 정리하고, 도메인 정책은 경계값 중심 단위 테스트로 좁혀 쓰는 전략과 그 테스트를 설계하는 순서를 따라가며 옮겨 적은 탐구 기록.

테스트Kotlin

· 개인

Java의 Record Class (feat. Kotlin의 Data Class)

자바 Record를 코틀린 Data Class와 나란히 놓고, 계층 사이 데이터 전달(DTO) 지점에서 두 언어가 같은 문제를 어떻게 푸는지 비교한 정리.

JavaKotlin

· 기업-기술-블로그-탐구-일지

「29CM」 트랜잭셔널 아웃박스 패턴의 실제 구현 사례

비즈니스 로직 중간에 에러가 나면 이벤트가 유실되는 문제를 29CM가 아웃박스 테이블과 TransactionalEventListener의 BEFORE_COMMIT/AFTER_COMMIT 분리로 푼 방식을 따라가며 정리한 탐구 기록.

트랜잭션KafkaSpring Boot아키텍처

· 오픈소스-프로젝트-분석-일지

「EmergencyAssistant」 프로젝트 백엔드 개발 분석

실시간 응급실 조회 서버를 뜯어보며 application·domain·infra 멀티모듈 분리와, CQRS·파사드 패턴으로 기능 함수를 조합해 비즈니스 로직을 드러내는 방식을 정리한 분석 기록.

멀티모듈아키텍처Java오픈소스

· 오픈소스-프로젝트-분석-일지

「고스락」 프로젝트 백엔드 개발 분석

공연 티켓 판매 서버의 Api·Domain·Infrastructure 멀티모듈 구성을 따라가며, 파사드 패턴과 커스텀 어노테이션으로 도메인 개념을 코드에 드러내는 방식과 FeignClient 사용을 정리한 분석 기록.

멀티모듈아키텍처Java오픈소스

· 기업-기술-블로그-탐구-일지

「29CM」 신규 검색 서비스 전환기 (feat. 컬리)

29CM와 컬리의 검색 전환기를 나란히 읽고, 원천 데이터와 변경 데이터를 카프카 발행/구독으로 흘려 검색엔진 인덱싱 파이프라인을 만드는 공통 구조를 뽑아낸 탐구 기록.

Kafka아키텍처Spring Boot

· inner-circle

일급 컬렉션 vs 확장 함수 (feat. 코틀린 & 자바)

컬렉션에 비즈니스 규칙을 붙일 때 자바처럼 일급 컬렉션으로 감쌀지 코틀린 확장 함수로 열어둘지를 코드로 비교하고, 어느 쪽이 레이어 구조에 더 잘 얹히는지 따져봤다.

KotlinJava

· inner-circle

주문 서버 개발기 3편 (구현)

설계한 주문 생성 API를 implement 레이어에 구현체를 두고 모든 흐름이 비즈니스 레이어로 향하도록 구현한 과정. 정합성을 맞추는 방법은 장기 트랜잭션과 개별 트랜잭션 조합 두 갈래를 놓고 저울질하는 데서 멈춘다.

Kotlin아키텍처트랜잭션

· inner-circle

JPA Entity 연관관계 (feat. 제미니의 개발실무)

연관관계를 웬만하면 걸지 않고 id로만 매핑하는 지침을 세우고, 엔티티와 도메인 객체가 1:1일 필요가 없는 이유를 리뷰·이미지 모델링 예로 풀었다.

JPADDD

· inner-circle

pull request 진행 시 Git Confilct Solution (feat. rebase)

코드리뷰가 끝난 PR이 메인 브랜치와 충돌했을 때 merge 대신 rebase로 이력을 일직선으로 유지하며 푼 과정. GitHub의 세 가지 머지 방식 차이도 함께 짚었다.

Git트러블슈팅

· inner-circle

코틀린의 확장함수 활용해 Converter Extension 해보자

계층 사이 DTO 변환 코드가 서비스에 흩어지는 걸 막으려고 코틀린 확장 함수로 Converter를 분리하고, 관심사 분리와 재사용 측면에서 얻은 효과를 주문 서비스 코드로 정리했다.

Kotlin리팩터링

· inner-circle

프로젝트 진행 중 발생한 깃 이슈

로컬 메인과 원격 메인이 어긋난 두 상황을 나눠, 기능 브랜치는 rebase로 원격 메인 위에 다시 얹고 어긋난 로컬 메인은 초기화해 정리한 기록.

Git트러블슈팅

· inner-circle

주문 서버 개발기 1편 (도메인)

교보문고·예스24 같은 주문 서버를 맡아 코드를 짜기 전에, 회원·주문·상품·장바구니·결제·배송 여섯 도메인의 관계와 주문 프로세스의 트랜잭션·자동복구·성능 지점을 먼저 그려본 기록.

DDD아키텍처트랜잭션

· inner-circle

주문 서버 개발기 2편 (설계)

여섯 도메인이 얽힌 주문을 멀티모듈 안에서 어떻게 나눌지, 내부 통신과 외부 결제 연동을 어디서 끊을지 정하고 분산 트랜잭션과 재처리 전략까지 시퀀스 다이어그램으로 확정한 설계 기록.

아키텍처멀티모듈트랜잭션

· inner-circle

Jasypt 이용해 민감한 정보 암호화 작업

AWS 데이터베이스 접속 정보를 원격 저장소에 올려야 하는 상황에서 Jasypt로 application.yml 속성을 암호화하고, 복호화 키는 실행 환경변수로 분리한 적용 기록.

Spring BootAWSMySQL

· inner-circle

Spring Boot (Kotlin, Gradle) + Docker 를 AWS 배포해보자

컨테이너 서비스를 비교해 Fargate를 고른 이유부터 시작해, JWT 검증용 레디스 캐시와 외부 통신(NAT), 이미지 관리, 상태 점검을 하나씩 붙여가며 배포 자동화와 클라우드 구조를 키워간 설계 기록.

AWSDockerCI/CDRedis