[웹 스터디] 퍼시스트턴스 레이어 : 스프링 데이터 JPA

박준수·2022년 11월 25일
0

[웹 스터디]

목록 보기
11/19

TodoEntity

보통 데이터베이스 테이블마다 그에 상응하는 엔티티 클래스가 존재한다.
Todo테이블 --> TodoEntity 상응

  • @Entity : 엔티티 클래스임을 명시
    • @Entity("TodoEntity")처럼 매개 변수를 넣어 줄 수도 있다.
  • @Table(name = "Todo") : 데이터베이스의 Todo 테이블에 매핑된다는 뜻.
    • 만약 @Table을 추가하지 않거나, 추가해도 name을 명시하지 않는 경우 => @Entity의 이름을 테이블 이름으로 간주한다.
      @Entity에 이름을 지정하지 않는 경우 => 클래스의 이름을 테이블 이름으로 간주한다.
  • @Id : 기본키가 될 필드에 지정한다. id가 기본 키이므로 id 필드 위에 @Id를 추가한다.
  • @GeneratedValue는 ID를 자동으로 생성하겠다는 뜻이다.
    • 이때 매개변수인 generator로 어떻게 ID를 생성할지 지정할 수 있다.
    • system-uuid라는 generator를 사용한다.
    • system-uuid는 @GenericGenerator에 정의된 generator의 이름이다.
  • @GenericGenerator는 Hibernate(ORM 프레임워크)이 제공하는 기본 Generator가 아닌 나만의 Generator를 사용하고 싶을 때 이용한다.
    • 우리는 문자열 형태의 UUID를 사용하기 위해 커스텀 generator를 만드는 것이다.
    • UUID를 사용하기 위해 GenericGenerator의 매개변수 strategy로 "uuid"를 넘겼다.
    • uuid를 사용하는 "system-uuid"라는 이름의 GenericGenerator를 만들었고, 이 Generator는 @GeneratedValue가 참조해 사용한다.

TodoRepository

JpaRepository<T,ID>

  • 첫 번쨰 매개변수인 T는 테이블에 매핑할 엔티티 클래스
  • ID는 이 엔티티의 기본 키 타입이다. TodoEntity의 기본 키인 id의 타입인 String
    -@Repository : Component 어노테이션의 특별 케이스이므로 스프링이 관리한다.
  • JpaRepository는 기본적으로 데이터베이스 오퍼레이션 인터페이스를 제공한다. (save, findById, findAll 등등)

여기서 잠깐!!!!

TodoRepository는 인터페이스인데 어떻게 TodoRepository를 구현하는 클래스가 없이도 동작하는 걸까? 추상 클래스나 인터페이스는 반드시 구현하는 클래스가 있어야 사용 가능한데...?

간단히 설명하면 스프링은 MethodInterceptor라는 AOP 인터페이스를 이용한다. MethodInterceptor는 우리가 JpaRepository의 메서드를 부를 때마다 이 메서드 콜을 가로채 간다. 가로챈 메서드의 메서드 이름을 확인하고, 메서드 이름을 기반으로 쿼리를 작성한다.

그렇다면 기본적인 쿼리가 아닌 쿼리는 어떻게 짤까?

이 메서드를 작성하면 스프링 데이터 JPA가 메서드 이름을 파싱해서 SELECT * FROM Todo WHERE userId='{userId}'와 같은 쿼리를 작성해 실행한다.

결론 :
퍼시스턴스 레이어는 데이터베이스와 통신하며 필요한 쿼리를 날리고, 해석해 엔티티 오브젝트로 변환해 주는 역할을 한다.

profile
방구석개발자

0개의 댓글