-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
[승수]Chapter 7. JPA를 통한 엔티티 설계, 매핑 & 프로젝트 파일 구조 이해
- Loading branch information
Showing
3 changed files
with
90 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 문제 발생 |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
> |