[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.08.06
📕 학습 목록
- API
- DB
- MariaDB (RDBMS)
- SQL (DDL; 데이터 정의 언어)
📗 기억할 내용
1) API(Application Programming Interface)
- 응용 프로그램 프로그래밍 인터페이스; 응용 프로그램에서 사용할 수 있도록, 운영체제•프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스
- 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스 제공
① API 호출
- 데이터 요청 & 응답 과정
- API : 프로그램 – 프로그램 의 연결다리&대화할 수 있는 방법 (≓ 웹브라우저 – 서버 관계)
- API 호출 : 데이터를 요청하고 전달받는 것(Request & Response)
- "API를 호출한다" = "다른 프로그램으로 부터 데이터를 받는다"
- 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
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) -- 외래키 제약 조건 );
📙 내일 일정
- '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 |