전체 글
-
미니 PC 한 대로 서비스 운영하기: 1인 개발 홈서버 인프라 구성과 지키는 법카테고리 없음 2026. 10. 16. 15:37
미니 PC 한 대로 서비스 운영하기: 1인 개발 홈서버 인프라 구성과 지키는 법들어가며신나게마을은 아파트 실거래가, 미세먼지, 인구 같은 공공데이터를 동네 단위로 모아 보여 주는 사이트입니다. 혼자 만들고 혼자 운영하고, 서버는 집에 둔 미니 PC 한 대입니다. 웹, 배치, DB, 관리 화면, 배포까지 전부 그 한 대에 올라가 있습니다.이 글은 그 인프라를 정리한 기록입니다. 서버 안에 무엇이 올라가 있고 각각 어떻게 띄웠는지 먼저 정리하고, 그다음 그 서버를 바깥에 내보내고 지키는 Cloudflare 쪽을 적었습니다.이 글에서 공유드릴 내용은 이렇습니다.1인 개발 서비스에 필요한 구성 요소와 각자의 역할, 실제 설정Docker Swarm 이 연 포트가 방화벽(UFW)을 우회하는 문제공유기 포트를 하나도..
-
Spring 7 내장 Resilience 사용기: @ConcurrencyLimit 과 @RetryableSpring 2026. 10. 16. 08:56
Spring 7 내장 Resilience 사용기들어가며Spring Framework 7 에 Resilience 기능이 들어왔습니다. 메서드에 어노테이션 하나로 동시 실행 수를 묶는 @ConcurrencyLimit, 재시도를 거는 @Retryable, 코드로 재시도를 쓰는 RetryTemplate 입니다. 그동안 재시도는 spring-retry 라는 별도 라이브러리가 맡아 왔는데, 이제 본체에 있습니다.저는 퇴근하고 혼자 신나게마을이라는 동네 데이터 사이트를 만들고 있습니다. 매일 새벽 배치가 공공데이터 API 를 수천 번 부르는데, 지금은 재시도는 spring-retry, 동시성 제한은 Spring 7 의 @ConcurrencyLimit 을 섞어 쓰고 있습니다.이 글은 두 부분입니다.1부: 지금 실제로 ..
-
AI 에게 규칙을 적어 줬더니 안 지켰다: 함정대장에서 게이트까지카테고리 없음 2026. 10. 15. 18:14
AI 에게 규칙을 적어 줬더니 안 지켰다들어가며퇴근하고 혼자 만드는 신나게마을이라는 동네 데이터 사이트가 있습니다. 혼자라고 했지만 정확히는 둘이 만듭니다. 코드 대부분은 Claude Code(터미널에서 도는 AI 코딩 도구)가 쓰고, 저는 무엇을 만들지 정하고 결과를 확인합니다.AI 와 오래 일하면 반드시 이 말을 하게 됩니다."이거 하지 말라고 했잖아."Claude Code 는 프로젝트의 CLAUDE.md 를 대화마다 읽습니다. 저는 여기에 하지 말 것을 계속 적었고, 지금 736줄이 됐습니다. 그래도 같은 실수가 반복됐습니다. AI 가 규칙을 몰라서가 아니었습니다. 물어보면 다 압니다. 일에 몰입한 순간, 손에 익은 쪽으로 먼저 움직일 뿐입니다. 사람도 위키에 적힌 규칙보다 CI 가 막는 규칙을 더..
-
Spring Boot 가상 스레드와 HikariCP: 커넥션 대기 줄에 상한 두기 (Semaphore + DataSource)Spring 2026. 10. 15. 13:59
가상 스레드를 켜고 잃어버린 것: 스레드 풀이라는 방파제들어가며퇴근하고 혼자 운영하는 사이트가 하나 있습니다. 신나게마을이라는 동네 데이터 사이트입니다. 아파트 실거래가, 전월세, 미세먼지, 인구 같은 공공데이터를 동네 단위로 모아서 보여 주는 서비스입니다.거창한 인프라는 아닙니다. 집 한쪽에 둔 손바닥만 한 미니 PC(HP EliteDesk 800 G6 Mini) 한 대에 도커로 앱 두 개를 띄우고, 앞에는 Cloudflare 와 Traefik 을 두었습니다. DB 는 같은 서버의 PostgreSQL 입니다. 평소에는 초당 요청이 5건 안팎이라 서버가 거의 놀고 있습니다.그러던 9월 초 어느 날이었습니다. 지나가다 홈서버를 만져 봤는데 손을 대기 싫을 정도로 뜨거웠습니다. 저전력 CPU 가 들어간 작은..
-
Spring Cloud Data FlowSpring 2024. 10. 2. 15:09
공식 문서 사이트https://dataflow.spring.io/docs/installation/https://docs.spring.io/spring-cloud-task/docs/current/reference/html/#preface수동 다운로드 사이트작성일 기준으로 최신 버전은 2.11.4Spring Cloud Dataflow ServerSpring Cloud Skipper설명Spring Cloud SkipperSpring Cloud Data Flow와 함께 사용되는 배포 관리 도구로, 애플리케이션 배포의 관리 및 업그레이드를 간편하게 수행할 수 있도록 도와주며, Skipper는 Spring Cloud Data Flow에서 스트림 및 작업(Tasks)을 구성하고 실행하는데 있어 버전 관리, 롤백, 및..
-
Spring & JTA(분산 트랜잭션)Spring 2023. 10. 30. 15:58
Spring Boot에 JTA 사용하기 안녕하세요. 기존 게시물 중 Spring Multi Datasource와 Multi Transaction 게시 글들이 있는데 말이 Multi Transaction이었지 결국에는 별개의 Transaction이었기 때문에 서로 다른 Transaction를 같이 사용했을 때 ACID가 지켜지지 않는 문제가 있었습니다. 그래서 이번 게시 글에선 JTA(Java Transaction API)를 이용한 분산 트랜잭션 처리를 다뤄보고자 합니다. 여기서 JTA에 간략하게 설명하자면 분산 트랜잭션을 관리하는 데 사용되는 Java 표준 API이며 데이터베이스, 메시지 큐, 웹 서비스 등 분산 트래잭션을 처리하게 해줍니다. 즉 이기종 간의 트랜잭션을 처리할 수 있습니다. 예로 A DB..
-
PG(Postgresql) 대용량 InsertDB 2023. 7. 3. 14:18
대용량 Insert 기술들 bulk insert(Multi-valued Insert) 데이터가 일정이상 과도하게 insert 되는 경우 인덱싱 문제로 인해 insert 속도가 저하 되었다. 테이블 인덱스 삭제 -> 대용량 Insert -> 테이블 인덱스 재생성 인덱스를 삭제 후 대용량 insert엔 문제가 없었으나 인덱스의 재생성에서 시간이 오래 걸림 PG의 copy문 사용 PG에서 제공하는 copy문을 사용. 1. 임시 테이블 생성 후 대량 Insert(해당 테이블엔 인덱스가 없기 때문에 Insert 속도 향상) 2. 본 테이블의 인덱스 삭제 3. 대용량 insert가 완료된 임시 테이블 copy문을 통해 csv 파일 생성 (copy to) 4. csv를 본 테이블에 전달(copy from) 5. 본 ..
-
RabbitMQ 리스너 메세지 무손실 배포MQ 2023. 7. 3. 13:47
문제Queue에 메세지가 존재 하는 상황에서 배포를 할 경우 리스너에서 Queue 처리가 어디까지 진행되었는지 모르는 상황인데 이때 리스너를 종료하게 되면 Queue가 unacked 상태가 되거나 혹은 다시 대기열로 들어가서 Queue를 재처리 하는 과정에서 원치 않는 프로세스의 중복을 유발 시킬 수도 있다. 그래서 이를 피하긴 위해 Queue에 메세지가 있는지 확인하고 없는 상황에서만 배포를 해야 하는데 그럴려면 Queue에 메세지를 상시 확인 해야 하며 배포 일자를 원하는 시기에 맞춰서 할 수 없다는 문제가 있다.목적Queue에 메세지가 존재하거나 리스너에서 Queue를 처리 하고 있는 상태에서도 Queue 메세지를 상시 확인하지 않고 배포 일자를 원하는 시기에 맞춰 할 수 있게 리스너 배포를 구성...