- 학습 목표
- Blog API 개발
- H2(DB) - in memory
- Spring data JPA
- 실습 안내
- 새 프로젝트를 만들고,
- 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차 캐시의 역할을 한다.
- JPA
- member table ↔ API
- 조회 시 즉시 반영해야 한다.
- JPA를 사용하게 되면 조회한 데이터를 일단 갖고 있는다. DB 통신 접속 회수가 줄어들어서 성능이 좋아진다.
- DB 부하를 줄이고 DB를 잘 설계하는 게 중요하다.
- QueryDSL과 같은 외부 라이브러리 사용하기도 함. 최근에는 업데이트가 안 되고 있어 사용하기에 불편함.
- 쓰기 지연
- DB에서의 commit(반영)
- 반영해도 되는 시점이 오면 캐시에 갖고 있던 것을 처리해준다.
- 변경 감지
- 지연 로딩(LAZY)
- 모아놨다가 변경분을 commit(DB에 반영)한다.
- 바로바로 반영이 되어야 할 때는 즉시 로딩(EAGER) 사용.
- 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에 대한 정보를 가져온다.
- 총 두 번 쿼리를 날린다.
- Team 1
- 즉시 로딩
- N+1 문제
- 해결 방법
- fetch join으로 해결
- 1:N을 N(주인):1 관계로 programming하기
- 지연 로딩을 사용
- 해결 방법
- Team(객체)
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 |