Skip to content

Commit

Permalink
Merge pull request #38 from SSUMC-6th/seungsu/#7
Browse files Browse the repository at this point in the history
[승수]Chapter 7. JPA를 통한 엔티티 설계, 매핑 & 프로젝트 파일 구조 이해
  • Loading branch information
sseongeun authored Jun 4, 2024
2 parents fe158ba + 3badb15 commit f1d2da7
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 0 deletions.
57 changes: 57 additions & 0 deletions docs/chpater7/ch_07keyword
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
- 영속성 컨텍스트

객체와 데이터베이스 테이블의 매핑을 통해 엔티티 클래스 객체 안에 포함된 정보를 테이블에 저장하는 기술이다.

JPA에서는 테이블과 매핑되는 엔티티 객체 정보를영속성 컨텍스트를 통해 애플리케이션 내에서 오래 지속되도록 보관한다.

### 비영속

엔티티 객체를 생성했지만 아직 영속성 컨텍스트에 저장하지 않은 상태를 비영속(new/transient)라 한다.

```java
Member member = new Member();
```

### 영속

엔티티 매니저를 통해서 엔티티를 영속성 컨텍스트에 저장한 상태를 말하며 영속성 컨텍스트에 의해 관리된다는 뜻이다.

```java
em.persist(member);
```

### 준영속

영속성 컨텍스트가 관리하던 영속 상태의 엔티티 더이상 관리하지 않으면 준영속 상태가 된다. 특정 엔티티를 준영속 상태로 만드려면 `em.datach()`를 호출하면 된다.

```java
// 엔티티를 영속성 컨텍스트에서 분리해 준영속 상태로 만든다.
em.detach(member);
// 영속성 콘텍스트를 비워도 관리되던 엔티티는 준영속 상태가 된다.
em.claer();
// 영속성 콘텍스트를 종료해도 관리되던 엔티티는 준영속 상태가 된다.
em.close();
```

- 양방향 매핑
- 연관관계 매핑: 객체 지향 프로그래밍에서 객체 간의 관계를 표현하는 것, 이러한 연관관계 매핑을 통해 객체 간의 관계를 사용하여 데이터베이스 테이블 간의 조인을 자동으로 처리할 수 있음

→ 이러한 연관관계 매핑을 DB테이블 간 양방향으로 하는 것이 양방향 매핑


- 예시: 게시글(Post)과 댓글(Comment) 간의 관계
- 설명: 게시글과 댓글은 일대다 관계이면서 동시에 다대일 관계. 한 개의 게시글에 여러 개의 댓글이 달릴 수 있고, 한 개의 댓글은 하나의 게시글에 속함

→ 이 경우, 양방향 매핑이 필요하므로 게시글(Post) 엔티티에는 @OneToMany 어노테이션을 사용하여 댓글과의 관계를 매핑하고, 댓글(Comment) 엔티티에는 @ManyToOne 어노테이션을 사용하여 게시글과의 관계를 매핑, 이렇게 하면 게시글 엔티티에서는 댓글에 대한 참조가 가능하고, 댓글 엔티티에서는 속한 게시글에 대한 참조가 가능

- N + 1 문제

**1번 조회해야할 것을 N개 종류의 데이터 각각을 추가로 조회하게 되서 총 N+1번 DB조회를 하게 되는 문제이다.**

즉, JPA의 Entity 조회시 Query 한번 내부에 존재하는 다른 연관관계에 접근할 때 또 다시 한번 쿼리가 발생하는 비효율적인 상황을 말한다.

**발생원인: LAZY(지연 로딩)인 경우**

1. JPQL에서 만든 SQL을 통해 데이터를 조회
2. JPA에서 Fetch 전략을 가지지만, 지연 로딩이기 때문에 추가 조회는 하지 않음
3. 하지만, 하위 엔티티를 가지고 작업하게 되면 추가 조회가 발생하기 때문에 결국 N + 1 문제 발생
Binary file added src/mission/chapter7/Untitled.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 33 additions & 0 deletions src/mission/chapter7/mission7
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
- **미션 기록**
- ⚡이슈 No.1

`Persistent entity 'Terms' should have primary key` 라고 나오면서 오류가 나온다.

## 📌 JPA Domain 설계 중 마주친 오류

`@Id` annotation은 해당 필드가 해당 Entity의 Primary Key임을 알려준다. 나는 서버를 실행시키고 다음과 같은 오류를 발견했는데

> nested exception is org.hibernate.AnnotationException: No identifier specified for entity: com.snowdeer.database.board.Member
>

구글링 결과

`import org.springframework.data.annotation.Id`

👇

`import javax.persistence.Id`로 수정했더니 해결되었다.

- ⚡이슈 No.2

컴파일을 돌렸더니 애노테이션이 먹지 않는다.

→ JRE를 11로 바꾸고, JDK21은 lombok을 지원하지 않으므로 17로 바꾸어주었다.

- 데이터 그립
<img width="902" alt="Untitled" src="https://github.com/SSUMC-6th/Spring_Boot_B/assets/76688615/93f5b7df-1dfb-43b2-8a2b-07430a16012d">
> **github 링크**
>
>
> https://github.com/kjmq1234/umc_study
>

0 comments on commit f1d2da7

Please sign in to comment.