-- GET /api/room/:postId 대화방 메시지 수신 API
1. 모든 메시지 출력
SELECT * FROM Messages;
2. postId에 해당하는 메시지 출력
SELECT * FROM Messages WHERE postId = 1;
3. postId에 해당하는 Channels에 참여중인 모든 유저의 userId를 출력
SELECT userId FROM Channels WHERE postId = 1;
4-1. userId가 해당하는 Channels에 참여중인지 확인 (COALESCE 사용)
SELECT COALESCE(MIN('Y'), 'N') AS isUserId
FROM Channels
WHERE 4 IN (SELECT userId
FROM Channels
WHERE postId = 1)
- COALESCE 사용
4-2. userId가 해당하는 Channels에 참여중인지 확인 및 코드 병합(WHERE AND 사용)
SELECT userId, message, updatedAt
FROM Messages
WHERE postId = 1
AND 4 IN (SELECT userId
FROM Channels
WHERE postId = 1)
;
- 서브 쿼리를 최대한 줄이고 내부에 코드를 병합하였다.
- userId = 4, postId = 1 조건으로 검색
5. messageId 추가 및 Users 테이블의 nickname, profileImg 추가
SELECT m.messageId, m.userId, u.nickname, u.profileImg, m.message, m.updatedAt
FROM Messages AS m
JOIN Users AS u
ON m.userId = u.userId
WHERE m.postId = 1
AND 2 IN (SELECT userId
FROM Channels
WHERE postId = 1)
;
6. 정렬 조건 추가
SELECT m.messageId, m.userId, u.nickname, u.profileImg, m.message, m.updatedAt
FROM Messages AS m
JOIN Users AS u
ON m.userId = u.userId
WHERE m.postId = 1
AND 2 IN (SELECT userId
FROM Channels
WHERE postId = 1)
ORDER BY m.messageId ASC
;
7. LIMIT 설정
SELECT m.messageId, m.userId, u.nickname, u.profileImg, m.message, m.updatedAt
FROM Messages AS m
JOIN Users AS u
ON m.userId = u.userId
WHERE m.postId = 1
AND 2 IN (SELECT userId
FROM Channels
WHERE postId = 1)
ORDER BY m.messageId ASC
LIMIT 0, 20
;
8. userId가 NULL 이라도 nickname, profileIme를 NULL로 가져오도록 LEFT JOIN으로 설정
SELECT m.messageId, m.userId, u.nickname, u.profileImg, m.message, m.updatedAt
FROM Messages AS m
LEFT JOIN Users AS u
ON m.userId = u.userId
WHERE m.postId = 1
AND 2 IN (SELECT userId
FROM Channels
WHERE postId = 1)
ORDER BY m.messageId ASC
LIMIT 0, 20
;
9.. Channels 에서 userId가 참가한 시간을 가져온다.
SELECT createdAt FROM Channels WHERE userId =2 AND postId = 1;
- postId, userId는 중복이 발생할 수 있다.
- postId, userId가 중복으로 들어가 있을 경우 에러 발생
- LIMIT 1로 에러 제거
SELECT createdAt FROM Channels WHERE userId =2 AND postId = 1 LIMIT 1;
- LIMIT을 사용해 Sub Query에서 사용하더라도 에러가 발생하지 않도록 작성
10. userId가 Channels에 접속한 후의 메시지만 가져오도록 설정
SELECT m.messageId, m.userId, u.nickname, u.profileImg, m.message, m.updatedAt
FROM Messages AS m
LEFT JOIN Users AS u
ON m.userId = u.userId
WHERE m.postId = 1
AND 5 IN (SELECT userId
FROM Channels
WHERE postId = 1)
AND m.createdAt >= (SELECT createdAt FROM Channels WHERE userId = 5 AND postId = 1 LIMIT 1)
ORDER BY m.messageId ASC
LIMIT 0, 20
;
-- Messages foreign Key 수정
ALTER TABLE Messages DROP FOREIGN KEY Messages_ibfk_2;
# Messages에 등록되어있는 Messages_ibfk_2이름의 Foreign Key를 삭제한다.
ALTER TABLE Messages ADD CONSTRAINT FOREIGN KEY(userId) REFERENCES Users(userId) ON DELETE SET NULL;
# Messages에 새로운 외래키를 지정한다.
# Messages테이블의 userId컬럼을 Users테이블의 userId와 연결한다.
# 만약 부모 테이블의 컬럼이 삭제될 경우 Messages.userId를 NULL로 변경한다.
-- React 설치
$ curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
- Curl을 사용해 서버에 nodesource.com에서 제공하는 Node.js LTS 버전을 다운받는다.
$ sudo apt-get install -y nodejs
- Node.js를 설치하고, 확인 메시지가 출력되었을 경우 Yes로 답변한다.
$ sudo apt-get install unzip
- ZIP 파일을 풀기 위해 unzip 라이브러리를 다운로드 한다.
$ unzip heturemoyeo.zip
- zip파일을 푼다.
$ sudo npm install -g yarn
- 전역으로 yarn을 설치한다.
$ sudo npm install
- package.json에 설정된 npm 모듈을 설치
$ sudo yarn install
- package.json에 설정된 yarn 모듈을 설치
$ sudo apt-get install iptables
- 다른 포트로 들어오는 지정한 포트로 전달하기 위한 iptables 라이브러리를 설치한다.
$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
- 80번 포트로 들어오는 클라이언트를 3000번 포트로 보냄
$ nohup yarn start &
- 백그라운드에서 yarn start를 실행
- 터미널이 종료되어도 React는 종료되지 않는다.
- yarn start를 통해 배포를 하는것은 비효율 적이므로 build를 해서 앱을 제공해야 한다.
$ jobs
- 현재 실행중인 프로세스들의 List를 볼 수 있다.
$ bg %1
- 멈춰있던 Job Id [1]번 Process를 Running 상태로 변경한다
$ sudo ln -s /etc/nginx/sites-available/FinalProject.conf /etc/nginx/sites-enabled/FinalProject.conf
- 심볼릭 링크를 생성한다.
'항해99 > 필기노트' 카테고리의 다른 글
[필기노트] MySQL VIEW, API (0) | 2021.08.20 |
---|---|
[필기노트] MySQL Group_concat, Event Scheduler (0) | 2021.08.17 |
[필기노트] MySQL 모임 초대 DB, SQL (0) | 2021.08.12 |
[필기노트] MySQL Geometry DataSet, Socket Middleware (0) | 2021.08.11 |
[필기노트] HTTPS, 테스트코드 고려사항 (0) | 2021.08.10 |