상품 Entity, 상품 Repository 설계, 쿼리 메소드

jihan kong·2022년 12월 14일
0
post-thumbnail

쇼핑몰에는 상품들이 진열되어있다. 가장 먼저, 상품 Entity와 관련된 항목들을 우선적으로 설계해야겠다는 생각을 했다.

상품 Entity 설계

@Entity 어노테이션을 붙여 JPA에서 관리하게끔 만들었다.

Item.java


package com.shop.entity;

import com.shop.constant.ItemSellStatus;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
@Table(name="item")
@Getter
@Setter
@ToString
public class Item {

	@Id
	@Column(name="item_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
    
    @Column(nullable = false, length = 50)
    private String itemNm;
    
    @Column(name="price", nullable = false)
    private int price;
    
    @Column(nullable = false)
    private int stockNumber;
    
    @Lob
    @Column(nullable = false)
    private String itemDetail;
    
    @Enumerated(EnumType.STRING)
    private ItemSellStatus itemSellStatus;
    
    private LocalDateTime regTime;
    
    private LocalDateTime updateTime;

}

그 후, DAO 역할을 하는 Repository 인터페이스를 설계했다.

ItemRepository 설계

com.shop.repository.ItemRepository.java

package com.shop.repository;

import com.shop.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ItemRepository extends JpaRepository<Item, Long> {

}

JpaRepository 를 상속받는 ItemRepository 를 작성. JpaRepository 는 2개의 제네릭 타입을 사용하는데 첫 번째에는 엔티티 타입 클래스를 넣어주고, 두 번째에는 기본키 타입을 넣어준다.

쿼리 메소드

애플리케이션을 개발하려면 데이터를 조회하는 기능은 필수적이다. 쿼리 메소드는 스프링 데이터 JPA에서 제공하는 핵심 기능 중 하나이다. 보통 다음과 같이 많이 사용한다.

find + (엔티티 이름) + By + 변수이름

이를 토대로 ItemRepository에 적용해보았다.

com.shop.repository.ItemRepository.java

package com.shop.repository;

import com.shop.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ItemRepository extends JpaRepository<Item, Long> {
	List<Item> findByItemNm(String itemNm);
}

프로젝트 구조

Constant : ItemSellStatus
Entity : Item
Repository : ItemRepository

배운 것

  1. 엔티티 관련
  • @Entity 는 클래스를 Entity로 설정하게 해준다.

  • Entity로 선언한 클래스는 반드시 기본키를 가져야한다.

  • @GeneratedValue 는 기본키 생성 전략이라고 하는데 전략에 따라 다음과 같이 나뉜다.

    • GenerationType.AUTO : JPA 구현체가 자동으로 생성 전략 결정
    • GenerationType.IDENTITY : 기본키 생성을 데이터베이스에 위임
    • GenerationType.SEQUENCE : 데이터베이스 시퀀스 오브젝트를 이용한 기본키 생성
    • GenerationType.TABLE : 키 생성용 테이블 사용
  • @Column 어노테이션 핵심 속성
    테이블을 생성할 때 컬럼에는 다양한 조건들이 들어가게 되는데 @Column 어노테이션은 이를 설정하는 것을 도와준다.

    • name : 필드와 매핑할 칼럼의 이름 설정
    • unique : 유니크 제약 조건 설정
    • length : String 타입의 문자 길이 제약 조건 설정 (기본값 : 255)
    • nullable : null 값의 허용 여부 설정. false 설정 시에 DDL 생성할 때 not null 제약조건이 추가됨
  1. JpaRepository 는 기본적인 CRUD 및 페이징 처리를 위한 메소드가 정의되어 있다. 대표적으로 엔티티를 저장, 삭제 또는 엔티티의 개수 출력 등의 메소드를 구현할 수 있다.

    <JpaRepository에서 지원하는 메소드 예시>

  • <s extends T> save(S entity) : 엔티티 저장 및 수정
  • void delete(T entity) : 엔티티 삭제
  • count() : 엔티티 총 개수 반환
  • Iterable<T> findAll() : 모든 엔티티 조회
  1. 쿼리 메소드의 편의성에 대해 알게 되었다.
    SQL 문법은 따로 공부해야할 정도로 많은 양이 있다. 그러나 간단한 네이밍 룰을 이용하여 원하는 쿼리를 실행할 수 있다는 것이 아주 큰 장점이었다. And, Or, Between 부터 LessThan, GreaterThan 과 같은 대소 비교까지 복잡한 쿼리가 아니라면 편리하게 사용할 수 있었다. 나중에 사용할 기회가 있다면 사용해보아야겠다.
profile
학습하며 도전하는 것을 즐기는 개발자

0개의 댓글