지금까지 Spring boot에서 CrudRepository를 사용할 때 다음과 같은 루틴으로 사용하였습니다.
- DB Table과 일치하는 DAO를 만든다.
- 해당 객체가 사용되는 CrudRepository Interface를 작성한다.
그런데 join된 Table에 대한 정보를 읽어와야하는 일이 생겼습니다. 스택오버플로우에서 아래와 같은 글을 발견하여 정리해봅니다.
1. Join할 DAO에 @ManyToOne 정의
TistoryCategory라는 DAO와 Category라는 DAO의 join된 결과를 얻으려합니다. 두 DAO는 "cat_id"라는 column member를 공유하고 있으며, cat_id를 통해 join할 예정입니다.
- @ManyToOne 추가
- @JoinColumn(name="cat_id") 추가
- Category(join할 DAO) 추가
2. Join 이후 형식에 맞는 DAO 정의
Join이 일어난 후에 만들어질 Table과 일치하는 DAO를 정의하고, 생성자를 정의해줍니다. Lombok의 @Data 어노테이션으로 자동 생성되는 생성자로 처리할 수 없습니다. 이 DAO를 TistoryCategoryAll이라는 이름으로 정의하였습니다.
- Join 후 Table에 대한 DAO 정의
- 정의된 DAO의 생성자 작성
3. @ManyToOne을 추가한 DAO의 Repository에 메서드 추가
저는 TistoryCategory라는 DAO에 @ManyToOne 어노테이션을 추가하였고, 위 메서드를 TistoryCategoryRepository에 추가하였습니다. @Query 어노테이션으로 SQL 쿼리를 작성하여 메서드를 추가하면 사용할 수 있습니다. 이 때 쿼리문으로 "select new"와 사용할 DAO를 사용하며, 메서드의 파라미터를 사용하고 싶을 경우 위와 같이 @Param 어노테이션으로 파라미터 이름을 지정해주고 콜론(:)으로 해당 값을 읽어 사용할 수 있습니다.
- @ManyToOne을 추가한 DAO의 Repository에 메서드 추가
- @Query로 쿼리 작성
- select new 사용
- 정의한 DAO 사용 - 메서드 파라미터를 쿼리에 사용시
- 파라미터에 @Param("blog_name")과 같이 어노테이션 사용
- :blog_name으로 쿼리에 사용
SELECT NEW
new라는게 SQL에 있었나 싶어 찾아봤는데 JPQL 문법이라고 합니다. JAVA 경험이 부족하여 query문에 생성자를 사용하는 것도 신기하네요.
'프레임워크 > Spring' 카테고리의 다른 글
[Spring] CrudRepository의 save vs saveAll (0) | 2022.01.15 |
---|---|
[Spring] 사용하는 객체를 Table로 자동 생성 (0) | 2022.01.10 |
[Spring] HTTP request 보내기 (RestTemplate) (0) | 2022.01.06 |
[Spring] CrudRepository findById가 안될 때 (0) | 2022.01.04 |
[Spring] IntelliJ에서 import에 빨간 불일 때 (0) | 2022.01.04 |