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

 

여러 테이블 간의 외래 키 ( Foreign Key )로 설정된 컬럼들을 연결해 조회하는 SELECT 연산자의 활용법 중 하나다.

JOIN 연산자는 데이터를 조회할 때, 여러 테이블들의 연관 관계를 포함해 데이터를 조회한다.

 

 

위와 같은 ERD는 사용자 ( Users ) 테이블과 게시글 ( Posts ) 테이블에서 1명의 사용자가 여러개의 게시글을 작성 할 수 있으므로 1:N 관계를 갖게 된다.

여기서 게시글 목록을 조회할 때 작성한 사용자의 이메일을 표시하고 싶어도 게시글 테이블에 email 컬럼이 존재하지 않아 이메일을 표시해줄 수 없게 된다.

이때, 게시글 테이블에서는 userId 컬럼을 이용해 어떤 사용자가 게시글을 작성했는지 확인 할 수 있으므로, JOIN을 이용해 외래키가 설정된 userId를 기준으로 해당 사용자의 이메일을 함께 출력해 줄 수 있다.

 

예시를 통해 확인해보자.

 사용자, 게시글 생성 및 삽입 SQL

CREATE TABLE Users
(
    userId   int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    email    varchar(255) NOT NULL,
    password varchar(255) NOT NULL
);

CREATE TABLE Posts
(
    postId  int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    userId  int(11)      NOT NULL,
    title   varchar(255) NOT NULL,
    content varchar(255) NOT NULL,
    FOREIGN KEY (userId) REFERENCES Users (userId)
);


INSERT INTO Users (userId, email, password)
VALUES (1, 'AAAA', '1234'),
       (2, 'BBBB', '1234');

INSERT INTO Posts (userId, title, content)
VALUES (1, 'AAAA Title1', 'content'),
       (1, 'AAAA Title2', 'content'),
       (2, 'BBBB Title1', 'content'),
       (2, 'BBBB Title2', 'content');

 

사용자, 게시글 테이블 JOIN SQL

SELECT p.postId, p.title, p.content, u.email
FROM Posts as p
JOIN Users as u
	ON p.userId = u.userId;

 

SELECT JOIN 결과

 

JOIN ... ON 의 역할

JOIN ... ON 은 두 개 이상의 테이블을 결합할 때, 어떤 조건으로 테이블을 결합할 것인지를 정의할 때 사용한다.

  • ON 뒤에는 결합 조건이 위치하며, 이는 두 테이블 간의 관계를 정의한다.

이번 예시는 사용자( Users ) 테이블에 있는 userId가 게시글 ( Posts ) 테이블에 있는 userId로 외래 키가 설정되어 있었고, 해당 컬럼을 기준으로 게시글의 작성자를 확인할 수 있었다.

 

'데이터베이스' 카테고리의 다른 글

[DATABASE] ORM과 Prisma  (0) 2024.09.06
[DATABASE] Raw Query  (0) 2024.09.06
[DATABASE] SQL 제약조건  (0) 2024.09.05
[DATABASE] SQL ( Structured Query Language )  (0) 2024.09.05
[DATABASE] 관계형 데이터베이스  (0) 2024.09.05

오늘의 목표

더보기

✔️ 프로그래머스 코테 문제 풀이

✔️ Node.js 강의 듣기

✔️ 챌린지반 OT 참여


⏱️ 오늘의 일정

9:00 ~ 10:00 - 프로그래머스 코테 문제 풀이

10:00 ~ 19:00 - Node.js 강의 듣기

19:00 ~ 20:00 - 챌린지반 OT 참여


📜 프로그래머스 코테 문제 풀이

9:00 ~ 10:00 - 프로그래머스 코테 문제 풀이

 

로또의 최고 순위와 최저 순위

https://github.com/YamSaeng/AlgorithmCodingTest/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/1/77484.%E2%80%85%EB%A1%9C%EB%98%90%EC%9D%98%E2%80%85%EC%B5%9C%EA%B3%A0%E2%80%85%EC%88%9C%EC%9C%84%EC%99%80%E2%80%85%EC%B5%9C%EC%A0%80%E2%80%85%EC%88%9C%EC%9C%84

 

