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

[내 프로필 수정] 내 프로필을 수정할 수 있음(#38) #67

Merged
merged 56 commits into from
May 8, 2024
Merged
Show file tree
Hide file tree
Changes from 55 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
8aca7d3
feat: 서비스 정규식 enum 정리(#38)
Minjae-An Apr 15, 2024
cb1f984
feat: 회원가입 요청 dto 필드, wrapper 타입으로 일괄 변경(#38)
Minjae-An Apr 15, 2024
2eee86c
feat: 생년월일 기반 성인 여부 확인 로직 추가(#38)
Minjae-An Apr 15, 2024
b772980
feat: 프로필 수정 관련 예외 추가(#38)
Minjae-An Apr 15, 2024
5d2cb7d
feat: 사용자 기반 사용자 선호 내역 조회 기능 정의(#38)
Minjae-An Apr 15, 2024
7abfd40
feat: 사용자 기반 사용자 선호 내역 조회 로직 추가(#38)
Minjae-An Apr 15, 2024
8cb989a
feat: 내 프로필 수정 요청 DTO 보완(#38)
Minjae-An Apr 15, 2024
e337251
feat: 내 프로필 업데이트 로직 추가(#38)
Minjae-An Apr 15, 2024
f8c90b4
feat: 선호조건 업데이트 로직 추가(#38)
Minjae-An Apr 15, 2024
d958eb4
feat: 내 프로필 수정 비즈니스 로직 구성(#38)
Minjae-An Apr 15, 2024
93d9082
feat: API 응답 코드 200으로 일괄 수정(#38)
Minjae-An Apr 15, 2024
2c85ae7
feat: 불필요한 constraint exception 핸들링 로직 삭제(#38)
Minjae-An Apr 17, 2024
849f214
feat: 하한, 상한 필드들 nullable하게 수정(#38)
Minjae-An Apr 17, 2024
5a14144
feat: 하한, 상한 값들 제약 조건 수정(#38)
Minjae-An Apr 17, 2024
069994a
feat: 내 프로필 수정 비즈니스 로직 수정(#38)
Minjae-An Apr 17, 2024
5a64f6e
feat: 예외 enum 위치 적절히 이동(#38)
Minjae-An Apr 17, 2024
7ee919d
feat: 예외 enum 위치 이동에 따른 사용 위치 수정(#38)
Minjae-An Apr 17, 2024
ae1537f
refactor: 현재 날짜 변수명 now에서 currentDate로 변경(#38)
Minjae-An Apr 17, 2024
6a1c8d3
feat: 회원 생성 로직에 성인 여부 검증 과정 추가(#38)
Minjae-An Apr 17, 2024
dd2f990
Merge branch 'dev' into feat/#38-edit-my-profile
Minjae-An Apr 28, 2024
de9e033
feat: 키 필드, 기본 타입으로 수정(#38)
Minjae-An Apr 28, 2024
1cbfa27
feat: 키, 사진 싱크로율 필드 기본 타입으로 수정(#38)
Minjae-An Apr 29, 2024
82cd65f
feat: 프로필 업데이트 로직, 업데이트 가능한 필드 추가(#38)
Minjae-An Apr 30, 2024
661aa0e
feat: 음역대 엔티티 생성자, 분류 비교 로직 추가(#38)
Minjae-An Apr 30, 2024
8934d5e
feat: 동물상 엔티티 생성자, 이름 비교 로직 추가(#38)
Minjae-An Apr 30, 2024
d6ddac6
feat: 지역 엔티티 생성자, 이름 비교 로직 추가(#38)
Minjae-An Apr 30, 2024
e76eb02
feat: 동물상 전체 조회 로직 추가(#38)
Minjae-An Apr 30, 2024
124648b
feat: 지역 전체 조회 로직 추가(#38)
Minjae-An Apr 30, 2024
20677b7
feat: 선호 조건 업데이트 로직 수정(#38)
Minjae-An Apr 30, 2024
84ea195
feat: 내 프로필 수정 요청 DTO, 선호하는 mbti 필드 추가(#38)
Minjae-An Apr 30, 2024
74ed0e9
feat: 음역대 조회 로직 수정 및 추가(#38)
Minjae-An Apr 30, 2024
1e4210f
feat: 분류 기반 음역대 조회 메서드 사용 위치 수정(#38)
Minjae-An Apr 30, 2024
779a85c
feat: 내 프로필 수정 비즈니스 로직 변경(#38)
Minjae-An Apr 30, 2024
14b1846
Merge branch 'dev' into feat/#38-edit-my-profile
Minjae-An May 1, 2024
7c9ea6d
feat: 불필요한 이메일 검증 정규식 삭제(#38)
Minjae-An May 1, 2024
47b2f0e
feat: 불필요한 이미 사용 중인 이메일 예외 삭제(#38)
Minjae-An May 1, 2024
eed0097
feat: 사용자 엔티티 이메일 필드 삭제, 연관 로직 수정(#38)
Minjae-An May 1, 2024
e5b169b
feat: 회원가입 요청 dto, 이메일 필드 삭제(#38)
Minjae-An May 1, 2024
b687a4a
feat: 사용자 상세 프로필 응답 dto, 이메일 필드 삭제(#38)
Minjae-An May 1, 2024
b017cac
feat: 이메일 연관 조회 로직 삭제(#38)
Minjae-An May 1, 2024
65bd1b0
feat: 이메일 연관 조회 로직 삭제(#38)
Minjae-An May 1, 2024
310c1cd
feat: 이메일 연관 로직 삭제(#38)
Minjae-An May 1, 2024
b5caf52
feat: 사용자 생성 로직에서 이메일 검증 코드 삭제(#38)
Minjae-An May 1, 2024
ce65021
feat: 불필요한 이메일 찾기 연관 API 삭제(#38)
Minjae-An May 1, 2024
7b10974
feat: 삭제된 API, 인가 필요 URL에서 제외(#38)
Minjae-An May 1, 2024
7930b8c
Merge branch 'dev' into feat/#38-edit-my-profile
Minjae-An May 1, 2024
e919607
fix: 병합 과정에서 미처 반영되지 못한 부분 수정(#38)
Minjae-An May 1, 2024
39d66ec
feat: 사용자 선호 조건 조회 로직, 단건을 조회하게 수정(#38)
Minjae-An May 1, 2024
06d778e
feat: 사용자 선호 조건 조회 로직 수정(#38)
Minjae-An May 1, 2024
f6f54a4
feat: 사용자 키 130~220cm 범위 값만 가능토록 검증 추가(#38)
Minjae-An May 1, 2024
f1cbd93
feat: 사용자 키, 나이 관련 검증 추가(#38)
Minjae-An May 1, 2024
6d99b57
feat: 유효 범위를 벗어난 사용자 나이 예외 정의(#38)
Minjae-An May 1, 2024
efdff84
feat: 사용자 나이 20~40세 범위내인 지 검증하는 로직 구성(#38)
Minjae-An May 1, 2024
1179b45
feat: 회원가입시 사용자 나이 검증 로직 수정(#38)
Minjae-An May 1, 2024
7d4ae23
feat: 프로필 수정시 사용자 나이 검증 로직 수정(#38)
Minjae-An May 1, 2024
4fe6dfe
Merge branch 'dev' into feat/#38-edit-my-profile
Minjae-An May 8, 2024
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
2 changes: 0 additions & 2 deletions be/src/main/java/yeonba/be/config/WebConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ public void addInterceptors(InterceptorRegistry registry) {
"/error")
.excludePathPatterns(
"/users/join/**",
"/users/email-inquiry/**",
"/users/pw-inquiry",
"/users/login",
"/users/refresh");
}
Expand Down
194 changes: 78 additions & 116 deletions be/src/main/java/yeonba/be/exception/ExceptionAdvice.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package yeonba.be.exception;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;
Expand All @@ -21,118 +19,82 @@
@RestControllerAdvice(annotations = {RestController.class})
public class ExceptionAdvice extends ResponseEntityExceptionHandler {

@ExceptionHandler(value = GeneralException.class)
public ResponseEntity<Object> handleGeneralException(
GeneralException exception,
HttpServletRequest request) {

return handleExceptionInternal(
exception,
request);
}

@ExceptionHandler(value = ConstraintViolationException.class)
public ResponseEntity<Object> handleConstraintViolationException(
ConstraintViolationException exception,
WebRequest request) {

String exceptionMessage = getConstraintViolationMessage(exception);

return handleExceptionInternalConstraint(
exception,
exceptionMessage,
request);
}

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(
MethodArgumentNotValidException exception,
HttpHeaders headers,
HttpStatusCode status,
WebRequest request) {

Map<String, String> exceptionArgs = getMethodArgumentExceptionArgs(exception);

return handleExceptionInternalArgs(
exception,
exceptionArgs,
request);
}

private ResponseEntity<Object> handleExceptionInternal(
GeneralException exception,
HttpServletRequest request) {

CustomResponse<Object> body = new CustomResponse<>(exception.getExceptionReason());
WebRequest webRequest = new ServletWebRequest(request);

return super.handleExceptionInternal(
exception,
body,
HttpHeaders.EMPTY,
exception.getHttpStatus(),
webRequest);
}

private Map<String, String> getMethodArgumentExceptionArgs(
MethodArgumentNotValidException exception) {

Map<String, String> exceptionArgs = new LinkedHashMap<>();
exception.getBindingResult().getFieldErrors()
.forEach(fieldError -> {
String fieldName = fieldError.getField();
String errorMessage = Optional
.ofNullable(fieldError.getDefaultMessage())
.orElse("");
exceptionArgs.merge(
fieldName,
errorMessage,
(existingErrorMessage, newErrorMessage) ->
existingErrorMessage
.concat(", ")
.concat(newErrorMessage));
});

return exceptionArgs;
}

private ResponseEntity<Object> handleExceptionInternalArgs(
MethodArgumentNotValidException exception,
Map<String, String> exceptionArgs,
WebRequest request) {

CustomResponse<Map<String, String>> body = CustomResponse.onFailure(
CommonException.BAD_REQUEST.getReason(),
exceptionArgs);

return super.handleExceptionInternal(
exception,
body,
HttpHeaders.EMPTY,
CommonException.BAD_REQUEST.getHttpStatus(),
request);
}

private String getConstraintViolationMessage(ConstraintViolationException exception) {

return exception.getConstraintViolations().stream()
.map(ConstraintViolation::getMessage)
.findFirst()
.orElseThrow(() -> new RuntimeException("ConstraintViolationException 추출 도중 오류 발생"));
}

private ResponseEntity<Object> handleExceptionInternalConstraint(
ConstraintViolationException exception,
String exceptionMessage,
WebRequest request) {

CustomResponse<Object> body = new CustomResponse<>(exceptionMessage);

return super.handleExceptionInternal(
exception,
body,
HttpHeaders.EMPTY,
CommonException.BAD_REQUEST.getHttpStatus(),
request);
}
@ExceptionHandler(value = GeneralException.class)
public ResponseEntity<Object> handleGeneralException(
GeneralException exception,
HttpServletRequest request) {

return handleExceptionInternal(
exception,
request);
}

private ResponseEntity<Object> handleExceptionInternal(
GeneralException exception,
HttpServletRequest request) {

CustomResponse<Object> body = new CustomResponse<>(exception.getExceptionReason());
WebRequest webRequest = new ServletWebRequest(request);

return super.handleExceptionInternal(
exception,
body,
HttpHeaders.EMPTY,
exception.getHttpStatus(),
webRequest);
}

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(
MethodArgumentNotValidException exception,
HttpHeaders headers,
HttpStatusCode status,
WebRequest request) {

Map<String, String> exceptionArgs = getMethodArgumentExceptionArgs(exception);

return handleExceptionInternalArgs(
exception,
exceptionArgs,
request);
}

private Map<String, String> getMethodArgumentExceptionArgs(
MethodArgumentNotValidException exception) {

Map<String, String> exceptionArgs = new LinkedHashMap<>();
exception.getBindingResult().getFieldErrors()
.forEach(fieldError -> {
String fieldName = fieldError.getField();
String errorMessage = Optional
.ofNullable(fieldError.getDefaultMessage())
.orElse("");
exceptionArgs.merge(
fieldName,
errorMessage,
(existingErrorMessage, newErrorMessage) ->
existingErrorMessage
.concat(", ")
.concat(newErrorMessage));
});

return exceptionArgs;
}

private ResponseEntity<Object> handleExceptionInternalArgs(
MethodArgumentNotValidException exception,
Map<String, String> exceptionArgs,
WebRequest request) {

CustomResponse<Map<String, String>> body = CustomResponse.onFailure(
CommonException.BAD_REQUEST.getReason(),
exceptionArgs);

return super.handleExceptionInternal(
exception,
body,
HttpHeaders.EMPTY,
CommonException.BAD_REQUEST.getHttpStatus(),
request);
}
}
16 changes: 0 additions & 16 deletions be/src/main/java/yeonba/be/exception/JoinException.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,6 @@ public enum JoinException implements BaseException {
HttpStatus.BAD_REQUEST,
"비밀번호 확인 값이 비밀번호와 일치하지 않습니다."),

VOCAL_RANGE_NOT_FOUND(
HttpStatus.BAD_REQUEST,
"존재하지 않는 음역대입니다."),

ANIMAL_NOT_FOUND(
HttpStatus.BAD_REQUEST,
"존재하지 않는 동물상입니다."),

AREA_NOT_FOUND(
HttpStatus.BAD_REQUEST,
"존재하지 않는 지역입니다."),

ALREADY_USED_EMAIL(
HttpStatus.BAD_REQUEST,
"이미 사용 중인 이메일입니다."),

ALREADY_USED_NICKNAME(
HttpStatus.BAD_REQUEST,
"이미 사용 중인 닉네임입니다."),
Expand Down
47 changes: 30 additions & 17 deletions be/src/main/java/yeonba/be/exception/UserException.java
Original file line number Diff line number Diff line change
@@ -1,36 +1,49 @@
package yeonba.be.exception;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.http.HttpStatus;

@Getter
@AllArgsConstructor
public enum UserException implements BaseException {

INVALID_REFRESH_TOKEN(
HttpStatus.UNAUTHORIZED,
"유효하지 않은 리프레시 토큰입니다."),

NOT_MATCH_LOGIN_TYPE(
HttpStatus.BAD_REQUEST,
"다른 로그인 방식을 이용해주세요."),

VOCAL_RANGE_NOT_FOUND(
HttpStatus.BAD_REQUEST,
"존재하지 않는 음역대입니다."),

ANIMAL_NOT_FOUND(
HttpStatus.BAD_REQUEST,
"존재하지 않는 동물상입니다."),

AREA_NOT_FOUND(
HttpStatus.BAD_REQUEST,
"존재하지 않는 지역입니다."),

USER_NOT_FOUND(
HttpStatus.BAD_REQUEST,
"해당 사용자가 존재하지 않습니다."),

NOT_MATCH_LOGIN_TYPE(
USER_PREFERENCE_NOT_FOUND(
HttpStatus.BAD_REQUEST,
"다른 로그인 방식을 이용해주세요.");

private final HttpStatus httpStatus;
private final String reason;
"해당 사용자의 선호내역이 존재하지 않습니다."),

UserException(HttpStatus httpStatus, String reason) {
this.httpStatus = httpStatus;
this.reason = reason;
}
AGE_OUT_OF_RANGE(
HttpStatus.BAD_REQUEST,
"서비스 이용이 가능한 사용자 나이는 20~40세입니다."),

@Override
public HttpStatus getHttpStatus() {
return httpStatus;
}
LOWER_BOUND_LESS_THAN_OR_EQUAL_UPPER_BOUND(
HttpStatus.BAD_REQUEST,
"하한 값은 상한 값보다 작거나 같아야 합니다.");

@Override
public String getReason() {
return reason;
}
private final HttpStatus httpStatus;
private final String reason;
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,9 @@
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import yeonba.be.login.dto.request.UserEmailInquiryRequest;
import yeonba.be.login.dto.request.UserJoinRequest;
import yeonba.be.login.dto.request.UserLoginRequest;
import yeonba.be.login.dto.request.UserPasswordInquiryRequest;
import yeonba.be.login.dto.request.UserRefreshJwtRequest;
import yeonba.be.login.dto.request.UserVerificationCodeRequest;
import yeonba.be.login.dto.request.UserVerifyPhoneNumberRequest;
import yeonba.be.login.dto.response.UserEmailInquiryResponse;
import yeonba.be.login.dto.response.UserJoinResponse;
import yeonba.be.login.dto.response.UserLoginResponse;
import yeonba.be.login.dto.response.UserRefrehJwtResponse;
Expand Down

This file was deleted.

Loading
Loading