💻 백엔드개발/멋쟁이사자처럼 12기

RDB, 데이터베이스 구축, JPA

aaahyunseo 2024. 10. 29. 23:50

🛠️RDB, 데이터베이스 구축, JPA

 

📍In-Memory

: javaApp에서 만들어진 (list<> 등) 것이 RAM에 저장되는 것.

  • 많은 양의 데이터 저장 불가
  • 데이터가 사라짐 (휘발성)
  • IO 처리 속도가 빠름
  • 하드디스크 DB를 사용하면 영구적으로 많이 보관할 수 있음

📍mySQL

  • RDB(관계형 데이터 베이스)
  • 테이블형 관계형 데이터베이스 관리 시스템(RDBMS)
  • SELECT : 어떤 Column의 정보를 요청할 것인지
  • FROM : 어떤 테이블에 정보를 요청할 것인지
  • WHERE : 조건
  • name convention → 전부 소문자로 작성하고, ‘_’로 단어 구분.
  • Primary Key(PK) → ID Column : 유일해야 함. (=Field=Attribute)

→ Entity에는 ID 컬럼이 필수로 들어가야 하는데, @ID 어노테이션을 추가해주면 됨. ID 컬럼에 고유한 값을 자동으로 생성해주는 @GeneratedValue 어노테이션을 붙일 수 도 있음.

  • Foreign Key(FK) → 외래키 : 테이블과 테이블 사이의 관계를 연결시켜주는 값. (=Row=Record=Tuple)
    1. 참조 테이블에서는 중복이 가능
    2. 피참조 테이블에서는 Unique해야 함.
  • DB는 FK로 연관관계를 맺음. FK를 가진 쪽이 주인.

 

DB 간 관계

  • One To One

A의 row가 B의 row와 정확히 1:1로 매칭 되는 것.

  • One To Many

A가 여러 개의 B를 가질 수 있는 것. (1:N)

  • Many To Many

A도 B를 여러 개 가질 수 있고, B도 A를 여러 개 가질 수 있다. (N:M)

→ 실무에서는 사용 지양.

→ 다대다 관계는 객체 지향 설계에 적합하지 않음. 그러므로 일대다, 다대일로 풀어내야 함.

→ 구현하려면 중간 테이블을 하나 만들어야 함. (일반적으로 연결하는 두 테이블의 이름을 연결해서 만듦. ex. product + category = product_category)

→ OneToMany + OneToMany

  • One, 필수

one 필수

  • One, 선택

one 선택

  • Many, 필수

Many 필수

  • Many, 선택

Many 선택

 

🪄데이터 베이스 정규화

  • 연관이 있는 정보들을 한 테이블에 모두 넣는 것이 아니라 여러 개의 테이블로 나누어 저장하는 것.
  • 정규화의 목적은 데이터 중복을 제거하고, 효율성을 향상시키며, 데이터 무결성을 보장하는 것.

→ 각 컬럼은 하나의 데이터만 저장하며, 다중 값을 갖지 않는다.

→ 현재 테이블의 주제와 관련없는 컬럼은 다른 테이블로 분리하여 테이블 간 사이의 관계를 설정한다.

→이행적 함수 종속성(A→B종속, B→C 종속, A→C 종속)을 제거한다.

 

  • MemoApp DB 설계
    • Entity → user, memo, like 
    • user와 memo는 OneToMany
    • user와 like는 OneToMany
    • memo와 like는 OneToMany

📍ORM(Object-Relational Mapping)

: 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것.

  • 데이터를 객체 지향적으로 관리 가능.
  • query 작성할 필요 없이 더 직관적이고, 비즈니스 로직에 더 집중할 수 있음.
  • 재사용성 및 유지보수의 편리성 증가.
  • DBMS에 대한 종속성이 줄어듦.
  • DB 데이터 ↔ [mapping] ↔ Object 필드

📍JPA(Java Persistence API)

: 자바 ORM기술을 쉽게 구현하도록 도와주는 API

  • JpaRepository를 상속하는 인터페이스에 메서드 이름만 적어놓으면 구현체 생성, 쿼리문 구현 등을 알아서 처리해줌.

**쿼리(Query) : 데이터 베이스에 특정한 정보를 보여 달라는 클라이언트의 요청.

즉, ‘쿼리문을 작성한다.’는 데이터베이스에서 원하는 정보를 가져오는 코드를 작성한다는 의미.