AlgorithmCodingTest/프로그래머스/1/77484. 로또의 최고 순위와 최저 순위 at main · YamSaeng/Algorithm

This is an auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). - YamSaeng/AlgorithmCodingTest

github.com

 

📜 Node.js 강의 듣기

10:00 ~ 19:00 - Node.js 강의 듣기

 

숙련 1주차 강의 듣기를 시작했다. 내일까지 숙련 1주차 수업듣기와 내용 정리를 완료하고

숙련 2주차 수업을 들을 수 있도록 해야겠다.

 

관계형 데이터 베이스 RDB에 대한 내용

2024.09.05 - [데이터베이스] - [DATABASE] 관계형 데이터베이스

 

[DATABASE] 관계형 데이터베이스

관계형 데이터베이스 ( RDB )는 각 데이터를 '테이블'이라는 표 형태의 구조에 저장한다.여기서, 각 '테이블'은 여러 정보를 저장하며, '테이블'간에 연관 관계를 설정해, 여러 테이블에 분산된 데

program-yam.tistory.com

 

AWS에서 RDS를 구매하고 사용하는 방법

2024.09.05 - [IT] - [AWS] RDS 구매하고 사용하기

 

[AWS] RDS 구매하고 사용하기

RDS는 AWS에서 제공하는 관계형 데이터베이스 서비스다.RDS는 서버 운영, 유지 보수, 백업과 같이 데이터베이스 관련 작업을 AWS에게 위임해서, 백엔드 개발자가 데이터베이스를 사용하는 것에 집

program-yam.tistory.com

 

SQL 문법

2024.09.05 - [데이터베이스] - [DATABASE] SQL ( Structured Query Language )

 

[DATABASE] SQL ( Structured Query Language )

