🛠️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)
- 참조 테이블에서는 중복이 가능
- 피참조 테이블에서는 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, 선택
- 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 사용법
- Entity 클래스 정의
- Repository 인터페이스 정의 (JpaRepository 인터페이스를 상속 받아 사용)
- application.properties 파일에 JPA 설정 정보 지정
- Service 클래스, Controller 클래스 정의
📍docker
: Go언어로 작성된 리눅스 컨테이너 기반 오픈소스 가상화 플랫폼.
- Image : 컨테이너를 실행할 수 있는 실행 파일, 설정 값들을 가지고 있는 것.
→ Image를 컨테이너에 담고 실행을 시키면 해당 프로세스가 동작함.
- Container : image 실행
→ Docker는 한 서버의 여러 OS를 가상화 하여 사용하는 것과 달리 컨테이너 방식으로 프로세스를 격리 시켜 동작.
🪄Column 안에 올 수 있는 속성
- name : 필드와 매핑할 테이블의 컬럼 이름 (Default는 객체 필드 이름)
- 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 차이점
- Cascade.REMOVE 는 부모가 삭제되면 자식을 삭제
→ Team이 삭제되면 해당 Team의 모든 member가 삭제됨
→ 부모-One (Team) / 자식-Many (Member) - orphanRemoval 는 부모와 자식의 연관 관계가 끊어지면 (ex. team.getMembers.clear 등) 자식을 삭제→ 양쪽이 모두 버렸을 때 member가 삭제되는 것. 양쪽으로 버려야 orphanRemoval 가능.
→ 부모와 자식을 양방향으로 Mapping함. (onetomany와 manytoone 함께 사용) 그러므로 한 쪽이 관계를 끊어도 한 쪽이 관계를 유지.
🪄 JPA 영속성
💡 영속성(Persistence)이란? 데이터를 생성한 프로그램이 종료되어도 사라지지 않는 데이터의 특성을 말한다. 영속성을 갖지 않으면 데이터는 메모리에서만 존재하게 되고 프로그램 종료 시 해당 데이터는 모두 사라진다. DB에 영구 저장함으로써 데이터에 영속성을 부여해야 한다.
💡 영속성 컨텍스트(Persistence Context)? 엔티티를 영구 저장하는 환경. EntityManager를 이용해 Entity를 저장하거나 조회할 때 EntityManager는 영속성 컨테이너에 Entity를 보관하고 관리한다. 버퍼링이나 캐싱을 위해 이것을 사용한다.
'💻 백엔드개발 > 멋쟁이사자처럼 12기' 카테고리의 다른 글
Cookie와 Header (0) | 2024.10.30 |
---|---|
인증, 인가, JWT, 요청 캐싱 (0) | 2024.10.29 |
HTTP Request & Response, 예외처리 (0) | 2024.10.29 |
Spring MVC, 컨트롤러, 서비스, Lombok (0) | 2024.10.29 |
Java 기초와 디자인 패턴, Spring Boot 기초 (0) | 2024.10.29 |