고객 주문 저장 및 조회

PostgreSQLBeginner
지금 연습하기

소개

주문 애플리케이션에는 데이터베이스 연결이 있지만 주문 테이블은 없습니다. 작은 스키마를 정의하고 고객 주문 세 건을 저장한 뒤 애플리케이션이 읽는 데이터를 조회합니다.

먼저 앞선 데이터베이스 연결 실습을 완료하세요. 이 실습은 제공된 PostgreSQL 인스턴스, 애플리케이션 및 설정된 AWS CLI로 독립적으로 시작합니다. 결과를 테스트한 뒤 연습용 데이터베이스를 삭제합니다.

자격증 시험과의 연관성

이 실습은 다음 시험 주제를 위한 기초 실습을 제공합니다.

주문 테이블 정의

이 단계에서는 각 주문에 고유 식별자, 고객 이름 및 총액을 부여하는 스키마를 만듭니다.

테이블은 정의된 열을 가진 행을 저장합니다. SQL은 이 행을 정의하고 조회하는 언어입니다. RDS API는 데이터베이스 인스턴스를 관리하고 SQL은 PostgreSQL 엔진 내부의 데이터를 처리합니다.

준비된 SQL 연결 설정을 불러오고 제공된 인스턴스를 확인합니다.

cd /home/labex/project
source database.env
aws rds \
  describe-db-instances \
  --db-instance-identifier orders-db \
  --query 'DBInstances[0].{Database:DBName,Endpoint:Endpoint,Status:DBInstanceStatus}'

인스턴스는 사용 가능하며 데이터베이스 orders를 포함합니다. psql 연결은 service=orders-db로 준비되어 있습니다.

heredoc으로 테이블을 만듭니다. 두 SQL 줄 사이의 텍스트는 SQL 문으로 psql에 전달됩니다.

psql \
  "service=orders-db" \
  --set=ON_ERROR_STOP=1 <<'SQL'
CREATE TABLE orders (
  order_id integer PRIMARY KEY,
  customer text NOT NULL,
  total numeric(8,2) NOT NULL CHECK (total > 0)
);
SQL

기본 키는 두 행이 같은 주문 ID를 사용하는 것을 방지합니다. NOT NULL은 값을 필수로 지정합니다. numeric(8,2)는 소수점 이하 두 자리의 숫자를 저장하고 CHECK는 0 이하의 총액을 거부합니다. 이러한 제약 조건은 데이터베이스에서 잘못된 데이터를 거부하게 합니다.

테이블을 확인합니다.

psql \
  "service=orders-db" \
  --command '\d orders'

열 세 개, 기본 키 및 양수 총액 검사 조건이 표시되어야 합니다. 테이블에는 아직 행이 없습니다.

고객 주문 세 건 저장

이 단계에서는 작은 데이터 집합을 삽입하고 즉시 다시 읽습니다.

INSERT는 행을 씁니다. 열 이름을 지정하면 각 값과 열의 관계가 명확해집니다.

psql \
  "service=orders-db" \
  --set=ON_ERROR_STOP=1 <<'SQL'
INSERT INTO orders (order_id, customer, total)
VALUES
  (101, 'Maya', 49.90),
  (102, 'Owen', 18.50),
  (103, 'Nina', 25.25);

SELECT order_id, customer, total
FROM orders
ORDER BY order_id;
SQL

위 값을 가진 세 행이 표시되어야 합니다. SELECT는 저장된 데이터를 읽고 ORDER BY는 출력 순서를 예측 가능하게 합니다. 정렬 절이 없으면 데이터베이스는 특정 행 순서를 보장하지 않습니다.

AWS View에도 같은 세 건의 주문이 표시되어야 합니다. 애플리케이션은 요청을 받으면 PostgreSQL을 읽으므로 테이블과 행을 추가하면 사용할 수 없던 주문 목록이 유용한 애플리케이션 데이터로 바뀝니다.

주문 조회 및 애플리케이션 확인

이 단계에서는 비즈니스 질문에 답하고 SQL 데이터와 애플리케이션 응답을 비교합니다.

팀은 금액이 25.00 이상인 주문을 원합니다. WHERE는 결과에 포함하기 전에 행을 필터링합니다.

psql \
  "service=orders-db" \
  --command 'SELECT order_id, customer, total FROM orders WHERE total >= 25.00 ORDER BY order_id;'

주문 101과 103이 표시되어야 합니다. 필터는 주문 102를 삭제하지 않고 반환할 행만 선택합니다.

집계는 여러 행의 값을 합칩니다. 모든 주문 수와 총금액을 계산합니다.

psql \
  "service=orders-db" \
  --command 'SELECT count(*) AS order_count, sum(total) AS order_total FROM orders;'

주문 수 3과 총금액 93.65가 표시되어야 합니다.

애플리케이션의 주문 목록을 요청합니다.

curl \
  --silent \
  --show-error \
  --fail \
  http://127.0.0.1:8080/application/orders | jq

세 건의 주문 모두와 데이터베이스 orders, 사용자 orders_admin, read_only: false가 표시되어야 합니다. SQL과 애플리케이션은 동일한 저장 데이터를 읽습니다. 애플리케이션은 전체 목록을 반환하며 앞선 SQL 쿼리는 지정한 필터를 적용했습니다.

데이터베이스 마스터 사용자는 이 스키마를 만드는 데 유용합니다. 다음 실습에서는 일상적인 접근에 관리 권한이 필요하지 않도록 애플리케이션에 더 제한된 데이터베이스 계정을 부여합니다. 애플리케이션이 PostgreSQL 기본 데이터베이스에 저장된 주문 세 건을 읽습니다.

연습용 데이터베이스 삭제

이 단계에서는 이 실습의 데이터베이스와 주문 데이터를 삭제합니다.

제공된 인스턴스는 이 연습에 속합니다. 예제 주문이나 최종 스냅샷을 보존할 필요는 없습니다.

aws rds \
  delete-db-instance \
  --db-instance-identifier orders-db \
  --skip-final-snapshot \
  --query 'DBInstance.DBInstanceIdentifier'
aws rds \
  wait db-instance-deleted \
  --db-instance-identifier orders-db
aws rds \
  describe-db-instances \
  --query 'DBInstances[].DBInstanceIdentifier'

[]가 표시되어야 합니다. 인스턴스를 삭제하면 테이블이 포함된 데이터베이스가 제거됩니다. 이는 기존 테이블의 선택된 행을 제거하는 DELETE보다 범위가 넓습니다. 준비된 애플리케이션과 네트워크 리소스는 그대로 두세요.

요약

제약 조건이 있는 주문 스키마를 정의하고 레코드 세 개를 삽입한 뒤 SQL 필터와 집계로 데이터 질문에 답했습니다. 애플리케이션은 PostgreSQL에서 같은 행을 읽었습니다. 이후 제공된 애플리케이션과 네트워크를 유지하면서 연습용 데이터베이스를 삭제했습니다.

다음 실습에서는 네트워크 접근과 애플리케이션의 데이터베이스 권한을 모두 제한합니다.