쇼핑몰에는 상품들이 진열되어있다. 가장 먼저, 상품 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 인터페이스를 설계했다.
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
@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 제약조건이 추가됨JpaRepository
는 기본적인 CRUD 및 페이징 처리를 위한 메소드가 정의되어 있다. 대표적으로 엔티티를 저장, 삭제 또는 엔티티의 개수 출력 등의 메소드를 구현할 수 있다.
<JpaRepository에서 지원하는 메소드 예시>
<s extends T> save(S entity)
: 엔티티 저장 및 수정void delete(T entity)
: 엔티티 삭제count()
: 엔티티 총 개수 반환Iterable<T> findAll()
: 모든 엔티티 조회And
, Or
, Between
부터 LessThan
, GreaterThan
과 같은 대소 비교까지 복잡한 쿼리가 아니라면 편리하게 사용할 수 있었다. 나중에 사용할 기회가 있다면 사용해보아야겠다.