본문 바로가기
DataBase

데이터를 운반하는 트럭 Packet

by LeeJ1Hyun 2022. 12. 31.

Node.js, typeORM, Mysql을 사용하는 프로젝트를 할 때 SELECT 쿼리문을 이용하여 데이터를 조회했더니 다음과 같은 형태의 결과를 얻을 수 있었다.

 

[
    RowDataPacket {
      id: 1,
      quantity: 1
    },
    RowDataPacket {
      id: 2,
      quantity: 10
    }
]

 

RowDataPacket 그리고 객체의 형태로 원하는 데이터들이 나열된 배열이 출력되었다. 이때까진 세세한 개념까지 깊이 공부할 여유가 없어서 데이터를 담아주는 바구니같은 개념이겠거니 하고 넘어갔었다. Packet에 대해 글을 작성하게된 계기는 DELETE 쿼리문의 에러 핸들링 과정에서 발생했다.

 

bookings(예약) 테이블에 실제로 존재하지 않는 class_id와 user_id의 조합이라면 당연히 DELETE 쿼리 실행이 실패하고 에러를 발생시킬 것이라고 생각했다. 분명 유효하지 않은 조합으로 통신 요청을 보냈는데 200 OK가 뜨고 에러 처리가 되지 않았다. Mysql에서 두 가지 쿼리문 모두 실행시킨 결과는 다음과 같았다.

 

DELETE 쿼리 결과

두 줄의 Query OK

 

늘 실제로 존재하는 row에 대해서만 쿼리 실행을 하고, 존재 여부를 미리 판단하여 에러 핸들링을 했기 때문에 미처 생각하지 못한 부분이었다. 실제로 존재하든 아니든 쿼리 실행 결과는 OK이다. 단, 몇개의 row가 영향을 받았냐의 차이가 존재한다. 두 결과를 살펴보면 위는 1 row affected, 아래는 0 row affected이다. 일반적으로 GET을 제외한 나머지 메소드는 결과값으로 데이터가 출력되지 않기 때문에 에디터 내부에서 쿼리 실행 성공 여부를 판단하기 어렵다.

 

이때 필요한 것이 바로 OkPacket이다.

 

Packet은 대체 무엇일까

 

네트워크 관점에서 Packet은 전송되기 위한 작은 데이터 조각, 한번에 전송할 수 있는 크기 등을 의미한다. 데이터를 나누어 보내야 하는 이유는 여러가지가 있지만, 가장 단순한 이유로는 중간에 손실이 일어날 경우 다시 처음부터 보내야 하는 비효율적인 전송이 일어나기 때문이다. Packet은 Header, Payload, Trailer로 이루어져 있다. 간단하게 이메일 전송을 예로 들어보면 각각 아래와 같은 정보들이 들어간다.

 

Header Payload Trailer
전송인의 IP 주소 Data Packet 끝을 표시하는 데이터
받는이의 IP 주소   Error correction
Protocol    
Packet number    

 

Response Packet

 

Packet의 개념에 대해 간단히 알았다면 이를 활용하여 API 만들기 및 에러 핸들링 하는 법에 대해 알아야 한다. OkPacket은 Response Packet의 종류중 하나로 그 밖에도 ErrPacket과 같은 Packet도 존재한다. 마찬가지로 Payload가 존재하며 이 안에는 affected_rows라는 요소가 존재한다.

 

OkPacket

 

위 사진은 실제로 19번 수업의 예약을 성공한 통신 결과이다. INSERT 쿼리 결과를 result 변수에 담고 affectedRows의 결과를 console.log()로 출력한 결과로 OkPacket 객체가 반환되었다. affectedRows 외에도 insertId는 실제로 데이터 베이스에 INSERT된 row의 id이다. 이를 이용하여 실제로 DELETE 쿼리가 잘 실행되었는지를 판단할 수 있다.

 

 

// database.js에 모듈화하여 만들어 놓은 함수

  getAffectedRows() {
        return this.result.affectedRows;
    }

 

예약한 수업을 취소하는 Dao단의 함수로 result.getAffectedRows() 결과가 1(true)이 아니면 에러를 발생시켰다. 실제로 0개의 row가 삭제되었을 때 직접 처리해준 에러 메시지가 반환된 것으로 보아 정상적으로 에러 핸들링이 된 것을 알 수 있었다. OkPacket을 이용하면 DELETE뿐만 아니라 다른 메소드에서도 몇개의 rows가 영향을 받았는지를 통해 에러 핸들링 및 여러 로직을 구상할 수 있다.

'DataBase' 카테고리의 다른 글

Redis Sentinel 이해하기  (0) 2023.03.02
Mysql JSON 형태로 조회하기  (2) 2022.12.31
쿼리문을 이용한 공격 SQL Injection  (0) 2022.12.31
콜백 지옥에 이은 join 지옥  (0) 2022.12.14
DB와 DBMS의 차이점  (0) 2022.12.14

댓글