N+1 문제를 해결하기 위해 Fetch join을 사용하다 보면 한 엔티티에서 여러 리스트를 Fetch join하는 경우가 있다. 이때 MultipleBagFetchException이 발생할 수 있다. (Bag은 JPA에서 만들어둔 중복을 허용하고 순서가 없는 컬렉션이고, 영속성 컨텍스트에 등록할 때 List를 Bag으로 포장한다고 생각하자) 아무튼 실제 SQL에서는 여러 테이블을 Fetch join하는 쿼리를 작성할 수 있는데 JPA는 왜 예외를 던질까? 간단히 말하자면 쿼리 성능에 악영향을 끼치는 카테시안 곱이 발생했음을 경고하기 위해서다. 친절한 JPA ㅋㅋㅋ.. 대응 방법 여러가지 방법이 있겠지만 공부한 내용만 나열한다. 하나의 컬렉션만 Fetch Join하기: 한 쿼리에서 여러 컬렉션을 FETC..
Tool/Java
JPA에서 복합 키를 사용하려면 @Embeddable 이나 @IdClass 애너테이션을 사용해서 구현할 수 있다. 1. 공통점 Serializable 인터페이스 구현: 복합 키 클래스는 Serializable 인터페이스를 구현해야 한다. 기본 생성자: 복합 키 클래스에는 기본 생성자가 필요하다. hashCode와 equals 구현: 복합 키의 동등성을 정확히 비교하기 위해 hashCode와 equals 메소드를 오버라이드 해야 한다. 2. Embedded ID 사용하기 @Embedded를 적용한 복합 키 클래스를 정의한다. 이때, Serializable 인터페이스를 구현해야 한다. @Embeddable public class MyCompositeKey implements Serializable { pri..
자바의 Reflection API는 런타임에 클래스의 내부 정보를 탐색하거나 수정할 수 있게 해주는 기능이다. 컴파일 시점에 타입이 결정되는 것을 런타임 시점으로 연기할 수 있다. 주로 다이나믹 로딩, 테스트 자동화, 애너테이션 기반의 설정 등에서 사용된다. 사용 단계 클래스 정보 획득: 대상 클래스의 Class 객체를 획득한다. Class myClass = MyClass.class; 멤버 정보 탐색: 메서드, 필드, 생성자 등의 멤버 정보를 가져온다. Method[] methods = myClass.getMethods(); Field[] fields = myClass.getFields(); 동적 생성 및 접근: Class 객체를 이용해 동적으로 인스턴스를 생성하거나, 메서드를 호출하고, 필드에 접근한다..
자바로 CUI 키오스크를 만드는게 개인 과제로 나왔다. 과제를 제출하는데 어려웠던 기술적인 부분을 적어달라고 하길래 고민했던 것들을 적었다. 코드는 깃허브에 올렸다. https://github.com/OuOHoon/nbc-chapter2-homework 고민 목록 상태 관리 키오스크의 상태에 따라서 행동하기 위해서 개발하다보니 방대한 클래스를 만들었다. 이 클래스는 가독성이 나쁘고 기능을 추가하기 어려워서 어떻게 관리하는게 좋을지 고민했다. 키오스크의 상태에 따라 관련된 필드와 메소드를 클래스로 만들어서 캡슐화 했는데, 기능 추가가 쉬워지고 가독성은 좋아졌지만 그만큼 관리해야 하는 클래스가 늘어나서 불편함을 느꼈다. // 상태 인터페이스 public interface KioskState { String ..
오류가 있으면 언제든지 지적해 주세요. 생각을 공유하는 것도 좋아합니다! 목표 Stream의 특징을 이해한다. Stream의 문법을 훑어본다. 기존의 반복문, 컬렉션과 비교하고 차이점을 이해한다. 1. 특징 Java8에서 추가됐다. 원본 데이터를 변경하지 않는다. 내부 반복자를 사용한다. 람다식과 함께 사용할 수 있다. 지연 연산을 수행한다. 병렬 처리를 할 수 있다. 일회용이다. 닫힌 스트림을 사용하면 예외가 발생한다. 2. 문법 실행 순서 Stream pipeline을 따라서 데이터 소스(array, collection,...) 중간 연산(map, filter,...) 마지막 연산(count, sum,...) 위의 순서대로 실행된다. Stream의 종류 Stream 종류 용도 IntStream int..