diff --git a/src/main/java/univ/goormthon/kongju/domain/payment/SessionUtils.java b/src/main/java/univ/goormthon/kongju/domain/payment/SessionUtils.java new file mode 100644 index 0000000..3cf80ae --- /dev/null +++ b/src/main/java/univ/goormthon/kongju/domain/payment/SessionUtils.java @@ -0,0 +1,21 @@ +package univ.goormthon.kongju.domain.payment; + +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import java.util.Objects; + +public class SessionUtils { + + public static void addAttribute(String name, Object value) { + Objects.requireNonNull(RequestContextHolder.getRequestAttributes()).setAttribute(name, value, RequestAttributes.SCOPE_SESSION); + } + + public static String getStringAttributeValue(String name) { + return String.valueOf(getAttribute(name)); + } + + public static Object getAttribute(String name) { + return Objects.requireNonNull(RequestContextHolder.getRequestAttributes()).getAttribute(name, RequestAttributes.SCOPE_SESSION); + } +} \ No newline at end of file diff --git a/src/main/java/univ/goormthon/kongju/domain/payment/controller/KakaoPayController.java b/src/main/java/univ/goormthon/kongju/domain/payment/controller/KakaoPayController.java new file mode 100644 index 0000000..54869c9 --- /dev/null +++ b/src/main/java/univ/goormthon/kongju/domain/payment/controller/KakaoPayController.java @@ -0,0 +1,38 @@ +package univ.goormthon.kongju.domain.payment.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import univ.goormthon.kongju.domain.payment.SessionUtils; +import univ.goormthon.kongju.domain.payment.dto.request.PayApproveRequest; +import univ.goormthon.kongju.domain.payment.dto.response.PayApproveResponse; +import univ.goormthon.kongju.domain.payment.dto.response.PayReadyResponse; +import univ.goormthon.kongju.domain.payment.service.KakaoPayService; +import univ.goormthon.kongju.domain.reservation.entity.Reservation; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/kongju/payment") +public class KakaoPayController { + + private final KakaoPayService kakaoPayService; + + @PostMapping("/ready") + public ResponseEntity ready(@RequestBody Reservation reservation, @RequestParam int totalFee) { + PayReadyResponse response = kakaoPayService.ready(reservation, totalFee); + SessionUtils.addAttribute("tid", response.tid()); + return ResponseEntity.ok(response); + } + + @GetMapping("/approval") + public ResponseEntity approval(@RequestParam("pg_token") String pgToken) { + String tid = SessionUtils.getStringAttributeValue("tid"); + PayApproveResponse response = kakaoPayService.approve(pgToken, tid); + return ResponseEntity.ok(response); + } + + @PostMapping("/cancel") + public ResponseEntity cancel(@RequestParam String tid, @RequestParam int cancelAmount) { + return ResponseEntity.ok(null); + } +} diff --git a/src/main/java/univ/goormthon/kongju/domain/payment/dto/request/PayApproveRequest.java b/src/main/java/univ/goormthon/kongju/domain/payment/dto/request/PayApproveRequest.java new file mode 100644 index 0000000..e3160ca --- /dev/null +++ b/src/main/java/univ/goormthon/kongju/domain/payment/dto/request/PayApproveRequest.java @@ -0,0 +1,14 @@ +package univ.goormthon.kongju.domain.payment.dto.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; + +@Builder +public record PayApproveRequest( + @JsonProperty("cid") String cid, + @JsonProperty("tid") String tid, + @JsonProperty("partner_order_id") String partnerOrderId, + @JsonProperty("partner_user_id") String partnerUserId, + @JsonProperty("pg_token") String pgToken +) { +} diff --git a/src/main/java/univ/goormthon/kongju/domain/payment/dto/request/PayRequest.java b/src/main/java/univ/goormthon/kongju/domain/payment/dto/request/PayRequest.java new file mode 100644 index 0000000..6c97d86 --- /dev/null +++ b/src/main/java/univ/goormthon/kongju/domain/payment/dto/request/PayRequest.java @@ -0,0 +1,19 @@ +package univ.goormthon.kongju.domain.payment.dto.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; + +@Builder +public record PayRequest( + @JsonProperty("cid") String cid, + @JsonProperty("partner_order_id") String partnerOrderId, + @JsonProperty("partner_user_id") String partnerUserId, + @JsonProperty("item_name") String itemName, + @JsonProperty("quantity") int quantity, + @JsonProperty("total_amount") int totalAmount, + @JsonProperty("tax_free_amount") int taxFreeAmount, + @JsonProperty("approval_url") String approvalUrl, + @JsonProperty("cancel_url") String cancelUrl, + @JsonProperty("fail_url") String failUrl +) { +} diff --git a/src/main/java/univ/goormthon/kongju/domain/payment/dto/response/PayApproveResponse.java b/src/main/java/univ/goormthon/kongju/domain/payment/dto/response/PayApproveResponse.java new file mode 100644 index 0000000..62ca654 --- /dev/null +++ b/src/main/java/univ/goormthon/kongju/domain/payment/dto/response/PayApproveResponse.java @@ -0,0 +1,26 @@ +package univ.goormthon.kongju.domain.payment.dto.response; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.time.LocalDateTime; + +public record PayApproveResponse( + @JsonProperty("aid") String aid, + @JsonProperty("tid") String tid, + @JsonProperty("cid") String cid, + @JsonProperty("partner_order_id") String partnerOrderId, + @JsonProperty("partner_user_id") String partnerUserId, + @JsonProperty("payment_method_type") String paymentMethodType, + + @JsonProperty("amount") Amount amount, + @JsonProperty("item_name") String itemName, + @JsonProperty("approved_at") LocalDateTime approvedAt + + ) { + public record Amount( + @JsonProperty("total") int total, + @JsonProperty("tax_free") int taxFree, + @JsonProperty("vat") int vat, + @JsonProperty("point") int point, + @JsonProperty("discount") int discount) {} +} diff --git a/src/main/java/univ/goormthon/kongju/domain/payment/dto/response/PayReadyResponse.java b/src/main/java/univ/goormthon/kongju/domain/payment/dto/response/PayReadyResponse.java new file mode 100644 index 0000000..3dc107b --- /dev/null +++ b/src/main/java/univ/goormthon/kongju/domain/payment/dto/response/PayReadyResponse.java @@ -0,0 +1,9 @@ +package univ.goormthon.kongju.domain.payment.dto.response; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public record PayReadyResponse( + @JsonProperty("tid") String tid, + @JsonProperty("next_redirect_pc_url") String nextRedirectPcUrl +) { +} diff --git a/src/main/java/univ/goormthon/kongju/domain/payment/service/KakaoPayService.java b/src/main/java/univ/goormthon/kongju/domain/payment/service/KakaoPayService.java new file mode 100644 index 0000000..934bcab --- /dev/null +++ b/src/main/java/univ/goormthon/kongju/domain/payment/service/KakaoPayService.java @@ -0,0 +1,70 @@ +package univ.goormthon.kongju.domain.payment.service; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import univ.goormthon.kongju.domain.payment.dto.request.PayApproveRequest; +import univ.goormthon.kongju.domain.payment.dto.request.PayRequest; +import univ.goormthon.kongju.domain.payment.dto.response.PayApproveResponse; +import univ.goormthon.kongju.domain.payment.dto.response.PayReadyResponse; +import univ.goormthon.kongju.domain.reservation.entity.Reservation; + +@Service +public class KakaoPayService { + + @Value("${kakaopay.secret-key}") + private String secretKey; + + @Value("${kakaopay.cid}") + private String cid; + + public PayReadyResponse ready(Reservation reservation, int totalFee) { + PayRequest request = PayRequest.builder() + .partnerOrderId(String.valueOf(reservation.getId())) + .partnerUserId(String.valueOf(reservation.getMemberId())) + .itemName("공유 주차장 결제 진행") + .quantity(1) + .totalAmount(totalFee) + .taxFreeAmount(0) + .approvalUrl("http://localhost:8080/api/kongju/payment/approval") + .cancelUrl("http://localhost:8080/api/kongju/payment/cancel") + .failUrl("http://localhost:8080/api/kongju/payment/fail") + .build(); + + HttpEntity entity = new HttpEntity<>(request, this.getHeaders()); + + RestTemplate restTemplate = new RestTemplate(); + String url = "https://kapi.kakao.com/v1/payment/ready"; + ResponseEntity response = restTemplate.postForEntity(url, request, PayReadyResponse.class); + + return response.getBody(); + } + + public PayApproveResponse approve(String pgToken, String tid) { + PayApproveRequest request = PayApproveRequest.builder() + .cid(cid) + .tid(tid) + .partnerOrderId("1") + .partnerUserId("1") + .pgToken(pgToken) + .build(); + + HttpEntity entity = new HttpEntity<>(request, this.getHeaders()); + + RestTemplate restTemplate = new RestTemplate(); + String url = "https://kapi.kakao.com/v1/payment/approve"; + + return restTemplate.postForObject(url, request, PayApproveResponse.class); + } + + private HttpHeaders getHeaders() { + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", "SECRET_KEY " + secretKey); + headers.set("Content-type", "application/json"); + + return headers; + } +} diff --git a/src/main/java/univ/goormthon/kongju/domain/reservation/controller/ReservationController.java b/src/main/java/univ/goormthon/kongju/domain/reservation/controller/ReservationController.java index 70f971a..988f6bd 100644 --- a/src/main/java/univ/goormthon/kongju/domain/reservation/controller/ReservationController.java +++ b/src/main/java/univ/goormthon/kongju/domain/reservation/controller/ReservationController.java @@ -33,8 +33,8 @@ public class ReservationController { @ApiResponse(responseCode = "404", description = "회원 세션이 존재하지 않음", content = @Content(schema = @Schema(implementation = ErrorCode.class))) }) @GetMapping("/list") - public ResponseEntity> getReservations(HttpSession session){ - return ResponseEntity.ok(reservationService.getReservations(session)); + public ResponseEntity> getReservations(@RequestParam String memberId){ + return ResponseEntity.ok(reservationService.getReservations(memberId)); } @Operation(summary = "예약 조회", description = "현재 로그인한 사용자의 예약 하나를 조회합니다.") @@ -46,47 +46,21 @@ public ResponseEntity> getReservations(HttpSession ses @ApiResponse(responseCode = "404", description = "회원 세션이 존재하지 않음", content = @Content(schema = @Schema(implementation = ErrorCode.class))) }) @GetMapping - public ResponseEntity reserve(HttpSession session, @RequestParam Long parkingId) { - return ResponseEntity.ok(reservationService.getReservation(session, parkingId)); + public ResponseEntity getReservation(@RequestParam String memberId, @RequestParam Long parkingId) { + return ResponseEntity.ok(reservationService.getReservation(memberId, parkingId)); } - @Operation(summary = "예약 대기", description = "현재 로그인한 사용자의 예약을 진행하기 전에 대기합니다.") + @Operation(summary = "예약 진행", description = "현재 로그인한 사용자의 예약을 진행합니다.") @Parameters(value = { @Parameter(name = "request", description = "예약 요청 JSON 형식의 데이터") }) @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "예약 성공", content = @Content(schema = @Schema(implementation = ReservationResponse.class))), + @ApiResponse(responseCode = "200", description = "예약 진행", content = @Content(schema = @Schema(implementation = ReservationResponse.class))), @ApiResponse(responseCode = "404", description = "회원 세션이 존재하지 않음", content = @Content(schema = @Schema(implementation = ErrorCode.class))) }) @PostMapping - public ResponseEntity reserve(HttpSession session, @RequestBody ReservationRequest request) { - return ResponseEntity.ok(reservationService.reserve(session, request)); - } - - @Operation(summary = "예약 취소", description = "현재 로그인한 사용자의 예약을 취소합니다.") - @Parameters(value = { - @Parameter(name = "parkingId", description = "주차장 ID") - }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "예약 취소 성공", content = @Content(schema = @Schema(implementation = ReservationResponse.class))), - @ApiResponse(responseCode = "404", description = "회원 세션이 존재하지 않음", content = @Content(schema = @Schema(implementation = ErrorCode.class))) - }) - @PostMapping("/cancel") - public ResponseEntity cancelReservation(HttpSession session, @RequestParam Long parkingId) { - return ResponseEntity.ok(reservationService.cancel(session, parkingId)); - } - - @Operation(summary = "예약 수락", description = "현재 로그인한 사용자의 예약을 수락합니다.") - @Parameters(value = { - @Parameter(name = "parkingId", description = "주차장 ID") - }) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "예약 수락 성공", content = @Content(schema = @Schema(implementation = ReservationResponse.class))), - @ApiResponse(responseCode = "404", description = "회원 세션이 존재하지 않음", content = @Content(schema = @Schema(implementation = ErrorCode.class))) - }) - @PostMapping("/accept") - public ResponseEntity acceptReservation(HttpSession session, @RequestParam Long parkingId) { - return ResponseEntity.ok(reservationService.accept(session, parkingId)); + public ResponseEntity reserve(@RequestParam String memberId, @RequestBody ReservationRequest request) { + return ResponseEntity.ok(reservationService.reserve(memberId, request)); } } diff --git a/src/main/java/univ/goormthon/kongju/domain/reservation/service/ReservationService.java b/src/main/java/univ/goormthon/kongju/domain/reservation/service/ReservationService.java index 206f2b3..2a455dc 100644 --- a/src/main/java/univ/goormthon/kongju/domain/reservation/service/ReservationService.java +++ b/src/main/java/univ/goormthon/kongju/domain/reservation/service/ReservationService.java @@ -5,8 +5,11 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import univ.goormthon.kongju.domain.member.entity.Member; +import univ.goormthon.kongju.domain.member.repository.MemberRepository; import univ.goormthon.kongju.domain.parking.entity.Parking; import univ.goormthon.kongju.domain.parking.repository.ParkingRepository; +import univ.goormthon.kongju.domain.payment.dto.response.PayReadyResponse; +import univ.goormthon.kongju.domain.payment.service.KakaoPayService; import univ.goormthon.kongju.domain.reservation.dto.request.ReservationRequest; import univ.goormthon.kongju.domain.reservation.dto.response.ReservationResponse; import univ.goormthon.kongju.domain.reservation.entity.Reservation; @@ -27,13 +30,13 @@ public class ReservationService { private final ReservationRepository reservationRepository; private final ParkingRepository parkingRepository; private final VehicleRepository vehicleRepository; + private final MemberRepository memberRepository; + private final KakaoPayService kakaoPayService; @Transactional - public ReservationResponse reserve(HttpSession session, ReservationRequest request) { - Member member = (Member) session.getAttribute("member"); - if (member == null) { - throw new NotFoundException(ErrorCode.MEMBER_NOT_FOUND); - } + public ReservationResponse reserve(String memberId, ReservationRequest request) { + Member member = memberRepository.findById(Long.parseLong(memberId)) + .orElseThrow(() -> new NotFoundException(ErrorCode.MEMBER_NOT_FOUND)); Parking parking = parkingRepository.findById(request.parkingId()) .orElseThrow(() -> new NotFoundException(ErrorCode.PARKING_NOT_FOUND)); @@ -56,34 +59,15 @@ public ReservationResponse reserve(HttpSession session, ReservationRequest reque reservationRepository.save(reservation); - return ReservationResponse.builder() - .id(reservation.getId()) - .parkingId(reservation.getParkingId()) - .memberId(reservation.getMemberId()) - .vehicleId(reservation.getVehicleId()) - .reservationDate(reservation.getReservationDate().toString()) - .startTime(reservation.getStartTime().toString()) - .endTime(reservation.getEndTime().toString()) - .reservationStatus(reservation.getReservationStatus().name()) - .totalFee(totalFee) - .build(); - } - - @Transactional - public ReservationResponse cancel(HttpSession session, Long reservationId) { - Member member = (Member) session.getAttribute("member"); - if (member == null) { - throw new NotFoundException(ErrorCode.MEMBER_NOT_FOUND); + // 카카오페이 결제 성공 시 예약 상태 변경 + PayReadyResponse response = kakaoPayService.ready(reservation, totalFee); + if(response != null) { + reservation.setReservationStatus(ReservationStatus.ACCEPTED); } - - Reservation reservation = reservationRepository.findById(reservationId) - .orElseThrow(() -> new NotFoundException(ErrorCode.RESERVATION_NOT_FOUND)); - - if (!reservation.getMemberId().equals(member.getId())) { - throw new NotFoundException(ErrorCode.RESERVATION_NOT_FOUND); + else { + reservation.setReservationStatus(ReservationStatus.CANCELED); } - reservation.setReservationStatus(ReservationStatus.CANCELED); reservationRepository.save(reservation); return ReservationResponse.builder() @@ -95,49 +79,14 @@ public ReservationResponse cancel(HttpSession session, Long reservationId) { .startTime(reservation.getStartTime().toString()) .endTime(reservation.getEndTime().toString()) .reservationStatus(reservation.getReservationStatus().name()) - .totalFee(reservation.getTotalFee()) - .build(); - } - - @Transactional - public ReservationResponse accept(HttpSession session, Long reservationId) { - Member member = (Member) session.getAttribute("member"); - if (member == null) { - throw new NotFoundException(ErrorCode.MEMBER_NOT_FOUND); - } - - Reservation reservation = reservationRepository.findById(reservationId) - .orElseThrow(() -> new NotFoundException(ErrorCode.RESERVATION_NOT_FOUND)); - - if (!reservation.getMemberId().equals(member.getId())) { - throw new NotFoundException(ErrorCode.RESERVATION_NOT_FOUND); - } - - // 카카오페이 진행 - - // 예약 상태 변경 - reservation.setReservationStatus(ReservationStatus.ACCEPTED); - reservationRepository.save(reservation); - - return ReservationResponse.builder() - .id(reservation.getId()) - .parkingId(reservation.getParkingId()) - .memberId(reservation.getMemberId()) - .vehicleId(reservation.getVehicleId()) - .reservationDate(reservation.getReservationDate().toString()) - .startTime(reservation.getStartTime().toString()) - .endTime(reservation.getEndTime().toString()) - .reservationStatus(reservation.getReservationStatus().name()) - .totalFee(reservation.getTotalFee()) + .totalFee(totalFee) .build(); } @Transactional(readOnly = true) - public ReservationResponse getReservation(HttpSession session, Long reservationId) { - Member member = (Member) session.getAttribute("member"); - if (member == null) { - throw new NotFoundException(ErrorCode.MEMBER_NOT_FOUND); - } + public ReservationResponse getReservation(String memberId, Long reservationId) { + Member member = memberRepository.findById(Long.parseLong(memberId)) + .orElseThrow(() -> new NotFoundException(ErrorCode.MEMBER_NOT_FOUND)); Reservation reservation = reservationRepository.findById(reservationId) .orElseThrow(() -> new NotFoundException(ErrorCode.RESERVATION_NOT_FOUND)); @@ -160,11 +109,9 @@ public ReservationResponse getReservation(HttpSession session, Long reservationI } @Transactional(readOnly = true) - public List getReservations(HttpSession session) { - Member member = (Member) session.getAttribute("member"); - if (member == null) { - throw new NotFoundException(ErrorCode.MEMBER_NOT_FOUND); - } + public List getReservations(String memberId) { + Member member = memberRepository.findById(Long.parseLong(memberId)) + .orElseThrow(() -> new NotFoundException(ErrorCode.MEMBER_NOT_FOUND)); List reservations = reservationRepository.findByMemberId(member.getId()); diff --git a/src/main/java/univ/goormthon/kongju/domain/vehicle/controller/VehicleController.java b/src/main/java/univ/goormthon/kongju/domain/vehicle/controller/VehicleController.java index 975cf52..0e06871 100644 --- a/src/main/java/univ/goormthon/kongju/domain/vehicle/controller/VehicleController.java +++ b/src/main/java/univ/goormthon/kongju/domain/vehicle/controller/VehicleController.java @@ -8,7 +8,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -32,8 +31,8 @@ public class VehicleController { @ApiResponse(responseCode = "404", description = "회원 세션이 존재하지 않음", content = @Content(schema = @Schema(implementation = VehicleResponse.class))) }) @GetMapping("/list") - public ResponseEntity> getVehicles(HttpSession session) { - return ResponseEntity.ok(vehicleService.getVehicles(session)); + public ResponseEntity> getVehicles(@RequestParam String memberId) { + return ResponseEntity.ok(vehicleService.getVehicles(memberId)); } @Operation(summary = "이동 수단 추가", description = "현재 로그인한 회원의 이동 수단을 추가합니다.") @@ -46,9 +45,9 @@ public ResponseEntity> getVehicles(HttpSession session) { @ApiResponse(responseCode = "404", description = "회원 세션이 존재하지 않음", content = @Content(schema = @Schema(implementation = VehicleResponse.class))) }) @PostMapping("/add") - public ResponseEntity addVehicle(HttpSession session, + public ResponseEntity addVehicle(@RequestParam String memberId, @RequestBody VehicleRequest request) { - return ResponseEntity.ok(vehicleService.addVehicle(session, request)); + return ResponseEntity.ok(vehicleService.addVehicle(memberId, request)); } @Operation(summary = "이동 수단 수정", description = "현재 로그인한 회원의 이동 수단을 수정합니다.") @@ -61,9 +60,9 @@ public ResponseEntity addVehicle(HttpSession session, @ApiResponse(responseCode = "404", description = "회원 세션이 존재하지 않음", content = @Content(schema = @Schema(implementation = VehicleResponse.class))) }) @PutMapping("/update") - public ResponseEntity updateVehicle(HttpSession session, + public ResponseEntity updateVehicle(@RequestParam String memberId, @RequestBody VehicleRequest request) { - return ResponseEntity.ok(vehicleService.updateVehicle(session, request)); + return ResponseEntity.ok(vehicleService.updateVehicle(memberId, request)); } @Operation(summary = "이동 수단 삭제", description = "현재 로그인한 회원의 이동 수단을 삭제합니다.") @@ -75,9 +74,9 @@ public ResponseEntity updateVehicle(HttpSession session, @ApiResponse(responseCode = "404", description = "회원 세션이 존재하지 않음") }) @DeleteMapping("/delete") - public ResponseEntity deleteVehicle(HttpSession session, + public ResponseEntity deleteVehicle(@RequestParam String memberId, @RequestParam Long vehicleId) { - vehicleService.deleteVehicle(session, vehicleId); + vehicleService.deleteVehicle(memberId, vehicleId); return ResponseEntity.ok().build(); } } diff --git a/src/main/java/univ/goormthon/kongju/domain/vehicle/service/VehicleService.java b/src/main/java/univ/goormthon/kongju/domain/vehicle/service/VehicleService.java index 21fed22..f2818eb 100644 --- a/src/main/java/univ/goormthon/kongju/domain/vehicle/service/VehicleService.java +++ b/src/main/java/univ/goormthon/kongju/domain/vehicle/service/VehicleService.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import univ.goormthon.kongju.domain.member.entity.Member; +import univ.goormthon.kongju.domain.member.repository.MemberRepository; import univ.goormthon.kongju.domain.vehicle.dto.request.VehicleRequest; import univ.goormthon.kongju.domain.vehicle.dto.response.VehicleResponse; import univ.goormthon.kongju.domain.vehicle.entity.Vehicle; @@ -21,10 +22,12 @@ public class VehicleService { private final VehicleRepository vehicleRepository; + private final MemberRepository memberRepository; @Transactional(readOnly = true) - public List getVehicles(HttpSession session) { - Member member = (Member) session.getAttribute("member"); + public List getVehicles(String memberId) { + Member member = memberRepository.findById(Long.parseLong(memberId)) + .orElseThrow(() -> new NotFoundException(ErrorCode.MEMBER_NOT_FOUND)); List vehicles = vehicleRepository.findAllByMember(member); @@ -38,11 +41,9 @@ public List getVehicles(HttpSession session) { } @Transactional - public VehicleResponse addVehicle(HttpSession session, VehicleRequest request) { - Member member = (Member) session.getAttribute("member"); - if(member == null) { - throw new NotFoundException(ErrorCode.MEMBER_NOT_FOUND); - } + public VehicleResponse addVehicle(String memberId, VehicleRequest request) { + Member member = memberRepository.findById(Long.parseLong(memberId)) + .orElseThrow(() -> new NotFoundException(ErrorCode.MEMBER_NOT_FOUND)); Vehicle vehicle = Vehicle.builder() .member(member) @@ -60,11 +61,9 @@ public VehicleResponse addVehicle(HttpSession session, VehicleRequest request) { } @Transactional - public VehicleResponse updateVehicle(HttpSession session, VehicleRequest request) { - Member member = (Member) session.getAttribute("member"); - if(member == null) { - throw new NotFoundException(ErrorCode.MEMBER_NOT_FOUND); - } + public VehicleResponse updateVehicle(String memberId, VehicleRequest request) { + Member member = memberRepository.findById(Long.parseLong(memberId)) + .orElseThrow(() -> new NotFoundException(ErrorCode.MEMBER_NOT_FOUND)); Vehicle vehicle = vehicleRepository.findByMember(member) .orElseThrow(() -> new NotFoundException(ErrorCode.VEHICLE_NOT_FOUND)); @@ -79,11 +78,9 @@ public VehicleResponse updateVehicle(HttpSession session, VehicleRequest request } @Transactional - public void deleteVehicle(HttpSession session, Long vehicleId) { - Member member = (Member) session.getAttribute("member"); - if(member == null) { - throw new NotFoundException(ErrorCode.MEMBER_NOT_FOUND); - } + public void deleteVehicle(String memberId, Long vehicleId) { + Member member = memberRepository.findById(Long.parseLong(memberId)) + .orElseThrow(() -> new NotFoundException(ErrorCode.MEMBER_NOT_FOUND)); Vehicle vehicle = vehicleRepository.findById(vehicleId) .orElseThrow(() -> new NotFoundException(ErrorCode.VEHICLE_NOT_FOUND));