본문 바로가기

프로젝트 기록/백엔드 심화 부트캠프

241113 프로젝트 TIL

주문 기능 리펙토링

오늘은 주문 기능을 전체적으로 리펙토링했다. 

 

먼저 OrderService 코드안에 Customer의 코드와 Owner의 코드가 섞여 있으니 내가 보기에도 불편했고, 다른 개발자분들이 보시기에도 헷갈리실 것 같아서 분리하고 공통기능만 OrderService 안에 넣어두었다. 

서비스 코드가 훨씬 더 깔끔해졌다. 리펙토링의 중요성을 깨달았다.

 

그리고 주문 생성 시, 쿠폰을 적용하는 로직을 원래 주문 객체 생성 전에 진행하고 한번에 객체를 생성했는데, coupon 기능을 개발하신 분의 쿠폰 적용 서비스 코드를 보니 쿠폰 적용 시 order객체가 함께 들어가야했다. 

그래서 이에 맞춰 개발하기 위해 주문을 먼저 생성해 저장하고, 쿠폰 적용 시 할인 가격과 총 금액을 업데이트 하는걸로 로직을 변경하였다.

이렇게 변경하니 최종적으로 코드가 훨씬 깔끔해졌고 기능 분리가 잘 됐다고 느꼈다. 

 

주문 취소 기능 완성하기

또한 오늘은 주문 취소 기능을 완성했는데 로직이 복잡하게 느껴져 직접 써보며 생각을 정리하고 개발했다. 

3-1 기능은 결제 기능 개발이 선행된 후 추가되어야한다.

 

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