티스토리 뷰

같이 플젝하고 있는 친구를 위해, 그리고 겸사겸사 복습해보기 위해

내가 아는 선에서의 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;
    }

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함