에러 처리 미들웨어

  • 에러는 원하지 않았던 비지니스 로직이 수행되지 않도록 하기 위해 사용


Express.js의 에러 처리 미들웨어

  • 에러 처리 미들웨어는 Express.js가 공식적으로 제공하는 기능
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('Something broke!');
});
  • err: 이전 미들웨어에서 발생한 에러를 전달받은 객체

  • req, res: 일반적으로 사용하는 HTTP 요청과 응답을 관리하는 객체

  • next: 미들웨어를 실행하는 함수

  • 에러를 인자로 전달받아 클라이언트에게 에러 응답을 반환하거나 다음 미들웨어로 에러를 전달하는 역할

  • 에러 처리 미들웨어는 Nest.js에서 Exception Filter라는 이름으로 불림

  • Express.js에서는 미들웨어나 라우터에서 에러가 발생하면, 해당 에러를 next 함수를 통해 다음 미들웨어로 전달.



AWS에 서버 연결


다운로드 폴더로 접근합니다.

cd Download

sparta_keypair.pem 파일의 권한을 읽기만 가능하도록 수정합니다.

sudo chmod 400 sparta_keypair.pem 

ssh -i 받은키페어를끌어다놓기 ubuntu@AWS에적힌내아이피
  • Key fingerprint 관련 메시지가 나올 경우 Yes를 입력해주세요!
  • git bash를 종료할 때는 exit 명령어를 입력하여 ssh 접속을 먼저 끊어주세요.
ls: 내 위치의 모든 파일을 보여준다.

pwd: 내 위치(폴더의 경로)를 알려준다.

mkdir [폴더 이름]: 내 위치 아래에 새 폴더를 만든다.

cd [폴더 이름]: 나를 해당 폴더로 이동시킨다.

cd .. : 나를 현재 위치의 상위 폴더로 이동시킨다.

cp -r [복사할 파일/폴더] [붙여넣기 할 위치]: 복사 붙여넣기

rm -rf [지울 파일/폴더]: 지우기 (이 명령은 매우 위험합니다. 신중히 사용해주세요!)

# 명령어 사용 당시에만 관리자 권한이 부여됩니다.
sudo [실행 할 명령어]: 명령어를 관리자 권한으로 실행한다.

# 명령어 사용 이후 모든 명령이 관리자 권한으로 실행됩니다.
sudo su: 관리자 권한이 있는 계정으로 접속한다. (exit 입력하면 관리자 계정에서 로그아웃)


Node.js 설치

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -

sudo apt-get install -y nodejs // apt-get 명령어는 yarn처럼 리눅스 운영체제에서 지원하는 패키지 매니저에서 원하는 패키지를 설치하는 명령어


git clone

원격 저장소로 부터 코드 가져오기

git clone <Github Repository URL>

프로젝트 실행 순서

  1. cd nodejs-todo-list : 원격 저장소로부터 가져온 프로젝트로 이동합니다.

  2. sudo npm install -g yarn : yarn을 사용하기 위해, 전역으로 yarn을 설치합니다.

  3. yarn : 원격 저장소로 부터 가져온 프로젝트의 의존성 및 패키지를 설치합니다.

  4. node app.js : 프로젝트를 실행합니다.


연결을 끊어도 꺼지지 않는 서버 실행 프로그램, PM2

pm2 설치와 명령어

sudo -s // Linux 관리자 계정으로 전환

yarn global add pm2 // pm2 라이브러리를 global로 설치

pm2 start app.js // pm2로 app.js 파일 실행

pm2 list // pm2 실행중인 파일 리스트

pm2 delete 0 // id값 0에 해당하는 파일 실행 종료

pm2 restart [idNumber] // 오류 생겼을 때, 서버 재시작

pm2 log // 실행한 서비스들의 로그 출력할 때 사용, 에러 메시지까지 확인 가능, 디버깅 유용

pm2 logs --lines [number] // 가장 최근에 발생한 로그 중에서 지정한 수만큼 출력



IP 주소와 Port

IP 주소

공인 IP(Public IP Address): 인터넷 전체에서 유일, 이 주소를 통해 외부에서 접근 가능

사설 IP(Private IP Address): 네트워크 내부에서만 사용, 외부에서 접근 불가능

PORT

통신이 가능한 모든 기기는 포트(Port)라고 불리는 데이터가 드나들 수 있는 통로가 있다.

  • 하나의 포트는 여러 프로그램이 같이 사용할 수 없다.



관계형 데이터베이스 (RDB)

데이터의 정규화와 무결성을 보장하면서 정형화된 데이터를 효과적으로 관리할 수 있다.

