N+1문제란?

@Entity
@Getter
@Setter
@NoArgsConstructor
public clss Owner{
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;
	private String name;
	
	//LAZY여도 N+1 발생 시점을 연관관계 데이터를 사용하는 시점으로 미룰지, 
	//아니면 초기 데이터 로드 시점에 가져오느냐에만 차이가 있다.
	**@OneToMany(mappedBy = "owner", fetch = FetchType.EAGER) 
	private Set<Cat> cats = new LinkedHashSet<>();**
	...
}
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Cat{
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;
	private String name;

	**@ManyToOne
	private Owner owner;**

	public Cat(String name) {
		this.name = name
	}
}
@Test
void exampleTest(){
	Set<Cat> cats = new LinkedHashSet<>();
	for(int i=0;i<10;i++){
		cats.add(new Cat("cat"+i));
	}
	catRepository.saveAll(cats);
	
	List<Owner> owners = new ArrayList<>();
	for(int i=0;i<10;i++){
		Owner owner = new Owner("owner"+i);
		owner.setCats(cats);
		owners.add(owner);
	}
	ownerRepository.saveAll(owners);

	entityManager.clear();
	
	//test
	**List<Owner> everyOwners = ownerRepository.findAll();**
	assertFalse(everyOwners.isEmpty());
}

Untitled

→ 고양이 집사를 조회하는 쿼리를 호출하였다. (1)

→ 고양이를 조회하는 쿼리가 고양이 집사를 조회한 row만큼 호출된 것을 확인할 수 있다. (N)

그렇다면 N+1은 왜 발생하는 것일까?

해결방안은 무엇이 있을까?

1. Fetch join