From 91ff9ee2470f6ceba5a34c63fd63c538baff1723 Mon Sep 17 00:00:00 2001 From: minjikim Date: Mon, 27 Nov 2023 23:04:29 +0900 Subject: [PATCH] =?UTF-8?q?[Feat(=EB=9D=BC=EC=9D=B4/=EA=B9=80=EB=AF=BC?= =?UTF-8?q?=EC=A7=80)]=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\353\235\274\354\235\264/build.gradle" | 4 ++ .../apiPayload/code/status/ErrorStatus.java" | 6 +-- .../handler/FoodCategoryHandler.java" | 11 +++++ .../com/umc/demo/config/SwaggerConfig.java" | 39 ++++++++++++++++ .../umc/demo/converter/MemberConverter.java" | 43 ++++++++++++++++++ .../converter/MemberPreferConverter.java" | 19 ++++++++ .../java/com/umc/demo/domain/Member.java" | 8 +++- .../com/umc/demo/domain/enums/Gender.java" | 2 +- .../demo/domain/mapping/MemberPrefer.java" | 11 +++++ .../repository/FoodCategoryRepository.java" | 7 +++ .../demo/repository/MemberRepository.java" | 7 +++ .../MemberService/MemberCommandService.java" | 9 ++++ .../MemberCommandServiceImpl.java" | 44 +++++++++++++++++++ .../MemberService/MemberQueryService.java" | 4 ++ .../MemberQueryServiceImpl.java" | 4 ++ .../annotation/ExistCategories.java" | 21 +++++++++ .../validator/CategoriesExistValidator.java" | 36 +++++++++++++++ .../web/controller/MemberRestController.java" | 28 ++++++++++++ .../umc/demo/web/dto/MemberRequestDTO.java" | 31 +++++++++++++ .../umc/demo/web/dto/MemberResponseDTO.java" | 19 ++++++++ 20 files changed, 348 insertions(+), 5 deletions(-) create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/apiPayload/exception/handler/FoodCategoryHandler.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/config/SwaggerConfig.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/converter/MemberConverter.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/converter/MemberPreferConverter.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/repository/FoodCategoryRepository.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/repository/MemberRepository.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberCommandService.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberCommandServiceImpl.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberQueryService.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberQueryServiceImpl.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/validation/annotation/ExistCategories.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/validation/validator/CategoriesExistValidator.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/web/controller/MemberRestController.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/web/dto/MemberRequestDTO.java" create mode 100644 "\353\235\274\354\235\264/src/main/java/com/umc/demo/web/dto/MemberResponseDTO.java" diff --git "a/\353\235\274\354\235\264/build.gradle" "b/\353\235\274\354\235\264/build.gradle" index 2f9997d..7f8eb47 100644 --- "a/\353\235\274\354\235\264/build.gradle" +++ "b/\353\235\274\354\235\264/build.gradle" @@ -29,6 +29,10 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springdoc:springdoc-openapi-ui:1.6.15' + implementation 'io.springfox:springfox-swagger2:2.9.2' + implementation 'io.springfox:springfox-swagger-ui:2.9.2' + implementation 'org.springframework.boot:spring-boot-starter-validation' } tasks.named('test') { diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/apiPayload/code/status/ErrorStatus.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/apiPayload/code/status/ErrorStatus.java" index e1d556e..061233d 100644 --- "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/apiPayload/code/status/ErrorStatus.java" +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/apiPayload/code/status/ErrorStatus.java" @@ -16,12 +16,12 @@ public enum ErrorStatus implements BaseErrorCode { _UNAUTHORIZED(HttpStatus.UNAUTHORIZED,"COMMON401","인증이 필요합니다."), _FORBIDDEN(HttpStatus.FORBIDDEN, "COMMON403", "금지된 요청입니다."), - // 멤버 관려 에러 + // Member MEMBER_NOT_FOUND(HttpStatus.BAD_REQUEST, "MEMBER4001", "사용자가 없습니다."), NICKNAME_NOT_EXIST(HttpStatus.BAD_REQUEST, "MEMBER4002", "닉네임은 필수 입니다."), - // 예시,,, - ARTICLE_NOT_FOUND(HttpStatus.NOT_FOUND, "ARTICLE4001", "게시글이 없습니다."), + // Food Category + FOOD_CATEGORY_NOT_FOUND(HttpStatus.NOT_FOUND, "FOODCATEGORY4001", "음식 카테고리가 없습니다."), // For test TEMP_EXCEPTION(HttpStatus.BAD_REQUEST, "TEMP4001", "이거는 테스트"); diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/apiPayload/exception/handler/FoodCategoryHandler.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/apiPayload/exception/handler/FoodCategoryHandler.java" new file mode 100644 index 0000000..1454d7c --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/apiPayload/exception/handler/FoodCategoryHandler.java" @@ -0,0 +1,11 @@ +package com.umc.demo.apiPayload.exception.handler; + +import com.umc.demo.apiPayload.code.BaseErrorCode; +import com.umc.demo.apiPayload.exception.GeneralException; + +public class FoodCategoryHandler extends GeneralException { + + public FoodCategoryHandler(BaseErrorCode errorCode) { + super(errorCode); + } +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/config/SwaggerConfig.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/config/SwaggerConfig.java" new file mode 100644 index 0000000..65e8d83 --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/config/SwaggerConfig.java" @@ -0,0 +1,39 @@ +package com.umc.demo.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.oas.models.servers.Server; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + + @Bean + public OpenAPI UMCstudyAPI() { + Info info = new Info() + .title("UMC Server WorkBook API") + .description("UMC Server WorkBook API 명세서") + .version("1.0.0"); + + String jwtSchemeName = "JWT TOKEN"; + // API 요청헤더에 인증정보 포함 + SecurityRequirement securityRequirement = new SecurityRequirement().addList(jwtSchemeName); + // SecuritySchemes 등록 + Components components = new Components() + .addSecuritySchemes(jwtSchemeName, new SecurityScheme() + .name(jwtSchemeName) + .type(SecurityScheme.Type.HTTP) // HTTP 방식 + .scheme("bearer") + .bearerFormat("JWT")); + + return new OpenAPI() + .addServersItem(new Server().url("/")) + .info(info) + .addSecurityItem(securityRequirement) + .components(components); + } +} \ No newline at end of file diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/converter/MemberConverter.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/converter/MemberConverter.java" new file mode 100644 index 0000000..8b6b1ce --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/converter/MemberConverter.java" @@ -0,0 +1,43 @@ +package com.umc.demo.converter; + +import com.umc.demo.domain.Member; +import com.umc.demo.domain.enums.Gender; +import com.umc.demo.web.dto.MemberRequestDTO; +import com.umc.demo.web.dto.MemberResponseDTO; +import java.time.LocalDateTime; +import java.util.ArrayList; + +public class MemberConverter { + + public static MemberResponseDTO.JoinResultDTO toJoinResultDTO(Member member){ + return MemberResponseDTO.JoinResultDTO.builder() + .memberId(member.getId()) + .createdAt(LocalDateTime.now()) + .build(); + } + + public static Member toMember(MemberRequestDTO.JoinDto request){ + + Gender gender = null; + + switch (request.getGender()){ + case 1: + gender = Gender.MALE; + break; + case 2: + gender = Gender.FEMALE; + break; + case 3: + gender = Gender.NONE; + break; + } + + return Member.builder() + .address(request.getAddress()) + .specAddress(request.getSpecAddress()) + .gender(gender) + .name(request.getName()) + .memberPreferList(new ArrayList<>()) + .build(); + } +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/converter/MemberPreferConverter.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/converter/MemberPreferConverter.java" new file mode 100644 index 0000000..e8eebbf --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/converter/MemberPreferConverter.java" @@ -0,0 +1,19 @@ +package com.umc.demo.converter; + +import com.umc.demo.domain.FoodCategory; +import com.umc.demo.domain.mapping.MemberPrefer; +import java.util.List; +import java.util.stream.Collectors; + +public class MemberPreferConverter { + + public static List toMemberPreferList(List foodCategoryList){ + + return foodCategoryList.stream() + .map(foodCategory -> + MemberPrefer.builder() + .foodCategory(foodCategory) + .build() + ).collect(Collectors.toList()); + } +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/domain/Member.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/domain/Member.java" index 3808c91..df4a8b6 100644 --- "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/domain/Member.java" +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/domain/Member.java" @@ -24,9 +24,14 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; @Entity @Getter +@DynamicUpdate +@DynamicInsert @Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @@ -58,9 +63,10 @@ public class Member extends BaseEntity { private LocalDate inactiveDate; - @Column(nullable = false, length = 50) +// @Column(nullable = false, length = 50) private String email; + @ColumnDefault("0") private Integer point; @OneToMany(mappedBy = "member", cascade = CascadeType.ALL) diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/domain/enums/Gender.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/domain/enums/Gender.java" index a5f4b62..0e1739e 100644 --- "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/domain/enums/Gender.java" +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/domain/enums/Gender.java" @@ -1,5 +1,5 @@ package com.umc.demo.domain.enums; public enum Gender { - MALE, FEMALE + MALE, FEMALE, NONE, } diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/domain/mapping/MemberPrefer.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/domain/mapping/MemberPrefer.java" index 3b82f13..483b60b 100644 --- "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/domain/mapping/MemberPrefer.java" +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/domain/mapping/MemberPrefer.java" @@ -35,4 +35,15 @@ public class MemberPrefer extends BaseEntity { @JoinColumn(name = "category_id") private FoodCategory foodCategory; + public void setMember(Member member){ + if(this.member != null) + member.getMemberPreferList().remove(this); + this.member = member; + member.getMemberPreferList().add(this); + } + + public void setFoodCategory(FoodCategory foodCategory){ + this.foodCategory = foodCategory; + } + } diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/repository/FoodCategoryRepository.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/repository/FoodCategoryRepository.java" new file mode 100644 index 0000000..64c8631 --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/repository/FoodCategoryRepository.java" @@ -0,0 +1,7 @@ +package com.umc.demo.repository; + +import com.umc.demo.domain.FoodCategory; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface FoodCategoryRepository extends JpaRepository { +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/repository/MemberRepository.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/repository/MemberRepository.java" new file mode 100644 index 0000000..a140d02 --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/repository/MemberRepository.java" @@ -0,0 +1,7 @@ +package com.umc.demo.repository; + +import com.umc.demo.domain.Member; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MemberRepository extends JpaRepository { +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberCommandService.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberCommandService.java" new file mode 100644 index 0000000..2db516a --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberCommandService.java" @@ -0,0 +1,9 @@ +package com.umc.demo.service.MemberService; + +import com.umc.demo.domain.Member; +import com.umc.demo.web.dto.MemberRequestDTO; + +public interface MemberCommandService { + + Member joinMember(MemberRequestDTO.JoinDto request); +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberCommandServiceImpl.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberCommandServiceImpl.java" new file mode 100644 index 0000000..b8854ed --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberCommandServiceImpl.java" @@ -0,0 +1,44 @@ +package com.umc.demo.service.MemberService; + +import com.umc.demo.apiPayload.code.status.ErrorStatus; +import com.umc.demo.apiPayload.exception.handler.FoodCategoryHandler; +import com.umc.demo.converter.MemberConverter; +import com.umc.demo.converter.MemberPreferConverter; +import com.umc.demo.domain.FoodCategory; +import com.umc.demo.domain.Member; +import com.umc.demo.domain.mapping.MemberPrefer; +import com.umc.demo.repository.FoodCategoryRepository; +import com.umc.demo.repository.MemberRepository; +import com.umc.demo.web.dto.MemberRequestDTO; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class MemberCommandServiceImpl implements MemberCommandService { + + private final MemberRepository memberRepository; + + private final FoodCategoryRepository foodCategoryRepository; + + @Override + @Transactional + public Member joinMember(MemberRequestDTO.JoinDto request) { + + Member newMember = MemberConverter.toMember(request); + List foodCategoryList = request.getPreferCategory().stream() + .map(category -> { + return foodCategoryRepository.findById(category).orElseThrow(() -> new FoodCategoryHandler( + ErrorStatus.FOOD_CATEGORY_NOT_FOUND)); + }).collect(Collectors.toList()); + + List memberPreferList = MemberPreferConverter.toMemberPreferList(foodCategoryList); + + memberPreferList.forEach(memberPrefer -> {memberPrefer.setMember(newMember);}); + + return memberRepository.save(newMember); + } +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberQueryService.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberQueryService.java" new file mode 100644 index 0000000..99be2bb --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberQueryService.java" @@ -0,0 +1,4 @@ +package com.umc.demo.service.MemberService; + +public interface MemberQueryService { +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberQueryServiceImpl.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberQueryServiceImpl.java" new file mode 100644 index 0000000..476df42 --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/service/MemberService/MemberQueryServiceImpl.java" @@ -0,0 +1,4 @@ +package com.umc.demo.service.MemberService; + +public class MemberQueryServiceImpl { +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/validation/annotation/ExistCategories.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/validation/annotation/ExistCategories.java" new file mode 100644 index 0000000..a7d9151 --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/validation/annotation/ExistCategories.java" @@ -0,0 +1,21 @@ +package com.umc.demo.validation.annotation; + +import com.umc.demo.validation.validator.CategoriesExistValidator; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.validation.Constraint; +import javax.validation.Payload; + +@Documented +@Constraint(validatedBy = CategoriesExistValidator.class) +@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExistCategories { + + String message() default "해당하는 카테고리가 존재하지 않습니다."; + Class[] groups() default {}; + Class[] payload() default {}; +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/validation/validator/CategoriesExistValidator.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/validation/validator/CategoriesExistValidator.java" new file mode 100644 index 0000000..120af19 --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/validation/validator/CategoriesExistValidator.java" @@ -0,0 +1,36 @@ +package com.umc.demo.validation.validator; + +import com.umc.demo.apiPayload.code.status.ErrorStatus; +import com.umc.demo.repository.FoodCategoryRepository; +import com.umc.demo.validation.annotation.ExistCategories; +import java.util.List; +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class CategoriesExistValidator implements ConstraintValidator> { + + private final FoodCategoryRepository foodCategoryRepository; + + @Override + public void initialize(ExistCategories constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(List values, ConstraintValidatorContext context) { + boolean isValid = values.stream() + .allMatch(value -> foodCategoryRepository.existsById(value)); + + if (!isValid) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate(ErrorStatus.FOOD_CATEGORY_NOT_FOUND.toString()).addConstraintViolation(); + } + + return isValid; + + } +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/web/controller/MemberRestController.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/web/controller/MemberRestController.java" new file mode 100644 index 0000000..6af5ea9 --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/web/controller/MemberRestController.java" @@ -0,0 +1,28 @@ +package com.umc.demo.web.controller; + +import com.umc.demo.apiPayload.ApiResponse; +import com.umc.demo.converter.MemberConverter; +import com.umc.demo.domain.Member; +import com.umc.demo.service.MemberService.MemberCommandService; +import com.umc.demo.web.dto.MemberRequestDTO; +import com.umc.demo.web.dto.MemberResponseDTO; +import javax.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/members") +public class MemberRestController { + + private final MemberCommandService memberCommandService; + + @PostMapping("/") + public ApiResponse join(@RequestBody @Valid MemberRequestDTO.JoinDto request){ + Member member = memberCommandService.joinMember(request); + return ApiResponse.onSuccess(MemberConverter.toJoinResultDTO(member)); + } +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/web/dto/MemberRequestDTO.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/web/dto/MemberRequestDTO.java" new file mode 100644 index 0000000..ebe3e14 --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/web/dto/MemberRequestDTO.java" @@ -0,0 +1,31 @@ +package com.umc.demo.web.dto; + +import com.umc.demo.validation.annotation.ExistCategories; +import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import lombok.Getter; + +public class MemberRequestDTO { + + @Getter + public static class JoinDto{ + @NotBlank + String name; + @NotNull + Integer gender; + @NotNull + Integer birthYear; + @NotNull + Integer birthMonth; + @NotNull + Integer birthDay; + @Size(min = 5, max = 12) + String address; + @Size(min = 5, max = 12) + String specAddress; + @ExistCategories + List preferCategory; + } +} diff --git "a/\353\235\274\354\235\264/src/main/java/com/umc/demo/web/dto/MemberResponseDTO.java" "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/web/dto/MemberResponseDTO.java" new file mode 100644 index 0000000..da35c70 --- /dev/null +++ "b/\353\235\274\354\235\264/src/main/java/com/umc/demo/web/dto/MemberResponseDTO.java" @@ -0,0 +1,19 @@ +package com.umc.demo.web.dto; + +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class MemberResponseDTO { + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class JoinResultDTO{ + Long memberId; + LocalDateTime createdAt; + } +}