(해당 글은 실제 SDD 기반 개발 경험을 정리한 뒤, Claude AI 를 통해 초안을 작성하고 수정한 글입니다.)들어가며최근 몇 달 동안 레거시 시스템의 SP(Stored Procedure) 로직을 Java 로 전환하는 작업을 하고 있습니다.처음엔 Claude Code 같은 AI 에이전트를 붙여서 흔히 말하는 “바이브 코딩” 스타일로 작업했습니다."이 SP Java 로 옮겨줘""이 분기 로직 서비스로 분리해줘""기존 응답 포맷 유지해서 리팩토링해줘"위와 같은 방식의 개발은 기존 코딩방식에 비교해 놀라운 경험이었습니다.몇 천 줄짜리 SP 를 던져주면:repositoryservicetransaction 처리DTO테스트 코드까지 한 번에 꽤 그럴듯하게 만들어줬습니다.특히 CRUD 수준에서는 생산성이 정말 ..
(해당 글은 SDD 기반 개발 경험을 정리 후, Claude AI를 통해 요청하여 작성된 글입니다.)들어가며Claude Code 같은 AI 에이전트를 본격적으로 쓰기 시작한 지 몇 달 됐는데요, 솔직히 처음엔 신세계였습니다. "이 API 만들어줘" 하면 몇 초 만에 컨트롤러부터 서비스, 레포지토리까지 한 번에 뽑아주니까요.근데 한 두 달 지나니까 묘한 피로감이 쌓이더라고요. 머릿속에 그리던 그림과 살짝 어긋난 결과가 나오면, "아니 그게 아니라…" 하고 다시 시키게 됩니다. 그러다 보면 어느 순간 내가 무엇을 원했는지가 점점 흐릿해집니다. AI 가 짠 코드 위에 또 AI 가 코드를 덧칠하는 식이 되어버리거든요.그래서 요즘 자주 보이는 SDD(Spec-Driven Development) 라는 접근에 호기심..
암호화는 보안 시스템의 핵심이다. 단순히 데이터를 숨기는 수준을 넘어, 정보의 기밀성·무결성·인증·부인방지를 달성하기 위한 핵심 기술이다. 이 글에서는 실무 개발자가 반드시 이해하고 있어야 할 암호화 개념과 구현 시 고려사항을 체계적으로 정리한다.1. 암호화의 목적과 보안 속성암호화를 설계하거나 적용할 때는 “왜 암호화하는가”에 대한 명확한 이해가 필요하다.보안은 단일 기능이 아니라 여러 속성이 맞물려 작동한다.속성 설명기밀성 (Confidentiality)권한 없는 사용자가 데이터를 볼 수 없도록 보호한다.무결성 (Integrity)데이터가 전송·저장 중 변조되지 않았음을 보장한다.인증 (Authentication)데이터를 보낸 주체가 누구인지 확인할 수 있다.부인방지 (Non-repudiation)데..
Redis는 메모리 기반 데이터베이스로, 빠른 응답속도와 높은 처리량 덕분에 캐싱, 세션 관리, 실시간 분석 등 다양한 분야에서 널리 사용됩니다. 하지만 Redis는 메모리 상에서 데이터를 관리하기 때문에, 메모리 사용량이 급증하면 성능 저하나 OOM(Out Of Memory) 문제가 발생할 수 있습니다. 따라서 Redis를 효율적으로 운영하기 위해서는 메모리 최적화와 관리 전략이 필수적입니다. 1. Redis 메모리 구조 이해Redis 메모리 최적화의 첫 단계는 메모리 구조를 이해하는 것입니다. Redis는 모든 데이터를 메모리에 올리고 관리하므로, 데이터를 어떻게 저장하는지가 곧 메모리 사용량에 직결됩니다.1.1 데이터 구조별 메모리 사용Redis는 다양한 자료구조를 지원합니다. 각 자료구조는 내부적..
자바는 전통적으로 객체지향 프로그래밍(OOP) 언어로 알려져 있습니다. 하지만 Java 8부터 함수형 프로그래밍(Functional Programming, FP) 을 지원하면서 코드의 간결성과 유지보수성을 높일 수 있는 새로운 패러다임이 도입되었습니다.이번 글에서는 기초 개념부터 고급 활용까지 자세히 살펴보며, 실제 예제와 함께 자바에서 함수형 프로그래밍을 어떻게 적용할 수 있는지 알아보겠습니다.1. 함수형 프로그래밍이란?함수형 프로그래밍은 부수 효과(side-effect)를 최소화하고, 상태를 변경하지 않으며, 함수를 일급 객체로 다루는 프로그래밍 스타일입니다.일급 객체(First-class Citizen): 함수도 변수처럼 다룰 수 있습니다.순수 함수(Pure Function): 동일한 입력에 대해 ..
들어가며통합회원 서비스: 기존 3개 도메인별 회원 DB CRUD 변경 사항을 통합회원 DB와 동기화기존 도메인 서비스가 통합회원 DB로 완전히 전환되지 않아, 사이드이펙트 발생 가능성을 고려JTA 기반 분산 트랜잭션으로 3개 도메인 DB + 통합회원 DB 묶어 동기화 처리2PC 패턴으로 인한 성능 저하 및 서비스 지연 다수 발생개선 방향: 비동기 이벤트 기반 아키텍처로 전환 검토Spring Event 비교한 도입시 장점현재 Spring Event를 사용할 경우, 이벤트 발생 후 내부에서 여전히 대상 서버의 API를 호출하여 처리가 이루어지고 있음.반면, 별도의 Streams를 사용할 경우, 통합회원 시스템에서는 이벤트만 발행하면 이후 처리 과정은 별도로 신경 쓰지 않아도 되며, 시스템 간 의존성이 낮아짐..
들어가며최근 팀에서 회원가입 로직 리팩토링 중, 기존 테스트 케이스 정리하는 작업 담당이상하게도 어떤 테스트는 단독 실행 시 성공하지만, 전체 테스트를 돌리면 실패하는 현상 발생로그를 뒤져보고, 디버깅까지 해도 로직에는 문제가 없었음, 원인은 Spring의 ApplicationContext 공유 때문으로 확인문제 상황예시코드 (회원가입 성공)@SpringBootTestclass MemberServiceTest { @Autowired private MemberService memberService; @Test void 회원가입_성공() { MemberRequest req = new MemberRequest("uijin", "pass123"); Member me..
가비지 컬렉션(Garbage Collection)가비지 컬렉션은 프로그래밍에서 더 이상 사용하지 않는 메모리, 즉 "쓰레기"가 된 메모리를 자동으로 회수하여 재활용하는 프로세스이다. 이는 개발자가 명시적으로 메모리를 해제해야 하는 부담을 덜어주고, 메모리 누수와 같은 문제를 예장하는 데 중요한 역할을 한다.가비지 컬렉션의 기본 원리가비지 컬렉션의 핵심 원리는 어떤 메모리 객체가 아직 사용되고 있는지, 아닌지를 판단하고 사용되지 않는 객체가 차지하고 있는 메모리를 회수하는 것이다. 가비지 컬렉션의 기본 원리는 다음과 같다.객체 추적 : 가비지 컬렉터는 프로그램 내의 모든 객체를 추적하고 관리한다. 각 객체가 어떤 변수나 다른 객체에 의해 참조되고 있는지 여부를 파악한다.도달 가능성 판단 : 가비지 컬렉터는..