본문 바로가기

백엔드 학습 과정/Section 3 [Spring MVC, JDBC, JPA, RestDo

Spring JPA 기능 코드

목차

1. LocalDateTime 클래스 타입

2. @Enumerated 상태

3. findVerifiedMember for updateMember, findMember, deleteMember Service 메서드

4. verifyExist변수명 for createMember Service메서드

 

3,4 차이는 어떤 케이스에 예외;를 발생시키느냐

존재하면 발생

존재하지 않으면 발생

가장 큰 차이 : 반환 값이 있다 없다

 

 

1. 등록 시간 혹은 수정 시간 타입 = LocalDateTime

@Column(nullable = false)
    private LocalDateTime createdAt = LocalDateTime.now();   // (2)

    // (3)
    @Column(nullable = false, name = "LAST_MODIFIED_AT")
    private LocalDateTime modifiedAt = LocalDateTime.now();

modifiedAt 사용가능 예제 코드

public Order updateOrder(Order order) {
    Order findOrder = findVerifiedOrder(order.getOrderId());

    Optional.ofNullable(order.getOrderStatus())
            .ifPresent(orderStatus -> findOrder.setOrderStatus(orderStatus));
    findOrder.setModifiedAt(LocalDateTime.now());
    return orderRepository.save(findOrder);
}

 

 

 

2. @Enumerated

@NoArgsConstructor
@Getter
@Setter
@Entity(name = "ORDERS")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long orderId;
    
    @Column(nullable = false)
    private LocalDateTime createdAt = LocalDateTime.now();

    @Column(nullable = false, name = "LAST_MODIFIED_AT")
    private LocalDateTime modifiedAt = LocalDateTime.now();

    // (1)
    @Enumerated(EnumType.STRING) // (2)
    private OrderStatus orderStatus = OrderStatus.ORDER_REQUEST;

    public enum OrderStatus {
        ORDER_REQUEST(1, "주문 요청"),
        ORDER_CONFIRM(2, "주문 확정"),
        ORDER_COMPLETE(3, "주문 완료"),
        ORDER_CANCEL(4, "주문 취소");

        @Getter
        private int stepNumber;

        @Getter
        private String stepDescription;

        OrderStatus(int stepNumber, String stepDescription) {
            this.stepNumber = stepNumber;
            this.stepDescription = stepDescription;
        }
    }
}

1. @Enumerated : enum 타입과 매핑할 때 사용하는 애너테이션

2. @Enumerated Attribute

A. (EnumType.ORDINAL) : enum의 순서를 나타내는 숫자를 테이블에 저장

B. (EnumType.STRING) : enum의 이름을 테이블에 저장 <권장>

 

>> A의 경우, 기존에 정의되어 있는 enum 사이에 새로운 enum을 추가하면,

이전에 저장되어 있는 enum 순서 번호와 enum에 정의되어 있는 순서가 일치하지 않는 문제가 발생한다.

 

OrderPatchDto에 private Order.OrderStatus orderStatus; 추가해야할 수 있음

OrderResponseDto에도 private Order.OrdersStatus orderStatus 추가해야할 수 있음

 

3. findVerified엔티티 for updateMember, findMember, deleteMember Service 메서드

 

-findVerifiedCoffee-

    public Coffee findVerifiedCoffee(long coffeeId) {
        Optional<Coffee> optionalCoffee = coffeeRepository.findById(coffeeId);
        Coffee findCoffee =
                optionalCoffee.orElseThrow(()->
                        new BusinessLogicException(ExceptionCode.COFFEE_NOT_FOUND));
        return findCoffee;
    }

 

-updateCoffee-

    public Coffee updateCoffee(Coffee coffee) {
        Coffee findCoffee = findVerifiedCoffee(coffee.getCoffeeId());

        Optional.ofNullable(coffee.getKorName())
                .ifPresent(korName -> findCoffee.setKorName(korName));
        Optional.ofNullable(coffee.getEngName())
                .ifPresent(engName -> findCoffee.setEngName(engName));
        Optional.ofNullable(coffee.getPrice())
                .ifPresent(price -> findCoffee.setPrice(price));

        Optional.ofNullable(coffee.getCoffeeStatus())
                .ifPresent(coffeeStatus -> findCoffee.setCoffeeStatus(coffeeStatus);

        return coffeeRepository.save(findCoffee);
    }

 

-findCoffee-

    public Coffee findCoffee(long coffeeId) {
        return findVerifiedCoffeeByQuery(coffeeId);
    }

 

-deleteMember-

    public void deleteCoffee(long coffeeId) {
        Coffee coffee = findVerifiedCoffee(coffeeId);
        coffeeRepository.delete(coffee);
    }

 

 

4. verifyExist변수명 for createMember Service메서드

 

-verifyExistCoffee-

    private void verifyExistCoffee(String coffeeCode) {
        Optional<Coffee> coffee = coffeeRepository.findByCoffeeCode(coffeeCode);
        if(coffee.isPresent())
            throw new BusinessLogicException(ExceptionCode.COFFEE_CODE_EXISTS);
    }

 

-createCoffee-

    public Coffee createCoffee(Coffee coffee) {
        String coffeeCode = coffee.getCoffeeCode().toUpperCase();

        verifyExistCoffee(coffeeCode);
        coffee.setCoffeeCode(coffeeCode);

        return coffeeRepository.save(coffee);
    }