220523 팀프로젝트 회고

Parker.Park·2022년 5월 23일
0

CodeCampTeamProject

목록 보기
13/22

220523 팀프로젝트 회고

갑자기 결제 API 에러처리가 궁금해지다...

대략적인 결제 flow는 프론트쪽에서 결제가 완료 된 후 서버사이드로 결과를 보내주면 DB에서 검증하고 저장하는 대략적인 flow이다. 로컬 호스트와 브라우저에서 직접 테스트를 할 때 cors에러가 뜨는데, 이 에러는 브라우저에서 막는 것이기 때문에 결제가 완료 된 후 서버 사이드로 신호를 보낼 때 나는 것이다. 그렇기 때문에 결제는 완료 되었지만 서버에서는 검증할 방법이 없게 된 것이다. 현재는 cors에러만 그러하지만 결제 서버가 아닌 기록만 저장하는 DB와 서버가 이상이 생겼을 경우는 어떻게 처리되는지, 그전에 처리는 어떻게해야 하는지에 대한 고민이 생겼다.

  1. 프론트 쪽에서 에러 처리
    프론트 쪽에서 우리 서버와 에러가 났을 경우 결제가 된 내용에 대해 환불 처리하는 것이다. 몇몇 페어분들에게 조언을 구했을 때 이방식을 가장 많이 추천해줬는데, 사용자 입장에서는 결제가 애초에 되지 말았었으면 어땠을까 하는 아쉬움이 있을 것이다.
  2. 결제를 서버사이드에서 실행
    이 방법이 개인적으로는 가장 괜찮은 방법이라고 생각한다. 그러나 지금 배우고 있는 api는 프론트쪽에서 결제가 완료된다는 것을 가정하기 때문에 좀 더 공부가 필요하고 리팩토링 해야 할 것이다.

sql서버 초기화? delete 데이터

현재 gcp에서 Mysql데이터베이스를 사용 하고 있다. 편리한 점은 DB 데이터들이 쌓인다는 것이다. 불편한 점은 DB 데이터들이 쌓인다는 것이다.
테스트를 할 때 회원정보를 미리 저장하고 다른 데이터를 쌓아가면 조회 API를 테스트 할 때 편리하다. 하지만 Entity Column을 추가하고 데이터를 추가하다 보면 이전 데이터는 null값이 발생하게 되는데 이로인하여 오류가 발생하는 경우가 종종 있다. 그렇기 때문에 localhost에서는 데이터베이스를 지우고 다시 실행하면 그만이었다. 다만 처음 데이터를 만들어줘야 하는 것이 불편했을 뿐이다.
gcp의 경우는 Mysql 인스턴스를 만들어 그곳에 데이터베이스를 따로 추가해줘야 했다. 그렇기 때문에 docker에서 자동으로 생성하는 것은 바라기 어려웠다. 그래서 기존 테이블과 데이터베이스 구조는 유지하면서 기존 데이터를 지우는 명령어는 있을까 하고 찾았다. 그리고 찾을 수 없었다.

drop database database_name; // DB를 아예 통째로 날려버리는 것이다. 
delete Table table_name [where column_name = column] 
// table 데이터혹은 특정 데이터를 삭제
truncate table_name // 테이터를 비워놓는 기능이라고 한다. join되었을 경우 처리되지 않았다.

결국 'dorp database~'를 사용하고, 다시 'create database~'를 사용하여 처리하였지만, 중간중간 이게 맞나 맞나 싶어서 굉장히 고통스러운 작업이었다. 현직에 있는 친구에게 물어보니 당연히 drop으로 database를 쓰는일은 말도 안되는 것이라고 한다. 그러니 빨리 일이나 알아보라는 '좋은(?)' 해결책을 제시해주었다.

pagination

pagination은 이번 프로젝트에서 2차 목표로 두었던 것인데, back쪽으로는 공부가 필요하다고 생각해서 알아봤다. 단어 자체는 굉장히 생소했지만, 게시판 같은데 페이지 번호가 있고 그것을 누르면 이동하게끔 데이터를 나눠놓는 작업이다. DB가 mysql이다 보니 typeORM인 QueryBuilder를 사용하기로 했다.

const users = await dataSource
    .getRepository(User)
    .createQueryBuilder("user")
    .leftJoinAndSelect("user.photos", "photo")
    .skip(5)
    .take(10)
    .getMany()

위에는 TypeORM Docs에서 그대로 가져온 것이다. 위와 같이 skip과 take로 페이지를 불러온다고 한다. 그러나 프론트 페어와 얘기를 해보니 전체 데이터를 조회하는 API 와 count를 조회하는 API를 활용하여 만들었다고 한다. 그래서 count를 반영하는 api를 만들었다. 이 또한 QueryBuilder를 통해서 안정성을 확보 하려고 했다.


const [results, count] = await this.questionBoardRepository
      .createQueryBuilder('QuestionBoard')
      .leftJoinAndSelect('QuestionBoard.user', 'userId')
      .getManyAndCount();

아래 ".getManyAndCount()"는 TypeORM Docs가 아닌 다른 페이지를 참고하였는데(도무지 찾을수가 없었다 ㅠ), 결과값은 나왔으나 이게 맞는지는 정확하지 않다. Docs에 나와야 좀 안심이 되기도한다.

참조

[Using pagination, TypeORM, 2022년05월23일 접속]
https://typeorm.io/select-query-builder#using-pagination
[Nest.js Typeorm 말고 querybuilder 를 써야하는경우, https://ganzicoder.tistory.com/160, 2022년05월23일 접속]
https://ganzicoder.tistory.com/160

profile
개발자준비중

0개의 댓글