inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[인프런워밍업클럽 3기 BE] 3주차 발자국

pej4303
0

1. 강의

1.1 학습내용


2. 미션

2.1. 조회 REST API 만들기

2.2. 삽입, 수정, 삭제 API 만들기

class OrderNotFoundException(val orderNo: Long) : CustomException("해당 주문정보가 없습니다. [주문번호 : $orderNo]")
class ProductNotFoundException(val productCd: Long) : CustomException("해당 상품코드가 없습니다. [상품코드 : $productCd]")
   @Transactional
    fun create(requestDTO: RequestCreateDTO): ResponseEntity<ResponseDTO> {
        // 주문 마스터 생성
        val orderHeader = Order(orderSts = OrderSts.PAYMENT_COMPLETED.code)
        orderRepository.save(orderHeader)

        // 주문 상세 생성
        requestDTO.items.forEach { item ->
            val product = productRepository.findById(item.productCd).orElseThrow {
                ProductNotFoundException(item.productCd) // 상품 코드가 없을 경우 예외 던지기
            }
            val orderDetail = OrderDetail(
                order = orderHeader,
                product = product,
                price = item.price,
                qty = item.qty,
                memo = item.memo
            )
            orderDetailRepository.save(orderDetail)
        }

        val response = ResponseDTO(
            code = 200,
            msg = "주문 등록 성공",
            orderNo = orderHeader.orderNo,
            orderSts = orderHeader.orderSts
        )

        return ResponseEntity.status(HttpStatus.OK).body(response)
    }
@Transactional
    fun update(orderNo: Long, requestDTO: RequestUpdateDTO): ResponseEntity<ResponseDTO> {
        // 주문 마스터
        val orderHeader = orderRepository.findById(orderNo).orElseThrow {
            OrderNotFoundException(orderNo) // 주문 정보가 없을 경우 예외 던지기
        }

        if ("60".equals(orderHeader.orderSts)) {
            val errorRes = ResponseDTO(
                code = 400,
                msg = "배송완료 상태는 수정 할 수 없습니다. [주문번호 : ${orderNo}]",
                orderNo = null,
                orderSts = null
            )

            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorRes)
        }

        if (requestDTO.orderSts > 0 ) {
            // 주문 상태가 유효한 코드인지 확인하고 적용
            val orderSts = OrderSts.values().find { it.code == requestDTO.orderSts } ?: throw ApiException("유효하지 않은 주문 상태 코드입니다. [주문상태 : ${requestDTO.orderSts}]")

            // 주문 마스터 업데이트
            orderHeader.orderSts = orderSts.code // code 값으로 업데이트
            orderRepository.save(orderHeader) // 주문 상태를 업데이트
        }

        // 주문 상세
        val orderDetail = orderDetailRepository.findByOrderNo(orderNo)

        requestDTO.items.forEach { item ->
            val product = productRepository.findById(item.productCd).orElseThrow {
                ProductNotFoundException(item.productCd) // 상품 코드가 없을 경우 예외 던지기
            }

            // 주문 상세 업데이트
            val updateOrderDetail = orderDetail.find { it.product == product }
            if (updateOrderDetail != null) {
                updateOrderDetail.price = item.price
                updateOrderDetail.qty = item.qty
                updateOrderDetail.memo = item.memo
                orderDetailRepository.save(updateOrderDetail) // 업데이트
            }
        }

        // 응답 반환
        val response = ResponseDTO(
            code = 200,
            msg = "주문 수정 성공",
            orderNo = orderNo,
            orderSts = orderHeader.orderSts
        )

        return ResponseEntity.status(HttpStatus.OK).body(response)
    }
 @Transactional
    fun delete(orderNo: Long): ResponseEntity<ResponseDTO> {
        val orderHeader = orderRepository.findById(orderNo).orElseThrow {
            OrderNotFoundException(orderNo) // 주문 정보가 없을 경우 예외 던지기
        }

        val orderSts = orderHeader.orderSts
        if ("60".equals(orderSts)) {
            val errorRes = ResponseDTO(
                code = 400,
                msg = "배송완료 상태는 삭제 할 수 없습니다. [주문번호 : ${orderNo}]",
                orderNo = null,
                orderSts = null
            )

            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorRes)
        }

        // 주문 마스터
        orderHeader.delYn = "Y"
        orderRepository.save(orderHeader)

        // 주문 상세
        val orderDetailList = orderDetailRepository.findByOrderNo(orderNo)
        orderDetailList.forEach { it.delYn = "Y" } // delYn 필드 값을 "Y"로 변경
        orderDetailRepository.saveAll(orderDetailList) // 변경된 리스트를 저장


        val response = ResponseDTO(
            code = 200,
            msg = "주문 삭제 성공",
            orderNo = orderNo,
            orderSts = null
        )
        return ResponseEntity.status(HttpStatus.OK).body(response)
    }

2.3. 느낀 점

조회 API 만들기 미션은 제출하지 못했고 삽입, 수정, 삭제 API 만들기 미션은 겨우 제출하였다.

생각보다 내가 원하는 기능은 구현하는게 빠르게 되지 않아서 많이 검색해보았다.

개발하고 나서 사용하지 않는 테이블과 컬럼들을 정리하였다. 초기 ERD와 좀 다르게 되어서 ERD도 다시 수정하였다.

출처

백엔드 발자국 인프런워밍업클럽

답변 0