JPA - Entity, Repositoty

kimki·2022년 4월 11일
0

Spring ( Boot ) / Java

목록 보기
3/5
💡 JPA는 반복해서 Query를 보내 ResultSet을 파싱(**ORM**) 해야 하는 개발자의 노고를 덜어준다.

JPA는 스펙이다.
‘JPA의 구현을 위해 이런 기능들을 작성해라’ 라고 되어 있고, 명시한대로 작성 후 나머지 내부의 세부 구현은 구현자의 마음이다.

이 스펙을 구현하는 구현자를 JPA Provider라고 부르며, 대표로 Hibernate가 있다.

SpringDataJPA는 JPA +@ 로써, JPA를 추상화하여 쉽게 쓰기 위한 스프링 프로젝트이다.
즉, 사용하기 쉬운 인터페이스를 제공해 주는데, 대표로는 JpaRepository가 있다.

Entity 정의


@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity // 해당 클래스를 Entity로 지정
@Table(name = "Todo") // 생성될 DB 테이블 이름 지정
public class TodoEntity {
    @Id // PK 명시
    @GeneratedValue(generator = "system-uuid") // 자동으로 생성할 Generator가 무엇인지
    @GenericGenerator(name="system-uuid", strategy = "uuid") // PK값 커스텀 생성기
    private String id;
    private String userId;
    private String title;
    private boolean done;
}
  • 기본 Generator 에는 INCREMENTAL , SEQUENCE , IDENTITY 등이 있음
  • 여기서는 커스텀 Generator를 사용

Repository

@Repository
public interface TodoRepository extends JpaRepository<TodoEntity, String> {
		// 직접 쿼리 작성. ?1은 메서드 매개변수의 위치
		@Query("select * from Todo t where t.userId = ?1")
    List<TodoEntity> findByUserId( String userId);
}
  • JpaRepository는 인터페이스다.
  • 이를 사용하기 위해 Extends 한다.
  • 이때 JpaRepository<T, ID> Generic Type을 받는다. <테이블에 매핑될 Entity, PK의 Type>
  • @Repository 또한 @Service처럼 @Component 기능 + 이름으로 명시하는 역할을 한다.
💡 **JpaRepository**는 **인터페이스**인데 구현체가 없는 것처럼 보인다. 이는 [**MethodInterceptor**](https://javacan.tistory.com/tag/MethodInterceptor)라는 AOP 인터페이스를 사용하여, JpaRepository의 메서드를 부를 때마다 메서드 콜을 가로채 간다. ( Spring AOP APIs ). 이후 메서드 이름을 확인하고 **메서드 이름을 기반으로 쿼리를 작성**한다.
profile
개발 자라는 사람.

0개의 댓글