2026-07-10사진: Unsplash 의 Growtika개요JPA를 사용하다 보면 반드시 마주치는 문제가 N+1 쿼리입니다. 연관 엔티티를 조회할 때 예상치 못한 추가 쿼리가 N번 발생하여 성능을 크게 저하시킵니다. 이 글에서는 N+1 문제의 원인을 파악하고, 실무에서 가장 많이 쓰이는 두 가지 해결책인 Fetch Join과 EntityGraph를 코드 중심으로 비교합니다.N+1 문제란 무엇인가N+1 문제는 1번의 쿼리로 N개의 결과를 가져온 뒤, 각 결과의 연관 엔티티를 로딩하기 위해 N번의 추가 쿼리가 발생하는 현상입니다.예를 들어 Order 엔티티가 Member와 연관되어 있을 때, 주문 목록 100건을 조회하면 총 101번의 쿼리가 실행됩니다.// Order 엔티티@Entitypublic cl..
2026-07-09사진: Unsplash 의 Luca Bravo개요MCP(Model Context Protocol)는 Anthropic이 2024년 11월 오픈소스로 공개한 이후, 2026년 현재 10,000개 이상의 서버가 등록될 만큼 AI 에이전트 생태계의 핵심 인프라가 되었습니다. Claude에 MCP 서버를 연결하면 파일 시스템, GitHub, 데이터베이스 등 외부 도구를 AI가 직접 제어할 수 있어 반복 작업을 자동화하고 개발 생산성을 크게 높일 수 있습니다. 이 글에서는 실무 개발자에게 당장 유용한 MCP 서버 TOP 6를 소개하고 설정 방법을 정리합니다.MCP란 무엇인가MCP는 AI 모델이 외부 도구 및 데이터 소스와 통신하기 위한 표준 프로토콜입니다. USB-C가 다양한 기기를 하나의 규격..
2026-07-09사진: Unsplash 의 Luca Bravo개요Java 8부터 도입된 Optional은 NullPointerException을 방지하고 null 처리를 명시적으로 표현하기 위한 컨테이너 클래스입니다.그러나 실무에서 잘못 사용하면 오히려 코드가 더 복잡해지거나, null 체크 수준에 머무는 경우가 많습니다. 이번 글에서는 Optional의 올바른 사용 패턴과 피해야 할 안티패턴을 정리합니다.Optional 기본 생성 방법// 값이 있을 때Optional opt1 = Optional.of("hello");// null일 수도 있을 때Optional opt2 = Optional.ofNullable(getValue());// 빈 OptionalOptional opt3 = Optional.em..
2025-07-211. 문제 A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction > Android resource linking failed aapt2 ... Failed to load resources table in APK '/Users/xxx/Library/Android/sdk/platforms/android-35/android.jar'. error: failed to load include path ... 또는* What went wrong:Execution failed for task ':app:processDebug..
2025-07-02save() vs saveAndFlush() 차이점항목save()saveAndFlush()기능엔티티를 영속성 컨텍스트(Persistence Context)에 저장엔티티 저장 + flush()를 즉시 호출DB 반영 시점flush 시점 (트랜잭션 커밋 or 명시적 flush 시)즉시 flush → DB에 SQL 실행트랜잭션 내에서 커밋 전까지 DB에서 조회 불가✅ 가능❌ flush로 DB에 즉시 반영됨성능일반적으로 더 효율적 (버퍼링)성능 비용 있음 (즉시 DB IO)주 용도일반적인 CRUD 처리DB에 즉시 반영해야 할 때 (예: ID, 제약조건 확인 등)왜 둘 다 존재하는가?save()는 일반적인 "지연 쓰기" 전략에 최적화되어 있어 성능이 좋음.하지만 실무에서는 다음과 같은 즉시 DB ..