주문 기능 리펙토링
오늘은 주문 기능을 전체적으로 리펙토링했다.
먼저 OrderService 코드안에 Customer의 코드와 Owner의 코드가 섞여 있으니 내가 보기에도 불편했고, 다른 개발자분들이 보시기에도 헷갈리실 것 같아서 분리하고 공통기능만 OrderService 안에 넣어두었다.
그리고 주문 생성 시, 쿠폰을 적용하는 로직을 원래 주문 객체 생성 전에 진행하고 한번에 객체를 생성했는데, coupon 기능을 개발하신 분의 쿠폰 적용 서비스 코드를 보니 쿠폰 적용 시 order객체가 함께 들어가야했다.
그래서 이에 맞춰 개발하기 위해 주문을 먼저 생성해 저장하고, 쿠폰 적용 시 할인 가격과 총 금액을 업데이트 하는걸로 로직을 변경하였다.
이렇게 변경하니 최종적으로 코드가 훨씬 깔끔해졌고 기능 분리가 잘 됐다고 느꼈다.
주문 취소 기능 완성하기
또한 오늘은 주문 취소 기능을 완성했는데 로직이 복잡하게 느껴져 직접 써보며 생각을 정리하고 개발했다.
Customer와 Owner의 로직이 쿠폰 적용 기능을 제외하면 비슷해서 큰 어려움은 없었다.
고객, 주인 권한 추가하기
프로젝트 요구사항에서 Customer와 Owner는 서로의 API를 침범하면 안된다. 접근 권한 설정 방법을 구글링한 결과
@Secured, @PreAuthorize, @PostAuthorize 등의 어노테션을 컨트롤러에 붙여주는 방법이 존재했다.
세 어노테이션에 대해 좀 더 자세히 기록해보겠다.
- @Secured
이 어노테이션은 '사용자 본인'에 대한 권한 설정만 가능하다. 간단한 권한을 설정할 때 사용할 수 있다. 주문 컨트롤러에는 사용자 본인과 Master 권한도 접근이 가능해야했기 때문에 다른 방법을 찾아보았다.
- @PreAuthorize, @PostAuthorize
이 어노테이션은 다양한 표현식과 함께 사용할 수 있다. 그리고 권한을 여러개 넣어줄 수도 있다. 나는 이 방법을 선택해서 권한 처리를 했다.
@PostAuthorize는 함수를 일단 실행한 후, 클라이언트한테 응답을 하기 직전에 권한을 검사한다.
@PreAuthorize는 함수를 실행하기 전에 권한을 검사하는 어노테이션이다.
나는 권한이 없으면 함수를 아예 실행하기 못하게 하고 싶었기 때문에 @PreAuthorize 사용을 선택했다.
ex) Customer과 Master만 접근 가능
// 주문 생성 (Customer)
@PreAuthorize("hasAnyAuthority('CUSTOMER', 'MASTER')")
@PostMapping("/orders/customer")
public ResponseDto<?> orderCreateResponseCustomerDto(@RequestBody @Valid DeliveryOrderCreateRequestDto deliveryOrderCreateRequestDto, BindingResult bindingResult,
@AuthenticationPrincipal UserDetailsImpl userDetails) {
orderCustomerService.createDeliveryOrders(deliveryOrderCreateRequestDto, userDetails.getUser());
return new ResponseDto<>(1, "주문이 정상적으로 생성되었습니다.", null);
}
ex) Owner와 Master만 접근 가능
// 주문 생성 (Owner)
@PreAuthorize("hasAnyAuthority('OWNER', 'MASTER')")
@PostMapping("/orders/owner")
public ResponseDto<?> orderCreateResponseOwnerDto(@RequestBody @Valid TakeOutOrderCreateRequestDto takeOutOrderCreateRequestDto, BindingResult bindingResult,
@AuthenticationPrincipal UserDetailsImpl userDetails) {
orderOwnerService.createTakeOutOrders(takeOutOrderCreateRequestDto, userDetails.getUser());
return new ResponseDto<>(1, "주문이 정상적으로 생성되었습니다.", null);
}
권한 설정 참고 https://steemit.com/kr-dev/@igna84/spring-security-preauthorize-postauthorize
참고로 위 권한 처리 기능을 사용하기 위해선 SecurityConfig 파일에 해당 어노테이션을 붙여줘야 실행이 가능하다.
@EnableMethodSecurity(prePostEnabled = true)
'프로젝트 기록 > 백엔드 심화 부트캠프' 카테고리의 다른 글
241118 프로젝트 TIL (1) | 2024.11.18 |
---|---|
241115 프로젝트 TIL (1) | 2024.11.15 |
241114 프로젝트 TIL (2) | 2024.11.14 |
241112 프로젝트 TIL (2) | 2024.11.12 |
241111 프로젝트 TIL (2) | 2024.11.11 |