JPA
-
[QueryDSL] Entity 쿼리 로직의 데이터베이스 접근 횟수를 최소화해 리소스 생성 동작 성능 개선하기Today I Learned 2023. 6. 23. 01:50
최종보스 프로젝트를 진행하면서 코드를 구현하는 데 가장 많은 시간을 써야 했고, 가장 마지막까지 방치했던 부분은 목록과 관련된 리소스를 반환하는 로직이었다. 하나의 리소스를 조합하는 데 여러 Entity들이 필요한 동작이 있었다. 경기 목록이나 검색 결과와 같은 리소스를 반환하는 식의 동작들이었는데, 본 글에서는 검색 결과 리소스를 구성하는 예시를 살펴보려 한다. 기존에는 경기 목록을 구성하는 리소스 하나를 생성하기 위해 다음의 Entity들이 필요했다. - Post 하나 - Place 하나 - Post, Place와 연결된 Game 하나 - Game과 연결된 Register 여러 개 경기에 참가하는 사용자를 키워드로 경기 목록을 검색하는 Service는 다음과 같은 로직으로 작성되어 있었다. 비록 Po..
-
[Java][JPA] 추상 클래스 개념을 적용해 알림 객체 설계 개선하기Today I Learned 2023. 6. 17. 18:36
로버트 C. 마틴이 언급한 객체지향 설계를 위한 5대 원칙 중 하나로 개방-폐쇄 원칙(Open-closed Principle)이 있다. '소프트웨어의 구성 요소는 확장에는 열려 있고, 변경에는 닫혀 있어야 한다'는 원칙으로, 간단히 이야기하자면 소프트웨어의 특정 모듈의 기능이 추가되어야 할 경우, 기존에 작성한 코드를 가급적 변경하지 않으면서 기능을 추가할 수 있어야 한다는 것이다. 기존 프로젝트의 알림 구조 프로젝트 애플리케이션에는 '알림'과 관련된 기능들과 Entity들이 존재했다. 특정 기능들을 수행했을 때 (이를테면 어떤 경기에 참가신청했다던가, 참가신청이 작성자에 의해 수락되었다던가와 같은 것들) 그와 관련된 정보를 담은 Notice 객체를 생성해 저장하는 부가적인 기능이었다. 본래 알림 기능을..
-
JPA에서 QueryDSL을 사용해 Join이 필요한 쿼리 수행하기Today I Learned 2023. 5. 4. 02:11
JPA를 이용해 두 개 이상의 테이블을 Join한 뒤, 조건에 맞는 Column을 쿼리하려면 쿼리 메서드를 어떻게 작성해야 할까? 이전에 개인 프로젝트를 진행할 때 모든 채팅 메시지 Entity 중 특정 채팅방의 입, 퇴장 메시지만을 선별해 쿼리해야 하는 상황이 있었는데, 그때는 어떻게든 조건을 만족시키는 쿼리 메서드 네이밍을 하거나, JPQL 문법에 맞는 쿼리문을 작성해 직접 쿼리를 정의하는 방법을 사용했었다. 어떻게든 만들어낸 쿼리 메서드를 살펴보자. List findAllByRoomIdAndTypeOrRoomIdAndType(Long roomId, ChattingMessageType enter, Long sameRoomId, ChattingMessageType quit); 한 눈에 봐도 명칭이 너무..
-
@OneToMany와 @ManyToOne으로 Entity 객체가 서로를 볼 수 있게 하기카테고리 없음 2022. 10. 31. 20:54
이틀 전에 til로 작성했던 JPA 환경 하에서 @ManyToMany 관계를 갖는 모델 정의를 지양하게 됨에 따라 객체 간의 관계를 나타내기 위해 간단하게만 살펴보았던 @OneToMany, @ManyToOne 사용법을 다시 살펴보게 되었다. @OneToMany와 @ManyToOne은 Entity 객체들끼리 서로의 개별 id를 통해 서로의 인스턴스를 참조할 수 있게 하는 어노테이션이다. 한 쪽 객체에서 @OneToMany나 @ManyToOne 어노테이션만을 부여하여 한쪽에서만 반대편을 참조할 수 있는 단방향 참조가 있고, 두 객체가 @OneToMany와 @ManyToOne으로 서로를 바라볼 수 있는 양방향 참조가 있다. @ManyToOne (단방향) @ManyToOne이 선언되는 Entity 객체 여럿이 ..