본문 바로가기
프로젝트/장애인 PT 플랫폼, PTFD

PORTONE활용 결제부, 상품 관련 DB 추가.

by 임지혁코딩 2024. 2. 18.

상품관련 DB는 2가지 분야에서 사용될 것이다.

 

1. 주문을 넣는 단(프론트 단)에서, 현재 남은 상품에 따라 해당 상품을 주문할 수도, 혹은 불가능 할 수 있다.  

2. 결제확인까지 완료된 이후에, 남은 상품을 변경한다. 

 

(현재 프론트 단과는 협업이 필요하기 때문에, 일단 2번을 먼저 진행하도록 하겠다)

 

상품 DB 추가, 결제에 따른 상품 변경

 

 

DBeaver를 활용해서, 매우 간단하게 상품의 목록을 구현하였다. 

 

그 이후엔, 이미 생성한 product table을 mapping 하였다

 

<Product>


@Table(name = "Product")
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Product {

    //getter setter가 필요하띾?

    @Id
    String PID ;

    @Column(name = "price")
    long price;

    @Column(name = "Pname")
    String Pname;

    @Column(name = "amount")
    long amount;

}

 

 

<repository>

public interface ProductRepsitory extends JpaRepository<Product, String> {


    @Transactional
    @Modifying(clearAutomatically = true)
    @Query("UPDATE Product SET amount = amount - 1 WHERE PID = :insertid")
    int minusOneAmount(@Param("insertid") String insertid);


}

 

- 시행착오들 

 

<db가 자동으로 생성되고, 이미 생성된 db와 mapping되지 않았던 문제>

결제내역, 실제 product, 사용자 그 어떤 경우에도 자동 table 생성이 필요한 것은 아니기 떄문에,

ddl-auto를 none으로 설정하였다. 

 

<update시 오류가 발생했던 문제> 

 

- 문제 1: 권한 관련 문제

 임시적으로 권한이 설정되지 않아있었다.

접속할 productmanager%localhost에게 권한을 부여하였다. 

 

mysql> use purchasedb
Database changed
mysql> GRANT ALL PRIVILEGES ON purchasedb.* TO 'purchaseadmin'@'localhost';
Query OK, 0 rows affected (0.07 sec)

 

- 문제 2: update시 transaction 문제 

 

public interface ProductRepsitory extends JpaRepository<Product, String> {


    @Transactional
    @Modifying(clearAutomatically = true)
    @Query("UPDATE Product SET amount = amount - 1 WHERE PID = :insertid")
    int minusOneAmount(@Param("insertid") String insertid);


}

 

해당 코드에서, transactional에 대한 문제가 발생했다 .

 

1. transactional을 반드시 dml(특히 update delete)시는 명시해주어야 한다. 

2. Modifying을 통해서 insert,delete,update임을 명시해주어야한다.

(jpa에는 1차 캐시라는 기능이 있는데, 이를 통해 직접적인 db의 접근 횟수를 감소시킨다)

(dml중 select시 즉시 1차 캐시를 통해 가져오기 때문에, 변경을 알 수 없다)

이럴떄. delete,insert,update시 캐시를 초기화 해준다. 

 

 

 

결제 요청에 따라 변경된, 햄버거의 갯수 확인 완료! 

 

-앞으로 할일

이제는, 이 모든 내용들을 spring을 활용한 backend 단에서 진행하는 형태로 변경하여 보자.