관계형 데이터베이스(RDB, Relational DataBase)는 각 데이터를 ‘테이블’이라는 표형태의 구조에 저장.

여기서 각 ‘테이블’은 여러 정보를 저장하며, ‘테이블’간에 ‘연관 관계’를 설정하여, 여러 테이블에 분산된 데이터를 서로 연결하여 관리할 수 있다.

  • 연관 관계(Relationship)란, 각 테이블 사이의 연결된 관계를 의미

  • 관계형 데이터베이스는 테이블(Table)이라는 구조를 가지며, 각 테이블은 고유한 데이터를 나타내는 행(row)과 데이터의 속성을 나타내는 열(column)을 가짐


관계형 데이터베이스(RDB) 특징

  • 테이블이 존재

  • 열(column)과 행(row)를 가짐

  • 각 행(row)는 고유한 데이터(record)를 나타냄

  • 각 열(column)은 해당 데이터의 속성을 표현

  • 테이블(표)들 간에는 서로 연관 관계를 가질 수 있다. 이 관계를 통해 더욱 복잡한 쿼리를 작성할 수 있다.


MySQL 이란?

MySQL은 가장 널리 사용되는 오픈소스 관계형 데이터베이스(RDB)이다.

  • MySQL은 오픈 소스 데이터베이스로, 다른 DBMS와 달리 라이센스 비용이 들지 않음

  • 데이터베이스를 관리하는 가장 대표적인 언어인 SQL(Structured Query Language)를 사용

  • 트랜잭션의 특징인 ACID를 준수하여 구현된 데이터베이스로써, 트랜잭션을 안전하게 처리할 수 있음



RDS 구매하고 MySQL 세팅하기

RDS란?

AWS에서 제공하는 관계형 데이터베이스 서비스.

RDS는 서버 운영, 유지보수, 백업과 같이 데이터베이스 관련 작업을 AWS에게 위임하여, 백엔드 개발자가 데이터베이스를 사용하는 것에 집중할 수 있게 해줌



SQL이란

데이터베이스에서 사용되는 생성, 삽입, 조회 명령문을 SQL(Structured Query Language)라고 함

SQL의 종류

DDL

  • DDL(Data Definition Language)은 데이터를 정의할 때 사용하는 언어

  • 테이블이나 데이터베이스를 생성, 수정, 삭제를 할 때 사용

  • CREATE: DATABASE, TABLE, VIEW, INDEX 등을 생성할 때 사용

CREATE DATABASE 데이터베이스명;
CREATE TABLE 테이블명
{
 컬럼명 컬럼속성
}

  • DROP: DATABASE, TABLE, VIEW, INDEX 등을 삭제할 때 사용
DROP DATABASE 데이터베이스명;
DROP TABLE 테이블명;
  • ALTER:DATABASE, TABLE 등의 속성을 변경할 때 사용
ALTER DATABASE 데이터베이스명 변경조건;
ALTER TABLE 테이블명 ADD 변경조건; -- 테이블에 새로운 컬럼을 추가합니다.
ALTER TABLE 테이블명 DROP 변경조건; -- 테이블에서 컬럼을 삭제합니다.
ALTER TABLE 테이블명 MODIFY 변경조건; -- 테이블의 컬럼을 수정합니다.
ALTER TABLE 테이블명 RENAME 변경조건; -- 테이블의 이름을 변경합니다.


DML

  • DML (Data Manipulation Language): 데이터베이스에서 데이터를 조작할 때 사용하는 언어로 데이터의 저장, 삭제, 수정, 조회와 같은 행위를 함

  • SELECT: 일반적으로 TABLE에서 원하는 데이터들을 조회할 때 사용

SELECT 컬럼목록 FROM 테이블명 [WHERE 조건];

  • INSERT: TABLE에 새로운 데이터들을 삽입할 때 사용
INSERT INTo 테이블명 (컬럼목록) VALUES (값목록);
  • DELETE: TABLE에서 특정한 조건에 맞는 데이터들을 삭제할 때 사용

  • WHERE 조건이 없다면, 모든 데이터가 삭제됩니다.

DELETE FROM 테이블명 [WHERE 조건];
  • UPDATE: TABLE에서 특정한 조건에 맞는 데이터들을 수정할 때 사용

  • WHERE 조건이 없다면, 모든 데이터가 수정됩니다.

UPDATE 테이블명 SET 컬럼 =  [WHERE 조건];


DCL

  • DCL(Data Control Language)은 데이터베이스에 대한 권한과 관련된 문법으로 특정 유저가 DB에 접근할 수 있는 권한을 설정할 때 사용

  • GRANT: 데이터베이스의 특정한 유저에게 사용 권한을 부여할 때 사용

  • 권한에는 SELECT, INSERT, UPDATE, DELETE 등 다양한 종류가 존재함

