Database, MySQL

nahsooyeon·2021년 2월 26일
0

3 Tier Architecture

한줄요약: 클라이언트 - 서버 - 데이터베이스
서버에 모든 데이터가 담긴 데이터베이스 원본을 보관하면 서버 유지하는 데 비효율적일 것같다..
서버가 터지는 경우엔 데이터가 유실되는 경우도 있지 않을까.(백업을 보관할 곳이 피료해..!!)
하지만 특정 데이터가 필요한 경우에만 서버가 데이터베이스에 요청해서 받아온다면 훨씬 더 효율적으로 데이터를 관리하고, 서버를 운영할 수 있을것!

결국... 3티어 아키텍처를 사용한다면 각 계층별로 맡는 기능을 분화할 수 있게 되고, 효율성이 증가할 것이다.

3 Tier Architecture에서 각 계층의 역할과 기능

각 계층은 물리적으로도 독립적이며 각 계층의 변경이 다른 계층에 의존하지 않는다

프레젠테이션 로직

  • 사용자에게 보여지는(Presentational) 부분에 해당한다.
  • 사용자인터페이스를 지원한다.
  • HTML, CSS, JavaScript

비즈니스 로직

  • 클라이언트의 요청에 따라 필요한 데이터를 처리 및 가공하고 다시 응답으로 보내준다.(동적 데이터를 제공한다.)
  • 클라이언트(1티어)에 대해서는 서버로 작동하되, 데이터베이스(3티어)에 대해서는 가공하지 않은 데이터를 요청하기때문에 클라이언트로서 작동한다.

데이터 액세스 로직

데이터베이스의 필요성과 영속성

SQL vs NoSQL

SQL: 데이터베이스에 쿼리를 보내는 원하는 데이터만 가져올 수 있게 하는 프로그래밍 언어
쿼리 ⇒ 내가 원하는 데이터를 요구하는 질문

테이블 관계

1:1 관계

ex. 한 명의 인스타 유저의 개인정보에는 하나의 전화번호만 담긴다.

1:N 관계

테이블 하나당 여러 개의 레코드와 연결되어있는 경우
ex. 인스타그램 유저 1명이 작성하는 여러 개의 포스트

N:N 관계

여러 개의 레코드가 여러 개의 레코드를 가지는 관계
ex. 인스타그램 사용자들의 팔로우 관계

✓ Primary Key

✓ Foreign Key
원본 키를 가지고 있는 테이블을 다른 테이블이 참조할 때 사용한다.

SQL 주요 문법

쿼리 실행순서

SELECT
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY

Join Table

내부 조인

SELECT <select_list>
FROM Table A
INNER JOIN Table B
ON A.Key = B.Key;

기준 테이블을 A로 하면서 A의 key데이터가 B의 key데이터와 일치하는 값을 찾는다.
(B의 key데이터가 null인 경우는 제외한다)

외부 조인(LEFT)

SELECT <select_list>
FROM Table A
LEFT JOIN Table B
ON A.Key = B.Key

기준 테이블을 A로 하면서 A의 key데이터가 B의 key데이터와 일치하는 값을 찾는다.
(B의 key데이터가 null인 경우도 포함한다)

테이블 수정하기 (ALTER)

ADD

/*uesr 테이블에 address 칼럼 추가하기*/
ALTER TABLE user ADD COLUMN address varchar(255) NOT NULL;

/*user 테이블에 role 테이블의 id를 참조하는 외래키 roleId 추가하기*/
ALTER TABLE `user` ADD FOREIGN KEY (`roleId`) REFERENCES `role` (`id`);

MODIFY

/* user 테이블의 id칼럼의 데이터 타입을 변경하기*/
ALTER TABLE user MODIFY COLUMN id varchar(16) NULL;

CHANGE

/* user 테이블의 id칼럼의 데이터 타입과 칼럼명까지 변경하기*/
ALTER TABLE user CHANGE COLUMN id user_key varchar(16) NULL;

DROP

/*user 테이블에서 address 칼럼 삭제하기*/
ALTER TABLE user DROP COLUMN address;

Sprint Reflection

1. learn-sql

힘들었던 부분

TODO: Q 5-2-9. duRiCha가 작성한 글의 개수 (컬럼명: ContentCount)를 출력하기 위한 SQL을 작성해주세요

내가 원하는 이름으로 데이터의 컬럼을 출력하기 위해서는 alias를 쓸 수 있다.
alias는 다음과 같은 형식으로 사용한다.

SELECT count(*) as ContentCount
FROM content
(...)

TODO: Q 5-2-5. jiSungPark이 작성한 content의 title을 찾기위한 SQL을 작성해주세요.

const PART5_2_5 = ` SELECT title FROM content
WHERE userId IN (SELECT id FROM user WHERE user.name = 'jiSungPark')`;

이중쿼리를 써보았다.
먼저 title 데이터는 content에 있으니까 출력 쿼리를 작성하고
content 테이블에 있는 userIduser 테이블에서 name이 'jiSungPark'인 레코드의 id와 일치하는 레코드

2. cmarket-database

스프린트 레포지토리 분석

SERVER
> config / config.js
> controller / index.js
> db / index.js
mysql 모듈을 사용해서 데이터베이스와 서버 인스턴스를 연결한다.

**> models** / index.js
**.gitignore**
**.env**

.gitignore.env 파일의 역할

힘들었던 부분
1) 데이터베이스를 서버와 연결하기

연결 그거 어떻게 하는 건데...

Node.js에서 mySQL 사용하기(npm 공식문서)
2) 여러 개의 레코드를 한번의 쿼리로 테이블에 저장하기

0개의 댓글