Spring

[JPA] JPA 기본 사용법

sabeom 2023. 11. 29. 10:34

1. 의존성 추가

build.gradle

dependencies {
    // 객체를 변환해주는 라이브러리 (DTO -> Entity)
    implementation group: 'org.modelmapper', name: 'modelmapper', version: '3.2.0'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

 

2. DTO 생성

OrderDto

@Data
public class OrderDto implements Serializable {
    private String productId;
    private Integer qty;
    private Integer unitPrice;
    private Integer totalPrice;

    private String orderId;
    private String userId;
}

 

3. Entity 생성

@Data
@Entity
@Table(name = "orders")
public class OrderEntity implements Serializable {
    // implements Serializable: 직렬화, 우리가 가지고 있는 객체를 전송하거나 보관하기 위해 마셜링 작업을 위해 사용
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 120, unique = true)
    private String productId;
    @Column(nullable = false)
    private Integer qty;
    @Column(nullable = false)
    private Integer unitPrice;
    @Column(nullable = false)
    private Integer totalPrice;

    @Column(nullable = false)
    private String userId;
    @Column(nullable = false, unique = true)
    private String orderId;

    @Column(nullable = false, updatable = false, insertable = false)
    @ColumnDefault(value = "CURRENT_TIMESTAMP")
    private Date createdAt;
}

 

4. Repository 생성

public interface OrderRepository extends CrudRepository<OrderEntity, Long> {
    OrderEntity findByOrderId(String productId);
    Iterable<OrderEntity> findByUserId(String userId);
}

 

5. Repository에서 정의한 Method 사용

@Override
public Iterable<OrderEntity> getOrdersByUserId(String userId) {
    return orderRepository.findByUserId(userId);
}

 

 

 

Repository 구현하는 규칙

JPA는 메소드 이름만으로 쿼리를 생성할 수 있다.

위에서 작성한 List<Comment> findAllByPostId(Long post_id); 해당 구문을 보면 해석해 보면 findAll (comment) 전부 찾아볼건데 postId로 찾는다는 거다. 이렇게만 작성해주면 JPA가 알아서 SQL문을 생성해준다.

Method

 method  기능
 save()  레코드 저장 (insert, update)
 findOne()  primary key로 레코드 한건 찾기
 findAll()  전체 레코드 불러오기. 정렬(sort), 페이징(pageable) 가능
 count()  레코드 갯수
 delete()  레코드 삭제

Keyword

메서드 이름 키워드  샘플  설명
 And  findByEmailAndUserId(String email, String userId)  여러필드를 and 로 검색
 Or  findByEmailOrUserId(String email, String userId)  여러필드를 or 로 검색
 Between  findByCreatedAtBetween(Date fromDate, Date toDate)  필드의 두 값 사이에 있는 항목 검색
 LessThan  findByAgeGraterThanEqual(int age)  작은 항목 검색
 GreaterThanEqual  findByAgeGraterThanEqual(int age)  크거나 같은 항목 검색
 Like  findByNameLike(String name)  like 검색
 IsNull  findByJobIsNull()  null 인 항목 검색
 In  findByJob(String … jobs)  여러 값중에 하나인 항목 검색
 OrderBy  findByEmailOrderByNameAsc(String email)  검색 결과를 정렬하여 전달

이 정도만 알고있으면 우리가 사용하려는 대부분의 쿼리문은 이런식으로 작성이 가능하다고 하다.

그리고 외우지 않아도 IDE에 자동완성 기능이 있기 때문에 훨씬 수월하게 개발을 할 수 있게 도와준다.

여기서 컬럼명이나 해당 개체의 필드명들은 파스칼로 적어주는게 좋다고 한다.

위 표말고도 JPA 참조문서를 찾아보면 더 많은 예시를 볼 수 있다.

https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html

 

 

쿼리문도 사용가능

public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select u from User u where u.emailAddress = ?1")
  User findByEmailAddress(String emailAddress);
}

SQL문이 복잡해서 메소드 이름만으로 해결이 안될때는 직접 쿼리하는 방법도 있다.

 

 

 

 

 

 

 

 

참고

https://geonoo.tistory.com/149