본문 바로가기
TIL _Today I Learned/2024.08

[DAY 19] API, DB, SQL

by gamdong2 2024. 8. 6.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.08.06

📕 학습 목록

  • API
  • DB
  • MariaDB (RDBMS)
  • SQL (DDL; 데이터 정의 언어)

 

📗 기억할 내용

 

1) API(Application Programming Interface)

  • 응용 프로그램 프로그래밍 인터페이스; 응용 프로그램에서 사용할 수 있도록, 운영체제•프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스
  • 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스 제공

① API 호출

  • 데이터 요청 & 응답 과정

데이터 요청 / 응답 과정

 

  • API : 프로그램 – 프로그램 의 연결다리&대화할 수 있는 방법 (≓  웹브라우저 – 서버 관계)
  • API 호출 : 데이터를 요청하고 전달받는 것(Request & Response)
  • "API를 호출한다" = "다른 프로그램으로 부터 데이터를 받는다"

API 요청 : request & response

  • API 호출 : 인터넷 속도•서버 부하 등에 따라, server에서 데이터를 응답해주는 시간이 달라짐 or 실패함
  • ∴ 언제 끝날지 모르는 API 호출을 비동기적으로 처리해야함(동기적X); Promise 객체 이용

② Promise : Javascript 내장 객체

  • Javascript 에서 API를 호출할 때 사용
  • 비동기 작업의 완료 or 실패를 처리하는 방법 제공