GRANT [권한] ON 객체명 TO 사용자;
  • REVOKE: 데이터베이스의 특정한 유저에게 사용 권한을 취소할 때 사용
REVOKE [권한] ON 객체명 FROM 사용자;


TCL

  • TCL(Transaction Control Language)은 데이터베이스 내의 트랜잭션을 관리하는 문법으로, 트랜잭션의 시작과 종료, 그리고 롤백을 수행할 때 사용

  • COMMIT: 데이터베이스의 작업이 정상적으로 완료되었음을 관리자에게 알려줄 때 사용

START TRANSACTION;
...
COMMIT;

  • ROLLBACK: 데이터베이스의 작업이 비정상적으로 완료되었음을 관리자에게 알려줄 때 사용

  • 작업 중 오류가 발생한 경우 이를 취소하고, 이전 상태로 되돌릴 때 사용

START TRANSACTION;
...
ROLLBACK;



SQl 제약조건

  • 제약조건(Constraint)은 각 컬럼들간의 제한사항을 관리하고, 조건을 위반하는 데이터를 방지하여 데이터베이스의 무결성(Intergrity)을 보장하는 규칙

* 무결성(Intergrity)은 데이터가 결함없이 정확하고 완전한 상태를 의미

  • 컬럼의 속성을 바탕으로 테이블의 역할과 어떤 데이터를 저장하는지 명확하게 구분할 수 있게 해줌


제약 조건의 종류

고유(Unique) 제약 조건

  • 테이블에 소속된 특정 컬럼이 중복된 키를 가질 수 없는 조건

  • 사용자 아이디, 이메일과 같은 고유한 정보를 저장할 때 사용

NULL 제약 조건

  • 특정 컴럼이 아무런 값을 입력받지 않도록 설정하거나 무조건 값을 입력 받도록 설정하는 조건

  • 데이터가 없다면, NULL을 저장하여, 데이터가 존재하지 않다는것을 표현

기본 키(Primary Key) 제약 조건

  • 테이블 내에서 각 행(row)을 고유하게 식별할 수 있도록 보장하는 조건

  • ex) id

외래 키(Foreign Key) 제약 조건

  • 데이터베이스를 설계할 때 가장 많은 고민을 하게 될 테이블 간의 관계를 설정하는 조건

  • 한 테이블의 컬럼(Column)이 다른 테이블의 특정 행(Row)을 참조하도록 설정하는 조건


이 4가지 조건이 안들어가는 경우는 없음


ERD 다이어그램

한명은 여러개의 주문을 가질 수 있고, 음식은 여러개의 주문을 가질 수 있을 때! sql 예시

CREATE TABLE User
(
    userId int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   varchar(255) NOT NULL UNIQUE
);

CREATE TABLE Food
(
    foodId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   varchar(255),
    price  int(11)
);

CREATE TABLE Orders
(
    orderId   int(11)  NOT NULL AUTO_INCREMENT PRIMARY KEY,
    userId    int(11)  NOT NULL,
    foodId    int(11)  NOT NULL,
    createdAt datetime NOT NULL DEFAULT NOW(),
    FOREIGN KEY (foodId) REFERENCES Food (foodId)
        ON DELETE NO ACTION
        ON UPDATE CASCADE,
    FOREIGN KEY (userId) REFERENCES User (userId)
        ON DELETE NO ACTION
        ON UPDATE CASCADE
);



개인 키 제약 조건

기본 키(Primary Key)는 테이블에 있는 데이터를 고유하게 구분할 수 있는 정보를 나타내기 위해서 사용

CREATE TABLE Users
(
    userid Int(11) NOT NULL AUTO_INCREAMENT PRIMARY KEY,
    name varchar(255)
);

* AUTO_INCREAMENT: 데이터가 입력될 때마다 숫자를 1씩 증가시켜 기본키의 고유한 값을 유지시켜 줌


NULL 제약 조건

NULL 속성은 특정 컬럼에서 NULL값을 허용하거나, 허용하지 않도록 설정하는 조건

NULL은 값이 없음을 나타냄

  • 테이블에서 컬럼을 생성할 때, 추가 조건을 작성하지 않으면 기본적으로 해당 컬럼은 NULL값을 허용하는 상태, 데이터 입력하지 않아도 된다는 것

    • NULL값을 허용하는 것은 데이터 누락 위험이 있음

    • ex) 이메일, 패스워드를 통해 로그인하는 경우, 2개의 정보는 필수로 존재해야 함. 하지만 NULL값이 허용될 경우 사용자 인증에 문제 생김

  • 이렇게 특정 컬럼에서 NULL 값을 허용하지 말아야 할 때는 NOT NULL 제약 조건을 추가해 NULL값 입력을 방지해야 됨

