본문 바로가기
SpringBoot Server/API

JPA 예제 - (3)주문 수정 API PUT

by ssury94 2025. 1. 6.

 

JAP란?

 

SQL 대신 자바로 DB와 상호작용하기 JPA(Java Persistence API)

지금까지는 JDBC를 활용하여 DAO 클래스에서 SQL쿼리를 통해 DB 작업을 하였는데요.//sql을 통한 회원가입 처리@Repositorypublic class UserDAO { @Autowired JdbcTemplate jdbcTemplate; // todo 회원가입 public int signUp(User

maeilcoding.tistory.com

 

JDBC와 비교해보기

 

JDBC 예제 - 유저관리 APl PUT

https://maeilcoding.tistory.com/117 예제 - 유저관리 API GET Allhttps://maeilcoding.tistory.com/116 예제 - 유저관리 API GET idhttps://maeilcoding.tistory.com/115 Controller, DAO, DTO 알아보기 // 예제 - 유저관리 API POSTDAO (Data Acc

maeilcoding.tistory.com

 

 

 

// todo 3 updateOrde

1. API 명세서 확인

 

2. Postman에 API Request 작성

{
  "productName": "애플펜슬",
  "quantity": 10,
  "totalPrice": 120000
}

3. Entity 클래스 변수 선언

@Data
@NoArgsConstructor
@AllArgsConstructor

@Entity
@Table(name = "`order`")
public class Order {

    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
   public Long id;
    @Column(length = 200)
   public String productName;
    @Column
   public Integer quantity;
    @Column
   public Double totalPrice;
    @Column
   public Instant orderDate;

    @PrePersist
    public void prePersist(){
        orderDate = Instant.now();
    }
 
    // 데이터 insert 할때 자동으로 현재시간이 들어감.

}

`order`로 백틱을 사용한 이유

@Table(name = "`order`")에서 백틱()을 사용하는 이유는 데이터베이스에서 order라는 이름이 SQL 예약어로 사용되기 때문입니다. SQL에서 ORDER BY와 같은 구문에서 ORDER`는 특정한 의미를 가지므로, 이를 테이블 이름으로 사용할 경우 충돌이 발생할 수 있습니다. orders와 같이 복수형으로 테이블 이름을 설정하는 것이 좋습니다.

 

4. Repository extends

@Repository
public interface OrderRepository extends JpaRepository<Order,Long> {

}

 

JPA에서는 JpaRepository 인터페이스를 상속받는 Resporitory 클래스를 통해 DB와 상호작용 합니다.

상속받은 메서드를 통해 CRUD 작업이 가능합니다.

 

Service 클래스에 메서드 완성

// 오더 수정
public void updateOrder(long id, OrderRequest orderRequest) {
    //1. DB 에서 id에 해당하는 행을 가져온다.
    //2. 클라이언트에서 변경된 데이터로 세팅
    //3. DB 에 업데이트
    Optional<Order> order = orderRepository.findById(id);
    // Order 는 있을수도 있고, 없을수도 있음 <- Optional
    if (!order.isPresent()) {
        throw new RuntimeException();
        // throw 을 사용하면 밑에 코드를 실행하지 않음
    } else {
        Order sevedOrder = order.get();
        // order.get() : Optional 을 Order 로 변환, 행을 가져옴 2. 클라이언트에서 변경된 데이터로 세팅
        sevedOrder.productName = orderRequest.productName;
        sevedOrder.quantity = orderRequest.quantity;
        sevedOrder.totalPrice = orderRequest.totalPrice;
        // 3. DB 에 업데이트
        orderRepository.save(sevedOrder);
    }
}

 

 

1. 메서드 선언:

public void updateOrder(long id, OrderRequest orderRequest)


id와 OrderRequest 객체를 매개변수로 받아 해당 ID의 주문을 수정합니다.


2. 데이터베이스에서 주문 조회:

Optional<Order> order = orderRepository.findById(id);


JpaRepository의 findById 메서드를 사용하여 주문을 조회합니다.


3. 주문 존재 여부 확인:
java

if (!order.isPresent()) {
    throw new RuntimeException();
} else {
    // 주문이 존재하는 경우의 처리
}


주문이 존재하지 않으면 RuntimeException을 발생시킵니다.


4. 주문 데이터 업데이트:

Order savedOrder = order.get();
savedOrder.productName = orderRequest.productName;
savedOrder.quantity = orderRequest.quantity;
savedOrder.totalPrice = orderRequest.totalPrice;


조회된 주문 엔티티의 데이터를 클라이언트에서 받은 새 데이터로 업데이트합니다.


5. 데이터베이스에 저장:

orderRepository.save(savedOrder);


수정된 주문 엔티티를 데이터베이스에 저장합니다.
이 메서드는 주어진 ID로 주문을 조회하고, 존재하면 새로운 데이터로 업데이트한 후 데이터베이스에 저장합니다. 주문이 존재하지 않으면 예외를 발생시킵니다.

 

Controller 클래스에 메서드 완성

// 오더 수정
@PutMapping("/orders/{id}")
public ResponseEntity<Object> updateOrder(@PathVariable long id, @RequestBody OrderRequest orderRequest) {
    try {
        orderService.updateOrder(id, orderRequest);
        return ResponseEntity.status(200).build();
    } catch (Exception e) {
        return ResponseEntity.status(400).build();
    }
}