Skip to content

Commit

Permalink
[refactor] #154 change DTO mapping to Projection-based mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
chaewonni committed Jan 3, 2025
1 parent 485b07d commit f025679
Show file tree
Hide file tree
Showing 13 changed files with 66 additions and 62 deletions.

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
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,6 +2,7 @@

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;
Expand All @@ -10,7 +11,6 @@
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.request.PreparationInfoDto;
import org.kkumulkkum.server.common.exception.ParticipantException;
import org.kkumulkkum.server.common.exception.code.ParticipantErrorCode;
Expand Down Expand Up @@ -127,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
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
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.kkumulkkum.server.domain.meeting.repository;

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.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

Expand All @@ -18,11 +18,13 @@ public interface MeetingRepository extends JpaRepository<Meeting, Long> {
List<Meeting> findAllByUserId(Long userId);

@Query("""
SELECT new org.kkumulkkum.server.api.meeting.dto.MeetingMetCountDto (m, COUNT(p.id))
SELECT
m.id as id, m.name as name, m.createdAt as createdAt,
m.invitationCode as invitationCode, COUNT(p.id) as metCount
FROM Meeting m
LEFT JOIN Promise p ON p.meeting.id = m.id AND p.isCompleted = true
WHERE m.id = :meetingId
GROUP BY m.id """)
Optional<MeetingMetCountDto> findByIdWithMetCount(Long meetingId);
Optional<MeetingMetCountProjection> findByIdWithMetCount(Long meetingId);

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.kkumulkkum.server.domain.member.manager;

import lombok.RequiredArgsConstructor;
import org.kkumulkkum.server.api.meeting.dto.projection.MemberProjection;
import org.kkumulkkum.server.domain.member.Member;
import org.kkumulkkum.server.api.meeting.dto.response.MemberDto;
import org.kkumulkkum.server.common.exception.MemberException;
import org.kkumulkkum.server.common.exception.code.MemberErrorCode;
import org.kkumulkkum.server.domain.member.repository.MemberRepository;
Expand All @@ -28,7 +28,7 @@ public boolean existsByMeetingIdAndUserId(
return memberRepository.existsByMeetingIdAndUserId(meetingId, userId);
}

public List<MemberDto> findAllByMeetingId(final Long meetingId) {
public List<MemberProjection> findAllByMeetingId(final Long meetingId) {
return memberRepository.findAllByMeetingId(meetingId);
}

Expand All @@ -54,7 +54,7 @@ public Member findByUserIdAndPromiseId(
return memberRepository.findByUserIdAndPromiseId(userId, promiseId);
}

public List<MemberDto> findAllByPromiseId(final Long promiseId) {
public List<MemberProjection> findAllByPromiseId(final Long promiseId) {
return memberRepository.findAllByPromiseId(promiseId);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.kkumulkkum.server.domain.member.repository;

import org.kkumulkkum.server.api.meeting.dto.projection.MemberProjection;
import org.kkumulkkum.server.domain.member.Member;
import org.kkumulkkum.server.api.meeting.dto.response.MemberDto;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

Expand All @@ -15,12 +15,12 @@ public interface MemberRepository extends JpaRepository<Member, Long> {
boolean existsByMeetingIdAndUserId(Long meetingId, Long userId);

@Query("""
SELECT new org.kkumulkkum.server.api.meeting.dto.response.MemberDto
(m.id, ui.name, ui.profileImg)
SELECT
m.id as memberId, ui.name as name, ui.profileImg as profileImg
FROM Member m
JOIN FETCH UserInfo ui ON m.user.id = ui.user.id
WHERE m.meeting.id = :meetingId""")
List<MemberDto> findAllByMeetingId(Long meetingId);
List<MemberProjection> findAllByMeetingId(Long meetingId);

@Query("""
SELECT CASE WHEN EXISTS (
Expand Down Expand Up @@ -51,12 +51,12 @@ SELECT CASE WHEN EXISTS (
Member findByUserIdAndPromiseId(Long userId, Long promiseId);

@Query("""
SELECT new org.kkumulkkum.server.api.meeting.dto.response.MemberDto
(m.id, ui.name, ui.profileImg)
SELECT
m.id as memberId, ui.name as name, ui.profileImg as profileImg
FROM Member m
JOIN m.meeting mt
JOIN FETCH UserInfo ui ON m.user.id = ui.user.id
JOIN Promise p ON p.meeting.id = mt.id
WHERE p.id = :promiseId""")
List<MemberDto> findAllByPromiseId(Long promiseId);
List<MemberProjection> findAllByPromiseId(Long promiseId);
}

0 comments on commit f025679

Please sign in to comment.