From bd23fda6f5f5b4a21989f684f505d6c48d9beff7 Mon Sep 17 00:00:00 2001 From: seungin Date: Sat, 26 Jul 2025 17:16:05 +0900 Subject: [PATCH 1/7] =?UTF-8?q?[feat]=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=93=B1=EB=A1=9D=20=EA=B4=80=EB=A0=A8=20Dto=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 --- .../user/dto/UserInfoRegisterRequestDto.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/com/wayble/server/user/dto/UserInfoRegisterRequestDto.java diff --git a/src/main/java/com/wayble/server/user/dto/UserInfoRegisterRequestDto.java b/src/main/java/com/wayble/server/user/dto/UserInfoRegisterRequestDto.java new file mode 100644 index 00000000..bd0530b2 --- /dev/null +++ b/src/main/java/com/wayble/server/user/dto/UserInfoRegisterRequestDto.java @@ -0,0 +1,26 @@ +package com.wayble.server.user.dto; + + +import com.wayble.server.user.entity.Gender; +import com.wayble.server.user.entity.UserType; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; + +@Getter +public class UserInfoRegisterRequestDto { + @NotBlank(message = "닉네임은 필수입니다.") + private String nickname; + + @NotBlank(message = "생년월일은 필수입니다.") + private String birthDate; // YYYY-MM-DD + + @NotNull(message = "성별은 필수입니다.") + private Gender gender; + + @NotNull(message = "유저 타입은 필수입니다.") + private UserType userType; + + private String disabilityType; // 장애 유형, (userType == DISABLED만 값 존재) + private String mobilityAid; // 이동보조수단, (userType == DISABLED만 값 존재) +} From d1465789d926d390310cc8c6aa09bed3ca4db3c0 Mon Sep 17 00:00:00 2001 From: seungin Date: Sat, 26 Jul 2025 17:23:18 +0900 Subject: [PATCH 2/7] =?UTF-8?q?[feat]=20=EC=9C=A0=EC=A0=80=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=EC=97=90=20=EC=9E=A5=EC=95=A0=20=EC=9C=A0?= =?UTF-8?q?=ED=98=95=20=EB=B0=8F=20=EC=9D=B4=EB=8F=99=20=EB=B3=B4=EC=A1=B0?= =?UTF-8?q?=20=EC=88=98=EB=8B=A8=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?,=20=EC=A0=95=EB=B3=B4=20update=EB=A5=BC=20=EC=9C=84=ED=95=9C?= =?UTF-8?q?=20setter=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/wayble/server/user/entity/User.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wayble/server/user/entity/User.java b/src/main/java/com/wayble/server/user/entity/User.java index ecb4f2a0..18189869 100644 --- a/src/main/java/com/wayble/server/user/entity/User.java +++ b/src/main/java/com/wayble/server/user/entity/User.java @@ -53,11 +53,17 @@ public class User extends BaseEntity { @Enumerated(EnumType.STRING) @Column(name = "user_type", nullable = false) - private UserType userType; + private UserType userType; // DISABLED,COMPANION,GENERAL @Column(name = "profile_image_url") private String profileImageUrl; + @Column(name = "disability_type") + private String disabilityType; // 장애 유형 (발달장애,시각장애,지체장애,청각장애) + + @Column(name = "mobility_aid") + private String mobilityAid; // 이동 보조 수단 (안내견,지팡이,동행인,휠체어) + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List reviewList = new ArrayList<>(); @@ -88,4 +94,20 @@ public void updateProfileImageUrl(String profileImageUrl) { public void setNickname(String nickname) { this.nickname = nickname; } + + public void setDisabilityType(String disabilityType) { + this.disabilityType = disabilityType; + } + public void setMobilityAid(String mobilityAid) { + this.mobilityAid = mobilityAid; + } + public void setBirthDate(LocalDate birthDate) { + this.birthDate = birthDate; + } + public void setGender(Gender gender) { + this.gender = gender; + } + public void setUserType(UserType userType) { + this.userType = userType; + } } From 61bf2e2498992a8137a57df25ec32cdc557ad0cc Mon Sep 17 00:00:00 2001 From: seungin Date: Sat, 26 Jul 2025 17:24:57 +0900 Subject: [PATCH 3/7] =?UTF-8?q?[feat]=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=93=B1=EB=A1=9D=20=EA=B4=80=EB=A0=A8=20ErrorCase?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/wayble/server/user/exception/UserErrorCase.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wayble/server/user/exception/UserErrorCase.java b/src/main/java/com/wayble/server/user/exception/UserErrorCase.java index a0aad440..98867c89 100644 --- a/src/main/java/com/wayble/server/user/exception/UserErrorCase.java +++ b/src/main/java/com/wayble/server/user/exception/UserErrorCase.java @@ -15,7 +15,8 @@ public enum UserErrorCase implements ErrorCase { USER_ALREADY_EXISTS(400, 1005, "이미 존재하는 회원입니다."), INVALID_CREDENTIALS(400, 1006, "아이디 혹은 비밀번호가 잘못되었습니다."), FORBIDDEN(403, 1007, "권한이 없습니다."), - KAKAO_AUTH_FAILED(401, 1008, "카카오 인증에 실패하였습니다."); + KAKAO_AUTH_FAILED(401, 1008, "카카오 인증에 실패하였습니다."), + USER_INFO_ALREADY_EXISTS(400,1009, "이미 등록된 정보가 있습니다."); private final Integer httpStatusCode; private final Integer errorCode; From 24c3d03c5d3b1fa22702bf9d76ece74b8dec733a Mon Sep 17 00:00:00 2001 From: seungin Date: Sat, 26 Jul 2025 17:28:20 +0900 Subject: [PATCH 4/7] =?UTF-8?q?[feat]=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=93=B1=EB=A1=9D=20=EA=B4=80=EB=A0=A8=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/user/service/UserInfoService.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/main/java/com/wayble/server/user/service/UserInfoService.java diff --git a/src/main/java/com/wayble/server/user/service/UserInfoService.java b/src/main/java/com/wayble/server/user/service/UserInfoService.java new file mode 100644 index 00000000..b6cf2740 --- /dev/null +++ b/src/main/java/com/wayble/server/user/service/UserInfoService.java @@ -0,0 +1,47 @@ +package com.wayble.server.user.service; + + +import com.wayble.server.common.exception.ApplicationException; +import com.wayble.server.user.dto.UserInfoRegisterRequestDto; +import com.wayble.server.user.entity.User; +import com.wayble.server.user.entity.UserType; +import com.wayble.server.user.exception.UserErrorCase; +import com.wayble.server.user.repository.UserRepository; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; + +@Service +@RequiredArgsConstructor +public class UserInfoService { + private final UserRepository userRepository; + + @Transactional + public void registerUserInfo(Long userId, UserInfoRegisterRequestDto dto) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new ApplicationException(UserErrorCase.USER_NOT_FOUND)); + + // 이미 등록된 정보가 있으면 에러 처리 + if (user.getNickname() != null) { + throw new ApplicationException(UserErrorCase.USER_INFO_ALREADY_EXISTS); + } + + user.setNickname(dto.getNickname()); + user.setBirthDate(LocalDate.parse(dto.getBirthDate())); + user.setGender(dto.getGender()); + user.setUserType(dto.getUserType()); + + if (dto.getUserType() == UserType.DISABLED) { + // 장애 유형,이동보조수단 설정 + user.setDisabilityType(dto.getDisabilityType()); + user.setMobilityAid(dto.getMobilityAid()); + } else { + user.setDisabilityType(null); + user.setMobilityAid(null); + } + + userRepository.save(user); + } +} From d8e8eceeff2154469af6b894f92627f4333ad9a3 Mon Sep 17 00:00:00 2001 From: seungin Date: Sat, 26 Jul 2025 17:34:24 +0900 Subject: [PATCH 5/7] =?UTF-8?q?[feat]=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=93=B1=EB=A1=9D=20=EA=B4=80=EB=A0=A8=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserController.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/com/wayble/server/user/controller/UserController.java b/src/main/java/com/wayble/server/user/controller/UserController.java index 1d650fa5..c156867a 100644 --- a/src/main/java/com/wayble/server/user/controller/UserController.java +++ b/src/main/java/com/wayble/server/user/controller/UserController.java @@ -3,10 +3,12 @@ import com.wayble.server.common.config.security.jwt.JwtTokenProvider; import com.wayble.server.common.exception.ApplicationException; import com.wayble.server.common.response.CommonResponse; +import com.wayble.server.user.dto.UserInfoRegisterRequestDto; import com.wayble.server.user.dto.UserLoginRequestDto; import com.wayble.server.user.dto.UserRegisterRequestDto; import com.wayble.server.user.dto.token.TokenResponseDto; import com.wayble.server.user.exception.UserErrorCase; +import com.wayble.server.user.service.UserInfoService; import com.wayble.server.user.service.UserService; import com.wayble.server.user.service.auth.AuthService; import io.swagger.v3.oas.annotations.Operation; @@ -17,6 +19,8 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -112,4 +116,25 @@ public CommonResponse logout( return CommonResponse.success("로그아웃에 성공하였습니다."); } + @PostMapping("/info") + @Operation(summary = "내 정보 등록", description = "유저의 상세 정보를 최초 1회 등록합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "내 정보 등록 완료"), + @ApiResponse(responseCode = "400", description = "이미 등록된 정보가 있습니다."), + @ApiResponse(responseCode = "404", description = "유저를 찾을 수 없습니다."), + @ApiResponse(responseCode = "401", description = "인증 필요") + }) + public CommonResponse registerUserInfo( + @RequestBody @Valid UserInfoRegisterRequestDto req + ) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (!(authentication.getPrincipal() instanceof Long userId)) { + throw new ApplicationException(UserErrorCase.FORBIDDEN); + } + + userInfoService.registerUserInfo(userId, req); + return CommonResponse.success("내 정보 등록 완료"); + } + + private final UserInfoService userInfoService; } From de40911a405866e0daf9caf57b0183bd9cfc9998 Mon Sep 17 00:00:00 2001 From: seungin Date: Sat, 26 Jul 2025 17:51:41 +0900 Subject: [PATCH 6/7] =?UTF-8?q?[fix]=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=ED=95=84=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/wayble/server/user/dto/UserLoginRequestDto.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/wayble/server/user/dto/UserLoginRequestDto.java b/src/main/java/com/wayble/server/user/dto/UserLoginRequestDto.java index ee69eb23..38a4496a 100644 --- a/src/main/java/com/wayble/server/user/dto/UserLoginRequestDto.java +++ b/src/main/java/com/wayble/server/user/dto/UserLoginRequestDto.java @@ -6,9 +6,6 @@ import jakarta.validation.constraints.NotNull; public record UserLoginRequestDto( - @NotBlank(message = "이름 또는 닉네임은 필수입니다") - String name, - @NotBlank(message = "이메일은 필수입니다") @Email(message = "유효한 이메일 형식이 아닙니다") String email, From de51266fd0cf4ea67cd46fc81335cfc3d584ec05 Mon Sep 17 00:00:00 2001 From: seungin Date: Sat, 26 Jul 2025 18:33:11 +0900 Subject: [PATCH 7/7] =?UTF-8?q?[reafactor]=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81=ED=95=98=EC=97=AC=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/wayble/server/user/controller/UserController.java | 3 +-- .../wayble/server/user/dto/UserInfoRegisterRequestDto.java | 2 ++ .../com/wayble/server/user/exception/UserErrorCase.java | 3 ++- .../com/wayble/server/user/service/UserInfoService.java | 7 ++++++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/wayble/server/user/controller/UserController.java b/src/main/java/com/wayble/server/user/controller/UserController.java index c156867a..dea97996 100644 --- a/src/main/java/com/wayble/server/user/controller/UserController.java +++ b/src/main/java/com/wayble/server/user/controller/UserController.java @@ -33,6 +33,7 @@ public class UserController { private final UserService userService; private final AuthService authService; private final JwtTokenProvider jwtProvider; + private final UserInfoService userInfoService; @PostMapping("/signup") @Operation( @@ -135,6 +136,4 @@ public CommonResponse registerUserInfo( userInfoService.registerUserInfo(userId, req); return CommonResponse.success("내 정보 등록 완료"); } - - private final UserInfoService userInfoService; } diff --git a/src/main/java/com/wayble/server/user/dto/UserInfoRegisterRequestDto.java b/src/main/java/com/wayble/server/user/dto/UserInfoRegisterRequestDto.java index bd0530b2..2c62901c 100644 --- a/src/main/java/com/wayble/server/user/dto/UserInfoRegisterRequestDto.java +++ b/src/main/java/com/wayble/server/user/dto/UserInfoRegisterRequestDto.java @@ -5,11 +5,13 @@ import com.wayble.server.user.entity.UserType; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Getter; @Getter public class UserInfoRegisterRequestDto { @NotBlank(message = "닉네임은 필수입니다.") + @Size(max = 8, message = "닉네임은 8자 이하여야 합니다.") private String nickname; @NotBlank(message = "생년월일은 필수입니다.") diff --git a/src/main/java/com/wayble/server/user/exception/UserErrorCase.java b/src/main/java/com/wayble/server/user/exception/UserErrorCase.java index 98867c89..e117df01 100644 --- a/src/main/java/com/wayble/server/user/exception/UserErrorCase.java +++ b/src/main/java/com/wayble/server/user/exception/UserErrorCase.java @@ -16,7 +16,8 @@ public enum UserErrorCase implements ErrorCase { INVALID_CREDENTIALS(400, 1006, "아이디 혹은 비밀번호가 잘못되었습니다."), FORBIDDEN(403, 1007, "권한이 없습니다."), KAKAO_AUTH_FAILED(401, 1008, "카카오 인증에 실패하였습니다."), - USER_INFO_ALREADY_EXISTS(400,1009, "이미 등록된 정보가 있습니다."); + USER_INFO_ALREADY_EXISTS(400,1009, "이미 등록된 정보가 있습니다."), + INVALID_BIRTH_DATE(400, 1010, "생년월일 형식이 올바르지 않습니다."); private final Integer httpStatusCode; private final Integer errorCode; diff --git a/src/main/java/com/wayble/server/user/service/UserInfoService.java b/src/main/java/com/wayble/server/user/service/UserInfoService.java index b6cf2740..9bfe9746 100644 --- a/src/main/java/com/wayble/server/user/service/UserInfoService.java +++ b/src/main/java/com/wayble/server/user/service/UserInfoService.java @@ -12,6 +12,7 @@ import org.springframework.stereotype.Service; import java.time.LocalDate; +import java.time.format.DateTimeParseException; @Service @RequiredArgsConstructor @@ -29,7 +30,11 @@ public void registerUserInfo(Long userId, UserInfoRegisterRequestDto dto) { } user.setNickname(dto.getNickname()); - user.setBirthDate(LocalDate.parse(dto.getBirthDate())); + try { + user.setBirthDate(LocalDate.parse(dto.getBirthDate())); + } catch (DateTimeParseException e) { + throw new ApplicationException(UserErrorCase.INVALID_BIRTH_DATE); + } user.setGender(dto.getGender()); user.setUserType(dto.getUserType());