TIL

아웃 소싱 프로젝트를 진행하며 고민했던 것들

oceanflow 2025. 3. 4. 23:40
@RestController
@RequiredArgsConstructor
public class MenuController {

    private final MenuService menuService;

    @PostMapping("/stores/{storeId}/menus")
    public ResponseEntity<MenuResponseDto> save(@PathVariable Long storeId, @Valid @RequestBody CreateMenuRequestDto dto) {

        return new ResponseEntity<>(menuService.save(dto, storeId), HttpStatus.CREATED);
    }

    @PutMapping("/stores/{storeId}/menus/{menuId}")
    public ResponseEntity<MenuResponseDto> update(@PathVariable Long storeId, @PathVariable Long menuId, @RequestBody UpdateMenuRequestDto dto) {

        return new  ResponseEntity<>(menuService.update(storeId, menuId, dto), HttpStatus.OK);
    }

    @DeleteMapping("/stores/{storeId}/menus/{menuId}")
    public ResponseEntity<Void> delete(@PathVariable Long storeId, @PathVariable Long menuId) {

        menuService.disableById(storeId, menuId);

        return ResponseEntity.noContent().build();
    }
}

 

지금은 메뉴를 생성할 때 스토어 아이디를 URL에 입력하여야 하지만,

사용자가 특정 상점에 로그인하거나 관리 권한을 가지고 있는 경우, 세션이나 인증 정보를 활용해 상점 ID를 추출하는 방법을 구현할 수 있지 않을까?

 

하지만 요구 사항에 한명의 사장님이 3개의 가게를 가질 수 있다고 되어있어 어떤 가게인지 구분이 가지 않아서 구현할 수 없었다.

다른 방법이 있는지 궁금하여 찾아 보았으나 결국 URI로 받아오는 방법밖에 없다는 것을 알았다.

 

또한 메뉴를 삭제할 때, 삭제를 하는 것이 아닌 status를 바꿔주어 메뉴를 삭제하더라도 주문 기록에는 남아있게 하는 것이 요구사항이었다.

이를 구현하기 위해 enum으로 Active와 Disable을 만들어 삭제가 아닌 초기값은 Active, 삭제를 할 시에 Disable을 만들어 주었다.

구현하는데 있어서 고민을 좀 했다. 처음해보는 것이기 때문이다.

 @DeleteMapping("/stores/{storeId}/menus/{menuId}")
    public ResponseEntity<Void> delete(@PathVariable Long storeId, @PathVariable Long menuId) {

        menuService.disableById(storeId, menuId);

        return ResponseEntity.noContent().build();
    }

 

@Transactional
    public void disableById(Long storeId, Long menuId) {

        Store store = storeRepository.findById(storeId).orElseThrow(() -> new EntityNotFoundException("해당 가게가 없습니다."));

        Menu menu = menuRepository.findByIdAndStore(menuId, store).orElseThrow(() -> new EntityNotFoundException("해당 메뉴가 없거나 해당 가게의 메뉴가 아닙니다."));
        menu.disable();
        menuRepository.save(menu);
    }

 

public void disable() {
        this.status = MenuStatus.DISABLED;
    }

 

public enum MenuStatus {
    ACTIVE,
    DISABLED
}