SQL데이터베이스에서 사용하는 생성, 삽입, 조회 명령문을 SQL ( Structured Query Language )라고 한다. SQL의 종류DDL ( Data Definition Language )DML ( Data Manipulation Language )DCL ( Data Control Language )TCL ( Transaction Cont

program-yam.tistory.com

 

SQL 제약조건

2024.09.05 - [데이터베이스] - [DATABASE] SQL 제약조건

 

[DATABASE] SQL 제약조건

제약 조건 ( Constraint )은 각 컬럼들간의 제안사항을 관리하고,조건을 위반하는 데이터를 방지해 데이터베이스의 무결성 ( Integrity )을 보장하는 규칙이다. 무결성은 데이터가 결함없이 정확하고

program-yam.tistory.com

 

관계형 데이터베이스에 대한 개념, SQL 문법, SQL 제약 조건 등을 배웠다.

 

📜 챌린지반 OT 참여

19:00 ~ 20:00 - 챌린지반 OT 참여

 

챌린지반 OT에 참여했다.

게임서버에 관한 깊은 내용을 다룬다는 공지를 받았고, 그만큼 어려울 것이라는 말도 함께 들었다.

신청하면 평가를 받아서 참여 여부를 알려준다고 하는데 ㅠㅠ 

부디 참여해서 수업을 듣고 싶다.

 

제약 조건 ( Constraint )은 각 컬럼들간의 제안사항을 관리하고,

조건을 위반하는 데이터를 방지해 데이터베이스의 무결성 ( Integrity )을 보장하는 규칙이다.

 

무결성은 데이터가 결함없이 정확하고 완전한 상태를 의미한다.

 

제약 조건의 종류

 ● 고유 제약 조건 ( Unique )

  • 테이블에 소속된 특정 컬럼이 중복된 키를 가질 수 없는 조건
  • 사용자 아이디, 이메일과 같은 고유한 정보를 저장할 때 사용한다.

 ●  NULL 제약 조건 ( Null )

  • 특정 컬럼이 아무런 값을 입력받지 않도록 설정하거나 무조건 값을 입력 받도록 설정하는 조건
  • 데이터가 없으면 Null을 저장해 데이터가 존재하지 않다는것을 표현한다.

 ● 기본 키 제약 조건 ( Primary Key )

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

 ● 외래 키 제약 조건 ( Foreign Key )

  • 데이터베이스를 설계할 때 가장 많은 고민을 하게 될 테이블 간의 관계를 설정하는 조건
  • 한 테이블의 컬럼 ( Column )이 다른 테이블의 특정 행 ( Row )을 참조하도록 설정하는 조건

음식 주문앱 DB 설계

  • 고객 ( User ) 테이블

  • 음식 ( Food ) 테이블

 

연관 관계 설계

  • 고객이 음식 주문 시, 주문 정보를 어느 테이블에 넣어야 할까?
  • 고객 테이블 또는 음식 테이블

"고객 테이블"에 주문 정보를 넣어보자

  • 문제점 : 회원 중복

"음식 테이블"에 주문 정보를 넣어보자

  • 그럴듯 해 보이지만.. 먹깨비 ( userID = 2 )가 '후라이드치킨'을 하나 더 시킬 경우.. 문제가 생김
  • 문제점 : 음식 중복

'주문'을 위한 테이블이 필요 ▶ 주문 ( Order ) 테이블 추가

  • 회원 1명은 주문 N개를 할 수 있다. ( 회원 : 주문 = 1 : N 관계 )
  • 음식 1개는 주문 N개에 포함될 수 있다. ( 음식 : 주문 = 1 : N 관계 )
  • 결론적으로 ( 회원 : 음식 = N : M 관계 )

ERD ( 개체 관계도 )

음식 주문앱에 사용할 테이블 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 Order
(
    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 SQL문을 보면 PRIMARY KEY라는 조건으로 기본 키가 선언되어 있는 것을 확인 할 수 있다.

만약, 기본키를 설정하지 않은 테이블을 생성하려한다면, 특정 데이터를 찾기위한 고유한 정보가 존재하지 않기 때문에 아래와 같은 에러메세지가 출력되면서 테이블이 생성되지 않게 된다.

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

 

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

 

사용자 ( User ) 테이블

  • userId 컬럼을 기본키로 설정한다. ( AUTO_INCREMENT 속성은 데이터가 입력될때마다 해당 속성의 값이 1씩 자동으로 증가시켜주는 속성 )
  • 이름 ( name ) 컬럼을 가진다.

 

NULL 제약 조건

테이블에서 컬럼을 생성할 때 추가 조건을 작성하지 않으면 기본적으로 해당 컬럼은 NULL값을 허용하는 상태가 된다.

NULL 값을 허용하게 되면, 필수적으로 입력되어야 하는 데이터가 누락될 수 있다는 점을 기억하고 있어야한다.

 

NOT NULL 제약 조건을 추가해 특정 컬럼에서 NULL 값을 허용하지 않게 해줄 수 있다.

 

NULL 제약 조건 요구사항!

사용자 ( User ) 테이블

  • UserId 컬럼을 기본키로 설정한다.
  • 이름 ( name ) 컬럼을 가진다.

이외 요구사항

  • 사용자 테이블의 이름 컬럼은 NULL 값을 허용하지 않는다.
CREATE TABLE Users
(
    userId int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   varchar(255) NOT NULL
);

 


 

고유 제약 조건 ( Unique )

고유 제약 조건은 중복된 값을 허용하지 않도록 설정할 수 있다.

 

UNIQUE 제약 조건 요구사항!

사용자 ( User ) 테이블

  • userId 컬럼을 기본키로 설정한다.
  • 이름 ( name ) 컬럼을 가진다.

이외 요구사항

  • 사용자 테이블의 이름 컬럼은 NULL을 허용하지 않는다.
  • 사용자 테이블의 이름 컬럼은 중복된 값을 허용하지 않는다.
CREATE TABLE Users
(
    userId int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   varchar(255) NOT NULL UNIQUE
);

 

만약, 고유 제약 조건을 할당한 컬럼에 중복된 데이터를 삽입하면 어떻게 될까?

INSERT INTO Users (name) VALUES ('정성원');
INSERT INTO Users (name) VALUES ('정성원');
Error: ER_DUP_ENTRY: Duplicate entry '정성원' for key 'Users.name'

 

EP_DUP_ENTRY 에러메세지가 출력되고, 데이터가 삽입되지 않은 것을 확인할 수 있다.

기본키를 적용한 컬럼은 고유 제약 조건이 자동으로 적용된다.


 

외래 키 제약 조건 ( Foreign Key )

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

연관 관계는 대표적으로 3가지의 형태로 표현할 수 있다.

  • 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 ) 테이블

  • 이름 ( name ) 컬럼을 가진다.
  • 주소 ( address ) 컬럼을 가진다.

정원 식물 ( GardenPlants ) 테이블

  • 식물 이름 ( name ) 컬럼을 가진다.

이외 요구사항

  • 정원 식물 ( GardenPlants )은 특정 정원 ( Garden )에 소속되어 있다.
  • 하나의 정원은 여러개의 정원 식물을 가질 수 있다.
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)
);

 

 

