> AI와 빅데이터로 건설업계의 디지털 혁신을 이끄는 (주)산군의 Jun Kang입니다. 대규모 데이터 처리, DB 최적화, 확장 가능한 시스템 구축에 관심이 많으며, 개발팀의 건강하고 지속 가능한 성장 문화를 문화를 만들어가고 있습니다. 이 파일은 생성형 검색엔진과 LLM 크롤러가 사이트 구조를 빠르게 파악하도록 제공하는 색인입니다. 본문 전문은 각 URL에서 확인할 수 있습니다. ## 저자 - 이름: Jun Kang - 소개: (주)산군 CTO. PostgreSQL 대규모 운영, 데이터 파이프라인, LLM/RAG 적용, 개발 조직 운영. - GitHub: https://github.com/junhkang - LinkedIn: https://www.linkedin.com/in/junh-kang - 프로필: https://junhkang.com/about/ ## Posts Blog posts - [로그가 0줄인 것은 아무 일도 없었다는 뜻이 아니다](https://junhkang.com/posts/observability-failure-modes/): 관찰 결과가 관찰 대상보다 먼저 사라지면 측정은 실패합니다. 로그 로테이션이 관찰 주기보다 짧을 때, 삭제된 파일에 계속 쓰고 있을 때, 0건이 '없음'인지 '동작 안 함'인지 구분할 수 없을 때 — 운영에서 반복해서 밟았던 관측 실패 유형을 정리합니다. (2026-09-02) - [console.log는 로깅이 아니다 — 운영에서 살아남는 로그 설계](https://junhkang.com/posts/structured-logging-design/): 배포 전에 지우는 console.log는 디버깅이지 로깅이 아닙니다. 로그 레벨을 나누는 실전 기준, 구조화 로그(JSON)가 검색·집계·알림으로 이어지는 이유, Request ID 전파, 그리고 로그에 절대 남기면 안 되는 것까지 정리합니다. (2026-08-05) - [[PostgreSQL] 트랜잭션 ID는 42억 개인데 왜 20억마다 freeze가 도는가](https://junhkang.com/posts/postgresql-transaction-id-wraparound/): PostgreSQL의 트랜잭션 ID는 32비트라 약 42억 개인데, 실제 freeze 기준은 그 절반인 20억입니다. 순환 카운터에서 두 트랜잭션의 전후 관계를 부호 있는 정수 비교로 판정하기 때문인데, 그 원리와 age() 모니터링 방법을 정리합니다. (2026-07-14) - [PostgreSQL POSITION 함수로 문자열 내 위치 찾기](https://junhkang.com/posts/126/) (2025-08-13) - [[Spring] 스프링부트와 HikariCP를 활용한 Connection Pool 설정 및 최적화](https://junhkang.com/posts/125/) (2025-01-30) - [[LINUX] SFTP 초기화 오류 : Failed to connect and initialize SSH connection. Message: [Failed to connect SFTP channel](https://junhkang.com/posts/124/) (2025-01-03) - [[AWS] Bastion 서버 설정 및 서버 접속 상태 한눈에 구분하기](https://junhkang.com/posts/123/) (2024-12-31) - [[LLM] Quota discoveryengine.googleapis.com/documents exceeded.](https://junhkang.com/posts/122/) (2024-12-17) - [[LLM] Google Cloud Discovery Engine 데이터 스토어 업로드 포맷](https://junhkang.com/posts/121/) (2024-12-16) - [[Spring] 테스트 4 - 얼마나 깊게 테스트 코드를 작성해야 하는가?](https://junhkang.com/posts/99/) (2024-09-22) - [[Spring] 테스트 3 - 언제 테스트 코드를 적용해야 하는가?](https://junhkang.com/posts/98/) (2024-09-22) - [[Spring] 테스트 2 - 테스트 코드를 어떻게 작성해야 하는가?](https://junhkang.com/posts/97/) (2024-09-22) - [[Spring] 테스트 1 - 왜 테스트 코드를 작성해야 하는가?](https://junhkang.com/posts/96/) (2024-09-22) - [[Spring] Caused by: java.lang.IllegalArgumentException: 이름이 {fragment}인, 둘 이상의 fragment들이 발견되었습니다.](https://junhkang.com/posts/95/) (2024-08-20) - [[PostgreSQL] RDS 쿼리 성능 분석 방법 : pg_stat_statements 설치, 고려사항 및 주요 지표](https://junhkang.com/posts/94/) (2024-08-14) - [[디자인패턴] 빌더(Builder) 패턴의 개념, 예제, 장단점, 활용](https://junhkang.com/posts/93/) (2024-07-29) - [[Spring] Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection, 데이터베이스 접속 에러](https://junhkang.com/posts/92/) (2024-07-25) - [[PostgreSQL] SUBSTRING, SUBSTR, 문자열 자르기](https://junhkang.com/posts/91/) (2024-07-24) - [[이펙티브 자바] 10. equals는 일반 규약을 지켜 재정의하라](https://junhkang.com/posts/90/) (2024-06-29) - [[GitHub] 민감한 정보 완전 삭제와 PR 히스토리 정리](https://junhkang.com/posts/89/) (2024-06-19) - [[PostgreSQL] 문자열에서 날짜/시간 변환 및 처리 과정](https://junhkang.com/posts/88/) (2024-05-02) - [[디자인패턴] 전략(Strategy) 패턴의 개념, 예제, 장단점, 활용](https://junhkang.com/posts/87/) (2024-04-12) - [[PostgreSQL] ROWNUM 사용과 순번 부여하기 - ROW_NUMBER(), RANK(), DENSE_RANK()](https://junhkang.com/posts/86/) (2024-04-11) - [[PostgreSQL] 버전 확인: 필요성과 4가지 방법](https://junhkang.com/posts/85/) (2024-04-11) - [[PostgreSQL] 고급 GROUPING 전략 : SETS, CUBE, ROLLUP의 개념, 효과적인 사용법 및 주의사항](https://junhkang.com/posts/84/) (2024-04-09) - [[PostgreSQL] UNION, INTERSECT, EXCEPT, SQL 쿼리 결합의 개념, 사용법 및 주의사항](https://junhkang.com/posts/83/) (2024-04-08) - [[PostgreSQL] 페이징 : OFFSET과 LIMIT의 올바른 사용과 주의점](https://junhkang.com/posts/82/) (2024-04-08) - [[이펙티브 자바] 9. try-finally 보다는 try-with-resources를 사용하라](https://junhkang.com/posts/81/) (2024-04-06) - [[이펙티브 자바] 8. finalizer 와 cleaner 사용을 피하라](https://junhkang.com/posts/80/) (2024-03-31) - [[PostgreSQL] Visibility Map(가시성 맵)의 개념, 원리, 생명주기 및 정보 확인 방법](https://junhkang.com/posts/79/) (2024-03-28) - [[이펙티브 자바] 7. 다 쓴 객체 참조를 해제하라](https://junhkang.com/posts/78/) (2024-03-27) - [[이펙티브 자바] 6. 불필요한 객체 생성을 피하라](https://junhkang.com/posts/77/) (2024-03-26) - [[이펙티브 자바] 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라](https://junhkang.com/posts/76/) (2024-03-25) - [[PostgreSQL] TOAST (The Oversized-Attribute Storage Technique)의 개념, PostgreSQL의 대용량 속성 저장 기법](https://junhkang.com/posts/75/) (2024-03-23) - [[PostgreSQL] DISK(디스크) 사용량 모니터링](https://junhkang.com/posts/74/) (2024-03-19) - [[디자인패턴] 데코레이터(Decorator) 패턴의 개념, 예제, 장단점, 활용](https://junhkang.com/posts/73/) (2024-03-18) - [[PostgreSQL] PostgreSQL의 물리적 한계치](https://junhkang.com/posts/72/) (2024-03-18) - [[PostgreSQL] Planner, Optimizer (플래너, 옵티마이저)란? Planner, Optimizer (플래너, 옵티마이저)의 개념과 작동방식](https://junhkang.com/posts/71/) (2024-03-14) - [[PostgreSQL] Index-Only 스캔과 Covering 인덱스, Index-only스캔의 효율적인 사용](https://junhkang.com/posts/70/) (2024-03-13) - [[PostgreSQL] 인덱스(INDEX)와 오더바이(ORDER BY), ORDER BY 성능개선, 효율적인 인덱스 적용](https://junhkang.com/posts/69/) (2024-03-12) - [[PostgreSQL] 2단계 커밋 프로토콜(Two-Phase Commit Protocol), Prepare transaction](https://junhkang.com/posts/68/) (2024-03-08) - [[PostgreSQL] 트랜잭션(Transaction)의 작동원리](https://junhkang.com/posts/67/) (2024-03-08) - [[PostgreSQL] WAL (Write-Ahead Logging) / 아카이브 모드 백업(Archive mode backup)의 개념 및 장단점](https://junhkang.com/posts/66/) (2024-02-26) - [[PostgreSQL] 대량 데이터 인서트 시 성능 개선 및 주의 사항](https://junhkang.com/posts/65/) (2024-02-26) - [[PostgreSQL] 외래키(Foreign Keys) 개념, 사용법, 장단점, 적용검토](https://junhkang.com/posts/64/) (2024-02-22) - [[디자인패턴] 컴포지트(Composite) 패턴의 개념, 예제, 장단점, 활용](https://junhkang.com/posts/63/) (2024-02-20) - [[이펙티브 자바] 4. 인스턴스화를 막으려거든 private 생성자를 사용하라](https://junhkang.com/posts/62/) (2024-02-18) - [[디자인패턴] 추상 팩터리(Abstract Factory) 패턴의 개념, 예제, 장단점, 활용](https://junhkang.com/posts/61/) (2024-02-16) - [[Linux] JDK 여러 버전 적용하기, 여러개의 패키지 관리하기 (update-alternatives)](https://junhkang.com/posts/60/) (2024-02-05) - [[Spring] 스프링부트 3, 스프링 시큐리티 6, 로그인 세션 유지, 로그인 풀림](https://junhkang.com/posts/59/) (2024-02-02) - [[Spring] 스프링부트 3 jstl 적용(maven), (절대 URI인 [http://java.sun.com/jsp/jstl/core]을(를), web.xml 또는 이 애플리케이션과 함께 배치된 JAR 파일 내에서 찾을 수 없습니다.)](https://junhkang.com/posts/58/) (2024-01-31) - [[Spring] Java 21 롬복(lombok) 버전 설정 (java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid')](https://junhkang.com/posts/57/) (2024-01-31) - [[Java] 자바 스트림(Streams)의 개념과 사용 방법](https://junhkang.com/posts/56/) (2024-01-30) - [[이펙티브 자바] 3. private 생성자나 열거 타입으로 싱글턴임을 보장하라](https://junhkang.com/posts/55/) (2024-01-24) - [[이펙티브 자바] 2. 생성자에 매개변수가 많다면 빌더를 고려하라](https://junhkang.com/posts/54/) (2024-01-23) - [[이펙티브 자바] 1. 생성자 대신 정적 팩터리 메서드를 고려하라](https://junhkang.com/posts/53/) (2024-01-18) - [[Spring] Java 21 외장 톰캣 버전 설정](https://junhkang.com/posts/52/) (2023-12-18) - [[Spring] Spring Security6 filterchain 사용시 jsp 뷰 렌더링 설정](https://junhkang.com/posts/51/) (2023-12-18) - [[Elastic Search] Elastic Search란? Elastic Search의 개념 및 장단점](https://junhkang.com/posts/50/) (2023-12-08) - [[WEB] SSR(Server Side Rendering) 과 CSR(Client Side Rendering)의 개념 및 차이](https://junhkang.com/posts/49/) (2023-11-28) - [[네트워크] REST, RESTful API의 개념 및 설계 가이드](https://junhkang.com/posts/48/) (2023-11-21) - [[Spring] 순환참조란? The dependencies of some of the beans in the application context form a cycle](https://junhkang.com/posts/47/) (2023-11-17) - [[PostgreSQL] 함수(Function)의 정의 및 상세 사용법 (다양한 예제)](https://junhkang.com/posts/46/) (2023-11-15) - [[Spring] 단위 테스트, JUnit의 개념 및 단위 테스트 코드 작성 방법](https://junhkang.com/posts/45/) (2023-11-14) - [[PostgreSQL] 명시적 JOIN 절로 플래너(Planner) 제어, 성능 향상](https://junhkang.com/posts/44/) (2023-11-08) - [[Spring] 스프링 컨테이너(Spring container)의 개념](https://junhkang.com/posts/43/) (2023-11-07) - [[Spring] IoC(제어의 역전) & DI(의존성 주입)의 개념](https://junhkang.com/posts/42/) (2023-11-06) - [[WEB] JWT 토큰 인증의 개념과 장단점](https://junhkang.com/posts/41/) (2023-11-01) - [[PostgreSQL] 윈도우 함수(Window Functions)의 개념, 성능 및 사용법 (over, sum/rank/ntitle/cume_dist 등...)](https://junhkang.com/posts/40/) (2023-10-31) - [[PostgreSQL] 데이터베이스 상속(Inheritance)의 개념과 사용법 및 성능비교 (Inherits, Only)](https://junhkang.com/posts/39/) (2023-10-30) - [[PostgreSQL] 날짜 형태 검증하기 (ERROR: date/time field value out of range)](https://junhkang.com/posts/38/) (2023-10-26) - [[Java] 가상 스레드 (Virtual Threads)란? 자바 21의 가상스레드 (Virtual Thread) 도입](https://junhkang.com/posts/37/) (2023-10-25) - [[Java] Switch와 else-if의 효율성 비교 (Switch와 else-if 중에 어떤 걸 사용해야 할까?)](https://junhkang.com/posts/36/) (2023-10-24) - [[Java] 클래스 로딩 과정(Java Class Loading Process)이란?](https://junhkang.com/posts/35/) (2023-10-23) - [[Linux] 스왑 메모리(Swap Memory)의 개념과 적용방법](https://junhkang.com/posts/34/) (2023-10-23) - [[Spring] 스프링부트 + Mybatis 데이터소스 여러개 연결 (스프링 다중 데이터베이스 연결)](https://junhkang.com/posts/33/) (2023-10-20) - [[Spring] 스프링 배치 ItemReader의 개념, (MybatisCursorItemReader, MybatisPagingItemReader 구현)](https://junhkang.com/posts/32/) (2023-10-19) - [[네트워크] TCP/IP의 개념](https://junhkang.com/posts/31/) (2023-10-18) - [[네트워크] 소켓(SOCEKT) 통신, 3-way handshake의 개념](https://junhkang.com/posts/30/) (2023-10-18) - [[Spring] 스프링 트랜잭션의 개념 및 적용 (@Transactional 사용법)](https://junhkang.com/posts/29/) (2023-10-17) - [[운영체제(OS)] 스레드 (Thread), 멀티스레드(Multithreaded Programming)란?](https://junhkang.com/posts/28/) (2023-10-17) - [[AWS] RDS 적정 인스턴스 선택, 비용 최적화](https://junhkang.com/posts/27/) (2023-10-16) - [[PostgreSQL] 쿼리 성능향상 (실행계획 보는 법, 상세 확인방법, Explain의 어떤 지표를 봐야할까?)](https://junhkang.com/posts/26/) (2023-10-12) - [[PostgreSQL] 뷰(VIEW) 테이블 개념 및 사용, 생성(CREATE), 수정(CREATE OR REPLACE), 삭제(DROP)](https://junhkang.com/posts/25/) (2023-10-11) - [[PostgreSQL] CREATE TABLE AS (결과물을 테이블로)](https://junhkang.com/posts/24/) (2023-10-11) - [[PostgreSQL] 시퀀스(Sequence)의 개념과 사용법(생성, 삭제, 조회 등)](https://junhkang.com/posts/23/) (2023-10-11) - [[PostgreSQL] 역할 및 권한 (ROLE, USER, GROUP) 개념 및 설정](https://junhkang.com/posts/22/) (2023-10-11) - [[PostgreSQL] 제약조건 (Constraint) 개념 및 설정 (Primary Keys, Foreign Keys, Unique, Not null, Check)](https://junhkang.com/posts/21/) (2023-10-10) - [[PostgreSQL] 트랜잭션(Transaction)의 개념 및 사용](https://junhkang.com/posts/20/) (2023-10-10) - [[AWS] AMI(Amazon Machine Image) 개념 및 적용](https://junhkang.com/posts/19/) (2023-10-09) - [[AWS] Elastic IP (탄력적 IP)의 개념 및 적용](https://junhkang.com/posts/18/) (2023-10-09) - [[PostgreSQL] Vacuum 개념 및 적절한 사용](https://junhkang.com/posts/17/) (2023-10-09) - [[Linux] 심볼릭 링크 (Symbolic link) 설정하기](https://junhkang.com/posts/16/) (2023-10-09) - [[PostgreSQL] MVCC (Multi-Version Concurrency Control)](https://junhkang.com/posts/15/) (2023-10-06) - [[PostgreSQL] 미사용 인덱스(INDEX) 찾기 및 삭제, 성능향상](https://junhkang.com/posts/14/) (2023-10-06) - [ERROR: text search configuration name \"english\" must be schema-qualified](https://junhkang.com/posts/13/) (2023-10-05) - [[PostgreSQL] 문자열내 중복 공백, 단어 제거](https://junhkang.com/posts/12/) (2023-10-04) - [[PostgreSQL] BRIN 인덱스의 원리 및 특징](https://junhkang.com/posts/11/) (2023-09-18) - [[PostgreSQL] GIN인덱스의 원리 및 특징](https://junhkang.com/posts/10/) (2023-09-13) - [[PostgreSQL] SP-GiST인덱스의 원리 및 특징](https://junhkang.com/posts/9/) (2023-09-13) - [[PostgreSQL] GiST인덱스의 원리 및 특징](https://junhkang.com/posts/8/) (2023-09-13) - [[PostgreSQL] Hash 인덱스의 원리 및 특징](https://junhkang.com/posts/7/) (2023-09-13) - [[PostgreSQL] B-tree 인덱스의 원리 및 특징](https://junhkang.com/posts/6/) (2023-09-12) - [[PostgreSQL] 인덱스(INDEX)개념 및 생성, 삭제, 분석, 설계 방법](https://junhkang.com/posts/5/) (2023-09-12) - [Postgresql Lock이란? (조회 및 kill, Dead lock)](https://junhkang.com/posts/4/) (2023-09-11) - [[PostgreSQL] Trigger, Procedure, Function (history 관리하기)](https://junhkang.com/posts/3/) (2023-09-08) - [Full Text Search를 활용한 데이터베이스 성능 향상](https://junhkang.com/posts/2/) (2023-09-07) ## 산군 개발조직을 처음부터 세팅하고 성장시키면서 겪은 다양한 경험과 고민들을 공유합니다. 조직문화 형성, 기술적 의사결정, 팀 빌딩 등 스타트업 개발조직의 성장 과정에서 마주친 여러 도전과 해결 과정에 대한 이야기를 담습니다. - [AI가 먹힌 업무와 안 먹힌 업무 — 직군별로 갈린 결과](https://junhkang.com/sankun/ai-adoption-2-where-it-worked/): 같은 도구를 같은 기간 쓰게 했는데 직군별 결과가 크게 갈렸습니다. 재료를 주고 시키는 일에서는 시간이 절반 아래로 줄었고, 무엇을 할지 정하는 일에서는 끝내 쓸 만한 방법을 못 찾았습니다. 그 경계에 대한 정리입니다. (2026-09-04) - [AI 도구를 전사에 깔고 한 달 — 토큰 사용량은 생산성이 아니다](https://junhkang.com/sankun/ai-adoption-1-token-is-not-productivity/): AI 코딩 도구를 전사에 도입하고 한 달간의 사용량을 집계했습니다. 숫자를 재기 시작하는 순간 그 숫자가 평가로 읽힌다는 문제를 어떻게 다뤘는지, 그리고 1:1에서 무엇을 물었는지 적었습니다. (2026-08-25) - [티켓 1건은 1건이 아니다 — 개발팀 지표에 무게를 붙인 이야기](https://junhkang.com/sankun/ticket-weight-kpi/): 11줄짜리 수정과 430줄짜리 수정이 똑같이 '1건'으로 세어지고 있었습니다. 티켓마다 무게를 매겨 팀의 역량이 실제로 어디에 쓰였는지 보이게 만든 과정과, 그 지표를 평가에 쓰지 않기로 한 이유를 적었습니다. (2026-08-16) - [2025년 회고 - CTO로서의 성장과 변화](https://junhkang.com/sankun/2/): 2025년 한 해 동안 산군 개발조직과 함께 겪은 변화와 성장, 그리고 앞으로의 방향성 (2026-01-09) ## Personal 회사 밖에서 개발자로 살면서 남긴 기록입니다. 정체성에 대한 고민, 개인적으로 굴려본 사이트에서 얻은 교훈처럼 조직의 일과는 조금 떨어진 이야기를 담담하게 적어둡니다. - [개인 사이트가 구글에서 사라졌다 — 대량 생성 페이지의 대가](https://junhkang.com/personal/google-deindex-1-what-happened/): 개인적으로 굴려보던 디렉터리형 사이트가 구글 색인에서 사실상 통째로 빠졌습니다. 페이지 단위로는 문제가 없어 보였는데 왜 걸렸는지, 진단 과정에서 확인한 것들을 정리합니다. (2026-09-06) - [개발자인가 CTO인가](https://junhkang.com/personal/developer-or-cto/): 명함에는 CTO라고 적혀 있는데 하는 일의 대부분은 혼자 코드를 쓰는 것이었습니다. 타이틀과 실제 사이에서 헷갈리던 2021년 중반의 기록입니다. (2021-06-20)