Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[10주차] 홍정우 학습 PR 제출합니다. #59

Open
wants to merge 18 commits into
base: main
Choose a base branch
from
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
18 changes: 0 additions & 18 deletions week10/10주차.md

This file was deleted.

155 changes: 155 additions & 0 deletions week10/홍정우.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
# Cow - Week9

## Indexing

- 데이터베이스 분야에 있어서 테이블에 대한 동작 속도를 높여주는 자료구조
- 테이블 내의 1개의 컬럼, 혹은 여러 개의 컬럼을 이용하여 생성될 수 있다.
- 고속의 검색 속도, 레코드 접근과 관련 효율적인 순서 매김 동작에 대한 기초를 제공
- 인덱스를 저장하는 데 필요한 디스크 공간은 보통 테이블을 저장하는 데 필요한 디스크 공간보다 작다.
- 보통의 인덱스는 키 - 필드만 가지고 있고, 테이블이 다른 세부 항목들은 가지고 있지 않기 때문
- 관계형 데이터베이스에서는 인덱스는 테이블 부분에 대한 하나의 사본이다.

### Clustered

<img width="678" alt="스크린샷 2023-11-27 오전 11 00 16" src="https://github.com/COW-edu/COW-Spring-2/assets/97429550/7f8615c3-88cf-409a-841f-dfd47a6ee527">

- 클러스터 형 인덱스는 데이터가 테이블에 물리적으로 저장되는 순서를 정의한다. 즉, 클러스터 형 인덱스는 특정 컬럼을 기준으로 데이터들을 정렬시킨다.
- 테이블 데이터는 오직 한 가지의 방법으로만 정렬되기 때문에 오직 테이블 당 하나의 클러스터 형 인덱스만 존재할 수 있다.
- primary key의 제약 조건은 클러스터 된 인덱스를 자동으로 생성하기 때문에 우리가 일반적으로 테이블을 생성할 때 특정 컬럼에 primary key를 지정했다면, 자료가 자동으로 정렬된다.
- 장점 : 검색 속도를 향상 시킨다.
- 단점 : 새로운 데이터를 삽입할 때는 많은 비용이 소모된다.

### Secondary Index

<img width="726" alt="스크린샷 2023-11-27 오전 11 02 43" src="https://github.com/COW-edu/COW-Spring-2/assets/97429550/28ccaade-7836-4c0d-8441-7e02805a9f14">

- Primary key 이외의 필요한 정렬 기준이 있을 경우 사용한다.
- 테이블 당 여러 개를 가질 수 있다.
- Data Record가 정렬되어 있지 않다.
- Index가 Data Record의 모든 주소 값을 가지고 있어야 한다.
- unique 하지 않아도 된다.
- 데이터 레코드가 Index 순서대로 정렬되어 있지 않기 때문에 범위 조건으로 검색하게 되면 많은 I/O가 발생할 수 있다.

## Relationship

- 관계는 엔터티 간의 관련성을 의미한다.

### 관계 차수

- Relation Cardinality는 두 개의 엔터티 간 관계에 참여하는 수를 의미

### 1:1 관계

- 완전 1:1
- 하나의 엔터티에 관계되는 엔터티의 관계가 하나 있는 경우
- 반드시 존재
- 선택적 1:1
- 하나의 엔터티에 관계되는 엔터티의 관계가 하나이거나 없을 수도 있다.

### 1:M 관계

- 엔터티에 행이 하나 있을 때 다른 엔터티의 값이 여러 개 있는 관게

### N:M 관계

- 두 개의 엔터티가 서로 여러 개의 관계를 갖고 있는 것
- 이러한 경우 JOIN 시에 문제가 발생할 수 있다. 따라서 1:M OR N:1로 바꿔줘야 한다.

## JPA 엔터티의 생명 주기

### 비영속

- 영속성 컨텍스트와 전혀 관계가 없는 상태
- 객체를 생성’만’한 상태

```java
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
```

### 영속

- 영속성 컨텍스트에 저장된 상태
- 엔터티가 영속성 컨텍스트에 의해 관리되는 상태
- 영속 상태가 된다고 바로 DB에 쿼리가 날라가지 않는다. 트랜잭션의 commit시점에 영속성 컨텍스트에 있는 정보들이 DB에 쿼리로 날라간다.

```java
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
// 객체를 저장한 상태 (영속)
entityManager.persist(member);
```

### 준영속

- 영속성 컨텍스트에 저장되었다가 분리된 상태
- 영속성 컨텍스트에서 지운 상태

```java
// 회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
entityManager.detach(member);
```

### 삭제

- 실제 DB 삭제를 요청한 상태

```java
// 객체를 삭제한 상태
entityManager.remove(member);
```

## @Id / @GeneratedValue

### @Id

- PK를 나타내기 위하여 @Id 어노테이션을 사용
- @Id 어노테이션은 기본타입, 기본 래퍼런스 유형, String, java.util.Date, java.sql.Date, java.math.BingDecimal, java.math.BigInteger 중 하나여야 한다. @Column 어노테이션을 지정하지 않으면 열 이름은 기본 키 속성 또는 필드의 이름으로 가정한다.

```java
package com.example.jwptodolist.todo.domain;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "todos")
public class Todo {

@Id
private Long id;

protected Todo() {
}

public Todo(final Long id) {
this.id = id;
}

public Long getId() {
return id;
}
}
```

### @GeneratedValue

엔터티의 기본키 생성 전략

- **TABLE**
- 데이터베이스에 키 생성 전용 테이블을 하나 만들고 이를 사용하여 기본키를 생성
- **SEQUENCE**
- 데이터베이스의 특별한 오브젝트인 시퀸스를 사용하여 기본키를 생성
- Sequence란 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트
- **IDENTITY**
- 기본키 생성을 데이터베이스에 위임한다.
- 예를 들어 MySQL의 경우 AUTO_INCREMENT를 사용하여 기본키를 생성한다.
- **AUTO**
- JPA 구현체가 자동으로 생성 전략을 결정한다.