위 예제에서 gardenId는 정원 식물 ( GardenPlants ) 테이블에서 정원 ( Garden ) 테이블을 참조하는 외래키다.

이것은 GardenPlants 테이블의 각 행이 실제로 존재하는 Garden 테이블의 행을 참조하도록 보장한다.

이처럼 외래키를 사용하여 특정 GardenPlants 테이블의 행이 어떤 Garden에 속해 있는지 알 수 있게 된다.

 

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

외래 키의 경우 다른 테이블과 관계를 맺고 있는 참조 데이터가 삭제 ( DELETE ) 또는 수정 ( UPDATE )될 때 어떤 행위를 해야하는지 설정할 수 있다. 이런 행위를 수행하는 조건을 연계 참조 무결성 제약 조건 이라고 정의한다.

 

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

CASCADE

  • 참조하고 있는 개체가 변경 / 삭제 될 경우 함게 변경 / 삭제된다.
  • 예) 사용자가 삭제된다면, 그 사용자의 모든 주문 내역도 삭제 된다.
FOREIGN KEY (userId) REFERENCES Users(userId)
    ON DELETE CASCADE
    ON UPDATE CASCADE;

 

NO ACTION

  • 참조하고 있는 개체가 변경 / 삭제 될 경우 아무런 행위를 하지 않고 에러가 발생하게 된다.
  • 예) 사용자를 삭제할 때, 사용자의 주문 내역이 아직 존재한다면, 삭제를 막는다.
FOREIGN KEY (userId) REFERENCES Users(userId)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;

 

SET NULL

  • 참조하고 있는 개체가 변경 / 삭제 될 경우 현재 데이터를 NULL로 변경한다.
  • 예) 사용자가 삭제되면, 사용자의 주문 내역의 '사용자 ID'는 NULL로 변경된다.
FOREIGN KEY (userId) REFERENCES Users(userId)
    ON DELETE SET NULL
    ON UPDATE SET NULL;

 

SET DEFAULT

  • 참조하고 있는 개체가 변경 / 삭제 될 경우 현재 데이터를 기본 값으로 변경한다.
  • 예) 사용자가 삭제되면, 사용자의 주문 내역의 '사용자 ID'는 기본 값으로 변경된다.
FOREIGN KEY (userId) REFERENCES Users(userId)
    ON DELETE SET DEFAULT
    ON UPDATE SET DEFAULT;

 


 

'데이터베이스' 카테고리의 다른 글

[DATABASE] ORM과 Prisma  (0) 2024.09.06
[DATABASE] Raw Query  (0) 2024.09.06
[DATABASE] SELECT JOIN 연산자  (0) 2024.09.05
[DATABASE] SQL ( Structured Query Language )  (0) 2024.09.05
[DATABASE] 관계형 데이터베이스  (0) 2024.09.05

SQL

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

 