CREATE TABLE Users (
    userId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);


고유(Unique) 제약 조건

Unique 제약 조건은 특정 컬럼에서 중복된 값이 허용되지 않도록 설정하는 조건

  • ex) 어플리케이션 사용자가 로그인을 시도할 때 이메일 중복을 허용할 경우, 이름, 나이, 닉네임과 같은 정보을 입력받아야지만 사용자를 특정할 수 있음
CREATE TABLE Users (
    userId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL UNIQUE
);


외래 키(Foreign Key) 제약 조건

외래 키(Foreign Key) 제약 조건은 테이블과 다른 테이블간의 관계를 맺을 때 사용하는 제약 조건

외래 키는 테이블 간의 연관 관계(Relation Ship)를 표현할 때 사용

  • 1:1 - 1명의 사용자(User)는 1개의 사용자 정보(UserInfo)를 가질 수 있다.

  • 1:N - 1명의 사용자(User)는 여러개의 주문(Order)를 가질 수 있다.

  • N:M - 여러명의 학생(Student)은 여러개의 학원(School)을 등록할 수 있다.

CREATE TABLE 테이블명 (
  FOREIGN KEY (컬럼명) REFERENCES 참조_테이블명 (참조_컬럼명)
    ON DELETE [연계 참조 제약 조건] // 부모 데이터가 삭제되었을 
    ON UPDATE [연계 참조 제약 조건] // 부모 데이터가 수정되었을 
);
CREATE TABLE Garden (
    gardenId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name varchar(255) NOT NULL,
    address varchar(255) NOT NULL
);

CREATE TABLE GardenPlants (
    gardenPlantsId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    gardenId int(11) NOT NULL,
    name varchar(255) NOT NULL,
    FOREIGN KEY (gardenId) REFERENCES Garden (gardenId)
);

외래 키(Foreign Key) 제약 조건 심화

외래 키의 경우 다른 테이블과 관계를 맺고 있는 참조 데이터가 삭제(DELETE)또는 수정(UPDATE)될 때 어떤 행위를 해야하는지 설정할 수 있음

이런 행위를 수행하는 조건을 연계 참조 무결성 제약 조건이라고 정의

연계 참조 무결성 제약 조건의 종류

CASCADE

  • 참조하고 있는 개체가 변경/삭제 될 경우 함께 변경/삭제

  • ex) 사용자가 삭제된다면, 그 사용자의 모든 주문 내역도 삭제

FOREIGN KEY (userId) REFERENCES Users(userId)
    ON DELETE CASCADE
    ON UPDATE CASCADE;


NO ACTION

  • 참조하고 있는 개체가 변경/삭제 될 경우 아무런 행위를 하지 않고 에러가 발생

  • ex) 사용자를 삭제할 때, 사용자의 주문 내역이 아직 존재한다면, 삭제를 막음

FOREIGN KEY (userId) REFERENCES Users(userId)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;


SET NULL

  • 참조하고 있는 개체가 변경/삭제 될 경우 현재 데이터를 NULL로 변경

  • ex) 사용자가 삭제되면, 사용자의 주문 내역의 ‘사용자 ID’는 NULL로 변경

FOREIGN KEY (userId) REFERENCES Users(userId)
    ON DELETE SET NULL
    ON UPDATE SET NULL;


SET DEFAULT

  • 참조하고 있는 개체가 변경/삭제 될 경우 현재 데이터를 기본 값으로 변경

  • ex) 사용자가 삭제되면, 사용자의 주문 내역의 ‘사용자 ID’는 기본 값으로 변경

FOREIGN KEY (userId) REFERENCES Users(userId)
    ON DELETE SET DEFAULT
    ON UPDATE SET DEFAULT;



SELECT JOIN

JOIN연산자는 두 테이블 사이의 공통된 데이터를 기준으로 테이블을 연결하여 하나의 테이블처럼 조회 할 수 있게 해주는 연산자

  • JOIN연산자는 SQL의 제약 조건이 아니며, 여러 테이블 간의 외래 키(Foreign Key)로 설정된 컬럼들을 연결하여 조회하는 SELECT연산자의 활용법 중 하나


alias

SELECT p.postId, p.title, p.content, u.email
FROM Posts as p
JOIN Users as u ON p.userId = u.userId;
  • 간결한 코드 작성을 위해 as로 별칭을 지어줌


JOIN ON

두개 이상의 테이블을 결합할 때의 조건을 정의

태그:

카테고리:

업데이트: