일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- html
- JPA
- javascript
- Spring Boot
- Spring
- google login
- Expo
- matplotlib
- google cloud
- 양방향 매핑
- STT
- oauth
- C++
- 졸프
- YOLOv5
- AWS
- 커스텀 데이터 학습
- @Transactional
- 코드업
- marksense.ai
- react native
- 순환참조
- idToken
- Loss Function
- OG tag
- skt fellowship 3기
- pandas
- yolo
- google 로그인
- 2021 제9회 문화공공데이터 활용경진대회
- Today
- Total
민팽로그
[ORM] JPA와 연관관계 본문
ORM(Object -Relational Mapping)
객체와 DB를 매핑하기 위한 기술.
OOP는 데이터 표현 시 클래스를, 관계형 DB는 테이블을 사용하므로 둘 사이의 불일치를 해결해 주어야 함.
ORM은 SQL문을 생성해주어 이러한 불일치를 해결할 수 있음.
- ORM 사용 이유?
- 백엔드 개발자가 SQL 작성에 들이는 노력을 줄여 비즈니스 로직 개발에 더 집중할 수 있음
- SQL 작성 과정에서 발생하는 실수를 줄일 수 있음
- 웹 서버 개발 언어(Java, Python, Javascript 등)과 SQL의 목적 및 사용법이 달라 소통 수단이 필요
- ORM이 SQL 작성의 수고를 덜어주긴 하지만, 백엔드 개발자는 DB테이블 설계, SQL query 성능 확보 등의 이유로 DB에 대해서도 잘 알고 있어야 함
참고)
https://gmlwjd9405.github.io/2019/02/01/orm.html
JPA(Java Persistence API)
Java ORM 기술에 대한 표준 명세.
과거에는 SQL Mapper(MyBatis, JdbcTemplete) 위주로 개발 -> 세계적으로 JPA 사용 빈도가 급격히 높아짐.
- Hibernate(하이버네이트): JPA 는 표준 명세이고, 이를 실제로 구현한 프레임워크 중 사실상 표준
- Spring Data JPA
- JPA와는 다름 -> JPA를 편리하게 사용하기 위해 스프링에서 JPA를 Wrapping
- 스프링 개발자들이 JPA를 사용할 때 필수적으로 작성해야 하는 코드들을 Spring Data JPA가 대신 작성
- Repository 인터페이스만 작성하면, 필요한 구현은 스프링이 대신 해줌 ex) delete(), findAll(), save()
- 데이터 필드에 대한 기능 구현 방법은 공식문서 참고
영속성 컨텍스트
앤티티 매니저(Entity Manager)는 객체와 DB 사이에서 소통을 효율적으로 할 수 있도록 관리해주는 역할을 함.
앤티티 매니저가 영속성 컨텍스트를 관리하며, 영속성 컨텍스트는 객체를 저장하고 관리함.
아래 코드를 영속성 컨텍스트가 없는 환경과 있는 환경에서 각각 살펴보자.
// 회원 "user1" 객체 추가
User user1 = new User();
user1.setUsername("user1");
user1.setPassword("password1");
user1.setEmail("user1@email.com");
user1.setRole(UserRole.USER);
// 회원 "user1" 객체를 repository에 저장
userRepository.save(user1);
// 회원 "user1" 을 조회
User foundUser1 = userRepository.findByUsername("user1").orElse(null);
// 회원 "user1" 을 또 조회
User foundUser2 = userRepository.findByUsername("user1").orElse(null);
// 회원 "user1" 을 또또 조회
User foundUser3 = userRepository.findByUsername("user1").orElse(null);
영속성 컨텍스트가 없는 경우
영속성 컨텍스트가 없는 환경에서 user1을 저장한 후 조회를 하게 되면 위 사진처럼 모두 다른 엔티티 id를 갖게 된다. 즉, 조회를 할 때마다 새로운 객체를 매번 생성하게 되는 것이다.
영속성 컨텍스트가 있는 경우
영속성 컨텍스트가 있는 환경에서는 user1을 저장한 후 3번의 조회에서 모두 같은 엔티티 id를 갖는것을 확인할 수 있다. 즉, save 하는 순간 영속성 컨텍스트에 객체가 1차 캐시로 저장되어 이후 find할 때 DB에 조회를 바로 요청하는 것이 아니라 영속성 컨텍스트가 가지고 있는 객체를 내려주는 것이다.
Spring Data JPA를 사용한다면 엔티티 메니저의 활성화 상태가 기본옵션이며 @Transactional @Controller 환경에도 영속성 컨텍스트가 존재한다고 한다. 좀 검색해보니 @Controller 환경은 완전한 영속성 환경이 아니라는 것 같음..
참고)
https://willseungh0.tistory.com/73
JPA 연관관계
DB의 1:1, 1:N, M:N 관계를 JPA를 통해 구현하기 위해서 @OneToMany, @ManyToOne, @ManyToMany 어노테이션을 사용한다.
특히 1:N 관계에서는 1 쪽에 @OneToMany 어노테이션을, N쪽에 @ManyToOne 어노테이션을 붙여준다.(양방향 매핑)
양방향 매핑을 하게 되면 양쪽 객체 모두가 서로를 조회할 수 있다.
만약 1:N 관계에서 N쪽에 @ManyToOne 어노테이션만 사용한다면, N쪽 객체에서만 조회할 수 있다.(단방향 매핑)
예를들어, 회원과 개인 폴더의 관계에서 회원 한 명이 여러개의 폴더를 생성할 수 있고 폴더 하나는 한명의 회원이 소유하고 있으므로 1:N 관계이다.
회원 Entity 관점
public class User {
@OneToMany
private List<Folder> folders;
}
폴더 Entity 관점
public class Folder{
@ManyToOne
private User user;
}
조회
//회원이 가진 폴더들을 조회
List<Folder> folders = user.getFolders();
//폴더를 소유한 회원을 조회
folder.getUser();
참고
스파르타 코딩클럽 Spring 심화반 - https://spartacodingclub.kr/online/spring_plus
스파르타코딩클럽 [Spring 심화반]
Spring 뽀개고 취업하기
spartacodingclub.kr
'jpa' 카테고리의 다른 글
DB 운영과 @Transactional (0) | 2021.09.14 |
---|---|
[jpa 연관관계] 다대일 관계: 양방향 매핑 무한루프 (0) | 2021.08.26 |