Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions keyword/chapter09/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
### 객체 그래프 탐색
- 객체 그래프 탐색

객체 그래프 탐색은 객체 지향 프로그래밍과 ORM(JPA) 기술에서 데이터에 접근하는 핵심적인 방법이다.

개발자가 복잡한 SQL을 매번 작성하지 않고도, 마치 지도에서 길을 찾아가듯 객체와 객체 사이를 이동하며 데이터를 조회하는 과정을 말한다.

**객체그래프란?**

객체들은 서로 독립적으로 둥둥 떠다니는 것이 아니라, 참조(Reference)를 통해 서로 연결되어 있다. 이 연결된 모습이 마치 거미줄이나 지도상의 네트워크(Graph)같다고 해서 객체 그래프라고 부른다.

- 노드(Node): 객체 그 자체 (예: User, Review, Store)
- 엣지(Edge): 객체 간의 연결/참조 (예: review.getUser(), store.getRegion())

이 그래프 위를 참조 연산자(.)를 이용해 이동하는 행위가 바로 탐색이다.

**탐색의 방법 → 점을 찍어 이동**

SQL 중심적인 개발에서는 필요한 데이터가 있을 때마다 새로운 JOIN 쿼리를 짜야했다. 하지만 객체지향 개발에서는 Method Chaining을 통해 데이터를 가져온다.

예시 상황: 1번 리뷰를 쓴 유저가 사는 주소를 알고싶따앙~

코드(객체 그래프 탐색):

```java
//1. 시작점 (리뷰 객체 획득)
Review review = reviewRepository.findById(1L).get();

//2. 탐색(Review -> User -> Address)
String address = review.getUser().getAddress();
```

위 코드에서 `getUser().getAddress` 처럼 꼬리에 꼬리를 물고 들어가는 과정이 탐색이다.

**JPA와 객체 그래프 탐색의 관계**

JPA는 이 객체 그래프 탐색을 데이터베이스와 연결해주는 역할을 한다.

1. 자유로운 탐색

SQL을 직접 짤 때는 처음 쿼리를 만들 때 가져올 데이터를 미리 정해야한다(select 절). 만약 나중에 Store 정보가 추가로 필요해지면 SQL을 뜯어고쳐야한다. 하지만 JPA에서는 엔티티 간에 연관관계만 맺어두면, 언제든지 마음대로 점을 찍어서 관련된 데이터를 가져올 수 있다.

2. 지연 로딩

객체 그래프 탐색의 가장 큰 특징은 필요할 때 가져온다는 것이다.

- review를 조회했을 때, JPA는 User나 Store 정보를 당장 가져오지 않는다.
- 대신 프록시라는 가짜 객체를 꽂아둔다.
- 개발자가 review.getUser().getName()을 호출하며 실제로 탐색을 시도하는 순간, 그때 DB에 SELECT 쿼리를 날려서 데이터를 채워 넣는다.

결론: 객체 그래프 탐색 덕분에 개발자는 데이터가 메모리에 이미 다 로딩되어 있다고 가정하고 편하게 코드를 짤 수 있다.


**주의할 점**

탐색은 편하지만, 성능 이슈의 주범이 된다.

- 상황: 리뷰 목록 10개를 가져옴.
- 탐색: for문을 돌면서 각 리뷰의 작성자 이름을 조회(review.getUser().getName())
- 결과:
1. 리뷰 목록 조회 쿼리 1번 실행
2. 각 리뷰마다 작성자를 조회하는 쿼리가 10번 추가 실행
3. 총 11번의 쿼리가 나감

이것을 N+1문제라고 하며, 이를 해결하기 위해 Fetch Join(처음부터 다 같이 가져오기)을 사용하여 그래프 탐색 시점을 조절해야 한다.
Loading