[ 핵심 포인트]
resolve 함수   Promise의 성공을 알리고, 결과 값을 전달하는 역할
then 메서드   resolve가 전달한 값을 받아서, 그 값을 인자로 처리
then의 매개변수(result)   resolve가 전달한 값
// [Promise 객체 문법]
// 1. Promise 생성자(함수 resoleve, reject를 인자로 받음)를 통해 객체 myPromise 생성
const myPromise = new Promise((resolve, reject) => {
	// 비동기 작업 수행 (1초 후에 완료)
    setTimeout(() => {
    	const success = true; 
    // 비동기 작업 성공/실패에 따라 함수 resolve or reject 를 호출  
    if (success) {  // 비동기 작업이 성공할 경우
    	resolve('성공했습니다!');  // Promise를 성공상태로 변경 & '성공했습니다!'를 Promise의 결과로 전달
    } else {  // 비동기 작업이 실패할 경우
    	reject('실패했습니다.');  // Promise를 실패상태로 변경 & '실패했습니다!' 가 오류값으로 전달됨
    }, 1000);
});

// 2. then 메서드
// Promise가 성공적으로 완료되었을 때(resolve가 호출되었을 때), then 메서드가 실행됨
myPromise
    .then(result => {  // then 메서드의 첫 번째 인자로, resolve에 의해 전달된 값(result = '성공했습니다!')을 받음
        console.log(result); // "성공했습니다!" 출력
    })
    .catch(error => {  // reject에 의해 전달된 값(error = '실패했습니다.')을 인자로 받음
        console.error(error); // "실패했습니다." 출력
    });

 

③ fetch : Javascript 내장 API

  • Javascript 에서 네트워크 요청을 수행할 때 사용 (요청 개시)
  • fetch는 Promise를 기반으로 하여 비동기적으로 동작함; HTTP 요청의 결과를 처리하는 데 편리•직관적인 방법
[핵심 포인트]
** 이 API(⊂HTTP) 요청 과정은 모두 비동기적으로 발생
fetch 함수   URL에 대해 HTTP 요청을 보냄 → Promise 객체를 반환
Promise 객체   HTTP 요청 성공/실패 여부에 따라 then/catch 메서드를 통해 결과 처리
then 메서드   응답이 성공적으로 도착했을 때, 응답 데이터를 처리
catch 메서드   요청이 실패했을 때, 오류를 처리
// GET 요청 예시: 사용자의 정보 가져오기
// fetch 함수는 내부적으로 Promise 객체를 반환하므로, 코드에 Promise가 직접 나타나지 않아도 then, catch 메서드를 통해 비동기 요청의 결과를 처리할 수 있음
fetch('https://jsonplaceholder.typicode.com/users/1') // API URL
    .then(response => {
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        return response.json(); // 응답 본문을 JSON으로 파싱
    })
    .then(data => {
        console.log('GET 요청으로 가져온 사용자 데이터:', data); // 가져온 데이터 출력
    })
    .catch(error => {
        console.error('GET 요청 오류:', error); // 오류 처리
    });

// POST 요청 예시: 새로운 사용자 추가하기
fetch('https://jsonplaceholder.typicode.com/users', { // API URL
    method: 'POST', // HTTP 메서드 POST
    headers: {
        'Content-Type': 'application/json' // JSON 형식의 요청 본문
    },
    body: JSON.stringify({ // 요청 본문 데이터
        name: 'John Doe',
        email: 'john.doe@example.com'
    })
})
    .then(response => {
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        return response.json(); // 응답 본문을 JSON으로 파싱
    })
    .then(data => {
        console.log('POST 요청으로 추가된 사용자 데이터:', data); // 추가된 데이터 출력
    })
    .catch(error => {
        console.error('POST 요청 오류:', error); // 오류 처리
    });
용어 설명
API - s/w 간의 상호작용을 매개하는 인터페이스
- 웹 API : HTTP 요청을 통해 클라이언트 - 서버간 상호작용을 매개
HTTP - 클라이언트-서버 간의 데이터 전송을 위한 프로토콜
GET - HTTP 메서드 중 하나
- 서버에 데이터를 요청
- 요청된 데이터는 서버에서 클라이언트로 반환됨
POST - HTTP 메서드 중 하나
- 서버에 데이터를 제출 • 서버에 새로운 리소스를 생성
Request - 클라이언트가 서버에 보내는 HTTP 요청
- 데이터 요청 • 조작을 지시
- Request ⊃ HTTP 요청메서드(GET, POST), URL, 헤더, 본문(body)
Response - 클라이언트의 요청에 대한 서버 응답
- Response ⊃ 상태코드, 헤더, 본문

 

④ async / await 키워드

  • fetch 사용 시 async & await 키워드를 사용하면 비동기 코드를 더 직관적으로 작성할 수 있음; 비동기 작업을 동기적 방식으로 작성할 수 있게 함
  • async : 함수 앞에 붙어 그 함수가 Promise를 반환하게 해주는 키워드
  • 'async + 함수' 내에서 await 키워드 사용
  • await : Promise가 처리될 때까지 함수의 실행을 일시 정지시킴. Promise가 처리되면 그 Promise의 결과값을 반환
// [async / await 기본 사용법]
// async를 사용하여 비동기 함수(fetchData)를 정의; 이 함수는 항상 Promise를 반환
async function fetchData() {
    // await 키워드; fetch 함수가 반환하는 Promise 가 해결될 때까지 기다림
    // fetch 요청이 완료되면 response 변수에 결과가 할당됨
    const response = await fetch('http://api.example.com/data');
    
    // 응답이 성공적인지 확인
    if (!response.ok) {  // 응답 객체의 ok 속성을 확인
    	throw new Error('Network response was not ok');  // 요청이 실패하면 에러를 발생시킴
    }
    
    // 응답을 JSON 형태로 변환 & 결과 반환
    const data = await reponse.json();  // 응답 객체의 json 메서드를 호출; 응답 데이터를 JSON 형태로 변환  // await를 사용하여 변환이 완료될 때까지 기다림
    return data;  // 변환된 JSON 데이터를 반환(이 데이터는 fetchData 함수가 반환하는 Promise의 결과값이 됨)
}

// fetchData 함수 호출 & 결과 처리
fetchData()  // fetchData 함수 호출 & 반환된 Promise를 처리
    .then(data => {
        console.log('서버 응답:', data);
    })
    .catch(error => {
        console.error('에러:', error);
    });

 
2) DB

  • 데이터베이스(DB) : 데이터의 집합
  • DBMS(Database Management System) : 데이터베이스 관리•운영 s/w
  • RDBMS(Relational Database Management System) : 관계형 데이터베이스 관리•운영 s/w
  • 관계형 데이터 모델 : 상호 관련성을 가진 테이블 집합; 모든 데이터를 2차원 테이블(row, column) 형태로 저장 → 데이터 모델 간의 관계를 명시 "확장이 용이"
  DB DBMS RDBMS
정의 데이터의 집합 데이터베이스 관리 s/w 관계형 데이터베이스 관리 s/w
기능 데이터 저장, 검색, 수정, 삭제 데이터베이스 생성, 관리, 유지 테이블 기반 데이터 관리 및 관계 정의
형식 다양한 형식 소프트웨어 테이블 형식, 관계 정의
예시 고객 정보, 제품 목록 MySQL, PostgreSQL MySQL, PostgreSQL,
Oracle Database, MariaDB

 
3) MariaDB

MariaDB 실행 화면

 
4) SQL (DDL; Data Definition Language)

  • Structured Query Language : RDBMS의 데이터를 관리하기 위한 프로그래밍 언어

① SQL 종류

  • DDL(데이터 정의 언어) : 데이터 구조 관리(테이블•인덱스 구조 등) 
  • DML(데이터 조작 언어) : 데이터 검색 • 등록 • 갱신 • 삭제
  • DCL(데이터 제어 언어) : 데이터 엑세스 • 권한 부여/박탈