SQL의 종류

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

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 ( 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 ( Data Control Language )

데이터베이스에 대한 권한과 관련된 문법으로 특정 유저가 DB에 접근할 수 있는 권한을 설정할 때 사용한다.

 ● GRANT

  • 데이터베이스의 특정한 유저에게 사용 권한을 부여할 때 사용한다.
  • 권한에는 SELECT, INSERT, UPDATE, DELETE 등 다양한 종류가 존재한다.
GRANT [권한] ON 객체명 TO 사용자;

 ● REVOKE

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

 


 

TCL ( Transaction Control Language )

데이터베이스 내의 트랜잭션을 관리하는 문법으로, 트랜잭션의 시작과 종료, 그리고 롤백을 수행할 때 사용한다.

 ● COMMIT

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

  ● ROLLBACK

  • 데이터베이스의 작업이 비정상적으로 완료되었음을 관리자에게 알려줄 때 사용한다.
  • 작업 중 오류가 발생한 경우 이를 취소하고, 이전 상태로 되돌릴 때 사용한다.
START TRANSACTION;
...
ROLLBACK;

 


 

'데이터베이스' 카테고리의 다른 글

[DATABASE] ORM과 Prisma  (0) 2024.09.06
[DATABASE] Raw Query  (0) 2024.09.06
[DATABASE] SELECT JOIN 연산자  (0) 2024.09.05
[DATABASE] SQL 제약조건  (0) 2024.09.05
[DATABASE] 관계형 데이터베이스  (0) 2024.09.05

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

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

 

RDS 구매

https://ap-northeast-2.console.aws.amazon.com/console/home?region=ap-northeast-2#

 

  • 위 링크로 접속해 로그인한다.

 

  • RDS를 검색한 후 클릭한다.

 

  • 데이터베이스 생성을 누른다

 

  • 표준 생성과 MySQL을 클릭한다.

 

  • 템플릿을 프리티어를 선택한다. ( AWS 가입 후 1년 동안 특정 서비스( = 프리 티어 )를 무료로 사용할 수 있다.

 

  • 설정 창에 데이터를 입력한다.
  • DB 인스턴스 식별자, 마스터 사용자 이름, 암호, 암호 확인

 

  • 인스턴스 구성과 스토리지 설정은 그대로 두고 넘어간다.

 

연결 설정은 다음과 같이 설정한다.

  • 컴퓨팅 리소스 : "EC2 컴퓨팅 리소스에 연결 안함" 선택
  • 퍼블릭 액세스 기능 : "예" 선택 ( 이 설정이 되어있어야 우리 컴퓨터에서 AWS RDS의 MySQL과 연결이 가능하다. )
  • VPC 보안 그룹 : "새로 생성" 선택 ( 새 VPC 보안 그룹 이름 : express-database-sg )
  • 가용 영역 : 옵션 중 아무거나 선택해도 됨

 

  • '추가 구성' > '초기 데이터베이스 이름'에 "express_db"를 입력한다.

 

  • 데이터베이스 생성 버튼 클릭해서 생성한다.


 

RDS 포트 열기

  • express-database를 클릭한다.

 

  • 연결 & 보안 > 보안 > VPC 보안 그룹 에서 express-database-sg를 찾아 클릭한다.

 

  • 보안그룹 ID를 클릭한다.

 

  • 인바운크 규칙 편집을 클릭한다.

 

인바운드 규칙을 다음과 같이 설정한다.

 1) "규칙 추가"를 클릭하고, 유형에서 사용자 지정 TCP를 선택한다.   

  • RDS의 특정 TCP 포트를 열도록 설정한다.

 2) 포트 범위에 3306을 입력한다.

  • MySQL을 3306 Port를 기본으로 사용하므로, 해당 Port를 열어준다.

  3) 소스에서 Anywhere-IPv4를 선택한다.

  • 모든 IP 주소에서 전달되는 트래픽을 허용한다는 의미
  • 실제 서비스 환경에서는 이 설정이 보안 위험을 초래할 수 있음

위와 같이 설정하고 "규칙 저장" 버튼을 클릭한다.

'IT' 카테고리의 다른 글

[IT] Access Token, Refresh Token  (1) 2024.09.09
[IT] 인증, 인가  (0) 2024.09.09
[IT] JWT  (0) 2024.09.08
[IT] 쿠키와 세션  (0) 2024.09.08
[IT] Javascript - Package Manager ( npm, yarn )  (0) 2024.08.28

RDB

 

관계형 데이터베이스 ( RDB )는 각 데이터를 '테이블'이라는 표 형태의 구조에 저장한다.

여기서, 각 '테이블'은 여러 정보를 저장하며, '테이블'간에 연관 관계를 설정해, 여러 테이블에 분산된 데이터를

서로 연결하여 관리할 수 있다.

  • 연관 관계 ( Relationship )란, 각 테이블 사이의 연결된 관계를 의미한다.
  • 관계형 데이터베이스는 테이블 ( Table )이라는 구조를 가지며, 각 테이블은 고유한 데이터를 나타내는 행 ( row )과 데이터의 속성을 나타내는 열 ( column )을 가진다.
  • 이 테이블들은 서로 연결될 수 있으며, 이 연결을 통해 복잡한 데이터를 관리할 수 있게 된다.

관계형 데이터베이스 ( RDB )와 비관계형 데이터베이스 ( NoSQL )의 개념

 

 

데이터 형식이 자유로운 비관계형 데이터베이스와는 달리 관계형 데이터베이스는 '테이블'이라는 개념이 존재한다.

여기서 테이블이란, 여러개의 '열( column )'과 '행( row )'을 가지는데, 이는 엑셀의 표와 유사한 형태다.

 

 

각 행 ( row )은 고유한 데이터 ( record )를 나타낸다. 각 열 ( column )은 해당 데이터의 속성 ( field )을 표현한다.

위 표를 예로 들어 설명하면

 행은 test@email.com, 테스트닉네임, 1234와 같은 정보를 나타내고,

 열은 이메일, 닉네임, 비밀번호와 같은 속성을 나타낸다.

 

주목해야할 점은 이 테이블 ( 표 )들 간에 서로 연관 관계 ( Relationship )를 가질 수 있다는 점이다.

이러한 관계를 통해 더욱 복잡한 쿼리를 작성할 수 있고, 바로 이 점이 "관계형 데이터베이스"라는 이름의 유래가 된것.

 

그렇다고 해서 비관계형 데이터베이스 ( NoSQL )가 좋지 않다는 것은 아니다. NoSQL은 유연한 데이터 구조를 가지기 때문에, 저장과 읽기 작업이 더욱 빠르고, 복잡한 비즈니스 로직 없이 주로 데이터 읽기와 쓰기에 중점을 둔 서버에서 주로 사용한다. ( 주로 빅데이터 환경, 단순 페이지뷰가 많은 앱 등 )

반면, 관계형 데이터베이스 ( RDB )는 더욱 복잡한 비즈니스 로직과 정형화된 데이터를 체계적으로 관리할 수 있어 더욱 안전한 서버 환경을 구성하기에 좋다. ( 보안이 중요한 기관, 은행과 같은 안전성을 중시하는 회사 등 )

'데이터베이스' 카테고리의 다른 글

[DATABASE] ORM과 Prisma  (0) 2024.09.06
[DATABASE] Raw Query  (0) 2024.09.06
[DATABASE] SELECT JOIN 연산자  (0) 2024.09.05
[DATABASE] SQL 제약조건  (0) 2024.09.05
[DATABASE] SQL ( Structured Query Language )  (0) 2024.09.05

오늘의 목표

더보기

✔️ Node.js 강의 듣기

✔️ AWS 비용 줄이기 특강


⏱️ 오늘의 일정

9:00 ~ 19:00 Node.js 강의 듣기

19:00 ~ 20:00 AWS 비용 줄이기 특강


📜 Node.js 강의 듣기

9:00 ~ 19:00 Node.js 강의 듣기

 

오늘까지 해서 입문 강의를 모두 완강했다. 내일부터는 숙련 강의를 들을 예정

 

2024.09.04 - [Javascript] - [Javascript][Node.js] joi ( 유효성 검증 )

 

[Javascript][Node.js] joi ( 유효성 검증 )

