JPA 예제 - (1)주문관리 API POST
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
DAO, DTO 알아보기 // 예제 - 유저관리 API POST
DAO (Data Access Object) 란?데이터베이스나 기타 영속성 메커니즘에 접근하는 객체 목적: 데이터 접근 로직과 비즈니스 로직을 분리기능: CRUD(Create, Read, Update, Delete) 작업 수행사용이유: - 코
maeilcoding.tistory.com
// todo 1 creatOrder
1. API 명세서 확인
2. Postman에 API Request 작성
{
"productName": "마우스",
"quantity": 10,
"totalPrice": 30000
}
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 createOrder(OrderRequest orderRequest) {
// DTO 를 Entity 로 변환해야함
Order order = new Order();
// 사용하려면 메모리에 객체 생성
order.productName = orderRequest.productName;
order.quantity = orderRequest.quantity;
order.totalPrice = orderRequest.totalPrice;
orderRepository.save(order);
//DB에 저장
//응답 본문 없음 Void
}
1. 메서드 선언:
public void createOrder(OrderRequest orderRequest)
- `OrderRequest` 객체를 매개변수로 받아 주문을 생성합니다.
- 반환 타입이 `void`이므로 별도의 응답을 반환하지 않습니다.
2. Entity 객체 생성:
Order order = new Order();
- `Order` 엔티티의 새 인스턴스를 생성합니다.
3. DTO에서 Entity로 데이터 복사:
order.productName = orderRequest.productName;
order.quantity = orderRequest.quantity;
order.totalPrice = orderRequest.totalPrice;
- `OrderRequest` DTO의 데이터를 `Order` 엔티티 객체에 복사합니다.
4. 데이터베이스에 저장:
orderRepository.save(order);
- `JpaRepository`의 `save` 메서드를 사용하여 주문 엔티티를 데이터베이스에 저장합니다.
이 메서드는 클라이언트로부터 받은 주문 정보(DTO)를 엔티티로 변환하고, 이를 데이터베이스에 저장하는 과정을 수행합니다.
Controller 클래스에 메서드 완성
@PostMapping("/orders")
createOrder(@RequestBody OrderRequest orderRequest) {
orderService.createOrder(orderRequest);
}