Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[refactor] querydsl 및 프로젝션 적용 #155

Merged
merged 8 commits into from
Jan 13, 2025
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;
Comment on lines -213 to -239
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DB에서 처리돼서 오는거긴 하지만 보이는 코드는 깔끔해졌네용

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 기존 애플리케이션으로 가져와 처리하는 것보다 DB에서 처리하는 게 성능적인 이점과 코드 가독성 면에서 더 나은 방식이라고 판단하여 수정해보았습니다!

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