🪄 JPA 사용법

  1. Entity 클래스 정의
  2. Repository 인터페이스 정의 (JpaRepository 인터페이스를 상속 받아 사용)
  3. application.properties 파일에 JPA 설정 정보 지정
  4. Service 클래스, Controller 클래스 정의

📍docker

: Go언어로 작성된 리눅스 컨테이너 기반 오픈소스 가상화 플랫폼.

  • Image : 컨테이너를 실행할 수 있는 실행 파일, 설정 값들을 가지고 있는 것.

→ Image를 컨테이너에 담고 실행을 시키면 해당 프로세스가 동작함.

  • Container : image 실행

→ Docker는 한 서버의 여러 OS를 가상화 하여 사용하는 것과 달리 컨테이너 방식으로 프로세스를 격리 시켜 동작.

 

🪄Column 안에 올 수 있는 속성

  1. name : 필드와 매핑할 테이블의 컬럼 이름 (Default는 객체 필드 이름)
  2. insertable, updatable : 등록, 변경 가능 여부 (Default는 true)
      false로 설정 시 변경 불가능(default)

   3. nullable : null 값의 허용 여부

   4. unique : 한 컬럼에 걸 유니크 제약조건
          해당 column의 유일 값

 

   5. length : 문자 길이 제약 조건, String 타입에만 사용 (Default는 255)


🪄@OneToMany , @ManyToOne 의 옵션

1️⃣fetch

  • LAZY : 지연 로딩.

→ 자식은 필요할 때 조회 됨. 즉, 필요한 상황이 생기면 그때 데이터를 가져옴. (쿼리를 날림)

→ 필요할 때 가져오기 때문에 좋을 것 같지만 성능 상의 문제가 있을 수 있음. 그러므로 상황에 따라 LAZY와 EAGER의 사용을 적절하게 해줘야 함.

  • EAGER : 즉시 로딩.

→ 부모 조회 시 자식도 같이 조회 됨.

→ 즉시 데이터를 모두 가져옴.

 

2️⃣cascade

→ *JPA 영속성 전이.

  • @OneToMany 에 사용 가능 (or @OneToOne)
  • 옵션 종류
    1. PERSIST : 저장 상태 전이
    2. REMOVE : 삭제 상태 전이 → Team 아래 member 정보가 같이 삭제됨. (연관 관계가 많을 때는 사용 지양)
    3. MERGE : 업데이트 상태 전이
    4. REFERESH : 갱신 상태 전이
    5. ALL : 전체 상태 전이

3️⃣orphanRemoval

: 고아 객체 제거

  • @OneToMany 또는 @OneToOne 부모 엔티티에서 사용.
  • casecade.REMOVE 와 비슷함.
  • 부모 객체에서 리스트 요소를 삭제했을 경우 해당 자식 객체는 매핑 정보가 없어지므로 대신 삭제해줌.

🪄Cascade.REMOVE vs. orphanRemoval 차이점

  1. Cascade.REMOVE 는 부모가 삭제되면 자식을 삭제
    → Team이 삭제되면 해당 Team의 모든 member가 삭제됨
    → 부모-One (Team) / 자식-Many (Member)
  2. orphanRemoval 는 부모와 자식의 연관 관계가 끊어지면 (ex. team.getMembers.clear 등) 자식을 삭제→ 양쪽이 모두 버렸을 때 member가 삭제되는 것. 양쪽으로 버려야 orphanRemoval 가능.
    → 부모와 자식을 양방향으로 Mapping함. (onetomany와 manytoone 함께 사용) 그러므로 한 쪽이 관계를 끊어도 한 쪽이 관계를 유지.

🪄 JPA 영속성

💡 영속성(Persistence)이란? 데이터를 생성한 프로그램이 종료되어도 사라지지 않는 데이터의 특성을 말한다. 영속성을 갖지 않으면 데이터는 메모리에서만 존재하게 되고 프로그램 종료 시 해당 데이터는 모두 사라진다. DB에 영구 저장함으로써 데이터에 영속성을 부여해야 한다.

💡 영속성 컨텍스트(Persistence Context)? 엔티티를 영구 저장하는 환경. EntityManager를 이용해 Entity를 저장하거나 조회할 때 EntityManager는 영속성 컨테이너에 Entity를 보관하고 관리한다. 버퍼링이나 캐싱을 위해 이것을 사용한다.