diff --git "a/week10/10\354\243\274\354\260\250.md" "b/week10/10\354\243\274\354\260\250.md" deleted file mode 100644 index 867b71b..0000000 --- "a/week10/10\354\243\274\354\260\250.md" +++ /dev/null @@ -1,18 +0,0 @@ -# 10주차 학습 PR - -이번 주는 살짝 쉬어가는 느낌으로 실습 PR은 별도로 없고, -H2 Database를 설치해오시면 좋을 것 같습니다! - -## Indexing이란? -(clustering index, secondary index) - - -## DB의 Relationship(1:1, 1:m, n:m) - - - -## JPA 엔티티의 생명 주기 - - - -## @Id, @GeneratedValue \ No newline at end of file diff --git "a/week10/\355\231\215\354\240\225\354\232\260.md" "b/week10/\355\231\215\354\240\225\354\232\260.md" new file mode 100644 index 0000000..626c3d8 --- /dev/null +++ "b/week10/\355\231\215\354\240\225\354\232\260.md" @@ -0,0 +1,155 @@ +# Cow - Week9 + +## Indexing + +- 데이터베이스 분야에 있어서 테이블에 대한 동작 속도를 높여주는 자료구조 +- 테이블 내의 1개의 컬럼, 혹은 여러 개의 컬럼을 이용하여 생성될 수 있다. +- 고속의 검색 속도, 레코드 접근과 관련 효율적인 순서 매김 동작에 대한 기초를 제공 +- 인덱스를 저장하는 데 필요한 디스크 공간은 보통 테이블을 저장하는 데 필요한 디스크 공간보다 작다. + - 보통의 인덱스는 키 - 필드만 가지고 있고, 테이블이 다른 세부 항목들은 가지고 있지 않기 때문 +- 관계형 데이터베이스에서는 인덱스는 테이블 부분에 대한 하나의 사본이다. + +### Clustered + +스크린샷 2023-11-27 오전 11 00 16 + +- 클러스터 형 인덱스는 데이터가 테이블에 물리적으로 저장되는 순서를 정의한다. 즉, 클러스터 형 인덱스는 특정 컬럼을 기준으로 데이터들을 정렬시킨다. +- 테이블 데이터는 오직 한 가지의 방법으로만 정렬되기 때문에 오직 테이블 당 하나의 클러스터 형 인덱스만 존재할 수 있다. +- primary key의 제약 조건은 클러스터 된 인덱스를 자동으로 생성하기 때문에 우리가 일반적으로 테이블을 생성할 때 특정 컬럼에 primary key를 지정했다면, 자료가 자동으로 정렬된다. +- 장점 : 검색 속도를 향상 시킨다. +- 단점 : 새로운 데이터를 삽입할 때는 많은 비용이 소모된다. + +### Secondary Index + +스크린샷 2023-11-27 오전 11 02 43 + +- 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 구현체가 자동으로 생성 전략을 결정한다.