TIL

[코드스테이츠] Day06 BE

yerinpark 2023. 7. 3. 17:08
  1. 학습 목표
    1. Blog API 개발
    2. H2(DB) - in memory
    3. Spring data JPA
  2. 실습 안내
    1. 새 프로젝트를 만들고,
    2. Blog API, JPA를 실습한다.(H2 DB 사용)

1차시(실습)

새 프로젝트 만들기(dependencies 추가)

2차시(개념)

JPA

Java Persistence(DB와 관련) API

  • DB 통신을 할 때 DB에서는 query 방식을 권장한다.
  • ORM(Object Relational Mapping) Framework

Spring Boot로 만든 Application ↔ DB와 통신

  • directly하게 통신하지 않고 Hibernate를 통해서 JDBC를 해석한다.
  • e.g. MySQL을 PostgreSQL[포스트그레스큐엘]로 바꿀 때 유지보수성 향상.

JPA는 원론적인 기술이고 Hibernate는 구현체 중 하나이다.

  • e.g. 어떤 의존성으로 구현했니? → 우리는 Spring Data JPA(JPA를 한 단계 더 추상화)로 의존성 추가함.
  • application 배포 시 JPA와 통신. 개발할 때는 Spring Data JPA 사용.

JPA

  • entity
    • 테이블과 맵핑되는 객체(class)
  • entity manager
    • entity factory로부터 생성된다.
    • 1개만 생성된다.
    • singleton pattern 적용.

Persistence Context

cf. Spring Application Context

entity manager

  1. 1차 캐시를 사용한다.
    1. 영속성 컨텍스트가 1차 캐시의 역할을 한다.
    2. JPA
    3. member table ↔ API
      1. 조회 시 즉시 반영해야 한다.
      2. JPA를 사용하게 되면 조회한 데이터를 일단 갖고 있는다. DB 통신 접속 회수가 줄어들어서 성능이 좋아진다.
      3. DB 부하를 줄이고 DB를 잘 설계하는 게 중요하다.
      4. QueryDSL과 같은 외부 라이브러리 사용하기도 함. 최근에는 업데이트가 안 되고 있어 사용하기에 불편함.
  2. 쓰기 지연
    1. DB에서의 commit(반영)
    2. 반영해도 되는 시점이 오면 캐시에 갖고 있던 것을 처리해준다.
  3. 변경 감지
  4. 지연 로딩(LAZY)
    1. 모아놨다가 변경분을 commit(DB에 반영)한다.
    2. 바로바로 반영이 되어야 할 때는 즉시 로딩(EAGER) 사용.
    3. LAZY/EAGER - Spring의 Fetch 전략

추가 학습

  • JPA 문법 더 알아보기
  • 영속성 컨텍스트 관련 개념은 기술 면접에서 도움이 될 것이다.
  • DB 공부가 꼭 선행되어야 한다.
    • 기본적인 join query는 짜야 한다.
    • 관계형 데이터베이스(RDB)

JPA vs. MyBatis

  • query 기반 MyBatis 꼭 경험해보고 입사하기.

3차시

  • Team 1
    • User 1
    • User 2
  • Team 2
    • User 1
    • User 2
    • User 3

Team(DB)

  • id(pk)

User(DB)

  • id(pk)

1:1, 1:N, N:1, N:N

  • 앞에 있는 걸 기준이라고 생각한다.
  • tip) N:1로 생각한다. N이 되는 걸 기준으로 생각하고 코딩하면 오류 확률을 줄일 수 있다.
  • N:1 관계에서는 즉시 로딩을 권장.
  • N:N 다대다 관계에서는 중간에 하나를 더 만드는 전략을 사용한다.
    • T(N) -V- S(N)
    • ⇒ T(N) - V(1) - S(N) 로 만든 후 지연 로딩 사용하는 공식을 쓴다.
  • e.g. User(N) : Team(1)
    • Team(객체)
      • id
      • name
      • List<User> users
    • 즉시 로딩 vs. 지연 로딩
      • 즉시 로딩
        • Team 1
          • List<User> list
          • Team 1의 User 1에 대한 정보과 User 2에 대한 정보를 가져온다.
          • 총 두 번 쿼리를 날린다.
    • N+1 문제
      • 해결 방법
        • fetch join으로 해결
        • 1:N을 N(주인):1 관계로 programming하기
        • 지연 로딩을 사용

what if N 설정이 헷갈릴 때는?

Team - User 간의 관계

case1

Team(N)

t_id(PK)

u_id(FK)

→ 고유성 원칙 위반

User(1)

u_id(PK)

실습

mappedBy

Team 기준으로 만듦.

@Query 에서 조인을 join fetch로 하고 있음. // JPQL 문법

다음 진도

Blog API : 화면 및 연습

JPA Spring Security

  • N+1 JPA 연관 관계 + Blog API 화면
  • Blog API 실습 + Spring Security

'TIL' 카테고리의 다른 글

[포트폴리오 특강] 회고  (0) 2024.02.20
[코드스테이츠] Day07 BE  (0) 2023.07.05
[코드스테이츠] Day05 BE  (0) 2023.06.30
[코드스테이츠] Day04 BE  (0) 2023.06.29
[코드스테이츠] Day03 BE  (0) 2023.06.29