의존성 주입과 느슨한 결합: 왜 구체 클래스가 아닌 interface인가
·
Programming Language/Java
들어가며프로젝트 초기엔 new로 객체를 직접 생성하는 게 간단해 보입니다. 하지만 시간이 지나면서 테스트 코드 작성이 어려워지고, 작은 변경에도 여러 클래스를 수정해야 하는 상황이 반복됩니다. 이 글에서 다룰 내용:의존(Dependency)의 정의클래스 간 의존 관계가 무엇이고, 왜 문제가 되는지강한 결합의 문제점구체 클래스에 직접 의존할 때 발생하는 실무 이슈들인터페이스 기반 설계느슨한 결합을 만드는 방법과 SOLID 원칙 연결실무 적용 사례결제 시스템, 로깅, 외부 API 연동 등에서 DI 패턴 활용법의존성 주입 방식 비교생성자/세터/필드 주입의 장단점이 글을 읽고 나면, 왜 "인터페이스에 의존하고 구체 클래스 의존을 피해야 하는지" 명확히 이해하고, 실무에서 바로 적용할 수 있는 패턴들을 익힐 수 ..
Claude, ChatGPT 성능을 3배 이상 끌어올릴 수 있는 진짜 꿀팁 (대화 세션 관리)
·
Vibe Coding(with AI)
요약본- Claude는 대화별로 완전 독립. 관련 주제는 무조건 한 대화에서 처리하자.- ChatGPT도 같은 방식으로 메모리를 쓰고 읽는다. 다른 LLM은 경험해보지 않아서 잘 모르겠지만 대부분 같지 않을까?- 사용자 입장에서는 LLM이 모든 대화를 알아서 기억해주면 좋겠지만 아직까지는 불가능한 이유는, `학습 및 추론에 불리하기 때문이 아닐까?` 추측한다. 혹시 저처럼 이런 실수를 하고 계셨나요?상황: 이력서 쓰려고 Claude와 대화 → 포트폴리오도 만들려고 새 대화 시작 → 자기소개서도 새 대화에서...결과: 매번 똑같은 설명 반복 + 일관성 깨진 조언 + 시간 낭비이거 `완전 안티패턴`입니다. 왜 그런지 알아보죠.Claude의 치명적 한계점 (+ 헷갈리는 개인 선호사항)⚠️ 먼저! 개인 선호사항..
SQL에서 비트 연산으로 복합 속성 관리하기 - 실무 패턴과 성능 최적화
·
Database/SQL
들어가며실무에서 `권한 관리, 기능 플래그, 태그 시스템`을 구현할 때 어떻게 하시나요?보통 별도 테이블을 만들어 JOIN으로 연결하거나, 문자열로 저장해서 LIKE 검색을 하실 텐데요. 오늘은 `비트 연산을 활용한 효율적인 복합 속성 관리`에 대해 알아보겠습니다.최근 프로그래머스 SQL 문제(특정 형질을 가지는 대장균 찾기, 부모의 형질을 모두 가지는 대장균 찾기)를 통해 이런 패턴의 실무 활용 가능성을 확인할 수 있었습니다.비트마스크 기본 개념왜 비트마스크를 사용할까?전통적인 방식과 비교해보겠습니다. 기존 방식: 별도 테이블 + JOIN-- 사용자별 권한 관리CREATE TABLE user_roles ( user_id INT, role_name VARCHAR(50) -- 'READ', '..
Claude Desktop + MCP 로 에이전트를 구축해보자(Claude Code)
·
Vibe Coding(with AI)
1. 왜 굳이 MCP인가?Claude Code Cli ($20/월) 은 `로컬 파일 접근 + 코드 리뷰 + Git 연동`이 매력 포인트이다.이 기능들은, MCP(Model Context Protocol)라는 연결 규격 덕분에 가능했던 것이다.MCP는 Claude한테 “손발”을 달아주는 기술이다. 즉, `웹 Claude`가 “똑똑한 부사수”라면,`Claude Desktop + MCP`는 “프롬프트대로 작업을 직접 처리하는 에이전트”라고 볼 수 있다. 2. 설치 준비물1. Claude Desktop 다운로드 (Mac/Windows 지원)2. Node.js (https://nodejs.org → LTS 버전 설치) 3. MCP 서버 설정하기 📂 설정 파일 위치Mac: ~/Library/Applicat..
Gemini CLI - 백엔드 개발자가 React를 빠르게 학습할 수 있었던 이유
·
Vibe Coding(with AI)
들어가면서저는 거의 자바 스프링을 기반으로 한 백엔드 개발만 해왔습니다. 하지만 언제까지고 API만 만들고 있을 순 없죠. 제가 만든 서버를 지인들이, 그리고 제가 더 편하게 쓸 수 있도록 간단한 프론트엔드를 직접 만들고 싶다는 욕심이 생겼습니다.수많은 기술 스택 속에서 제가 선택한 도구는 `React + TypeScript`였습니다. 채용 시장의 목소리도, 대중성도 이 조합을 가리키고 있었죠. 문제는 `어떻게`였습니다. HTML, CSS, JavaScript를 만져본 게 언젯적인지...이 글은 `Gemini CLI`라는 강력한 AI 도구와 함께, 제가 어떻게 프론트엔드의 벽을 넘고 있는지에 대한 기록입니다. 1. JavaScript와 TypeScriptJava 개발자에게 JavaScript는 애증의..
스프링 통합 테스트에서 Kafka를 지원하는 방법 (@EmbeddedKafka, @ConditionalOnProperty)
·
EtcTech
들어가면서경매 시스템의 입찰 로직에 Kafka 기반 비동기 이벤트 전송 기능을 도입하게 되었다.입찰 등록 시 Kafka로 이벤트를 발행하고, 이를 Consumer가 받아서 후속 처리하는 구조로 변경하면서,이벤트 기반 아키텍처의 이점을 실제로 적용하고 검증해보고자 했다.이후 통합 테스트를 작성하면서 Kafka까지 포함된 end-to-end 테스트를 수행하려고 했고,이를 위해 spring-kafka-test 라이브러리의 @EmbeddedKafka를 사용하여 내장 브로커 기반 테스트 환경을 구성했다. Embedded Kafka vs Testcontainers`Embedded Kafka`는 JVM 안에 Kafka 브로커를 띄우는 방식이라 속도가 빠르고 설정이 간단하지만, 실제 Kafka와 완벽히 동일하..
불필요한 에러 로그는 이제 그만 – Docker Compose 환경에서 실행 순서를 제어하는 방법
·
Infra & Messaging
들어가면서 MSA 환경이나 모놀리식 환경에서 여러 서비스를 한 번에 실행시키기 위해 docker-compose를 사용하다 보면, 서비스 간의 실행 순서를 보장해야 하는 상황이 발생합니다. 저는 최근 MySQL과 연동되는 애플리케이션을 docker-compose로 배포하면서, 단순히 컨테이너 실행 여부만으로는 서비스 준비 상태를 확실히 보장할 수 없다는 문제를 경험했습니다. 이번 포스팅에서는 그 문제 상황과 해결 방법, 그리고 마무리 정리를 통해 비슷한 문제를 겪는 분들께 도움이 되고자 합니다. 문제 상황 기존에는 docker-compose의 `depends_on` 옵션을 사용하여 애플리케이션 컨테이너가 MySQL 컨테이너 실행 후에 시작되도록 구성했습니다. 그러나 `depends_on`은 단..
슬랙(Slack) 봇이 배포 알람을 보내도록 만들어보자.
·
Infra & Messaging
들어가면서요즘 인프라 관련해서 여러 가지 만들어보는 중이다. 팀 단위로 CI/CD를 구축했다고 치자. 팀원들은 각자 통합 및 배포 타이밍이 다를 것이다. 이를 팀 전체에게 실시간 알람으로 보낸다면 프로젝트 진행에 큰 도움이 될 것이다.`개발하면서 발생하는 이벤트에 대한 정보`를 실시간 알람으로 보내도록 구현해 보자. 이번 포스팅에서는 배포 알람 전 단계로서, 수동으로 알람을 보낼 수 있도록 구현한다.   이번 포스팅은 인프런에서 `이준형 강사님의: 안정적인 서비스 배포를 위한 배포 전략과 팁`강의를 보며 실습하는 내용이다.    슬랙 알람이 필요한 이유이 글에서 소개할 `Slack`이라는 업무 플랫폼으로 특정 이벤트 발생 시 알람을 보내도록 구현할 수 있다.아래에서는 `배포`라는 이벤트에서 슬랙 알람이 ..