② DDL : 테이블 생성/구조관리/삭제

CREATE TABLE ~   "DB 개체 정의; 테이블, 인덱스, 제약조건,..."
ALTER TABLE ~ ADD ~   "DB 개체 정의 변경"
DROP TABLE ~   "DB 개체 삭제"
컬럼명 자료형 NULL 허용 디폴트 값 설명
column1 BIGINT
* 큰 정수형
NOT NULL
* 결측치 허용X
AUTO_INCREMENT
* 행이 생성됨에 따라 자동으로 값이 증가함
(ex) id : 1, 2, 3, 4, ...
PRIMARY KEY
* 기본키
식별자
column2 VARCHAR(20)
* 최대 20자의 문자열
NULL
* 결측치 허용O
     
column3 DATETIME
* YYYY-MM-DD 00:00:00
NOT NULL CURRENT_TIMESTAMP
* 자동으로 현재시간 기입
   
# 테이블 생성 예
CREATE TABLE My_table(
    column1 BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    column2 VARCHAR(50),
    column3 DATE NOT NULL DEFAULT CURRENT_TIMESTAMP,
);

# 테이블 구조 변경 예; 컬럼 추가
ALTER TABLE My_table ADD column4 INT NOT NULL;

# 테이블 삭제
DROP TABLE My_table;
[ 외래키(FORIEGN KEY) 설정]
- 외래키 : 두 테이블 간의 관계를 명확히 함; 데이터의 일관성 유지
- A 테이블's 외래키 = B 테이블's 기본키(PRIMARY KEY)
-- 1. 테이블 생성 시 외래키 설정
-- Customers 테이블 생성
CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,    -- 기본키
    CustomerName VARCHAR(100)
);
-- Orders 테이블 생성
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,       -- 기본키
    OrderDate DATE,
    CustomerID INT,                -- 외래키; Custormers 테이블의 Customer ID(기본키)를 참조함
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) -- 외래키 제약조건
);

-- 2. 테이블 생성 후 외래키 추가
-- Customers 테이블 생성
CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,   -- 기본키
    CustomerName VARCHAR(100)
);
-- Orders 테이블 생성 (외래키 없이)
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,      -- 기본키
    OrderDate DATE,
    CustomerID INT                -- 외래키 열 (아직 제약조건 없음)
);
-- Orders 테이블에 외래키 제약 조건 추가
ALTER TABLE Orders
ADD CONSTRAINT fk_customer    -- 외래키 제약조건 이름 설정(추후 제약조건 수정/삭제에 유용). foreign key for customer; 외래키 제약 조건이 Customer 테이블과 관련이 있음을 나타냄
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);

 

📘 트러블 슈팅

[문제]

  • 문제 내용
외래키 설정 과정에서 오류 발생
-- tb_user 테이블 생성
CREATE TABLE tb_user (
    user_id BIGINT PRIMARY KEY,   -- 기본키
    name VARCHAR(20)
);
-- tb_board 테이블 생성 및 외래키 설정
CREATE TABLE tb_board (
    board_id BIGINT PRIMARY KEY,   -- 기본키
    update_date DATETIME,
    user_id BIGINT FORIEGN KEY,   -- 외래키 열
);
  • 문제 원인
테이블 생성시 외래키 설정 방법이 잘못됨

 
[해결]

  • 해결 방법
외래키 제약 조건을 따로 빼서 작성
  • 해결 결과
-- tb_user 테이블 생성
CREATE TABLE tb_user (
    user_id BIGINT PRIMARY KEY,   -- 기본키
    name VARCHAR(20)
);
-- tb_board 테이블 생성 및 외래키 설정
CREATE TABLE tb_board (
    board_id BIGINT PRIMARY KEY,   -- 기본키
    update_date DATETIME,
    user_id BIGINT,                -- 외래키 열
    FOREIGN KEY (user_id) REFERENCES tb_user(user_id)  -- 외래키 제약 조건
);
MariaDB 실행 화면
MariaDB 실행 화면

 

📙 내일 일정

  • 'DBeaver, SQL(DML), Python - MariaDB 연동' 학습

 
 

Ref : [JS] API & fetch (velog.io)

 

'TIL _Today I Learned > 2024.08' 카테고리의 다른 글

[DAY 21] Flask  (0) 2024.08.08
[DAY 20] SQL  (0) 2024.08.07
[DAY 18] HTML, CSS, Javascript  (0) 2024.08.05
[DAY 17] Git & Web  (0) 2024.08.02
[DAY 16] Python 실습  (0) 2024.08.01