티스토리 뷰
같이 플젝하고 있는 친구를 위해, 그리고 겸사겸사 복습해보기 위해
내가 아는 선에서의 Spring Data JPA에 대해서 정리를 해보려고 한다!
(틀린 내용이 있을 수 있다... 혹시 있다면 알려주세요...)
기술에 대한 개요나 설정 등은 건너 뛰고
'사용 방법'에 대해서만 간단히 정리를 해보겠다.
1. Entity
우선 Spring Data JPA는 ORM 기술이다. 객체와 DB의 테이블을 자동으로 Mapping해준다.
Spring Data JPA 사용 시, 테이블을 직접 생성하지 않아도 된다. 설정 파일에서 ddl-auto를 상황에 맞게 변경해주면 테이블이 자동으로 생성된다! 그럼 테이블을 어떤 클래스와 Mapping 되는 것일까?
아래와 같이 @Entity 어노테이션이 붙은 클래스는 테이블로 매핑된다. 또한 @OntToOne 등의 어노테이션을 통해 테이블간 관계를 정의할 수 있다. Entity 클래스 자체는 테이블의 모양이 되고 해당 클래스의 객체를 통해 테이블의 튜플로 insert 등을 할 수 있다.
아래는 예시 코드이다.
package semohan.owner.domain.owner.domain;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.antlr.v4.runtime.misc.NotNull;
import semohan.owner.domain.restaurant.domain.Restaurant;
@Getter
@Setter
@Entity
public class Owner {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@NotNull
private String username;
@NotNull
private String password;
@NotNull
private String name;
@NotNull
private String phoneNumber;
@NotNull
@OneToOne(fetch = FetchType.LAZY) /*FetchType.LAZY: 해당 엔티티가 필요할 때까지 로딩 지연시키는 옵션*/
private Restaurant restaurant;
}
2. Repository
다음은 DB에 접근하는 역할을 하는 Repository에 대한 설명이다. DML의 역할을 한다.
1. 클래스가 아닌 인터페이스로 만든다.
2. JpaRepository<'사용할테이블Entity', '해당테이블의PK데이터타입'>을 상속받는다.
2. @Repository 어노테이션을 붙인다.
3. 약속된 패턴에 맞게 메서드를 선언한다.
아래는 예시 코드이다. 더 많은 예시 코드는 여기서!
interface PersonRepository extends Repository<Person, Long> {
List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
// Enables the distinct flag for the query
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
// Enabling ignoring case for an individual property
List<Person> findByLastnameIgnoreCase(String lastname);
// Enabling ignoring case for all suitable properties
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
// Enabling static ORDER BY for a query
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}
3. Update 작업 시,
두 가지 방법이 있는 걸로 알고 있다.
1. Repository 인터페이스 안에 @Modifying 어노테이션을 붙이고 직접 쿼리 작성
2. 변경 감지를 통한 엔티티 수정
나는 두번째 방법만 정리해보려고 한다.
(사용하는 방법만 아는거지 개념에 대한 정확한 이해는 아직 부족하다는 점 유의 부탁합니다!!)
Repository를 통해 찾아온 Entity 객체가 있을거다. 그 객체의 특정 속성을 수정기만 하면 된다!
아래는 예시 코드이다.
public Boolean updateRestaurantInfo(long ownerId, RestaurantInfoDto dto) {
long resId = ownerRepository.findOwnerById(ownerId).orElseThrow().getRestaurant().getId();
Restaurant restaurant = restaurantRepository.findRestaurantById(resId).orElseThrow();
// 가져온 Entity 객체의 값 수정
restaurant.setPhoneNumber(dto.getPhoneNumber());
restaurant.setBusinessHours(dto.getBusinessHours());
restaurant.setPrice(dto.getPrice());
return true;
}
'Web > Spring' 카테고리의 다른 글
MyBatis 작동 원리와 SqlSession (0) | 2024.05.18 |
---|---|
JDBC Template / 조회, 람다식 활용 (0) | 2024.05.13 |
스프링부트 프로젝트 세팅(feat. Swagger/spirngfox 오류 해결 방법) (0) | 2024.04.15 |
[JPA/1:1 채팅] 기존 채팅방 유무 검사 (0) | 2024.04.13 |
새로운 채팅 메세지 표시 (0) | 2024.04.12 |
- Total
- Today
- Yesterday
- 알고리즘
- 백준9375번
- 리트코드 1768 해석
- 안드로이드
- 컴퓨터학과
- 그리디 알고리즘
- 코틀린
- 컴공
- 생활코딩
- BFS
- 프로그래밍
- RDD
- 코딩
- 자바
- 백준 1004
- 스프링 강의
- 백준 2108
- 스프링부트
- bcrypaswordencoder
- 컴과
- 동덕여대
- 스파크
- 동덕여대 컴퓨터학과
- 자바 1004번
- 개발
- 자바 9375
- 아이엘츠
- 웹
- 백준
- 리트코드 1768
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |