Skip to content

Commit

Permalink
[refactor] querydsl 및 프로젝션 적용 (#155)
Browse files Browse the repository at this point in the history
* [refactor] #154 add required dependencies

* [refactor] #154 create querydsl configuration file

* [refactor] #154 create projection and delete unnecessary dto

* [refactor] #154 change to querydsl

* [refactor] #154 change to querydsl and delete unnecessary code

* [refactor] #154 latecomer query changed to querydsl

* [refactor] #154 delete unnecessary code

* [refactor] #154 change DTO mapping to Projection-based mapping
  • Loading branch information
chaewonni authored Jan 13, 2025
1 parent 8811ba8 commit bc2bea9
Show file tree
Hide file tree
Showing 21 changed files with 226 additions and 162 deletions.
14 changes: 14 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ dependencies {

// Logback Discord Appender
implementation('com.github.napstr:logback-discord-appender:1.0.0')

//Querydsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

tasks.named('test') {
Expand All @@ -85,4 +91,12 @@ task copyYml(type: Copy) {
include "**"
into './src/main/resources'
}
}

def querydslSrcDir = 'src/main/generated'
clean {
delete file(querydslSrcDir)
}
tasks.withType(JavaCompile).configureEach {
options.generatedSourceOutputDirectory = file(querydslSrcDir)
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.kkumulkkum.server.api.meeting.dto.projection;

import java.time.LocalDateTime;

public interface MeetingMetCountProjection {
Long getId();
String getName();
LocalDateTime getCreatedAt();
String getInvitationCode();
Long getMetCount();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.kkumulkkum.server.api.meeting.dto.projection;

public interface MemberProjection {
Long getMemberId();
String getName();
String getProfileImg();
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ public record MeetingDto (
Long metCount,
String invitationCode
) {
public static MeetingDto of(Meeting meeting, Long metCount) {
public static MeetingDto of(Long id, String name, LocalDateTime createdAt, String invitationCode, Long metCount) {
return new MeetingDto(
meeting.getId(),
meeting.getName(),
meeting.getCreatedAt(),
id,
name,
createdAt,
metCount,
meeting.getInvitationCode()
invitationCode
);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package org.kkumulkkum.server.api.meeting.dto.response;

import org.kkumulkkum.server.api.meeting.dto.projection.MemberProjection;

import java.util.List;

public record MembersDto(
int memberCount,
List<MemberDto> members
List<MemberProjection> members
) {
public static MembersDto from(List<MemberDto> members) {
public static MembersDto from(List<MemberProjection> members) {
return new MembersDto(
members.size(),
members
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.kkumulkkum.server.api.meeting.dto.projection.MeetingMetCountProjection;
import org.kkumulkkum.server.api.meeting.dto.projection.MemberProjection;
import org.kkumulkkum.server.domain.meeting.manager.MeetingEditor;
import org.kkumulkkum.server.domain.meeting.manager.MeetingRemover;
import org.kkumulkkum.server.domain.meeting.manager.MeetingRetriever;
Expand All @@ -11,13 +13,11 @@
import org.kkumulkkum.server.domain.member.manager.MemberSaver;
import org.kkumulkkum.server.domain.meeting.Meeting;
import org.kkumulkkum.server.domain.member.Member;
import org.kkumulkkum.server.api.meeting.dto.MeetingMetCountDto;
import org.kkumulkkum.server.api.meeting.dto.request.MeetingCreateDto;
import org.kkumulkkum.server.api.meeting.dto.request.MeetingRegisterDto;
import org.kkumulkkum.server.api.meeting.dto.response.CreatedMeetingDto;
import org.kkumulkkum.server.api.meeting.dto.response.MeetingDto;
import org.kkumulkkum.server.api.meeting.dto.response.MeetingsDto;
import org.kkumulkkum.server.api.meeting.dto.response.MemberDto;
import org.kkumulkkum.server.api.meeting.dto.response.MembersDto;
import org.kkumulkkum.server.common.exception.MeetingException;
import org.kkumulkkum.server.common.exception.code.MeetingErrorCode;
Expand Down Expand Up @@ -97,16 +97,22 @@ public MeetingsDto getMeetings(final Long userId) {

@Transactional(readOnly = true)
public MeetingDto getMeeting(final Long meetingId) {
MeetingMetCountDto meeting = meetingRetriever.findByIdWithMetCount(meetingId);
return MeetingDto.of(meeting.meeting(), meeting.metCount());
MeetingMetCountProjection meeting = meetingRetriever.findByIdWithMetCount(meetingId);
return MeetingDto.of(
meeting.getId(),
meeting.getName(),
meeting.getCreatedAt(),
meeting.getInvitationCode(),
meeting.getMetCount()
);
}

@Transactional(readOnly = true)
public MembersDto getMembers(final Long meetingId, final String exclude, final Long userId) {
List<MemberDto> members = memberRetreiver.findAllByMeetingId(meetingId);
List<MemberProjection> members = memberRetreiver.findAllByMeetingId(meetingId);
if (exclude != null) {
Member authenticatedMember = memberRetreiver.findByMeetingIdAndUserId(meetingId, userId);
members.removeIf(member -> member.memberId().equals(authenticatedMember.getId()));
members.removeIf(member -> member.getMemberId().equals(authenticatedMember.getId()));
}
return MembersDto.from(members);
}
Expand All @@ -130,7 +136,7 @@ public void leaveMeeting(
memberRemover.deleteById(member.getId());

// 모임 내 참여 인원이 전부 탈퇴 or 나가기로 없을 경우(모임 사라지면) 약속도 다 삭제하기
List<MemberDto> remainingMembers = memberRetreiver.findAllByMeetingId(meetingId);
List<MemberProjection> remainingMembers = memberRetreiver.findAllByMeetingId(meetingId);
if(remainingMembers.isEmpty()) {
promiseRemover.deleteByMeetingId(meetingId);
meetingRemover.deleteById(meetingId);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.kkumulkkum.server.api.participant.dto.projection;

import java.time.LocalDateTime;

public record ParticipantStatusUserInfoProjection(
Long participantId,
Long memberId,
String name,
String profileImg,
LocalDateTime preparationAt,
LocalDateTime departureAt,
LocalDateTime arrivalAt,
String state
) {
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package org.kkumulkkum.server.api.participant.dto.response;

import org.kkumulkkum.server.api.meeting.dto.response.MemberDto;
import org.kkumulkkum.server.api.meeting.dto.projection.MemberProjection;

import java.util.List;
public record AvailableParticipantsDto(
List<AvailableParticipantDto> members
) {
public static AvailableParticipantsDto of(List<MemberDto> members, List<Long> participantIds) {
public static AvailableParticipantsDto of(List<MemberProjection> members, List<Long> participantIds) {
List<AvailableParticipantDto> participantDtos = members.stream()
.map(member -> new AvailableParticipantDto(
member.memberId(),
member.name(),
member.profileImg(),
member.getMemberId(),
member.getName(),
member.getProfileImg(),
//모임 내 멤버가 약속 참여중인 멤버 리스트 안에 있으면 true, 아니면 false
participantIds.contains(member.memberId())
participantIds.contains(member.getMemberId())
)).toList();
return new AvailableParticipantsDto(participantDtos);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.kkumulkkum.server.api.meeting.dto.projection.MemberProjection;
import org.kkumulkkum.server.api.participant.dto.projection.ParticipantStatusUserInfoProjection;
import org.kkumulkkum.server.domain.participant.manager.ParticipantEditor;
import org.kkumulkkum.server.domain.participant.manager.ParticipantRemover;
import org.kkumulkkum.server.domain.participant.manager.ParticipantRetriever;
import org.kkumulkkum.server.api.participant.dto.response.*;
import org.kkumulkkum.server.domain.member.Member;
import org.kkumulkkum.server.domain.participant.Participant;
import org.kkumulkkum.server.domain.promise.Promise;
import org.kkumulkkum.server.api.meeting.dto.response.MemberDto;
import org.kkumulkkum.server.api.participant.dto.ParticipantStatusUserInfoDto;
import org.kkumulkkum.server.api.participant.dto.request.PreparationInfoDto;
import org.kkumulkkum.server.common.exception.ParticipantException;
import org.kkumulkkum.server.common.exception.code.ParticipantErrorCode;
Expand All @@ -25,7 +25,6 @@

import java.time.LocalDateTime;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -107,10 +106,16 @@ public PreparationStatusDto getPreparation(

@Transactional(readOnly = true)
public ParticipantsDto getParticipants(final Long promiseId) {
List<ParticipantStatusUserInfoDto> participants = participantRetriever.findAllByPromiseIdWithUserInfo(promiseId);
List<ParticipantStatusUserInfoProjection> participants = participantRetriever.findAllByPromiseIdWithUserInfo(promiseId);

List<ParticipantDto> sortedParticipants = participants.stream()
.map(this::createParticipantDto)
.sorted(Comparator.comparing(ParticipantDto::state, Comparator.comparingInt(this::stateOrder)))
.map(participant -> ParticipantDto.of(
participant.participantId(),
participant.memberId(),
participant.name(),
participant.profileImg(),
participant.state()
))
.collect(Collectors.toList());

return ParticipantsDto.from(sortedParticipants);
Expand All @@ -122,10 +127,10 @@ public AvailableParticipantsDto getAvailableParticipants(
final Long promiseId
) {
//모임 내 멤버 목록
List<MemberDto> members = memberRetreiver.findAllByPromiseId(promiseId);
List<MemberProjection> members = memberRetreiver.findAllByPromiseId(promiseId);
//나 제외
Member authenticatedMember = memberRetreiver.findByUserIdAndPromiseId(userId, promiseId);
members.removeIf(member -> member.memberId().equals(authenticatedMember.getId()));
members.removeIf(member -> member.getMemberId().equals(authenticatedMember.getId()));

//약속에 참여 중인 멤버 id들 가져오기
List<Long> participantIds = participantRetriever.findAllByPromiseId(promiseId).stream()
Expand Down Expand Up @@ -157,13 +162,7 @@ public LateComersDto getLateComers(final Long promiseId) {
List<LateComerDto> lateComers = participantRetriever.findAllLateComersByPromiseId(promiseId);
return LateComersDto.of(
promise,
lateComers.stream()
.map(lateComer -> LateComerDto.of(
lateComer.participantId(),
lateComer.name(),
lateComer.profileImg())
)
.collect(Collectors.toList())
lateComers
);
}

Expand Down Expand Up @@ -210,35 +209,4 @@ private boolean isNull(final LocalDateTime time) {
private boolean isNotNull(final LocalDateTime time) {
return time != null;
}

private ParticipantDto createParticipantDto(final ParticipantStatusUserInfoDto dto) {
String state = determineState(dto.preparationAt(), dto.departureAt(), dto.arrivalAt()); // 상태 결정 로직 호출

return ParticipantDto.of(dto.participantId(), dto.memberId(), dto.name(), dto.profileImg(), state);
}

private String determineState(
final LocalDateTime preparationAt,
final LocalDateTime departureAt,
final LocalDateTime arrivalAt
) {
if (arrivalAt != null) {
return "도착";
} else if (departureAt != null) {
return "이동중";
} else if (preparationAt != null) {
return "준비중";
}
return "꾸물중";
}

private int stateOrder(String state) {
switch(state) {
case "도착": return 1;
case "이동중": return 2;
case "준비중": return 3;
case "꾸물중": return 4;
default: return 5;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.kkumulkkum.server.common.config;

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@RequiredArgsConstructor
public class QuerydslConfig {

private final EntityManager entityManager;

@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.kkumulkkum.server.domain.meeting.manager;

import lombok.RequiredArgsConstructor;
import org.kkumulkkum.server.api.meeting.dto.projection.MeetingMetCountProjection;
import org.kkumulkkum.server.domain.meeting.Meeting;
import org.kkumulkkum.server.api.meeting.dto.MeetingMetCountDto;
import org.kkumulkkum.server.common.exception.MeetingException;
import org.kkumulkkum.server.common.exception.code.MeetingErrorCode;
import org.kkumulkkum.server.domain.meeting.repository.MeetingRepository;
Expand Down Expand Up @@ -34,7 +34,7 @@ public Meeting findById(final Long meetingId) {
.orElseThrow(() -> new MeetingException(MeetingErrorCode.NOT_FOUND_MEETING));
}

public MeetingMetCountDto findByIdWithMetCount(final Long meetingId) {
public MeetingMetCountProjection findByIdWithMetCount(final Long meetingId) {
return meetingRepository.findByIdWithMetCount(meetingId)
.orElseThrow(() -> new MeetingException(MeetingErrorCode.NOT_FOUND_MEETING));
}
Expand Down
Loading

0 comments on commit bc2bea9

Please sign in to comment.