diff --git a/src/main/java/com/example/triptalk/domain/tripPlan/controller/TripPlanController.java b/src/main/java/com/example/triptalk/domain/tripPlan/controller/TripPlanController.java index f535241..e8f09cc 100644 --- a/src/main/java/com/example/triptalk/domain/tripPlan/controller/TripPlanController.java +++ b/src/main/java/com/example/triptalk/domain/tripPlan/controller/TripPlanController.java @@ -4,9 +4,11 @@ import com.example.triptalk.domain.tripPlan.enums.TripStatus; import com.example.triptalk.domain.tripPlan.service.TripPlanService; import com.example.triptalk.global.apiPayload.ApiResponse; +import com.example.triptalk.global.security.AuthUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -17,15 +19,17 @@ public class TripPlanController { private final TripPlanService tripPlanService; + private final AuthUtil authUtil; @GetMapping("/{tripPlanId}") @Operation(summary = "여행 일정 조회", description = "tripPlanId로 여행 일정을 조회합니다.") public ApiResponse getTripPlan( @Parameter(description = "tripPlan ID", example = "1", required = true) - @PathVariable Long tripPlanId + @PathVariable Long tripPlanId, + HttpServletRequest request ) { - // 인증 구현 후 SecurityContext에서 로그인한 userId 가져오기 - TripPlanResponse.TripPlanDTO response = tripPlanService.getTripPlan(tripPlanId, 1L); + Long userId = authUtil.getUserIdFromRequest(request); + TripPlanResponse.TripPlanDTO response = tripPlanService.getTripPlan(tripPlanId, userId); return ApiResponse.onSuccess(response); } @@ -35,10 +39,11 @@ public ApiResponse getMyTripPlans( @Parameter(description = "여행 상태 필터", example = "PLANNED", required = true) @RequestParam TripStatus status, @Parameter(description = "다음 커서 ID (처음 요청 시 null)", example = "null") - @RequestParam(required = false) Long cursorId + @RequestParam(required = false) Long cursorId, + HttpServletRequest request ) { - // 인증 구현 후 SecurityContext에서 로그인한 userId 가져오기 - TripPlanResponse.TripPlanListResultDTO response = tripPlanService.getMyTripPlans(1L, status, cursorId); + Long userId = authUtil.getUserIdFromRequest(request); + TripPlanResponse.TripPlanListResultDTO response = tripPlanService.getMyTripPlans(userId, status, cursorId); return ApiResponse.onSuccess(response); } @@ -46,10 +51,11 @@ public ApiResponse getMyTripPlans( @Operation(summary = "여행 상태 완료 처리", description = "여행 계획의 상태를 PLANNED에서 TRAVELED로 변경합니다.") public ApiResponse markTripPlanAsTraveled( @Parameter(description = "tripPlan ID", example = "1", required = true) - @PathVariable Long tripPlanId + @PathVariable Long tripPlanId, + HttpServletRequest request ) { - // 인증 구현 후 SecurityContext에서 로그인한 userId 가져오기 - TripPlanResponse.TripPlanStatusDTO response = tripPlanService.changeTripPlanStatusToTraveled(tripPlanId, 1L); + Long userId = authUtil.getUserIdFromRequest(request); + TripPlanResponse.TripPlanStatusDTO response = tripPlanService.changeTripPlanStatusToTraveled(tripPlanId, userId); return ApiResponse.onSuccess(response); } } diff --git a/src/main/java/com/example/triptalk/domain/user/controller/UserController.java b/src/main/java/com/example/triptalk/domain/user/controller/UserController.java index 4d16ff3..a4e9da9 100644 --- a/src/main/java/com/example/triptalk/domain/user/controller/UserController.java +++ b/src/main/java/com/example/triptalk/domain/user/controller/UserController.java @@ -3,9 +3,10 @@ import com.example.triptalk.domain.user.dto.UserResponse; import com.example.triptalk.domain.user.service.UserService; import com.example.triptalk.global.apiPayload.ApiResponse; +import com.example.triptalk.global.security.AuthUtil; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -16,15 +17,13 @@ public class UserController { private final UserService userService; + private final AuthUtil authUtil; - @GetMapping("/{userId}") + @GetMapping("/me") @Operation(summary = "마이페이지 유저 정보 조회 API", description = "현재 로그인한 사용자의 마이페이지 정보를 조회하는 API입니다.") - public ApiResponse getUserInfo( - @Parameter(description = "유저 ID", required = true, example = "1") - @PathVariable Long userId - ) { - // 임시 유저로 설정 - UserResponse.UserInfoDTO response = userService.getUserInfo(1L); + public ApiResponse getUserInfo(HttpServletRequest request) { + Long userId = authUtil.getUserIdFromRequest(request); + UserResponse.UserInfoDTO response = userService.getUserInfo(userId); return ApiResponse.onSuccess(response); } } diff --git a/src/main/java/com/example/triptalk/global/security/AuthUtil.java b/src/main/java/com/example/triptalk/global/security/AuthUtil.java new file mode 100644 index 0000000..b44cd31 --- /dev/null +++ b/src/main/java/com/example/triptalk/global/security/AuthUtil.java @@ -0,0 +1,51 @@ +package com.example.triptalk.global.security; + +import com.example.triptalk.domain.user.entity.User; +import com.example.triptalk.domain.user.repository.UserRepository; +import com.example.triptalk.global.apiPayload.code.status.ErrorStatus; +import com.example.triptalk.global.apiPayload.exception.handler.ErrorHandler; +import com.example.triptalk.global.security.jwt.JwtTokenProvider; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +@Component +@RequiredArgsConstructor +public class AuthUtil { + + private final JwtTokenProvider jwtTokenProvider; + private final UserRepository userRepository; + + /** + * HTTP 요청에서 JWT 토큰을 추출하여 사용자 ID를 반환 + * @param request HTTP 요청 + * @return 사용자 ID + */ + public Long getUserIdFromRequest(HttpServletRequest request) { + String token = resolveToken(request); + if (token == null || !jwtTokenProvider.validateToken(token)) { + throw new ErrorHandler(ErrorStatus._UNAUTHORIZED); + } + + String email = jwtTokenProvider.getEmailFromToken(token); + User user = userRepository.findByEmail(email) + .orElseThrow(() -> new ErrorHandler(ErrorStatus.USER_NOT_FOUND)); + + return user.getId(); + } + + /** + * HTTP 요청 헤더에서 JWT 토큰 추출 + * @param request HTTP 요청 + * @return JWT 토큰 (없으면 null) + */ + private String resolveToken(HttpServletRequest request) { + String bearerToken = request.getHeader("Authorization"); + if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { + return bearerToken.substring(7); + } + return null; + } +} +