본문 바로가기

Coding/내일배움캠프

[내일배움캠프] req 객체, 데이터베이스(고가용성, SQL, DQL) - Node.js 4기 TIL | Day 40 | 24.02.11.(일)

req.params : 댓글 작성할 게시글 ID (postID)

req.user : 로그인한 사용자 정보 (userID)

req.body : 댓글 내용 (content)

 

  1. 댓글 작성하기 (POST)
  2. 댓글 조회하기 (GET)
  3. 댓글 수정하기 (PUT)
  4. 댓글 삭제하기 (DELETE)

 

 

 

Chore: yarn-start, Modified: app.js

 

 

데이터 저장에 데이터베이스를 쓰는 이유?

 

  • 효과적인 데이터 인출
  • 백업과 복구에 용이
  • ACID 특성 보장
  • 데이터 관리의 중앙화
  • 민감한 데이터 보안

 

고가용성

 

  • 대규모 웹 서비스에서 가장 중요한 사항 중 하나 - “안정성”
  • 두 번째 - “고가용성”

 

데이터베이스 고가용성

 

  • 데이터베이스는 이중화를 이용하여 고가용성을 확보할 수 있음
  • 이중화마스터 인스턴스가 죽은 경우스탠바이 인스턴스가 곧바로 마스터 인스턴스로 교체되어서 다운타임을 최소화하는 메커니즘을 말합니다.
  • 이중화는 데이터베이스 자체에서 지원하는 개념은 아니고, AWS RDS와 같은 클라우드 서비스에서 개발자들에게 제공해주는 솔루션
  • 기본적으로 AWS RDS는 보통 여러 개의 인스턴스가 있으며 1개의 마스터 인스턴스와 N개의 스탠바이 인스턴스로 구성된다.

 

  • Read Only
  • Primary
  • Standby

 

  • 이러한 구성인 이유?

 

쿼리의 종류

 

  • DDL(Data Definition Language)
  • DQL(Data Query Language)
  • DML(Data Manipulation Language)
  • DCL(Data Control Language)
  • TCL(Transaction Control Language)

 

  • DQL, DML은 백엔드 개발자라면 무조건 능숙하게 사용할 수 있어야 한다.

 

 

DQL (SELECT) 쿼리 문법 소개

 

ID Name Age Skill
1 메시 35 팬텀드리블
2 홀란드 22 오프더볼
3 음바페 24 순간속도

 

실습 1. 이 테이블의 모든 레코드를 갖고 오기

 

SELECT ID, Name, Age, Skill FROM soccer_players;

 

실습 2. 나이가 31세 이상이거나 23세 미만의 축구 선수 이름만 갖고 오기

 

SELECT Name FROM soccer_players WHERE Age > 30 OR Age < 23;

 

ID Name
1 아르헨티나
2 노르웨이
3 프랑스

 

soccer_players 테이블과 soccer_player_nations 테이블을 조합하여 결과를 볼 수 있다.

 

조합에는 각 테이블의 키 필드가 있어야 하며 이 필드를 기반으로 합쳐지는데, 이것을 JOIN 연산이라고 한다.

 

JOIN

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • OUTER JOIN

 

실습 3. soccer_players 테이블과 soccer_player_nations 테이블을 ID 컬럼 값이 일치하는 레코드만 JOIN 후 국가가 프랑스인 선수의 이름을 보여주기

 

SELECT a.Name

FROM soccer_player a

INNER JOIN soccer_player_nations b ON a.ID = b.ID

WHERE b.Nation = ‘프랑스’

 

Department_ID Name Salary Commision
3 메시 70,000,000 5,000,000
5 펠레 40,000,000 0
9 마라도나 90,000,000 0
17 크루이프 70,000,000 3,000,000
3 스테파노 60,000,000 0
17 베켄바우어 40,000,000 7,000,000
5 게르트 뮐러 90,000,000 11,000,000

 

Q. 연봉이 최대 5,000만원을 넘지 않는 부서 ID가 17인 사원들 + 부서 ID가 5번인 모든 사원들 + 커미션을 받는 사원들의 목록을 찾고 싶습니다. 어떻게 쿼리문을 작성하면 될까요?

 

A.

 

SELECT *

FROM employees

WHERE (Salary <= 5000000 and Department_ID = 17)

OR Department_id = 5

OR Commission > 0

 

 

 

트랜잭션

 

트랜잭션의 성질 === ACID

 

트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.

 

입금/출금

 

  • A가 B에게 10만원을 보낸다고 한다면,
  • 이러한 단계가 따로 처리가 된다면 크나큰 문제 발생

 

  • 트랜잭션의 원자성(Atomicity)은 이 두 단계가 모두 성공적으로 완료되거나 아니면 아무 것도 실행되지 않아야 함을 의미한다. 만약 두 번째 단계에서 문제가 발생하면 첫 번째 단계도 취소되어야 한다.

 

  • 모두 성공적으로 완료되어 반영되는 것 ➡️ 커밋
  • 문제가 하나라도 발생해서 원래의 상태로 돌아가는 것 ➡️ 롤백

 

  • 하지만 이러한 요구 사항은, 하나의 요청으로 다양한 케이스의 SQL 문을 마치 프로그램의 분기문과 같이 실행해야 하는 이슈를 발생시킨다.
  • 다행스럽게도, 여러 RDB에서는 Stored Procedure(저장 함수)라는 개념을 제공하여 해결을 돕고 있다!

 

ACID 특성

 

  • A (Atomicity)
  • C (Consistency)
  • I (Isolation)
  • D (Durability)

 

 

접근 제어 (Access Control)

 

  • 쿠키, 세션, JWT … 인증(Authentication), 인가(Authorization)
  • 인증(Authentication)

    CREATE User ‘Messi’@‘localhost’ IDENTIFIED BY ‘goat’;
  • 인가(Authorization)

    GRANT SELECT, INSERT, DELETE ON soccer.* To ‘Messi’@‘localhost’;
  • ‘최소 권한의 법칙’

데이터베이스의 보안 이야기 - 데이터 암호화

 

  • 암호화
  • 복호화
  • 비밀번호

 

데이터베이스의 보안 이야기 - SQL Injection

 

  • 프로그램에서 쿼리 인자를 입력할 때에는 반드시 Prepared statemen를 사용하자.
  • 악의적인 목적을 가진 사용자가 특정 값을 입력 값으로 넣게 되었을 때 SQL 구문에서 예기치 않은 동작이 발생할 수 있고, 정보 유출이 발생할 수 있다.
  • SQL Injection