From 076b38ce9e570e3b8eb707c729b80da9c300d5d8 Mon Sep 17 00:00:00 2001 From: mr8356 Date: Thu, 3 Jul 2025 15:44:59 +0900 Subject: [PATCH 1/5] fix users home --- .../producer/common/dto/enums/ErrorCode.java | 1 + .../domain/controller/UserController.java | 29 ++++++++++++- .../producer/domain/service/UserService.java | 42 ++++++++++++------- 3 files changed, 54 insertions(+), 18 deletions(-) diff --git a/producer/src/main/java/server/producer/common/dto/enums/ErrorCode.java b/producer/src/main/java/server/producer/common/dto/enums/ErrorCode.java index 6ec8a86..4fce8b0 100644 --- a/producer/src/main/java/server/producer/common/dto/enums/ErrorCode.java +++ b/producer/src/main/java/server/producer/common/dto/enums/ErrorCode.java @@ -27,6 +27,7 @@ public enum ErrorCode { NOT_FOUND_HOUSE(40401, "존재하지 않는 매물 ID 입니다."), HOUSE_NOT_FOUND(40402, "존재하지 않는 매물입니다."), ROOM_NOT_FOUND(40403, "존재하지 않는 방입니다."), + USER_NOT_FOUND(40404, "존재하지 않는 유저입니다."), //405 Method Not Allowed METHOD_NOT_ALLOWED(40500, "해당 요청은 지원되지 않습니다."), diff --git a/producer/src/main/java/server/producer/domain/controller/UserController.java b/producer/src/main/java/server/producer/domain/controller/UserController.java index 16ad848..486cf97 100644 --- a/producer/src/main/java/server/producer/domain/controller/UserController.java +++ b/producer/src/main/java/server/producer/domain/controller/UserController.java @@ -12,6 +12,7 @@ import server.producer.domain.dto.response.*; import server.producer.domain.service.UserService; import server.producer.security.jwt.JwtTokenProvider; +import server.producer.security.jwt.RefreshTokenRepository; import java.security.InvalidParameterException; @@ -20,6 +21,8 @@ @RequiredArgsConstructor public class UserController { private final UserService userService; + private final JwtTokenProvider jwtTokenProvider; + private final RefreshTokenRepository refreshTokenRepository; @GetMapping("/home") public ApiResponseDto getUserHomeInfo(HttpServletRequest request) { @@ -27,6 +30,8 @@ public ApiResponseDto getUserHomeInfo(HttpServletRequest re Long userId = SecurityUtil.getCurrentUserId(); HomeInfoResponseDto userHomeInfo = userService.getUserInfoAndRecentlyViewedHouse(userId); return ApiResponseDto.success(SuccessCode.MAIN_PAGE_GET_SUCCESS, userHomeInfo); + } catch (EntityNotFoundException e) { + return ApiResponseDto.fail(ErrorCode.USER_NOT_FOUND); } catch (InvalidParameterException e) { return ApiResponseDto.fail(ErrorCode.INVALID_PARAMETER); // userId가 유효하지 않은 경우 } catch (Exception e) { @@ -131,10 +136,30 @@ public ApiResponseDto updateGender(@RequestBody GenderU } @DeleteMapping("/delete") - public ApiResponseDto deleteUser() { + public ApiResponseDto deleteUser(@RequestHeader("Authorization") String refreshTokenHeader) { try { - Long userId = SecurityUtil.getCurrentUserId(); + if (refreshTokenHeader == null || !refreshTokenHeader.startsWith("Bearer ")) { + return ApiResponseDto.fail(ErrorCode.MISSING_REQUIRED_HEADER); + } + String refreshToken = refreshTokenHeader.substring(7); + + // 1. 토큰 유효성 검사 + if (!jwtTokenProvider.validateToken(refreshToken)) { + return ApiResponseDto.fail(ErrorCode.INVALID_REFRESH_TOKEN); + } + + // 2. 토큰 저장소에서 userId 조회 + Long userId = refreshTokenRepository.findUserIdByToken(refreshToken).orElse(null); + if (userId == null) { + return ApiResponseDto.fail(ErrorCode.INVALID_REFRESH_TOKEN); + } + + // 3. 토큰 삭제 + refreshTokenRepository.deleteByToken(refreshToken); + + // 4. 유저 삭제 userService.deleteUser(userId); + return ApiResponseDto.success(SuccessCode.USER_DELETE_SUCCESS, null); } catch (EntityNotFoundException e) { return ApiResponseDto.fail(ErrorCode.INVALID_PARAMETER); diff --git a/producer/src/main/java/server/producer/domain/service/UserService.java b/producer/src/main/java/server/producer/domain/service/UserService.java index 9bb4af1..7b8306d 100644 --- a/producer/src/main/java/server/producer/domain/service/UserService.java +++ b/producer/src/main/java/server/producer/domain/service/UserService.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; @Service +@Slf4j @RequiredArgsConstructor public class UserService { @@ -44,22 +45,31 @@ public HomeInfoResponseDto getUserInfoAndRecentlyViewedHouse(Long userId) { for (RecentlyViewedHouse rvh : houses) { House house = rvh.getHouse(); - final boolean isPinned = house.getPins().stream() - .anyMatch(pin -> pin.getUser().getId().equals(userId)); - HomeInfoResponseDto.RecentlyViewedHouseDto dto = new HomeInfoResponseDto.RecentlyViewedHouseDto( - house.getId(), - house.calculateMonthlyRent(), - house.calculateDeposit(), - house.calculateOccupancyType(), - house.getLocation(), - house.getGenderPolicy().toString(), - house.getLocationDescription(), - isPinned, - house.getMoodTag(), - house.getContractTerm(), - house.getMainImgUrl() - ); - recentlyViewedHouseDtos.add(dto); + if (house == null) { + log.warn("RecentlyViewedHouse 변환 중 예외 발생: {}", "house is null"); + continue; + } + try { + final boolean isPinned = house.getPins() != null && house.getPins().stream() + .anyMatch(pin -> pin.getUser() != null && pin.getUser().getId().equals(userId)); + HomeInfoResponseDto.RecentlyViewedHouseDto dto = new HomeInfoResponseDto.RecentlyViewedHouseDto( + house.getId(), + house.calculateMonthlyRent(), + house.calculateDeposit(), + house.calculateOccupancyType(), + house.getLocation(), + house.getGenderPolicy() != null ? house.getGenderPolicy().toString() : null, + house.getLocationDescription(), + isPinned, + house.getMoodTag(), + house.getContractTerm(), + house.getMainImgUrl() + ); + recentlyViewedHouseDtos.add(dto); + } catch (Exception e) { + log.warn("RecentlyViewedHouse 변환 중 예외 발생: {}", e.getMessage()); + continue; + } } return new HomeInfoResponseDto(nickname, location, recentlyViewedHouseDtos); } From 8001b7bfd1320737623afc0e68f46a261f294299 Mon Sep 17 00:00:00 2001 From: mr8356 Date: Thu, 3 Jul 2025 15:48:56 +0900 Subject: [PATCH 2/5] fix users home --- .../main/java/server/producer/domain/service/UserService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/producer/src/main/java/server/producer/domain/service/UserService.java b/producer/src/main/java/server/producer/domain/service/UserService.java index 7b8306d..21e4bea 100644 --- a/producer/src/main/java/server/producer/domain/service/UserService.java +++ b/producer/src/main/java/server/producer/domain/service/UserService.java @@ -3,6 +3,8 @@ import entity.*; import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; From 28f8bfdb34936c7d56af29d6035b6507fdf541a9 Mon Sep 17 00:00:00 2001 From: mr8356 Date: Thu, 3 Jul 2025 16:36:49 +0900 Subject: [PATCH 3/5] fix location default --- common/src/main/java/entity/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/entity/User.java b/common/src/main/java/entity/User.java index 4dbdfd3..4197cbd 100644 --- a/common/src/main/java/entity/User.java +++ b/common/src/main/java/entity/User.java @@ -32,7 +32,7 @@ public class User { private String nickname; @Column(nullable = true) - private String location = "창천동"; + private String location = "서울특별시 서대문구 창천동"; @Column(nullable = true) private double latitude = 37.55348; From 8adf1aaa3ea93cf8f56ae97f8772bd85291d8e5c Mon Sep 17 00:00:00 2001 From: mr8356 Date: Thu, 3 Jul 2025 18:13:32 +0900 Subject: [PATCH 4/5] =?UTF-8?q?fix=20jwt=20=ED=86=A0=ED=81=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../producer/security/jwt/JwtTokenProvider.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/producer/src/main/java/server/producer/security/jwt/JwtTokenProvider.java b/producer/src/main/java/server/producer/security/jwt/JwtTokenProvider.java index ec5b55b..e9eb1d9 100644 --- a/producer/src/main/java/server/producer/security/jwt/JwtTokenProvider.java +++ b/producer/src/main/java/server/producer/security/jwt/JwtTokenProvider.java @@ -41,7 +41,17 @@ public Long getUserId(String token) { .parseClaimsJws(token) .getBody(); - return claims.get("userId", Long.class); + Object userId = claims.get("userId"); + if (userId instanceof Integer) { + return ((Integer) userId).longValue(); + } + if (userId instanceof Long) { + return (Long) userId; + } + if (userId instanceof String) { + return Long.parseLong((String) userId); + } + throw new RuntimeException("userId 타입이 올바르지 않습니다: " + userId.getClass()); } private String createToken(User user, long validity) { From 67c3c230bc381c44f40aa19af9c6fb5def65ddba Mon Sep 17 00:00:00 2001 From: mr8356 Date: Thu, 3 Jul 2025 21:40:06 +0900 Subject: [PATCH 5/5] fix signup --- .../java/server/producer/domain/service/SocialLoginService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/producer/src/main/java/server/producer/domain/service/SocialLoginService.java b/producer/src/main/java/server/producer/domain/service/SocialLoginService.java index e5e3940..c3b4e61 100644 --- a/producer/src/main/java/server/producer/domain/service/SocialLoginService.java +++ b/producer/src/main/java/server/producer/domain/service/SocialLoginService.java @@ -32,6 +32,7 @@ public SocialLoginResponseDto loginOrSignup(String provider, String accessToken) .socialType(userInfo.getProvider()) .email(userInfo.getEmail()) .nickname(userInfo.getNickname()) + .location("서울특별시 서대문구 창천동") .build(); return userRepository.save(created); });