Joi는 Javascript 유효성 검증을 위한 라이브러리다. Joi는 여러 타입과 규칙을 이용해 유효성을 검증할 수 있으며, 유효성 검증에 실패하면 오류를 발생시킨다. 유효성 검증 ( Validation )function is1(valu

program-yam.tistory.com

 

2024.09.04 - [Javascript] - [Javascript][Node.js] 에러 처리 미들웨어

 

[Javascript][Node.js] 에러 처리 미들웨어

Express.js의 에러 처리 미들웨어에러 처리 미들웨어는 Express.js가 공식적으로 제공하는 기능으로, 아래와 같은 구조를 가지고 있다.app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('So

program-yam.tistory.com

 

2024.09.04 - [Javascript] - [Javascript] Prettier ( 코드 서식 관리 도구 )

 

[Javascript] Prettier ( 코드 서식 관리 도구 )

Prettier는 코드 서식을 관리 해주는 패키지다 Prettier 사용 준비# Prettier를 debDependency로 설치합니다.yarn add prettier -D 위 명령어를 터미널에 입력해 prettier를 설치한다. ( D = 개발 환경 전용 ) Prettier

program-yam.tistory.com

 

📜 AWS 비용 줄이기 특강

19:00 ~ 20:00 AWS 비용 줄이기 특강

 

악명(?) 높은 AWS 비용에 관한 특강이 있어서 참여했다.

가랑비에 옷 젖는줄 모른다는 말처럼 나도 모르게 비용이 엄청 늘어난다는 것이 주된 내용이였다.

AWS 비용이 지정한 액수에 가까워지면 메일로 알려주는 옵션, 해킹 당하면 비트채굴용으로 쓰인다는 예시와 함께 OTP 설명을 들어서 바로 수행했다.

Prettier

 

Prettier는 코드 서식을 관리 해주는 패키지다

 

Prettier 사용 준비

# Prettier를 debDependency로 설치합니다.
yarn add prettier -D

 

위 명령어를 터미널에 입력해 prettier를 설치한다. ( D = 개발 환경 전용 )

 

Prettier 설정파일 추가

.prettierrc.json 기본 설정

{
  "printWidth": 80,
  "tabWidth": 2,
  "singleQuote": false,
  "trailingComma": "all",
}

 

  • printwidth : number ( 한 줄에 최대 글자수를 정의 )
  • tabWidth : number ( Tab에 대한 스페이스 수를 정의 )
  • singleQuote : bool ( 따옴표를 쌍 따옴표 (") 사용 여부 )
  • trailingComma : "all" ( 여러 줄을 사용할 때, 후행 콤마 사용 )

스크립트 추가

Prettier를 보다 편리하게 사용할 수 있도록 package.json 파일에 스크립트를 추가한다.

이를 통해 터미널에서 간단한 명령만으로 Prettier를 실행할 수 있다.

 

"scripts": {
  "format": "prettier --write *.js **/*.js"
},

 

위 코드를 package.json에 입력한다. 이 스크립트를 실행하면 프로젝트 내의 모든 .js 파일을 대상으로 .prettierrc.js에 설정된 값을 바탕으로 Prettier를 실행하게 된다.

 

Prettier 실행

# package.json에 작성된 format 스크립트를 실행합니다.
yarn run format

 

위 명령어를 터미널에 입력하면 yarn run이 package.json에 작성한 스크립트를 실행한다. ( format은 package.json에 추가한 스크립트 이름 )

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 : 다음 미들웨어를 실행하는 함수

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

( Express.js에서 미들웨어나 라우터에서 에러가 발생하면, 해당 에러를 next 함수를 통해 다음 미들웨어로 전달한다. 그리고 Express.js는 등록된 미들웨어 중 에러를 매개변수로 받는 미들웨어를 찾아 실행하게 되는 것 )

 

에러 발생 시 에러를 처리하는 미들웨어 작성

export default function (err, req, res, next) {
  console.error(err);

  // Joi 검증에서 에러가 발생하면, 클라이언트에게 에러 메시지를 전달한다.
  if (err.name === 'ValidationError') {
    return res.status(400).json({ errorMessage: err.message });
  }

  // 그 외의 에러가 발생하면, 서버 에러로 처리한다.
  return res
    .status(500)
    .json({ errorMessage: '서버에서 에러가 발생하였습니다.' });
}

 

에러 처리 미들웨어 등록

import ErrorHandlerMiddleware from './middlewares/error-handler.middleware.js';

app.use('/api', [router, TodosRouter]);

app.use(ErrorHandlerMiddleware); // 에러 핸들링 미들웨어 등록

 

  • 에러 처리 미들웨어를 Router 하단에 등록해야 이전 미들웨어에서 발생한 에러에 대해 핸들링 할 수 있다. ( next()를 통해 에러 처리 미들웨어로 전달하기 때문에 )

Joi는 Javascript 유효성 검증을 위한 라이브러리다. Joi는 여러 타입과 규칙을 이용해 유효성을 검증할 수 있으며, 유효성 검증에 실패하면 오류를 발생시킨다.

 

유효성 검증 ( Validation )

function is1(value) {
	return value === 1;
}
  • 위 코드는 단순히 값이 1인지 아닌지 판단해서 Boolean 타입의 값을 반환하는 함수다. 이런 간단한 함수도 Validation. 즉, 검증을 위한 코드가 된다.
  • 이런 데이터를 검증하는 것을 더 쉽고 간결하게 작성하도록 도와주는 joi라는 라이브러리를 사용할 수 있다.

joi 설치

# yarn을 이용해 Joi를 설치합니다.
yarn add joi

 

  • yarn add joi를 터미널에 입력해 패키지를 설치한다.

 

joi를 이용해 유효성 검증 하기

  • 문자열 길이 검증
import Joi from 'joi';

// Joi 스키마를 정의합니다.
const schema = Joi.object({
  // name Key는 문자열 타입이고, 필수로 존재해야합니다.
  // 문자열은 최소 3글자, 최대 30글자로 정의합니다.
  name: Joi.string().min(3).max(30).required(),
});

// 검증할 데이터를 정의합니다.
const user = { name: 'Foo Bar' };

// schema를 이용해 user 데이터를 검증합니다.
const validation = schema.validate(user);

// 검증 결과값 중 error가 존재한다면 에러 메시지를 출력합니다.
if (validation.error) {
  console.log(validation.error.message);
} else {
  // 검증 결과값 중 error가 존재하지 않는다면, 데이터가 유효하다는 메시지를 출력합니다.
  console.log('Valid Data!');
}

 

  • 이메일 검증
import Joi from 'joi';

// Joi 스키마를 정의합니다.
const schema = Joi.object({
  // name Key는 문자열 타입이고, 필수로 존재해야합니다.
  // 문자열은 이메일 형식에 맞아야합니다.
  email: Joi.string().email().required(),
});

// 검증할 데이터를 정의합니다.
const user = { email: 'foo@example.com' };

// schema를 이용해 user 데이터를 검증합니다.
const validation = schema.validate(user);

// 검증 결과값 중 error가 존재한다면 에러 메시지를 출력합니다.
if (validation.error) {
  console.log(validation.error.message);
} else {
  // 검증 결과값 중 error가 존재하지 않는다면, 데이터가 유효하다는 메시지를 출력합니다.
  console.log('Valid Email User!');
}

 

https://joi.dev/api/?v=17.13.3  ( 더욱 상세한 joi 문법 사용 방법 )

 


joi를 이용해 유효성 검증하기 ( 비동기 )

  • 비동기로 문자열 길이 검증하기
import Joi from 'joi';

// Joi 스키마를 정의합니다.
const schema = Joi.object({
  // name Key는 문자열 타입이고, 필수로 존재해야합니다.
  // 문자열은 최소 3글자, 최대 30글자로 정의합니다.
  name: Joi.string().min(3).max(30).required(),
});

// 검증할 데이터를 정의합니다.
const user = { name: 'Foo Bar' };

try {
  // schema를 이용해 user 데이터를 검증합니다.
  const validation = await schema.validateAsync(user);
  // 검증 결과값 중 error가 존재하지 않는다면, 데이터가 유효하다는 메시지를 출력합니다.
  console.log('Valid Data!');
} catch (error) {
  // 검증에 실패한다면, 에러 메시지를 출력합니다.
  console.log(error.message);
}
  •  validateAsync()를 통해 데이터를 비동기적으로 검증한다.

+ Recent posts