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 예제 - 유저관리 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();
}
}