프레임워크/Spring

[Spring] CrudRepository를 이용한 table join

pythaac 2022. 1. 10. 19:56

  지금까지 Spring boot에서 CrudRepository를 사용할 때 다음과 같은 루틴으로 사용하였습니다.

  1. DB Table과 일치하는 DAO를 만든다.
  2. 해당 객체가 사용되는 CrudRepository Interface를 작성한다.

그런데 join된 Table에 대한 정보를 읽어와야하는 일이 생겼습니다. 스택오버플로우에서 아래와 같은 글을 발견하여 정리해봅니다.

https://stackoverflow.com/questions/43891571/crudrepository-join-single-field-from-other-table-to-entity-as-readonly

 

Crudrepository / Join single field from other table to entity as readonly

Bear with me for any mistakes I make, as this is my first question here. I have a database with two tables, one table called: PERSON with the following entity: @Entity class Person { @Id

stackoverflow.com

 

1. Join할 DAO에 @ManyToOne 정의

  TistoryCategory라는 DAO와 Category라는 DAO의 join된 결과를 얻으려합니다. 두 DAO는 "cat_id"라는 column member를 공유하고 있으며, cat_id를 통해 join할 예정입니다.

  1. @ManyToOne 추가
  2. @JoinColumn(name="cat_id") 추가
  3. Category(join할 DAO) 추가

 

2. Join 이후 형식에 맞는 DAO 정의

  Join이 일어난 후에 만들어질 Table과 일치하는 DAO를 정의하고, 생성자를 정의해줍니다. Lombok의 @Data 어노테이션으로 자동 생성되는 생성자로 처리할 수 없습니다. 이 DAO를 TistoryCategoryAll이라는 이름으로 정의하였습니다.

  1. Join 후 Table에 대한 DAO 정의
  2. 정의된 DAO의 생성자 작성

 

3. @ManyToOne을 추가한 DAO의 Repository에 메서드 추가

  저는 TistoryCategory라는 DAO에 @ManyToOne 어노테이션을 추가하였고, 위 메서드를 TistoryCategoryRepository에 추가하였습니다. @Query 어노테이션으로 SQL 쿼리를 작성하여 메서드를 추가하면 사용할 수 있습니다. 이 때 쿼리문으로 "select new"와 사용할 DAO를 사용하며, 메서드의 파라미터를 사용하고 싶을 경우 위와 같이 @Param 어노테이션으로 파라미터 이름을 지정해주고 콜론(:)으로 해당 값을 읽어 사용할 수 있습니다.

  1. @ManyToOne을 추가한 DAO의 Repository에 메서드 추가
  2. @Query로 쿼리 작성
    - select new 사용
    - 정의한 DAO 사용
  3. 메서드 파라미터를 쿼리에 사용시
    - 파라미터에 @Param("blog_name")과 같이 어노테이션 사용
    - :blog_name으로 쿼리에 사용

 

SELECT NEW

  new라는게 SQL에 있었나 싶어 찾아봤는데 JPQL 문법이라고 합니다. JAVA 경험이 부족하여 query문에 생성자를 사용하는 것도 신기하네요.