From 49d361c12f41338b8cbbe3afc95f7813bd1cae5c Mon Sep 17 00:00:00 2001 From: ddingmin Date: Sat, 20 Jan 2024 01:48:21 +0900 Subject: [PATCH] release: 0.1.9 (#131) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 모임 삭제 기능 구현 (#102) * refactor: 기획 변경에 따른 회원 카드 등록 API 리팩토링 (#105) * refactor: sql 변경 (#104) * refactor: User 클래스 필드명 변경 (#104) * refactor: API 변경에 따른 코드 리팩토링 (#104) * refactor: 불필요한 getId() 제거 ( 피드백 반영 ) (#104) * feat: 유효성 검증 관련 에러 일괄 처리을 위한 메소드 추가 (#104) * test: API 변경에 따른 통합 테스트 수정 및 단위 테스트 구현 (#104) * refactor: UserMeGetResponse 필드 변경 (#104) * fix: CI 에러 수정 (#104) * refactor: 피드백 반영 (#104) * fix: CI 에러 수정 (#104) * refactor: JWT 에러 응답 리팩토링 및 인가 인증 예최 처리 코드 수정 (#103) * refactor: 기타 코드 리팩토링( 피드백 반영 ) (#101) * chore: JWT 관련 의존성 변경 (#101) * refactor: JWT 및 인증 관련 로직 리팩토링 (#101) * test: 테스트 코드 및 설정 관련 변경(#101) * refactor: ObjectMapper Autowired 로 주입 (#101) * refactor: AuthService 반환 타입 Optional -> User 변경 (#101) * fix: V6_create_users_interests.sql 추가 (#109) (#110) * refactor: 회원 카드 등록시 JWT 정보도 함께 반환하도록 수정 (#114) * chore : application.properties 에 jwt 관련 설정 값 추가 (#113) * refactor : userService 회원 카드 등록 로직 수정 (#113) * feat : UserRegisterResponse 필드 추가(#113) * test: API 변경에 따른 테스트 관련 코드 수정 (#113) * fix: 소셜 로그인 관련 500 에러 수정 및 OAuth 로직 일부 개선 (#112) * fix: OAuthLoginController @RestController 어노테이션 추가(나는 바보..) 및 favicon 관련 임시 컨트롤러 생성 (#111) * refactor : 설정 yml 리팩토링 (#111) * refactor : SecurityConfig 리팩토링 (#111) * refactor : 기타 OAuth 관련 로직 리팩토링(#111) * refactor : Cors 허용 주소 임시 전부 허용 (#111) * fix : SonarCloud 오류 수정 (#111) * fix : SonarCloud 오류 수정 (#111) * feat: 위치 기반 API 구현 및 테스트 (#108) * refactor: 기타 코드 리팩토링( 피드백 반영 ) (#101) * chore: JWT 관련 의존성 변경 (#101) * refactor: JWT 및 인증 관련 로직 리팩토링 (#101) * test: 테스트 코드 및 설정 관련 변경(#101) * refactor: ObjectMapper Autowired 로 주입 (#101) * refactor: AuthService 반환 타입 Optional -> User 변경 (#101) * refactor: application.properties redis.port 변경 (#91) * refactor: 기존 Redis 설정 리팩토링 및 추가 구현 (#91) * feat: 유저 위치 기반 관련 DTO 및 VO 구현 (#91) * feat: 유저 위치 기반 API 구현 (#91) * test: 유저 위치 기반 통합 테스트 관련 클래스 구현 및 테스트 (#91) * test: redis port 변경에 따른 테스트 수정 (#91) * fix: CI 에러 수정 (#91) * fix: sonarCloud 에러 수정 (#91) * refactor: 리뷰 반영 (#108) * build: Gatling 세팅 (#115) * feat: 부하테스트 툴 Gatling을 세팅한다 * feat: 예시 코드를 작성한다 * refactor: Sample 코드의 이름을 변경한다 * feat: 내 정보 조회에 Oauth 정보 추가 (#119) * feat: 내 정보 조회에 Oauth 정보 추가 * test: Oauth 정보 추가에 따른 테스트 변경 * fix: 모임 목록 조회 조건에 활동 지역 조건이 안걸리는 버그 수정 (#121) * feat: 회원 탈퇴 사유 저장 로직 추가 및 cors 관련 재설정 (#123) * refactor: SecurityConfig Cors 관련 전체 허용으로 변경 및 회원 카드 등록 API permitAll 로 변경 (#117) * refactor: 기존 엔티티 관련 리팩토링 (#117) * feat: WithdrawReason 생성 sql 추가 (#117) * feat: WithdrawReason 관련 도메인 구현 (#117) * feat: 회원 탈퇴 시 탈퇴 사유 기능 추가 (#117) * test: 회원 탈퇴 단위 테스트 (#117) * refactor: 회원 탈퇴 API POST 로 수정 (#117) * refactor: 회원탈퇴 관련 통합 테스트 수정 및 요청 DTO 수정 (#117) * refactor: meeting 엔티티명 다시 복구 - 모든 테이블에 `s` 붙이는 방향 논의 필요 (#117) * feat: withdraw_reason 테이블 이름 변경 (#117) * fix: CI 에러 해결 (#117) * fix: 모임 규격 변경 (#127) * refactor: 코드 포매팅 적용 (#130) --------- Co-authored-by: ChoiDongKuen Co-authored-by: xb205 <62425964+devxb@users.noreply.github.com> --- .../meeting/domain/MeetingSpecification.java | 12 ++- .../domain/request/CreateMeetingRequest.java | 40 ++++---- .../domain/response/ImageUploadResponse.java | 9 +- .../domain/response/MeetingResponse.java | 58 ++++++------ .../domain/response/MeetingsResponse.java | 67 +++++++------- .../meeting/infra/ImageUploadService.java | 18 ++-- ...PageableHandlerMethodArgumentResolver.java | 20 ++-- .../meeting/domain/MeetingFixture.java | 91 ++++++++++--------- 8 files changed, 166 insertions(+), 149 deletions(-) diff --git a/src/main/java/net/teumteum/meeting/domain/MeetingSpecification.java b/src/main/java/net/teumteum/meeting/domain/MeetingSpecification.java index 2d74be02..fc2bc861 100644 --- a/src/main/java/net/teumteum/meeting/domain/MeetingSpecification.java +++ b/src/main/java/net/teumteum/meeting/domain/MeetingSpecification.java @@ -10,9 +10,11 @@ public class MeetingSpecification { public static Specification withIsOpen(boolean isOpen) { if (isOpen) { - return (root, query, criteriaBuilder) -> criteriaBuilder.greaterThan(root.get("promiseDateTime"), LocalDateTime.now()); + return (root, query, criteriaBuilder) -> criteriaBuilder.greaterThan(root.get("promiseDateTime"), + LocalDateTime.now()); } - return (root, query, criteriaBuilder) -> criteriaBuilder.lessThanOrEqualTo(root.get("promiseDateTime"), LocalDateTime.now()); + return (root, query, criteriaBuilder) -> criteriaBuilder.lessThanOrEqualTo(root.get("promiseDateTime"), + LocalDateTime.now()); } public static Specification withTopic(Topic topic) { @@ -20,7 +22,8 @@ public static Specification withTopic(Topic topic) { } public static Specification withAreaStreet(String meetingAreaStreet) { - return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("meetingArea").get("mainStreet"), meetingAreaStreet); + return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("meetingArea").get("mainStreet"), + meetingAreaStreet); } public static Specification withSearchWordInTitle(String searchWord) { @@ -32,7 +35,8 @@ public static Specification withSearchWordInIntroduction(String searchW } public static Specification withParticipantUserId(Long participantUserId) { - return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.join("participantUserIds"), participantUserId); + return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.join("participantUserIds"), + participantUserId); } } diff --git a/src/main/java/net/teumteum/meeting/domain/request/CreateMeetingRequest.java b/src/main/java/net/teumteum/meeting/domain/request/CreateMeetingRequest.java index 7635fb0a..4da305bf 100644 --- a/src/main/java/net/teumteum/meeting/domain/request/CreateMeetingRequest.java +++ b/src/main/java/net/teumteum/meeting/domain/request/CreateMeetingRequest.java @@ -9,27 +9,29 @@ import java.time.LocalDateTime; public record CreateMeetingRequest( - @NotNull(message = "모임 주제를 입력해주세요.") - Topic topic, - @NotNull(message = "모임 제목을 입력해주세요.") - @Size(min = 2, max = 32, message = "모임 제목은 2자 이상 32자 이하로 입력해주세요.") - String title, - @NotNull(message = "모임 소개를 입력해주세요.") - @Size(min = 10, max = 200, message = "모임 소개는 10자 이상 200자 이하로 입력해주세요.") - String introduction, - @NotNull(message = "약속 시간을 입력해주세요.") - @Future(message = "약속 시간은 현재 시간보다 미래여야 합니다.") - LocalDateTime promiseDateTime, - @NotNull(message = "모집 인원을 입력해주세요.") - int numberOfRecruits, - @Valid - MeetingArea meetingArea + @NotNull(message = "모임 주제를 입력해주세요.") + Topic topic, + @NotNull(message = "모임 제목을 입력해주세요.") + @Size(min = 2, max = 32, message = "모임 제목은 2자 이상 32자 이하로 입력해주세요.") + String title, + @NotNull(message = "모임 소개를 입력해주세요.") + @Size(min = 10, max = 200, message = "모임 소개는 10자 이상 200자 이하로 입력해주세요.") + String introduction, + @NotNull(message = "약속 시간을 입력해주세요.") + @Future(message = "약속 시간은 현재 시간보다 미래여야 합니다.") + LocalDateTime promiseDateTime, + @NotNull(message = "모집 인원을 입력해주세요.") + int numberOfRecruits, + @Valid + MeetingArea meetingArea ) { + public record MeetingArea( - @NotNull(message = "주소를 입력해주세요.") - String address, - @NotNull(message = "상세 주소를 입력해주세요.") - String addressDetail + @NotNull(message = "주소를 입력해주세요.") + String address, + @NotNull(message = "상세 주소를 입력해주세요.") + String addressDetail ) { + } } diff --git a/src/main/java/net/teumteum/meeting/domain/response/ImageUploadResponse.java b/src/main/java/net/teumteum/meeting/domain/response/ImageUploadResponse.java index a3f1d3b2..77141812 100644 --- a/src/main/java/net/teumteum/meeting/domain/response/ImageUploadResponse.java +++ b/src/main/java/net/teumteum/meeting/domain/response/ImageUploadResponse.java @@ -4,9 +4,10 @@ @Builder public record ImageUploadResponse( - String fileName, - String originalFileName, - String contentType, - String filePath + String fileName, + String originalFileName, + String contentType, + String filePath ) { + } diff --git a/src/main/java/net/teumteum/meeting/domain/response/MeetingResponse.java b/src/main/java/net/teumteum/meeting/domain/response/MeetingResponse.java index 56386670..372638b5 100644 --- a/src/main/java/net/teumteum/meeting/domain/response/MeetingResponse.java +++ b/src/main/java/net/teumteum/meeting/domain/response/MeetingResponse.java @@ -8,46 +8,48 @@ import java.util.Set; public record MeetingResponse( - Long id, - Long hostId, - Topic topic, - String title, - String introduction, - Set photoUrls, - LocalDateTime promiseDateTime, - int numberOfRecruits, - MeetingArea meetingArea, - Set participantIds + Long id, + Long hostId, + Topic topic, + String title, + String introduction, + Set photoUrls, + LocalDateTime promiseDateTime, + int numberOfRecruits, + MeetingArea meetingArea, + Set participantIds ) { + public static MeetingResponse of( - Meeting meeting + Meeting meeting ) { return new MeetingResponse( - meeting.getId(), - meeting.getHostUserId(), - meeting.getTopic(), - meeting.getTitle(), - meeting.getIntroduction(), - meeting.getImageUrls(), - meeting.getPromiseDateTime(), - meeting.getNumberOfRecruits(), - MeetingArea.of(meeting), - meeting.getParticipantUserIds() + meeting.getId(), + meeting.getHostUserId(), + meeting.getTopic(), + meeting.getTitle(), + meeting.getIntroduction(), + meeting.getImageUrls(), + meeting.getPromiseDateTime(), + meeting.getNumberOfRecruits(), + MeetingArea.of(meeting), + meeting.getParticipantUserIds() ); } public record MeetingArea( - String mainStreet, - String address, - String addressDetail + String mainStreet, + String address, + String addressDetail ) { + public static MeetingArea of( - Meeting meeting + Meeting meeting ) { return new MeetingArea( - meeting.getMeetingArea().getMainStreet(), - meeting.getMeetingArea().getAddress(), - meeting.getMeetingArea().getAddressDetail() + meeting.getMeetingArea().getMainStreet(), + meeting.getMeetingArea().getAddress(), + meeting.getMeetingArea().getAddressDetail() ); } } diff --git a/src/main/java/net/teumteum/meeting/domain/response/MeetingsResponse.java b/src/main/java/net/teumteum/meeting/domain/response/MeetingsResponse.java index d20bbe9d..31765751 100644 --- a/src/main/java/net/teumteum/meeting/domain/response/MeetingsResponse.java +++ b/src/main/java/net/teumteum/meeting/domain/response/MeetingsResponse.java @@ -8,57 +8,60 @@ import java.util.Set; public record MeetingsResponse( - List meetings + List meetings ) { + public static MeetingsResponse of(List meetings) { return new MeetingsResponse( - meetings.stream() - .map(MeetingResponse::of) - .toList() + meetings.stream() + .map(MeetingResponse::of) + .toList() ); } public record MeetingResponse( - Long id, - Long hostId, - Topic topic, - String title, - String introduction, - Set photoUrls, - LocalDateTime promiseDateTime, - int numberOfRecruits, - MeetingArea meetingArea, - Set participantIds + Long id, + Long hostId, + Topic topic, + String title, + String introduction, + Set photoUrls, + LocalDateTime promiseDateTime, + int numberOfRecruits, + MeetingArea meetingArea, + Set participantIds ) { + public static MeetingResponse of( - Meeting meeting + Meeting meeting ) { return new MeetingResponse( - meeting.getId(), - meeting.getHostUserId(), - meeting.getTopic(), - meeting.getTitle(), - meeting.getIntroduction(), - meeting.getImageUrls(), - meeting.getPromiseDateTime(), - meeting.getNumberOfRecruits(), - MeetingArea.of(meeting), - meeting.getParticipantUserIds() + meeting.getId(), + meeting.getHostUserId(), + meeting.getTopic(), + meeting.getTitle(), + meeting.getIntroduction(), + meeting.getImageUrls(), + meeting.getPromiseDateTime(), + meeting.getNumberOfRecruits(), + MeetingArea.of(meeting), + meeting.getParticipantUserIds() ); } public record MeetingArea( - String mainStreet, - String address, - String addressDetail + String mainStreet, + String address, + String addressDetail ) { + public static MeetingArea of( - Meeting meeting + Meeting meeting ) { return new MeetingArea( - meeting.getMeetingArea().getMainStreet(), - meeting.getMeetingArea().getAddress(), - meeting.getMeetingArea().getAddressDetail() + meeting.getMeetingArea().getMainStreet(), + meeting.getMeetingArea().getAddress(), + meeting.getMeetingArea().getAddressDetail() ); } } diff --git a/src/main/java/net/teumteum/meeting/infra/ImageUploadService.java b/src/main/java/net/teumteum/meeting/infra/ImageUploadService.java index 25f5fca8..b9a194b1 100644 --- a/src/main/java/net/teumteum/meeting/infra/ImageUploadService.java +++ b/src/main/java/net/teumteum/meeting/infra/ImageUploadService.java @@ -26,15 +26,15 @@ public class ImageUploadService implements ImageUpload { @Override public ImageUploadResponse upload(MultipartFile file, String path) { String originalFilename = Optional.ofNullable(file.getOriginalFilename()) - .orElseThrow(() -> new IllegalArgumentException("파일 이름이 없습니다.")); + .orElseThrow(() -> new IllegalArgumentException("파일 이름이 없습니다.")); String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".")); String fileName = UUID.randomUUID().toString(); String destination = path + "/" + fileName + fileExtension; PutObjectRequest request = PutObjectRequest.builder() - .bucket(bucketName) - .key(destination) - .build(); + .bucket(bucketName) + .key(destination) + .build(); try (var inputStream = file.getInputStream()) { s3Client.putObject(request, RequestBody.fromInputStream(inputStream, file.getSize())); @@ -43,10 +43,10 @@ public ImageUploadResponse upload(MultipartFile file, String path) { } return ImageUploadResponse.builder() - .fileName(fileName) - .originalFileName(originalFilename) - .contentType(file.getContentType()) - .filePath(destination) - .build(); + .fileName(fileName) + .originalFileName(originalFilename) + .contentType(file.getContentType()) + .filePath(destination) + .build(); } } diff --git a/src/test/java/net/teumteum/meeting/config/PageableHandlerMethodArgumentResolver.java b/src/test/java/net/teumteum/meeting/config/PageableHandlerMethodArgumentResolver.java index e354ddf6..705bc0d7 100644 --- a/src/test/java/net/teumteum/meeting/config/PageableHandlerMethodArgumentResolver.java +++ b/src/test/java/net/teumteum/meeting/config/PageableHandlerMethodArgumentResolver.java @@ -1,6 +1,7 @@ package net.teumteum.meeting.config; +import org.jetbrains.annotations.NotNull; import org.springframework.core.MethodParameter; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -25,9 +26,12 @@ public boolean supportsParameter(MethodParameter parameter) { } @Override - public Mono resolveArgument(MethodParameter methodParameter, BindingContext bindingContext, ServerWebExchange serverWebExchange) { - List pageValues = serverWebExchange.getRequest().getQueryParams().getOrDefault("page", List.of(DEFAULT_PAGE)); - List sizeValues = serverWebExchange.getRequest().getQueryParams().getOrDefault("size", List.of(DEFAULT_SIZE)); + public @NotNull Mono resolveArgument(@NotNull MethodParameter methodParameter, @NotNull BindingContext bindingContext, + ServerWebExchange serverWebExchange) { + List pageValues = serverWebExchange.getRequest().getQueryParams() + .getOrDefault("page", List.of(DEFAULT_PAGE)); + List sizeValues = serverWebExchange.getRequest().getQueryParams() + .getOrDefault("size", List.of(DEFAULT_SIZE)); String page = pageValues.get(0); @@ -44,11 +48,11 @@ public Mono resolveArgument(MethodParameter methodParameter, BindingCont } return Mono.just( - PageRequest.of( - Integer.parseInt(page), - Math.min(Integer.parseInt(sizeValues.get(0)), - MAX_SIZE), sort - ) + PageRequest.of( + Integer.parseInt(page), + Math.min(Integer.parseInt(sizeValues.get(0)), + MAX_SIZE), sort + ) ); } } diff --git a/src/test/java/net/teumteum/meeting/domain/MeetingFixture.java b/src/test/java/net/teumteum/meeting/domain/MeetingFixture.java index 052c542a..eb988ef9 100644 --- a/src/test/java/net/teumteum/meeting/domain/MeetingFixture.java +++ b/src/test/java/net/teumteum/meeting/domain/MeetingFixture.java @@ -15,96 +15,96 @@ public static Meeting getDefaultMeeting() { public static Meeting getOpenMeeting() { return newMeetingByBuilder(MeetingBuilder.builder() - .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) - .build() + .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) + .build() ); } public static Meeting getCloseMeeting() { return newMeetingByBuilder(MeetingBuilder.builder() - .promiseDateTime(LocalDateTime.of(2000, 1, 1, 0, 0)) - .build() + .promiseDateTime(LocalDateTime.of(2000, 1, 1, 0, 0)) + .build() ); } public static Meeting getOpenFullMeeting() { return newMeetingByBuilder(MeetingBuilder.builder() - .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) - .numberOfRecruits(3) - .participantUserIds(new HashSet<>(List.of(0L, 1L, 2L))) - .build() + .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) + .numberOfRecruits(3) + .participantUserIds(new HashSet<>(List.of(0L, 1L, 2L))) + .build() ); } public static Meeting getOpenMeetingWithTopic(Topic topic) { return newMeetingByBuilder(MeetingBuilder.builder() - .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) - .topic(topic) - .build() + .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) + .topic(topic) + .build() ); } public static Meeting getCloseMeetingWithTopic(Topic topic) { return newMeetingByBuilder(MeetingBuilder.builder() - .promiseDateTime(LocalDateTime.of(2000, 1, 1, 0, 0)) - .topic(topic) - .build() + .promiseDateTime(LocalDateTime.of(2000, 1, 1, 0, 0)) + .topic(topic) + .build() ); } public static Meeting getOpenMeetingWithMainStreet(String mainStreet) { return newMeetingByBuilder(MeetingBuilder.builder() - .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) - .meetingArea(new MeetingArea(mainStreet, "서울특별시", "강남대로 390")) - .build() + .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) + .meetingArea(new MeetingArea(mainStreet, "서울특별시", "강남대로 390")) + .build() ); } public static Meeting getOpenMeetingWithParticipantUserId(Long participantUserId) { return newMeetingByBuilder(MeetingBuilder.builder() - .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) - .participantUserIds(new HashSet<>(List.of(participantUserId))) - .build() + .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) + .participantUserIds(new HashSet<>(List.of(participantUserId))) + .build() ); } public static Meeting getCloseMeetingWithParticipantUserId(Long participantUserId) { return newMeetingByBuilder(MeetingBuilder.builder() - .promiseDateTime(LocalDateTime.of(2000, 1, 1, 0, 0)) - .participantUserIds(new HashSet<>(List.of(participantUserId))) - .build() + .promiseDateTime(LocalDateTime.of(2000, 1, 1, 0, 0)) + .participantUserIds(new HashSet<>(List.of(participantUserId))) + .build() ); } public static Meeting getOpenMeetingWithTitle(String title) { return newMeetingByBuilder(MeetingBuilder.builder() - .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) - .title(title) - .build() + .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) + .title(title) + .build() ); } public static Meeting getCloseMeetingWithTitle(String title) { return newMeetingByBuilder(MeetingBuilder.builder() - .title(title) - .promiseDateTime(LocalDateTime.of(2000, 1, 1, 0, 0)) - .build() + .title(title) + .promiseDateTime(LocalDateTime.of(2000, 1, 1, 0, 0)) + .build() ); } public static Meeting getOpenMeetingWithIntroduction(String introduction) { return newMeetingByBuilder(MeetingBuilder.builder() - .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) - .introduction(introduction) - .build() + .promiseDateTime(LocalDateTime.of(4000, 1, 1, 0, 0)) + .introduction(introduction) + .build() ); } public static Meeting getCloseMeetingWithIntroduction(String introduction) { return newMeetingByBuilder(MeetingBuilder.builder() - .promiseDateTime(LocalDateTime.of(2000, 1, 1, 0, 0)) - .introduction(introduction) - .build() + .promiseDateTime(LocalDateTime.of(2000, 1, 1, 0, 0)) + .introduction(introduction) + .build() ); } @@ -126,21 +126,22 @@ public static Meeting getCloseMeetingWithHostId(Long hostId) { public static Meeting newMeetingByBuilder(MeetingBuilder meetingBuilder) { return new Meeting( - meetingBuilder.id, - meetingBuilder.title, - meetingBuilder.hostUserId, - meetingBuilder.participantUserIds, - meetingBuilder.topic, - meetingBuilder.introduction, - meetingBuilder.meetingArea, - meetingBuilder.numberOfRecruits, - meetingBuilder.promiseDateTime, - meetingBuilder.imageUrls + meetingBuilder.id, + meetingBuilder.title, + meetingBuilder.hostUserId, + meetingBuilder.participantUserIds, + meetingBuilder.topic, + meetingBuilder.introduction, + meetingBuilder.meetingArea, + meetingBuilder.numberOfRecruits, + meetingBuilder.promiseDateTime, + meetingBuilder.imageUrls ); } @Builder public static class MeetingBuilder { + @Builder.Default private Long id = null;