2.2.6 퍼시스턴스 레이어 : 스프링 데이터 JPA

jaehyeok1230·2022년 11월 26일
0

TodoEntity.java

하나의 엔티티 인스턴스는 데이터베이스 테이블의 한 행에 해당한다. 엔티티 클래스는 클래스 그 자체가 테이블을 정의해야 한다. 즉, ORM이 엔티티를 보고 어떤 테이블의 어떤 필드에 매핑해야 하는지 알 수 있어야 한다는 뜻이다.

자바 클래스를 엔티티로 정의할 때 주의해야 하는 점

  • 클래스에는 매개변수가 없는 생성자, NoArgsConstructor가 필요하다.
  • Getter/Setter가 필요하다.
  • 기본키를 지정해줘야 한다.
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name = "Todo")
public class TodoEntity {
    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String id;  //이 오브젝트의 아이디
    private String userId;  //이 오브젝트를 생성한 유저 아이디
    private String title;   //Todo 타이틍 예) 운동하기
    private boolean done;   // true - todo를 완료한 경우(checked)
}
  • 엔티티에 이름을 부여하고 싶다면 @Entity("TodoEntity")처럼 매개변수를 넣어 줄 수 있다.
  • 테이블 이름을 지정하기 위해 @Table(name = "Todo")어노테이션을 추가한다. 이 엔티티는 데이터베이스의 Todo 테이블에 매핑된다는 뜻이다.
    - 만약 @Table을 추가하지 않거나, 추가해도 name을 명시하지 않는다면 @Entity의 이름을 테이블 이름으로 간주한다. @Entity에 이름을 지정하지 않는 경우 클래스의 이름을 테이블 이름으로 간주한다.
  • @Id는 기본키가 될 필드에 지정한다.
  • @GeneratedValue 어노테이션을 이용해 자동으로 생성할 수도 있다.
  • @GenericGeneator는 Hibernate이 제공하는 기본 Generator가 아닌 나만의 Generator을 사용하고 싶을 때 이용한다.

TodoRepository.java

@Repository
public interface TodoRepository extends JpaRepository<TodoEntity, String> {

}

JpaRepository는 인터페이스이다. 이 인터페이스를 사용하기 위해서는 새 인터페이스를 작성해 JpaRepository를 확장해야한다. 이때 JpaRepository<T,ID>이 Genetic Type을 받는 것을 주의한다.

  • T는 테이블에 매핑할 엔티티 클래스이다.
  • ID는 엔티티의 기본키 타입이다.

@Repository 어노테이션 또한 Component 어노테이션의 특별 케이스이다. 따라서 스프링이 관리한다.

TodoService를 이용하여 테스팅하기

@Service
public class TodoService {

    @Autowired
    private TodoRepository repository;


    public String testService() {
        // TodoEntity 생성
        TodoEntity entity = TodoEntity.builder().title("My first todo item").build();
        // TodoEntity 저장
        repository.save(entity);
        // TodoEntity 검색
        TodoEntity savedEntity = repository.findById(entity.getId()).get();
        return savedEntity.getTitle();
    }
 }

기본 쿼리와 쿼리 작성 방법

JpaRepository는 기본적인 DB 오퍼레이션 인터페이스를 제공한다. save, findByID, findAll등이 기본적으로 제공되는 인터페이스에 해당한다.
구현은 스프링 데이터 JPA가 실행 시 알아서 해준다.

  • JpaRepository는 추상클래스나 인터페이스는 반드시 구현하는 클래스가 있어야한다는 법칙을 무시하는 것 같다. AOP(Aspect Oriented Programiming)

기본적인 쿼리가 아닌 쿼리일 경우,

@Repository
public interface TodoRepository extends JpaRepository<TodoEntity, String> {
    List<TodoEntity> findByUserId(String userId);
}

findByUserId 메서드를 작성하면 스프링 데이터 JPA가 메서드 이름을 파싱해서 'select * from Todo where userId = '{userId}'와 같은 쿼리를 작성해 실시한다. 메서드의 이름은 쿼리, 매개변수는 쿼리의 Where문에 들어갈 값을 의미한다. 더 복잡한 쿼리는 @Query 어노테이션을 이용해 지정할 수 있다.

0개의 댓글