들어가기 전 이전 시간에 알아봤던 N+1 해결법에 이어서 FetchJoin을 이용해서 해결할 수 있었습니다. 하지만 Fetch Join이라고 다 해결할 수 있는 것은 아닙니다. 이번 시간에는 Fetch Join을 사용했을 때 어떠한 사이드 이펙트가 있는지 알아보고 그 해결책에 대해서 알아봅니다. 1. FetchJoin, EntityGraph 사용 시 Pagination을 사용할 수 없다. FetchJoin과 EntityGraph 둘 다 동일한 증상이 발생합니다. Fetch Join만 테스트를 해보겠습니다. @Query( value = "select t from Team t join fetch t.members", countQuery = "select count(t) from Team t" ) List f..
💡 아래 실습에 진행한 모든 코드는 Github에 있습니다. JPA N+1이란? 실무에서 JPA를 사용하다보면, N+1 쿼리를 만나게 됩니다. 여기서 N+1이란 Team(1) ↔ Member(N) 연관관계가 있다고 가정했을 때, 하나의 팀을 조회했지만 팀 내부에 있는 모든 멤버들이 함께 조회되면서 1+N 개의 쿼리가 발생하는 것을 의미합니다. 직접 테스트 코드를 통해 이러한 상황들을 해결할 수 있는 방법들을 살펴보고 각 상황이 또 어떤 사이드이펙트가 있는지도 알아보겠습니다. Entity 및 Repository 코드 실습에 사용될 코드는 다음과 같습니다. @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Membe..
개요 ArrayList를 자주 사용하는 편인데 ArrayList는 왜 Array와 다르게 초기 사이즈를 정해주지 않아도 되고, 무한정으로 원소가 추가되는 것 입니다. 이 부분이 리스트를 사용하면서도 늘 의문이였습니다. 오늘은 ArrayList를 간단하게 해부해볼 것 입니다. 원소 추가하는 부분을 중점적으로 살펴보겠습니다. ArrayList 내부적으로는 어떻게 되어있을까? public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable { private static final long serialVersionUID = 8683452581122892189L; /** * Default..
1. 간단한 팩토리 패턴 먼저 간단한 팩토리를 만들어보고 이를 점진적으로 패턴을 적용하여 업그레이드 하는 식으로 진행해보겠습니다. 먼저 아래에 노트북을 생성하는 함수가 있습니다. 매개변수 type에 따라서 노트북을 생성하고 준비, 설정, 포장해서 최종적으로 노트북을 반환하게 됩니다. public NoteBook creatNoteBook(String type) { NoteBook noteBook; if(type.equals("Macbook")) { noteBook = new MackBook(); } else if (type.equals("LG Gram")) { noteBook = new LGGram(); } else if (type.equals("GalaxyBook")) { noteBook = new Ga..
CascadeType.DELETE, orphanRemoval 차이점 목표 CASCADE.REMOVE 와 orphanRemoval의 차이점에 대해서 알아보겠습니다. 테스트용 엔티티 public class Parent { @OneToMany(mappedBy = "parent") private List children = new ArrayList(); } public class Child { @ManyToOne @JoinColumn(name = "PARENT_ID") private Parent parent; } CASCADE.REMOVE @OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE) private List children = new ArrayLi..
ObjectMapper? Jackson 라이브러리 클래스 중 하나인 ObjectMapper 통해 JSON → Object(역직렬화), Object → JSON(직렬화)를 간단하게 파싱할 수 있는 라이브러리 입니다. readValue() test.json { "name" : "john", "age" : 20 } json → Object 비직렬화 코드 People people = objectMapper.readValue(new File("static/test.json"), People.class); people의 각 값을 찍어보면 잘 출력됩니다. System.out.println(people.getName() + ", " + people.getAge()); // john, 20 그런데 말입니다.. Peopl..