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

[✨ feat] 약속 가능 시간 조회 API 구현 #65

Merged
merged 41 commits into from
Feb 21, 2025
Merged
Show file tree
Hide file tree
Changes from 37 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
d5a8326
refactor(AppointmentSaveAvailableTimesService) : request DTO 네이밍 변경
jsoonworld Feb 19, 2025
dea5238
refactor(AppointmentSaveAvailableTimesService) : 요청 DTO 네이밍 변경 및 서비스 …
jsoonworld Feb 19, 2025
cd124c6
refactor(AppointmentMemberAvailableTimeRequest) : 요청 DTO 네이밍 변경
jsoonworld Feb 19, 2025
6cf5a94
refactor(AppointmentMemberAvailableTimesRequest) : 요청 DTO 네이밍 변경
jsoonworld Feb 19, 2025
e5d8d2e
refactor(AppointmentMemberSaveAvailableTimesServiceImpl) : 요청 DTO 네이밍…
jsoonworld Feb 19, 2025
4eb719e
refactor(AppointmentCreateServiceImpl) : 약속 호스트 선택 시간을 저장하는 로직 구현
jsoonworld Feb 20, 2025
765fa86
feat(AppointmentHostSelectionTime) : 약속 호스트 선택 시간 엔티티 구현
jsoonworld Feb 20, 2025
328157b
feat(AppointmentHostSelectionTimeRepository) : 약속 호스트 선택 시간 저장소 추가
jsoonworld Feb 20, 2025
28db663
refactor(AppointmentHostSelectionTimes) : 생성자 파라미터 추가
jsoonworld Feb 20, 2025
b9e592c
refactor(AppointmentCreateRequest) : 약속 호스트 선택 시간 필드 타입 변경
jsoonworld Feb 20, 2025
dbae3b6
feat(AppointmentHostSelectionTimeRequest) : 약속 호스트 선택 시간 요청 DTO 구현
jsoonworld Feb 20, 2025
9c05735
refactor(AppointmentMemberAvailableTime) : 엔티티 네이밍 변경
jsoonworld Feb 20, 2025
64751c6
refactor(AppointmentMemberAvailableTimesRepository) : 인터페이스 네이밍 변경
jsoonworld Feb 20, 2025
2182261
refactor(AppointmentMemberRepository) : 패키지 구조 정리 및 불필요한 디렉터리 제거
jsoonworld Feb 20, 2025
11735d7
refactor(AppointmentMemberRepositoryCustom) : 패키지 구조 변경 및 메서드 추가
jsoonworld Feb 20, 2025
181ef2c
refactor(AppointmentMemberRepositoryImpl) : 패키지 구조 변경 및 기능 개선
jsoonworld Feb 20, 2025
6f458a0
refactor(GroupRepositoryTest) : 패키지 구조 정리 및 불필요한 중복 제거
jsoonworld Feb 20, 2025
28c97c1
refactor(AppointmentMemberController) : 가용 시간 저장 요청 DTO 변경 및 서비스 수정
jsoonworld Feb 20, 2025
d30016b
feat(AppointmentMemberRetrieveAvailableTimesService) : 약속 멤버 가용 시간 조회…
jsoonworld Feb 20, 2025
c97f528
feat(AppointmentMemberRetrieveAvailableTimesServiceImpl) : 약속 멤버 가용 시…
jsoonworld Feb 20, 2025
6f03f76
refactor(AppointmentMemberSaveAvailableTimesServiceImpl) : 가용 시간 엔티티 …
jsoonworld Feb 20, 2025
c51a751
feat(AppointmentMemberSuccessCode) : 약속 멤버 가용 시간 조회 성공 코드 작성
jsoonworld Feb 20, 2025
dcaa6bf
feat(AppointmentMember) : 약속 멤버의 가용 시간 설정 상태 추가 및 업데이트 기능 구현
jsoonworld Feb 20, 2025
97afb08
feat(AppointmentHostSelectionTimeResponse) : 약속 호스트 선택 시간 응답 DTO 추가
jsoonworld Feb 20, 2025
31dba7b
feat(AppointmentHostSelectionTimesResponse) : 약속 호스트 선택 시간 목록 응답 DTO 추가
jsoonworld Feb 20, 2025
4eb1f36
feat(AppointmentMemberAvailableTimeResponse) : 약속 멤버 가용 시간 응답 DTO 추가
jsoonworld Feb 20, 2025
42448b1
feat(AppointmentMemberAvailableTimesResponse) : 약속 멤버 가용 시간 목록 응답 DTO 추가
jsoonworld Feb 20, 2025
ebaab4c
feat(AppointmentMemberInfoResponse) : 약속 멤버 정보 응답 DTO 추가
jsoonworld Feb 20, 2025
5714545
feat(AppointmentMembersAvailableTimesResponse) : 약속 멤버 가용 시간 전체 응답 DT…
jsoonworld Feb 20, 2025
1bb0b7a
feat(AppointmentScheduleResponse) : 약속 일정 응답 DTO 구현
jsoonworld Feb 20, 2025
91b6383
refactor(NoostakApplication) : 행 제거
jsoonworld Feb 20, 2025
95083bb
refactor(AppointmentCreateServiceImplTest) : 약속 호스트 선택 시간 DTO 적용 및 테스…
jsoonworld Feb 20, 2025
070e82c
test(AppointmentHostSelectionTimeRepositoryTest) : 약속 호스트 선택 시간 리포지토리…
jsoonworld Feb 20, 2025
b1ad362
test(AppointmentMemberRetrieveAvailableTimesServiceImplTest) : 약속 멤버 …
jsoonworld Feb 20, 2025
166f376
test(AppointmentMemberSaveAvailableTimesServiceImplTest) : 가용 시간 저장 서…
jsoonworld Feb 20, 2025
cba40d3
refactor(AppointmentMemberAvailableTimesRepositoryTest) : 단수형 엔티티 적용 …
jsoonworld Feb 20, 2025
a50c873
test(AppointmentMemberRepositoryTest) : 약속 멤버 리포지토리 테스트 개선
jsoonworld Feb 20, 2025
2bfc91c
refactor(AppointmentMemberRetrieveAvailableTimesService) : 직관적인 메서드 네…
jsoonworld Feb 21, 2025
abf8364
refactor(AppointmentMemberController) : 직관적인 메서드로 네이밍 개선
jsoonworld Feb 21, 2025
ee8f75b
refactor(AppointmentMemberRetrieveAvailableTimesServiceImpl) : 직관적인 메…
jsoonworld Feb 21, 2025
2421452
refactor(AppointmentMemberRetrieveAvailableTimesServiceImplTest) : 직관…
jsoonworld Feb 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/main/java/org/noostak/NoostakApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,4 @@ public class NoostakApplication {
public static void main(String[] args) {
SpringApplication.run(NoostakApplication.class, args);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import org.noostak.appointment.common.exception.AppointmentErrorCode;
import org.noostak.appointment.common.exception.AppointmentException;
import org.noostak.appointment.domain.Appointment;
import org.noostak.appointment.domain.AppointmentHostSelectionTime;
import org.noostak.appointment.domain.AppointmentHostSelectionTimeRepository;
import org.noostak.appointment.domain.AppointmentRepository;
import org.noostak.appointment.domain.vo.AppointmentStatus;
import org.noostak.appointment.dto.request.AppointmentCreateRequest;
Expand All @@ -13,6 +15,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
Expand All @@ -21,6 +25,7 @@ public class AppointmentCreateServiceImpl implements AppointmentCreateService {
private final MemberGroupRepository memberGroupRepository;
private final GroupRepository groupRepository;
private final AppointmentRepository appointmentRepository;
private final AppointmentHostSelectionTimeRepository appointmentHostSelectionTimeRepository;

@Override
@Transactional
Expand All @@ -29,6 +34,7 @@ public void createAppointment(Long memberId, Long groupId, AppointmentCreateRequ
Group group = findGroupById(groupId);
Appointment appointment = createAppointment(group, memberId, request);
saveAppointment(appointment);
saveAppointmentHostSelectionTimes(appointment, request);
}

private void verifyMemberIsInGroup(Long memberId, Long groupId) {
Expand Down Expand Up @@ -57,4 +63,12 @@ private Appointment createAppointment(Group group, Long hostId, AppointmentCreat
private void saveAppointment(Appointment appointment) {
appointmentRepository.save(appointment);
}

private void saveAppointmentHostSelectionTimes(Appointment appointment, AppointmentCreateRequest request) {
List<AppointmentHostSelectionTime> selectionTimes = request.appointmentHostSelectionTimes().stream()
.map(timeRequest -> AppointmentHostSelectionTime.of(appointment, timeRequest.date(), timeRequest.startTime(), timeRequest.endTime()))
.toList();

appointmentHostSelectionTimeRepository.saveAll(selectionTimes);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,16 @@
@Entity
@Getter
@RequiredArgsConstructor
public class AppointmentHostSelectionTimes extends BaseTimeEntity {
public class AppointmentHostSelectionTime extends BaseTimeEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long appointmentHostSelectionTimeId;
@Column(name = "appointment_host_selection_time_id")
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "appointment_id")
private Appointment appointment;

@Column(name = "appointment_host_selection_date")
private LocalDateTime date;
Expand All @@ -25,17 +30,14 @@ public class AppointmentHostSelectionTimes extends BaseTimeEntity {
@Column(name = "appointment_host_selection_end_time")
private LocalDateTime endTime;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "appointment_id")
private Appointment appointment;

private AppointmentHostSelectionTimes(final LocalDateTime date, final LocalDateTime startTime, final LocalDateTime endTime) {
private AppointmentHostSelectionTime(final Appointment appointment, final LocalDateTime date, final LocalDateTime startTime, final LocalDateTime endTime) {
this.appointment = appointment;
this.date = date;
this.startTime = startTime;
this.endTime = endTime;
}

public static AppointmentHostSelectionTimes of(final LocalDateTime date, final LocalDateTime startTime, final LocalDateTime endTime) {
return new AppointmentHostSelectionTimes(date, startTime, endTime);
public static AppointmentHostSelectionTime of(Appointment appointment, LocalDateTime date, LocalDateTime startTime, LocalDateTime endTime) {
return new AppointmentHostSelectionTime(appointment, date, startTime, endTime);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.noostak.appointment.domain;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface AppointmentHostSelectionTimeRepository extends JpaRepository<AppointmentHostSelectionTime, Long> {
List<AppointmentHostSelectionTime> findByAppointmentId(Long appointmentId);
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package org.noostak.appointment.dto.request;

import org.noostak.appointment.domain.AppointmentHostSelectionTimes;

import java.util.List;

public record AppointmentCreateRequest(
String appointmentName,
String category,
Long duration,
List<AppointmentHostSelectionTimes> appointmentHostSelectionTimes
List<AppointmentHostSelectionTimeRequest> appointmentHostSelectionTimes
) {
public static AppointmentCreateRequest of(String appointmentName, String category, Long duration, List<AppointmentHostSelectionTimes> appointmentHostSelectionTimes) {
public static AppointmentCreateRequest of(String appointmentName, String category, Long duration, List<AppointmentHostSelectionTimeRequest> appointmentHostSelectionTimes) {
return new AppointmentCreateRequest(appointmentName, category, duration, appointmentHostSelectionTimes);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.noostak.appointment.dto.request;

import java.time.LocalDateTime;

public record AppointmentHostSelectionTimeRequest(
LocalDateTime date,
LocalDateTime startTime,
LocalDateTime endTime
) {
public static AppointmentHostSelectionTimeRequest of(LocalDateTime date, LocalDateTime startTime, LocalDateTime endTime) {
return new AppointmentHostSelectionTimeRequest(date, startTime, endTime);
}
}
Original file line number Diff line number Diff line change
@@ -1,29 +1,44 @@
package org.noostak.appointmentmember.api;

import lombok.RequiredArgsConstructor;
import org.noostak.appointmentmember.application.AppointmentSaveAvailableTimesService;
import org.noostak.appointmentmember.dto.request.AvailableTimesRequest;
import org.noostak.appointmentmember.application.AppointmentMemberRetrieveAvailableTimesService;
import org.noostak.appointmentmember.application.AppointmentMemberSaveAvailableTimesService;
import org.noostak.appointmentmember.dto.request.AppointmentMemberAvailableTimesRequest;
import org.noostak.appointmentmember.dto.response.AppointmentMembersAvailableTimesResponse;
import org.noostak.global.success.SuccessResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import static org.noostak.appointmentmember.common.success.AppointmentMemberSuccessCode.APPOINTMENT_MEMBER_AVAILABLE_TIMES_RETRIEVED;
import static org.noostak.appointmentmember.common.success.AppointmentMemberSuccessCode.SUCCESS_SAVE_AVAILABLE_TIMES;

@RestController
@RequestMapping("/api/v1/appointment-members")
@RequiredArgsConstructor
public class AppointmentMemberController {

private final AppointmentSaveAvailableTimesService appointmentSaveAvailableTimesService;
private final AppointmentMemberSaveAvailableTimesService appointmentMemberSaveAvailableTimesService;
private final AppointmentMemberRetrieveAvailableTimesService appointmentMemberRetrieveAvailableTimesService;


@PostMapping("/{appointmentId}/timetable")
public ResponseEntity<SuccessResponse> saveAvailableTimes(
// @AuthenticationPrincipal Long memberId
@PathVariable(name = "appointmentId") Long appointmentId,
@RequestBody AvailableTimesRequest request
@RequestBody AppointmentMemberAvailableTimesRequest request
) {
Long memberId = 2L;
appointmentSaveAvailableTimesService.saveAvailableTimes(memberId, appointmentId, request);
appointmentMemberSaveAvailableTimesService.saveAvailableTimes(memberId, appointmentId, request);
return ResponseEntity.ok(SuccessResponse.of(SUCCESS_SAVE_AVAILABLE_TIMES));
}

@GetMapping("/{appointmentId}/timetable")
public ResponseEntity<SuccessResponse<AppointmentMembersAvailableTimesResponse>> getAvailableTimes(
// @AuthenticationPrincipal Long memberId
@PathVariable(name = "appointmentId") Long appointmentId
) {
Long memberId = 3L;
AppointmentMembersAvailableTimesResponse response = appointmentMemberRetrieveAvailableTimesService.getAvailableTimes(memberId, appointmentId);
return ResponseEntity.ok(SuccessResponse.of(APPOINTMENT_MEMBER_AVAILABLE_TIMES_RETRIEVED, response));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.noostak.appointmentmember.application;

import org.noostak.appointmentmember.dto.response.AppointmentMembersAvailableTimesResponse;

public interface AppointmentMemberRetrieveAvailableTimesService {
AppointmentMembersAvailableTimesResponse getAvailableTimes(Long memberId, Long appointmentId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package org.noostak.appointmentmember.application;

import lombok.RequiredArgsConstructor;
import org.noostak.appointment.domain.AppointmentHostSelectionTimeRepository;
import org.noostak.appointmentmember.common.exception.AppointmentMemberErrorCode;
import org.noostak.appointmentmember.common.exception.AppointmentMemberException;
import org.noostak.appointmentmember.domain.AppointmentMember;
import org.noostak.appointmentmember.domain.AppointmentMemberAvailableTimesRepository;
import org.noostak.appointmentmember.domain.AppointmentMemberRepository;
import org.noostak.appointmentmember.dto.response.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class AppointmentMemberRetrieveAvailableTimesServiceImpl implements AppointmentMemberRetrieveAvailableTimesService {

private final AppointmentHostSelectionTimeRepository appointmentHostSelectionTimeRepository;
private final AppointmentMemberAvailableTimesRepository appointmentMemberAvailableTimesRepository;
private final AppointmentMemberRepository appointmentMemberRepository;

@Override
public AppointmentMembersAvailableTimesResponse getAvailableTimes(Long memberId, Long appointmentId) {
AppointmentMember appointmentMember = findAppointmentMember(memberId, appointmentId);

boolean appointmentTimeSet = appointmentMember.isAppointmentTimeSet();

AppointmentHostSelectionTimesResponse hostSelectionTimesResponse = findHostSelectionTimes(appointmentId);

List<AppointmentMemberInfoResponse> appointmentMembersInfo = findAppointmentMembersInfo(appointmentId);

return createAppointmentResponse(appointmentTimeSet, hostSelectionTimesResponse, appointmentMembersInfo);
}

private AppointmentMember findAppointmentMember(Long memberId, Long appointmentId) {
return appointmentMemberRepository.findByMemberIdAndAppointmentId(memberId, appointmentId)
.orElseThrow(() -> new AppointmentMemberException(AppointmentMemberErrorCode.APPOINTMENT_MEMBER_NOT_FOUND));
}

private AppointmentHostSelectionTimesResponse findHostSelectionTimes(Long appointmentId) {
List<AppointmentHostSelectionTimeResponse> hostSelectionTimeDtos =
appointmentHostSelectionTimeRepository.findByAppointmentId(appointmentId).stream()
.map(time -> AppointmentHostSelectionTimeResponse.of(
time.getDate(),
time.getStartTime(),
time.getEndTime()
))
.collect(Collectors.toList());
Copy link
Contributor

Choose a reason for hiding this comment

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

검토 요청 사항이 이 부분인 듯 한데, findBy를 통해 찾은 List를 DTO 변환하는 메소드는..

findHostSelectionTimes보다 fetchHostSelectionTimes를 사용하는게 적절해 보입니다 🙂

로직 자체는 문제 없습니다!

Copy link
Member Author

@jsoonworld jsoonworld Feb 21, 2025

Choose a reason for hiding this comment

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

피드백 감사합니다!

저도 find보다는 fetch가 이 상황에 더 적절한 네이밍이라는 의견에 공감합니다. 🙂

해당 부분 반영하겠습니다!


return AppointmentHostSelectionTimesResponse.of(hostSelectionTimeDtos);
}

private List<AppointmentMemberInfoResponse> findAppointmentMembersInfo(Long appointmentId) {
return appointmentMemberRepository.findAllWithAvailableTimes(appointmentId).stream()
.map(member -> {
List<AppointmentMemberAvailableTimeResponse> availableTimeDtos = findAvailableTimesForMember(member);
return AppointmentMemberInfoResponse.of(
member.getId(),
member.getMember().getName().value(),
AppointmentMemberAvailableTimesResponse.of(availableTimeDtos)
);
})
.collect(Collectors.toList());
}

private List<AppointmentMemberAvailableTimeResponse> findAvailableTimesForMember(AppointmentMember member) {
return appointmentMemberAvailableTimesRepository.findByAppointmentMember(member).stream()
.map(time -> new AppointmentMemberAvailableTimeResponse(
time.getDate(),
time.getStartTime(),
time.getEndTime()
))
.collect(Collectors.toList());
}

private AppointmentMembersAvailableTimesResponse createAppointmentResponse(
boolean appointmentTimeSet,
AppointmentHostSelectionTimesResponse hostSelectionTimesResponse,
List<AppointmentMemberInfoResponse> appointmentMembersInfo) {

AppointmentScheduleResponse appointmentScheduleResponse = AppointmentScheduleResponse.of(
hostSelectionTimesResponse,
appointmentMembersInfo
);

return AppointmentMembersAvailableTimesResponse.of(appointmentTimeSet, appointmentScheduleResponse);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.noostak.appointmentmember.application;

import org.noostak.appointmentmember.dto.request.AppointmentMemberAvailableTimesRequest;

public interface AppointmentMemberSaveAvailableTimesService {
void saveAvailableTimes(Long memberId, Long appointmentId, AppointmentMemberAvailableTimesRequest request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package org.noostak.appointmentmember.application;

import lombok.RequiredArgsConstructor;
import org.noostak.appointmentmember.common.exception.AppointmentMemberErrorCode;
import org.noostak.appointmentmember.common.exception.AppointmentMemberException;
import org.noostak.appointmentmember.domain.AppointmentMemberAvailableTime;
import org.noostak.appointmentmember.domain.AppointmentMemberAvailableTimesRepository;
import org.noostak.appointmentmember.dto.request.AppointmentMemberAvailableTimesRequest;
import org.noostak.appointmentmember.domain.AppointmentMember;
import org.noostak.appointmentmember.domain.AppointmentMemberRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class AppointmentMemberSaveAvailableTimesServiceImpl implements AppointmentMemberSaveAvailableTimesService {

private final AppointmentMemberRepository appointmentMemberRepository;
private final AppointmentMemberAvailableTimesRepository appointmentMemberAvailableTimesRepository;

@Override
@Transactional
public void saveAvailableTimes(Long memberId, Long appointmentId, AppointmentMemberAvailableTimesRequest request) {
AppointmentMember appointmentMember = findAppointmentMember(memberId, appointmentId);
List<AppointmentMemberAvailableTime> newTimes = createNewAvailableTimes(appointmentMember, request);

refreshAvailableTimes(appointmentMember, newTimes);
}

private AppointmentMember findAppointmentMember(Long memberId, Long appointmentId) {
return appointmentMemberRepository.findByMemberIdAndAppointmentId(memberId, appointmentId)
.orElseThrow(() -> new AppointmentMemberException(AppointmentMemberErrorCode.APPOINTMENT_MEMBER_NOT_FOUND));
}

private List<AppointmentMemberAvailableTime> createNewAvailableTimes(AppointmentMember appointmentMember, AppointmentMemberAvailableTimesRequest request) {
return request.appointmentMemberAvailableTimes().stream()
.map(time -> AppointmentMemberAvailableTime.of(appointmentMember, time.date(), time.startTime(), time.endTime()))
.collect(Collectors.toList());
}

private void refreshAvailableTimes(AppointmentMember appointmentMember, List<AppointmentMemberAvailableTime> newTimes) {
if (!isTimeUpdateRequired(appointmentMember, newTimes)) {
return;
}

updateAvailableTimes(appointmentMember, newTimes);
markAppointmentTimeIfNecessary(appointmentMember, newTimes);
}

private boolean isTimeUpdateRequired(AppointmentMember appointmentMember, List<AppointmentMemberAvailableTime> newTimes) {
List<AppointmentMemberAvailableTime> existingTimes = appointmentMemberAvailableTimesRepository.findByAppointmentMember(appointmentMember);
return !Set.copyOf(existingTimes).equals(Set.copyOf(newTimes));
Copy link
Contributor

Choose a reason for hiding this comment

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

copyOf는 별다른 설정이 없다면 객체의 주소값으로 비교연산이 일어날텐데, 혹시 해당 사항을 염두에 두어서 아래 EqualsAndHashCode 어노테이션을 작성하신건가요?

image

Copy link
Member Author

Choose a reason for hiding this comment

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

피드백 감사합니다!

네, copyOf를 사용하면 객체의 주소값을 기준으로 비교가 이루어지므로, 이를 고려하여 AppointmentMemberAvailableTime 클래스에 @EqualsAndHashCode 어노테이션을 추가했습니다. 해당 어노테이션을 통해 값 자체를 기준으로 비교하도록 설정하여, 기존 데이터와 새로운 데이터의 동등성 판단이 정확하게 이루어지도록 했습니다. 😊

}

private void updateAvailableTimes(AppointmentMember appointmentMember, List<AppointmentMemberAvailableTime> newTimes) {
appointmentMemberAvailableTimesRepository.deleteByAppointmentMember(appointmentMember);
appointmentMemberAvailableTimesRepository.saveAll(newTimes);
}

private void markAppointmentTimeIfNecessary(AppointmentMember appointmentMember, List<AppointmentMemberAvailableTime> newTimes) {
appointmentMember.updateAvailableTimes(newTimes);
}
}

This file was deleted.

Loading