TIL

Nodejs 강의 숙련 MySQL(1)

황민도 2024. 5. 21. 14:49

내일배움캠프 스파르타 코딩클럽

 

오늘은 어제 작성하지 못한 TIL을 작성해 보도록 하겠다.

이번엔 저번 입문강의에서 다룬 MongoDB NoSQl (비관계형 데이터) 와 달리

MySQL(관계형 데이터) 을 AWS 에서 제공하는 RDS를 통해 관리함으로써 어떻게 작성을 해야 하는지

배워보는 시간을 가졌다.

 

설치하는 법과 몇가지 설정을 단순하고 간략하게 보자면

1. AWS 검색창에 RDS 를 검색하고 클릭

2. 좌측 사이드바 데이터베이스를 클릭하여 들어가면 우측 상단에 데이터베이스 생성 클릭

3. 엔진옵션 MySQL

4. 템플릿 프리 티어(무료서비스 제공)

5. 설정 DB 클러스터 식별자, 마스터 사용자 이름 입력

6. 퍼블릭 액세스 아니오, vpc 보안 그룹 새로생

7. 모니터링은 사용요금 부과로 되도록 사용안하는 것을 추천

8. 추가구성 : 초기데이터베이스 이름 입력

9. 데이터베이스 생성


10. VS CODE 확장 : MySQL 설치

11. 탐색기 MYSQL + 클릭후 RDS 데이터베이스 페이지에 가서 VPC 보안 그룹 설정후 엔드포인트 복사 후 VS CODE input 창에 붙여넣기, 마스터 사용자 이름, 비밀번호 입력 후 생성

12. 

express-database 우클릭 NewQuery

13.CREATE DATABASE NodeJS;

14. 위 처럼 입력하고 해당 페이지 우클릭 후 Run MySQL Query 를 누르면

15.

이렇게 생성이 완료됨

16. NodeJS 우클릭후 NewQuery 클릭

17.

CREATE TABLE IF NOT EXISTS courses (
    id bigint(5) NOT NULL AUTO_INCREMENT,
    title varchar(255) NOT NULL,
    tutor varchar(255) NOT NULL,
    PRIMARY KEY (id)
);

/* bigint(5) 의 5는 표시 너비로 5자리수까지만 표시 되도록함 아래와 같이 zerofill 을사용한다면

CREATE TABLE IF NOT EXISTS courses (

id INT(5) ZEROFILL NOT NULL AUTO_INCREMENT,

title VARCHAR(255) NOT NULL,

tutor VARCHAR(255) NOT NULL,

PRIMARY KEY (id)

);

00001 로 표시가 됨 사실상 bigint 를 사용하는 입장에서는 5를 굳이 넣어줄 필요가 없음.

*/

18. 위 처럼 입력하고 해당 페이지 우클릭 후 Run MySQL Query 를 누르면

19.

이렇게 완료됨


< 등록 >

20. 반복해서 NodeJS 우클릭후 NewQuery 클릭

INSERT INTO courses (title, tutor) VALUES
    ('Spring 기초반', '최원빈'),
    ('Spring 숙련반', '최원빈'),
    ('React 기초반', '김예지'),
    ('React 숙련반', '김예지'),
    ('Node.js 기초반', '이용우'),
    ('Node.js 숙련반', '이용우'),
    ('웹개발 종합반', '이범규'),
    ('웹개발 종합반 플러스', '이범규');

21. 위 처럼 입력하고 해당 페이지 우클릭 후 Run MySQL Query 를 누르면 등록이 되고

22. NodeJS 우클릭후 NewQuery 클릭


< 조회 >

23. SELECT * FROM courses;

24. 이렇게 입력하고 해당 페이지 우클릭 후 Run MySQL Query 를 누르면

이렇게 잘 입력된걸 확인할 수 있다.

25. SELECT * FROM courses WHERE tutor='이용우';

26. 이렇게 입력하고 해당 페이지 우클릭 후 Run MySQL Query 를 누르면

해당 내용을 잘 확인할 수 있다.


 

< 제약 조건 >

27. 테이블에 대한 요구사항들 을 확인 할때

-- 사용자 ('Users') 테이블
-- 1. 'userId' 컬럽을 가지고, 기본키로 설정합니다.
-- 2. dlfma('name') 컬럼을 가집니다.

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

desc Users;

 

위 주석처럼 입력을 했다고 하고

desc Users; 를 입력하여 Run 하게 되면 

이렇게 나오는 걸 확인할 수 있다.

 

만약 수정을 하게 된다면 아래와 같이 DROP TABLE 을 사용하여 없애고 수정한 것을 다시 RUN 하면 된다.

-- 사용자 ('Users') 테이블
-- 1. 'userId' 컬럽을 가지고, 기본키로 설정합니다.
-- 2. dlfma('name') 컬럼을 가집니다.

-- 이외 요구사항

-- 1. 사용자 테이블의 이름 컬럼은 'NULL' 값을 허용하지 않습니다.

DROP TABLE Users;

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

desc Users;

 

28. 중복된 값을 허용하지 않으려면

-- 사용자 ('Users') 테이블
-- 1. 'userId' 컬럽을 가지고, 기본키로 설정합니다.
-- 2. dlfma('name') 컬럼을 가집니다.

-- 이외 요구사항

-- 1. 사용자 테이블의 이름 컬럼은 'NULL' 값을 허용하지 않습니다.
-- 2. 사용자 테이블의 이름 컬럼은 중복된 값을 허용하지 않습니다.

DROP TABLE Users;

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

desc Users;

이렇게 나온다.

INSERT INTO Users (name) VALUES ('이용우');
INSERT INTO Users (name) VALUES ('이용우');

이렇게 중복된 값을 넣으면 Error: ER_DUP_ENTRY: Duplicate entry '이용우' for key 'Users.name'에러발생

 

29. 1:N 관계 구성하기

-- <aside>
-- ❓ **외래키 제약 조건 요구사항!**

-- **정원(`Garden`) 테이블**

-- 1. 이름(`name`) 컬럼을 가집니다.
-- 2. 주소(`address`) 컬럼을 가집니다.

-- **정원 식물(`GardenPlants`) 테이블**

-- 1. 식물 이름(`name`) 컬럼을 가집니다.

-- **이외 요구사항**

-- 1. 정원 식물(`GardenPlants`)은 특정 정원(`Garden`)에 소속되어 있습니다.
-- 2. **하나의 정원**은 **여러개**의 **정원 식물**을 가질 수 있습니다.
-- </aside>

CREATE TABLE Garden
(
    gardenId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name varchar(255),
    address varchar(255)
);

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

Garden table
연관관계를 맺은 내용이 나오는 GardenPlants MUL(멀티키)

 *심화 (연계 참조 무결성 제약 조건의 종류)

잘못 입력된 값으로 참조 테이블을 지우고 싶은경우

-- Step 1: 데이터베이스 선택
USE `NodeJS`;

-- Step 2: 외래 키 제약 조건 삭제
ALTER TABLE Posts DROP FOREIGN KEY `Posts_ibfk_1`;

-- Step 3: Users 테이블 삭제
DROP TABLE Users;

 

30. < 연관관계 조회 >

-- DROP TABLE Users;
-- DROP TABLE Posts;

-- 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');

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

ON p.UserId = u.userId; 테이블 2개를 결합할때 쓰임 동일 한 결과값만 조회하겠다.