본문 바로가기

JPA5

TIL 230731 : QueryDSL 어렵진 않은데 너무 복잡해 (1. ORM 발전 흐름) QueryDSL로 기존의 코드를 리팩토링 해보는 과제가 있었다. 그런데 명확하게 친절하고 Oneway한 튜토리얼, 가이드는 없었고 무수히 많은 방법들이 혼재되어 오히려 헷갈리게 됐다. 이번 TIL은 이 혼재된 정보들을 정리하며 하나씩 체화해보려 정리해나가는 글이다. 어떤 것들이 혼란스럽게 했나 QueryDSL을 쓰는 코드가 뭔데? (장점, 단점, 쓰는 문법, 세팅법) QClass Predicate QueryDslPredicateExecutor JPQL, RAW JPA, jdbc, DAO, Mybatis, ORM, ... 미묘하게 다른 용어들과 기술들. 몇가지씩 그룹해서 하나씩 아래 정리해본다. ORM의 발전 흐름 1. DB가 생겼다 : 서버를 개발하는 사람들은 DB에 접근하려고 코드를 짜기 시작했다. 하.. 2023. 8. 1.
TIL 230705 : PK FK N:M 중간테이블 매핑하며 (해시태그 게시글 작성) 작업내용 오른쪽과 같이 Tag(HashTag에서 변경 : Post가 N:M 관계여서 중간에 받아주는 TagPostTable 중간테이블을 만들었다. 정리하자면 Post랑 Tag의 외래키를 갖는 TagPostTable Entity를 하나 더 만들고 맵핑하였다. 그러고 어김 없이 오류가 났는데 그로인해 배운 원칙을 정리하자면 아래와 같다. 배운점 1. FK를 가지고 있는 객체를 Repository에 저장할 때는 FK로 매핑된 객체들이 PK를 가지고 있어야 한다. 쉽게 말해, Tag와 Post객체의 각 PK를 FK로 가지는 TagPostTable 객체를 만들고 DB에 save할때 각 객체들이 PK값을 가지고 있어야 한다. tagPostTable 객체를 DB에 저장하기 전이다. 아직 id(PK)값은 null이고,.. 2023. 7. 6.
TIL 230703 : JPA Buddy라는 것이 이 세상에 있었다 JPA Buddy를 알고 계셨나요? 저는 오늘 JPA Buddy라는 발음 자체를 처음으로 들었습니다. 문제 다른 프로젝트에서 쓰여진 코드를 가져오다 쿼리메소드에서 오류가 났다. 해당 Repository를 다루는 Entity인 Post에는 modifiedAt이라는 멤버가 없었다. 다행히 오류 자체는 발견하고 해결도 쉬웠다. 다만, 메소드의 이름자체만으로도 작동이 가능한 JpaRepository이지만 위와 같이 단순한 오탈자에 의해 오류를 범할 수도 있다는 생각이 들었다. 관련해서 매니져님께서는 JPA Buddy라는 플러그인을 알려주셨고, 이러한 플러그인의 존재 자체에 놀랐다. JPA Buddy 세팅 - 플러그인 - 마켓플레이스에서 검색으로 쉽게 찾을 수 있었다. 설치이후 ~~repository하고 도트 연.. 2023. 7. 3.
TIL 230630 : (이어서) Entity반환시 문제. (Dto의 중요성) https://thiswooin.tistory.com/39 TIL 230629 : List to JSON 객체 반환시 오류 (jackson) 오늘도 어김없이 이해할 수 없는 타이밍에 찾아오는 오류. 단순히 GET메소드로 포스트ResponseDto를 객체로 리턴받는 건데, 하나하나 할때는 되는데 전체를 하면 안 된다. 유독 13번 Post만 GET이 안된 thiswooin.tistory.com 처음으로, 해결 못 하고 TIL을 마쳤던 어제의 오류, 아침부터 다른 방법들로 시도해보고 했는데 겨우 해결했다.... 문제 Post에는 Reply가 OneToMany로 List의 형태로 담겨있다. PostResponseDto에도 List를 추가했다. 결과적으로, Reply가 있는 Post를 Client에 반환하면 오.. 2023. 6. 30.
TIL 230628 : mappedBy 적응해보기 양방향 관계의 1:1 의 두 Entity 양방향일때, mappedBy 옵션으로 외래키의 주인을 지정해줘야한다. 위 예에서는 Food에서 외래키를 갖는 것으로 설정되어있다. Food에다가 외래키를 테이블 칼럼으로 설정하고 싶은곳에 @JoinColumn하고 Column이름을 설정해준다. 그리고 그 밑에 외래키로 받아올 객체를 선언해준다. 양방향의 경우 반대 Entity에는, 다시 말해 외래키가 없는 Entity에는 mappedBy를 써주고 외래키의 주인에 있는 변수명을 뒤에 적어준다. 본인 클래스의 이름이 아닌 외래키의 주인의 변수명을 따르는 것. User를 통해 Food 조회해보기 외래키의 주인은 Food. User를 통해서도 조회가 가능한지 확인해보자. 유저Repository에서 그냥 한번 가져와보자. .. 2023. 6. 28.