== pm2
$ pm2 -v
- 설치한 pm2의 버전을 확인하는 명령어
$ pm2 start app.js
- app.js 파일을 pm2에 등록해 실행
$ pm2 list
- 실행중인 pm2의 목록을 출력한다.
$ pm2 monit
- 실행중인 pm2의 프로세스들을 실시간 모니터링 할 수 있도록 설정한다.
$ pm2 show app
- app 프로세스의 상세한 상태를 조회
$ pm2 restart app
$ pm2 restart 0
- 프로세스이름이 app 또는 PID가 0일 경우 재시작한다.
$ pm2 delete app
$ pm2 delete 0
- 프로세스이름이 app 또는 PID가 0일 경우 삭제 및 종료한다.
== Linux Bash 명령어
$ tail ~/.pm2/logs/app-out.log
- ~/.pm2/logs/app-out.log 파일의 마지막 10줄을 출력한다.
$ tail -n 20 ~/.pm2/logs/app-out.log
- ~/.pm2/logs/app-out.log 파일의 마지막 20줄을 출력한다.
$ tail -f ~/.pm2/logs/app-out.log
- ~/.pm2/logs/app-out.log 파일을 실시간 모니터링 한다.
-- Posts Trigger Insert 이벤트 추가
CREATE TRIGGER TR_Posts
AFTER UPDATE OR INSERT ON Posts
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO Channels (postId, userId) values (new.postId, new.userId);
END IF;
IF UPDATING THEN
DELETE FROM Tags WHERE postId = old.postId;
END IF;
END
- AFTER OR은 MySQL 8버전 이상부터 사용 가능
-- 전체 모임 글 리스트 SQL 작성
1. 모든 Posts 출력
SELECT * FROM Posts
;
2. 모든 Channels 출력
SELECT * FROM Channels
;
3. 현재 채널에 접속중인 유저수를 출력한다.
SELECT COUNT(*) FROM Channels WHERE postId = 1 GROUP BY postId;
4. currentMember 코드를 JOIN으로 수정 후 병합
SELECT p.postId, p.title, p.postImg, COUNT(*) AS currentMember ,
p.maxMember, p.startDate, p.endDate, p.place
FROM Channels AS c
JOIN Posts AS p
ON p.postId = c.postId
GROUP BY c.postId
;
5. 방의 자리가 남아있을 경우 출력하는 조건 추가
SELECT p.postId, p.title, p.postImg, COUNT(*) AS currentMember, p.maxMember, p.startDate, p.endDate, p.place
FROM Channels AS c
JOIN Posts AS p
ON p.postId = c.postId
GROUP BY c.postId
HAVING currentMember < maxMember
;
6. LIMIT 추가
SELECT p.postId, p.title, p.postImg, COUNT(*) AS currentMember, p.maxMember, p.startDate, p.endDate, p.place
FROM Channels AS c
JOIN Posts AS p
ON p.postId = c.postId
GROUP BY c.postId
HAVING currentMember < maxMember
LIMIT 0, 5
;
-- 대화방 메시지 수신 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
;
-- Channels에 유저가 존재하는지 확인하는 API
1. 모든 채널 조회
SELECT * FROM Channels;
2. 모든 유저 조회
SELECT * FROM Users;
3. 입력받은 postId, userId가 존재할 경우 Channels를 조회
SELECT * FROM Channels WHERE postId = 1 AND userId = 1
4. 코드 병합
SELECT u.userId, u.nickname, u.profileImg
FROM Channels AS c
JOIN Users AS u
ON u.userId = c.userId
WHERE c.postId = 1
AND c.userId = 1
;
-- 친구 목록, 일정에 속해있는 유저 목록을 출력
1. 모든 친구 목록을 조회
SELECT * FROM Friends;
2. 친구 목록 중에서 친구 요청을 받은 유저를 조회
SELECT receiveUserId
FROM Friends
WHERE giveUserId = 1
;
3. 친구 목록 중에서 친구 요청을 보낸 유저를 조회
SELECT giveUserId
FROM Friends
WHERE receiveUserId = 1
;
4. 코드 병합
SELECT GROUP_CONCAT(r.receiveUserId ORDER BY r.receiveUserId ASC SEPARATOR ', ') AS receiveUserId
FROM (SELECT receiveUserId
FROM Friends
WHERE giveUserId = 1) AS r
WHERE r.receiveUserId IN (SELECT giveUserId
FROM Friends
WHERE receiveUserId = 1)
;
5. userId가 참가중인 모든 일정을 출력
SELECT * FROM Channels WHERE userId = 2;
6. postId에 참여중인 모든 유저를 출력
SELECT * FROM Channels WHERE postId = 1;
7. WHERE절 추가 삽입 및 SubQuery로 병합
SELECT DISTINCT userId
FROM Channels
WHERE postId IN (SELECT postId
FROM Channels
WHERE userId = 2)
AND userId != 2
ORDER BY userId ASC
;
8. GROUP_CONCAT으로 변경
SELECT GROUP_CONCAT(u.userId ORDER BY u.userId ASC SEPARATOR ', ') AS scheduleUsers
FROM (SELECT DISTINCT userId
FROM Channels
WHERE postId IN (SELECT postId
FROM Channels
WHERE userId = 2)
AND userId != 2
ORDER BY userId ASC ) AS u
;
9. 코드 병합 종료
SELECT
(SELECT GROUP_CONCAT(r.receiveUserId ORDER BY r.receiveUserId ASC SEPARATOR ', ')
FROM (SELECT receiveUserId
FROM Friends
WHERE giveUserId = 1) AS r
WHERE r.receiveUserId IN (SELECT giveUserId
FROM Friends
WHERE receiveUserId = 1)) AS friendUsers,
(SELECT GROUP_CONCAT(u.userId ORDER BY u.userId ASC SEPARATOR ', ')
FROM (SELECT DISTINCT userId
FROM Channels
WHERE postId IN (SELECT postId
FROM Channels
WHERE userId = 1)
AND userId != 1
ORDER BY userId ASC ) AS u) AS scheduleUsers
;
== Socket
☆
req.app.get("io").of("/room").emit("newRoom", {
postId, title, postImg, currentMember: 1, maxMember, startDate, endDate, place
});
- req.app.get("io") : Socket.IO에서 전달한 IO객체를 불러온다
- .of("/room") : "/check" 네임스페이스에 접속한다.
- // .to(req.params.id) : req.params.id에 해당하는 방에 접속한다.
- .emit("newRoom", {}) : newRoom이라는 이벤트명으로 {} 객체를 전달한다.
'항해99 > 필기노트' 카테고리의 다른 글
[필기노트] PROCEDURE, 인증메일 구성방법 (0) | 2021.08.04 |
---|---|
[필기노트] Docker, 실전 프로젝트 SQL (0) | 2021.08.03 |
[필기노트] 실시간 통신 논리구조, Socket (0) | 2021.07.30 |
[필기노트] SQL, 5개 Table 조회 (0) | 2021.07.29 |
[필기노트] 카카오맵, API 구현 (0) | 2021.07.28 |