전체 글

285

오늘도 상쾌한기분

아키텍처/원칙 HTTP DELETE Method 응답은 200? 204? 404? 최근 개발한 태스크 중에 자사나 외부 서비스의 리소스를 삭제하는 연동 작업이 몇 개 연달아서 있었는데엔드포인트는 모두 DELETE /resources, DELETE /resources/{resource_id}로 네이밍 규칙은 동일했다.하지만 응답에 대한 규칙은 모두 달랐다. 이번에는 HTTP DELETE Method 응답 상태 코드에 대한 글을 써보려고 한다.구현할 때 네트워크 오류 등으로 중복 전송이 될 수 있다고 가정하고, 로직과 오류 모니터링에서 문제가 없도록 개발하기 위해 동일 리소스 삭제 요청이 여러 번 발생하는 경우 삭제 API가 어떻게 동작하는지 확인이 필요했다.확인해 보니 응답 규칙이 서로 다른 4가지 경우가 있었다.구분리소스 첫 삭제 요청동일 리소스 재요청 (삭제 완료 이후)없는 리소스 ..
아키텍처/원칙 스프링 IoC 컨테이너: BeanFactory와 ApplicationContext 앞서 의존성 주입이 무엇이고 왜 필요한지 봤다. 이번에는 스프링 프레임워크가 그 일을 어떻게 대신해 주고 있는지 확인해보자.[아키텍처/원칙] - 의존성 주입(DI, Dependency Injection)과 다형성(Polymorphism)확인 버전Spring Boot 4.1 (Spring Framework 7.0.9)Kotlin 2.3 (JDK 25)IoC(Inversion of Control) 제어의 역전프로그램의 흐름을 내 코드가 아니라 프레임워크가 쥐는 설계 원칙이다. 내가 프레임워크를 부르는 것이 아니라 프레임워크가 내 코드를 부른다. IoC라는 용어는 1988년 Ralph E. Johnson과 Brian Foote가 Journal of Object-Oriented Programming에 게재한 D..
네트워크 통신사별 IP 대역 (SKT, KT, LG) 통신사별 IP 대역구분SK텔레콤KTLG U+3G203.226211.23439.7110.70175.223211.24661.43211.2344G27.160 ~ 27.183203.226223.32 ~ 223.632001:2d8::/3239.7110.70118.235175.223211.2462001:e60::/32106.102125.188117.111211.36106.1015G223.32 ~ 223.632001:2d8::/32211.234211.23539.7110.70118.2352001:e60::/32106.1012001:4430::/32로밍42.35 ~ 42.36223.32 ~ 223.63 관리대행자별 IP 할당 현황 (2026 10 17 기준)통신사기관명영문서비스명IPv4 (/24 개수)IPv6SK텔레콤..
기록 대 AI 에이전트 시대, 사기업이 개인정보를 계속 보유해야 할까? 작년부터 해킹과 개인정보 유출 사고로 시끄럽다. 늘고 있다는 건 알고 있었지만 어느 정도로 빈번해진 건지 궁금해서 관련 통계들을 찾아봤다.AI와 관련된 사고 건수도 증가하고 있다.실제로 일하면서도 과거의 공격과는 조금 다른 느낌을 받고 있다. 예전에는 DDoS 공격이나 스캐닝, 이미 알려진 취약점을 찔러보는 요청이 대부분이었던 것 같은데 요즘은 일반적인 클라이언트에서는 보기 어려운 요청이나 환경 정보를 가지고 접근하는 경우도 있고, 나 AI임ㅋ 하고 opencode나 hermes 같은 에이전트 이름을 달고 오는 것들도 모니터링에 잡히고 있다. 예전에 유출된 AWS 키로 IAM 유저를 만들려던 시도도 로그에 opencode가 찍혀 있었다.[보안] - 유출된 AWS AccessKey 무중단 교체하기: 출근길..
아키텍처/원칙 의존성 주입(DI, Dependency Injection)과 다형성(Polymorphism) 의존성 주입에 대해서한국어로 의존성 주입을 검색하면 세상천지 스프링 얘기밖에 없다. 의존성 주입을 스프링만의 고유 독점 기능처럼 말하는 사람도 본 적 있을 정도다. 스프링이 의존성 주입을 잘 활용한 프레임워크인 건 맞지만 의존성 주입은 특정 프레임워크만의 기능이 아니라 객체지향 특성을 잘 활용한 방식이다.의존성 주입은 한 문장으로 끝난다. 객체가 필요로 하는 다른 객체를 안에서 직접 만들지 않고 밖에서 받는다. 생성자 인자 하나 바꾸는 정도의 차이인데, 이 작은 차이가 다형성과 만나면 코드는 유연해지고 테스트는 짜기 쉬워진다.다만 경험상, 잘 모르는 영역에서 억지로 추상화부터 하면 나중에 후회하기 쉽다. 추상화는 필요해졌을 때 해도 늦지 않다. AI 덕분에 코드 비용이 낮아진 요즘이라면 더욱 그렇다. 정..
데이터베이스/MySQL 락 순서를 맞춰 MySQL 데드락(Deadlock) 피하기 업무에서 자주 있는 상황은 아니다 보니 막상 개념은 알고 있어도 로직을 짤 때는 종종 까먹곤 한다. 개발팀에서도 이 개념이 익숙하지 않은 분이 있어서 이번 기회에 글로 정리해 둔다. 이 글을 읽고 비슷한 상황을 만났을 때 소위 우아하게 다룰 수 있으면 좋겠다.설명 기준MySQL 8.0 이상InnoDB 엔진Isolation Level: REPEATABLE READ여러 행을 차례로 잠그는 로직에서는 항상 정렬을 해야 한다When modifying multiple tables within a transaction, or different sets of rows in the same table,do those operations in a consistent order each time. Then transact..
개발 도구/에디터·터미널 cmux 터미널 폰트 설정 방법 cmux는 터미널 엔진으로 Ghostty를 사용하기 때문에, 터미널 폰트 역시 Ghostty 설정을 통해 변경할 수 있다. 설정 파일은 다음 경로에 있다.~/.config/ghostty/config폰트 설정개인적으로 영문 및 코드에는 JetBrains Mono, 한글에는 Jetendard를 사용하고 있다.# 영문 / 코드 / Ghostty 기본 폰트이지만 명시적으로 기록font-family = JetBrains Mono# 한글 fallbackfont-family = Jetendard# 기본 폰트 크기font-size = 14# macOS에서 폰트를 조금 더 두껍게 렌더링font-thicken = truefont-thicken-strength = 20# 프로그래밍 ligature 비활성화# !=, => 등..
보안 2026년 실서비스 보안 취약점 발견 후기 I사: 공개 페이지에 평문으로 적힌 시크릿 I사는 패션업 서비스로 노션이 공개 되어 있었고 노션에 공용 계정과 소셜 서비스 시크릿을 관리하고 있었고, 평문으로 적혀 있어서 그대로 다 보이는 상황이였다.노션은 인증이나 인가 없이도 특정 API 엔드포인트 호출하여 그 회사 계정들의 이메일, 사진, 이름들이 조회 가능하다.(지금도 되는지는 몰?루?) API 조회하여 회사 계정 메일 주소를 몇 개 확인 한 뒤 이메일을 보냈는데 스팸으로 취급 했는지? 어쨋는지? 수신 확인은 해놓고 답장도 안오고 노션 비공개 처리도 계속 안되었다.결국 메일이 아니라 당사 직원에게 직접 내용 전달했고 이후 비공개 처리된 부분 확인 했다. (근데 고맙다고 인사도 못 들음. 예의 상태가?) O사: GraphQL introspectio..
Kotlin·Java K8s CronJob 기반 Spring Batch, Argo Workflows로 전환하기 - 4편: 전환 후 6개월간 운영해본 회고 앞서 3편의 글에서 K8s CronJob 기반으로 실행하던 Spring Batch를 Argo Workflwos로 전환하는 과정에 대해 정리했고 실제 서비스도 전환한 지 약 반년 정도 지났다.이번 글에서는 6개월 정도 실제로 운영해보며 예측하지 못해 문제가 있었는지, 어떤 장점이 있었는지, 아쉬운 부분등이 있었는지에 대해 정리해보려고 한다.1. 가장 걱정했던 부분으로 OOM에 취약한 구조Batch는 기능상 다른 Application들에 비해서 정확하게 수행해야하는 중요한 기능들이 많고 또 정해둔 스케줄에 맞춰서 동작하는게 중요하다.전환 당시 걱정했던 부분 중 하나로 Batch Job들이 Pod이나 Application OOM에 취약하게 열려 있는 점이였고 실제로 운영하면서 OOM이 발생한 적이 있었다. 그..
보안 타이밍 어택, 어디까지 막아야 할까? == 비교부터 프레임워크 CVE까지 타이밍 어택, 어디까지 막아야 할까? == 비교부터 프레임워크 CVE까지아래는 어디서나 볼 법한 비교 코드다.if request_value != secret_value: raise ...if user: user.check_password(raw_password)별 문제 없어 보인다. 그런데 이 코드는 응답 시간만으로 정보를 제공해 줄 수 있다. 어떻게 그럴수 있는지 알아보자.1. 타이밍 어택(Timing attack)이란?타이밍 어택은 이름 그대로 어플리케이션이 어떤 일을 처리하는 데 걸리는 시간을 관찰해 취약점을 알아내는 공격이다. 사이드 채널 어택 중 하나다. 핵심은 입력에 따라 처리 시간이 달라진다는 데 있다. 서버의 시크릿 값이나 로직을 잘 몰라도, 응답 시간에 따라 결과를 유추하다는 ..
코드 품질/테스트 AI 코딩 에이전트 git worktree 병렬 개발의 테스트 인프라, Testcontainers로 전환하기 - 2편 AI 코딩 에이전트 git worktree 병렬 개발의 테스트 인프라, Testcontainers로 전환하기 - 2편이전 1편은 worktree 병렬 에이전트 개발이 공유 테스트 인프라에서 격리가 안되고 있다는 문제점을 정의하고, 컨테이너 라벨에 worktree 식별자를 넣어 reuse의 해시 매칭을 격리 수단으로 뒤집는 설계까지 정리했다. 이제는 구현이다.1. Gradle 라이브러리 추가현재 프로젝트는 별도 테스트 모듈을 두고 있어서, 테스트 모듈에서 implementation으로 선언한 뒤필요한 모듈에 testImplementation(project())를 선언하는 방식으로 진행했다.현재 프로젝트에 맞춰서 필요한대로 선언해서 사용하면 될 것 같다.implementation("org.springfram..
코드 품질/테스트 AI 코딩 에이전트 git worktree 병렬 개발의 테스트 인프라, Testcontainers로 전환하기 - 1편 AI 코딩 에이전트 git worktree 병렬 개발의 테스트 인프라, Testcontainers로 전환하기 - 1편git worktree, Testcontainers, 멀티모듈 프로젝트에 대해 기본적으로 알고 있는 조건을 전제로 하고 있습니다. git worktree 혹은 Testcontainers 등에 대해 잘 모른다면 공식 문서나 검색해서 먼저 개념을 알기를 권합니다.업무를 점차 코딩 에이전트 중심으로 옮기고 있고, 개발은 git worktree 기반 하네스로 돌아간다. 현재 방식은 기능별 브랜치마다 worktree를 만들고, 각 worktree 안에서 구현 이후 테스트 에이전트가 테스트로 검증하는 구조다. 여러개의 클로드 코드를 동시에 실행하고 있는데 테스트 에이전트들이 동시에 돌기 시작하면 코드..