티스토리 뷰
DB 테이블 실습 과정은 크게 5가지로 나누었다.
1. "Board" 스키마 생성하기
2. 사용자 테이블 생성하기
3. 사용자 데이터 삽입하기
4. 게시글 테이블 생성하기
5. 게시글 데이터 삽입하기
스키마를 생성하기 전에, Docker를 켜놓고 mariadb가 있는 컨테이너에 접속한 후 mariadb를 실행해야한다.
1) mariadb가 있는 컨테이너 접속 : docker exec -it mariadb /bin/bash
2) mariadb 실행 : maraidb -u root -p
3) password 입력
이렇게 되면 연결이 잘 된 것이다. cmd에 치면 된다.
이제 "Board" 스키마를 생성해보겠다.
1. "board" 스키마 생성
CREATE DATABASE Board;
USE Board;
우선 Board 데이터베이스를 CREATE 해준다.
그 후, USE Board; 즉, Board 데이터베이스를 사용한다. 라고 치면된다.
그럼 MariaDB [(none)] 에서 MaraiDB [Board]로 변하는 걸 볼 수 있다.
이제 우린 Board 라는 데이터베이스를 사용할 수 있게 되는 것이다.
2. 사용자(user) 테이블 생성
CREATE TABLE users
(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
job VARCHAR(100),
birth DATE,
PRIMARY KEY (id)
);
Board 데이터베이스 안에 테이블을 먼저 생성해주겠다.
테이블 생성은 CREATE TABLE (테이블명); 을 치면된다.
보통 테이블명을 적을 때, 복수형을 적는 걸 추천한다.
그 이유는, 사용자가 1명이 아닌 많은 사용자가 있기 때문에 관리 차원에서 복수형이 더 좋을 것이다.
꼭 답은 아니지만 암묵적인 룰(=국룰)이라고 생각하면 될 것 같다 🙄
하지만 선임 개발자가 '복수형 쓰지마라' 라고 한다면 '넵' 하고 단수형 쓰면 된다^^...
(뭐든지 회사 선임이 답이다... 선임말 잘 듣자...)
위의 SQL에서 주의 깊게 봐야 할 부분이 있다.
NOT NULL , AUTO_INCREMENT, PRIMARY KEY 이다.
우선, NOT NULL 이란....
Null값을 절대 허용하지 않는다는 뜻이다.
즉, 비울 수 없는 컬럼이라는 것이다. id는 무조건 값을 채워야 한다! 라는 제약조건을 건 것이다.
제약조건엔 다양한 것들이 있지만, 일단 오늘은 NOT NULL만 사용해보았다.
또, AUTO_INCREMENT 란...
보통 데이터베이스에서 하나의 번호다! 라기보단 하나의 id다! 라고 많이들 표현한다.
데이터가 늘어날 때마다 id도 늘어날 것이다.
그래서 자동으로 데이터베이스에서 늘어나게 할 수가 있다.
그것이 바로 AUTO_INCREMENT 이다.
보통 1부터 증가하면서 값을 부여한다. 하지만 다른 값으로 부여할 수도 있긴하다.
근데 그렇게도 쓸려나? 흐음..🙄
PRIMARY?
이 사람 아니다.
PRIMARY KEY 이다.
이 테이블을 만들 때 사용하는 id는 primary key로 사용할 거야. 라는 뜻으로, 보통 SQL 마지막에 많이들 쓴다.
PRIMARY KEY는 데이터베이스 테이블 내의 모든 데이터에서 고유한 아이디를 제공하는 것이다.
흔히들 줄여서 PK 라고 부른다.
PRIMARY KEY는 특징이 존재한다.
1) Null값 X
2) 중복값 X
3) 하나의 기본키만 가질 수 있지만 경우에 따라 1개 이상이 될 수도 있다.
위에서 봤던 AUTO_INCREMENT 도 사실 PRIMARY KEY 의 속성 중 하나이다.
사실 SQL 구문은 실수가 잦기 때문에, 미리 메모장 or 노트패드에 위처럼 적어두고 복사해서 붙여넣는 걸 추천한다.
아주 잘 뜨는 걸 볼 수 있다. 테이블이 잘 만들어졌으니 이제 데이터를 삽입할 것이다.
3. 사용자 데이터 삽입
INSERT INTO users (name, job, birth)
VALUES ("공유", "배우", "1980-01-23");
사실 birth 는 DATE 로 만들긴 했지만 안전하게 DATE값이 출력되는 것과 동일하게 넣어주었다.
800123 넣어도 1980-01-23 으로 뜨긴한다. 지금은 2024년 이니까......
하지만 100123 이라면?
나는 1910-01-23 으로 생각하고 넣은 것이지만, 컴퓨터는 마법사가 아니다.
내가 원하는대로 무조건 출력을 해줄 수 없는 노릇인 거다.
실제로 100123 으로만 넣으면 2010-01-23 으로 출력이 된다.
이러한 문제를 방지하기 위해 처음부터 DATE값과 동일하게 넣는 걸 추천한다.
그럼 NOT NULL 로 제약조건을 걸어둔 name이 비어있다면 어떻게 될까?
생각했던 대로, 'name'필드에 기본값이 없습니다.' 라고 말해준다.
그럼 텍스트로 null 을 넣으면 될까?
당연히 안 된다 ㅎ
null을 넣으면 'Column 'name' cannot be null' => 'name'열은 null일 수 없습니다' 라고 뜬다.
제약조건을 걸었으면 잘 지키자😑
4. 게시글(post) 테이블 생성
CREATE TABLE posts
(
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
content VARCHAR(2000),
created_at TIMESTAMP DEFAULT NOW(),
PRIMARY KEY (id)
);
다른 코드들은 위와 비슷하니 상관이 없을 것 같고...
created_at => 작성일자 라고 보면된다.
created_at 뒤에 있는
TIMESTAMP DEFAULT NOW() 란..
'Default값으로 지금 기준 타임스탬프를 찍어줘' 라는 의미이다.
말 그대로 작성일자는 직접 쳐서 데이터를 넣는 것이 아니라
TIMESTAMP를 이용하여 자동으로 들어가게끔 하는 것이다.
보통 게시글은 작성일자 와 수정일자가 있는데
수정일자도 비슷한 방법으로 사용할 수 있지만 일단은 작성일자만 만들어보았다.
posts 테이블이 잘 만들어진 걸 볼 수 있다.
5. 게시글 데이터 삽입
INSERT INTO posts (title, content)
VALUES ("title1", "content1");
posts는 id, title, content, created_at 으로 만들었다.
id는 자동으로 부여되게 했으니 적지 않아도 되고...
엥? created_at 은 왜 안 적어요?? 라고 물으신다면... 일단 결과물을 보여주겠다.
created_at은 데이터값을 넣어주지도 않았는데 자동으로 시간이 찍혔다!
일단 이 부분은 따로 정리를 한 후에 설명 하도록 하겠다!
💥 MySQL(Maraidb) 날짜 / 시간 타입
1) DATE
- 날짜만
- YYYY-MM-DD
2) DATETIME
- 날짜+시간
- YYYY-MM-DD HH:MM:SS (24시간제)
3) TIME
- 시간
- HH:MM:SS
4) TIMESTAMP => 시스템 시간대 정보에 맞게 일시를 저장 / 자동 입력을 도와줌
- 날짜+시간
- YYYY-MM-DD HH:MM:SS (24시간제)
posts 테이블을 만들었을 때, created_at 의 Default 값이 current_timestamp() 로 지정된 걸 볼 수 있었다.
current_timestamp() 는 지금 기준으로 일시를 찍어주는 것이다.
UTC 로 변환을 할 수도 있다.
UTC는 한국 시간 - 9시간으로 생각하면 된다.
필요에 의해 변경할 수 있다. 라고만 알고 가도 될 것 같다.
💥 NOT NULL vs Default
Not Null 과 Default의 차이도 알고가야할 것 같다.
Default는 말 그대로 기본값이다.
"값? 안 넣어줘도 돼! 하지만 아무 값도 안 들어온다면 내가 이 값을 넣어줄게!" 라고 세팅하는 값이다.
- Not Null
: 공란 / 직접 쳐서 넣는 null 도 안됨 ❌
- Default
: 공란 => Default 설정 해둔 기본 값으로 insert됨
: 직접 쳐서 넣는 null => 값이 있는 걸로 인지를 하고 Default 값이 아닌 null 이라는 값이 들어가게됨.
'웹 개발 공부하기' 카테고리의 다른 글
[12.04] 로그인 세션과 쿠키 세션 (1) | 2024.12.04 |
---|---|
[12.03] user.js 리팩토링 (0) | 2024.12.03 |
[11.28] DBMS? RDBMS? 그게 뭐야🤷♀️ (0) | 2024.11.28 |
[11.27] express 요약 정리 한 번 더하기 + 오늘의 포스팅😁 (0) | 2024.11.27 |
[11.27] router()를 사용해서 깔끔하게 정리해보기😋 (0) | 2024.11.27 |