Back End/Spring Data JPA
-
[Spring Data JPA] DB 예약어 처리 (You have an error in your SQL syntax)Back End/Spring Data JPA 2022. 12. 9. 18:25
실 DB 에 JPA 를 붙이다보면 가끔 마주하는 현상이다. 에러 메세지도 모호하기 그저 없다. SQL 문법이 틀렸다, SQL을 실행할 수 없다. 컬럼이 없다. 등등 차라리 Keyword Constraint 에 걸렸다고 해주지.... 무튼 모호한 에러메세지라면 한번 쯤 DB Keyword 에 걸리지 않았는지 생각해보자. DB 예약어(Keyword) 를 위반한 엔티티 @Entity class UserAttendanceEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(columnDefinition = "INT") val id: Long? = null @Column(columnDefinition = "INT") val userIdx..
-
[Spring Data JPA] 페이징 page=1 부터 시작하기Back End/Spring Data JPA 2022. 9. 25. 20:37
Pageable 의 page Pageable 의 page 는 0 부터 시작한다. 아래의 application.yml 파일에 옵션을 추가하여 클라이언트에서 ?page=1 을 호출할 시 limit 0, {size} 쿼리가 나가도록 수정한다. spring: data: web: pageable: one-indexed-parameters: true Slice 객체의 number 필드 JPA 레파지토리에서 반환형을 Slice 로 받을 경우 반환되는 객체의 number 필드가 몇 번째 페이지를 쿼리했는지에 대한 정보를 담고 있다. 위의 yml 파일을 수정해주어도 해당 number 필드는 0부터 시작하고 있다. 이를 따로 Custom Response 를 만들어 반환해주어야 한다. (클라이언트가 원할 시) data cl..
-
[Spring JPA] 중간테이블 (조인테이블) 이 있을 때 연관관계 매핑Back End/Spring Data JPA 2022. 8. 28. 22:39
MyBatis 로만 구성된 환경에 JPA 를 적용시키면서 중간테이블이 있는 구조를 만나게 되었다. A B C 의 참조관계인데 실제로 사용할 테이블은 A,C 이며 B는 참조용 테이블일 뿐 이었다. A,B,C 모두 엔티티로 만들고 연관관계를 매핑하는 방법은 너무 기계적이고 쓸모없어 보였다. 그래서 서칭을 하다가 좋은 포스팅을 찾게되었고, 이를 활용한 방법을 기록하고자 한다. @JoinTable (kotlin) @Entity class TableA { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(columnDefinition = "INT") var id: Long? = null @ManyToOne(fetch = FetchType.LAZY) ..
-
[Spring JPA] @MappedSuperClass 사용시 주의할 점Back End/Spring Data JPA 2022. 3. 4. 22:03
필자는 처음 JPA를 패스트캠퍼스에서 간단하게 배웠다. 그 중 @MappedSuperClass 가 있었는데 누가봐도 상속을 이용하여 생산성 좋은 코드를 만들 수 있는 매우매우 좋은 기능이었다. 강의의 예제에서 @MappedSuperClass 가 붙은 추상클래스에 엔티티의 ID 필드를 작성하셔서 사이드프로젝트 초기에 당연히 추상클래스 필드에 ID필드를 넣었다. 이로 인해 매우 귀찮았던 썰을 풀어본다. * 참고로 개인적으로 JPA 스터디에 참여하면서 영한님 강의를 수강하게 되었는데, 영한님은 내가 겪은 사항을 미리 경고하시고 ID필드를 넣지 말기를 권고 하셨다. (호엥...) 한국인은 본론 먼저! @MappedSuperClass 의 추상클래스에 @Id 필드를 절대 넣지말자. @Id를 가진 필드를 넣게 되면 ..
-
save() 메서드 호출 시, select 쿼리가 하나 더 나가요 ㅠㅠ...Back End/Spring Data JPA 2022. 2. 17. 12:25
# 발생 기원 1. 엔티티의 PK 를 직접할당하고 save() 호출 시 목격 됨 PK 생성을 DB에 위임하지 않았을 시 발생하는 문제와 해결 (feat.복합키) · Issue #5 · Sun26-Avrin/study-sp PK 생성을 DB에 위임하지 않았을 시 목격되는 현상 엔티티를 생성하고 insert를 위한 로직에서 select쿼리가 하나 더 호출 되는 현상 이러한 현상의 이유는? 프록시객체는 PK를 기반으로 움직이며, PK github.com # 이유 em.persist() 가 아닌 em.merge()가 호출되기 때문 save() 메서드의 내부 코드를 보면 entityInformation.isNew(이하 isNew) 로 persist와 merge로 분기함. 엔티티의 PK가 null 이거나 초기화 값..
-
[Spring JPA] JPA, JPQL 의 조인 시 주의할 점 (Outer, Inner, Fetch)Back End/Spring Data JPA 2022. 1. 29. 13:47
JPQL 은 EntityManager 의 관리를 받아 SQL 쿼리를 번역하여 날리는 번역기 정도라고 생각했다. 공용어에서 각 DB마다의 방언으로 바꾸어주는데, 이와 동시에 EntityManger의 관리를 받으므로, 하이버네이트 특유의 쿼리동작과 영속성관리를 받는다. 진행하는 개인프로젝트에서는 쿼리가 맘에안들면 QueryDSL로 작업을 했고, 쓸데없는 JOIN문이 최대한 발생하지 않게끔 엔티티를 설계했기 때문에 JPA Query Method를 사용해도 이러한 현상을 목격하지 못했었는데 김영한님의 강의를 보다가 내가 겪어보지 못한 신기한 현상에 대한 설명을 하시는 것을 보고 기록으로 남겨두고자 포스팅한다. 사실 JPQL의 조인이라기 보다는 JPA의 조인현상이라고 보는게 맞을 것 같다. SQL 과 ORM의 간..
-
[Spring JPA] How to retrieve Only SuperClass from a class hierarchy.Back End/Spring Data JPA 2022. 1. 28. 18:47
StackOverFlow 에서 아무도 해결 못했던데...! 제가 해냈습니다 여러분...! ✌️✌️✌️ I see many posts lead us to @Polymorphism(PolymorphismType.EXPLICIT) and using @Customizer from EclipseLink. I could confidently tell you that those approach wouldn't work because I tested it already. And I guess many people solved it with native query but if you want to know the way not using it, read my post. There are 2 ways to select o..
-
[Spring JPA] Interface-Based Projection doesn't work.Back End/Spring Data JPA 2022. 1. 28. 18:14
The reason why interface-based-projection doesn't work is upto Spring-Boot version. I found it works well under version 2.6.1 and doesn't work in 2.6.3. And still, Class-Based Projection needs convertor. Hope it'd be helpful :D