-- 게시글 상세 SQL
SELECT p.postId, p.userId, u.nickname, p.title, p.artist, p.showDate, p.description, p.img,
CASE WHEN p.postId IN (SELECT postId FROM Favorites where userId = 1) then "TRUE" else "FALSE" end as favorite
FROM Posts AS p
JOIN Users AS u
on p.userId = u.userId;
- 출력 데이터 p.postId, p.userId, u.nickname, p.title, p.artist, p.showDate, p.description, p.img, favorite 유무
- Favorites 테이블에서 해당하는 지정하는 userId가 즐겨찾기한 Favorites.postId를 모두 출력한다.
- 만약 Posts.postId가 Favorites.postId에 해당할 경우 TRUE, 아니면 FALSE를 출력한다.
- TRUE, FALSE를 나타내는 컬럼의 이름은 favorite로 명명
- Posts, Users 테이블을 조인하고, userId가 같은 경우만 출력한다.
- 곱연산으로 인해 중복된 데이터들을 삭제시키기 위해 on Posts.userId = Users.userId를 사용한다.;
SELECT p.postId, p.userId, u.nickname, p.title, p.artist, p.showDate, p.description, p.img,
CASE when p.postId IN (SELECT postId FROM Favorites where userId = 1) then "TRUE" else "FALSE" end as favorite
FROM Posts AS p
JOIN Users AS u
on p.userId = u.userId and p.postId = 3;
- 위에 검색한 데이터 중 Posts.postId가 3인 값만 출력한다.
// TODO undefined 일때는 length가 사용되지 않는다.
- Object.keys(res.locals.user.userId).length : 값이 존재하지 않기 때문에 undefiend로 에러가 발생한다.
- Object.keys(res.locals).length : 빈 배열 객체로 에러가 발생하지 않는다.
select postId, img,
case when postId IN (select postId from Favorites where userId = 1) then "TRUE" else "FALSE" end as favorite
from Posts
where title like '%423%';
- CASE WHEN : 일반적인 삼항연산자
- %423% : title 안에 423이라는 문자가 포함되어 있는지 확인
select postId, img,
case when postId IN (select postId from Favorites where userId = 2) then "TRUE" else "FALSE" end as favorite
from Posts;
- 모든 Post를 가지고 온다.
-- Favorites에 해당하는 Posts들을 출력
1. Favorites 테이블에서 userId에 해당하는 값을 출력한다.
2. Favorites 테이블에서 userId로 검색된 값중 postId를 기준으로 Posts를 출력한다.
1. SELECT postId FROM Favorites WHERE userId = 1;
2.
SELECT postId, img
FROM Posts
WHERE postId IN (SELECT postId FROM Favorites WHERE userId = 1);
//TODO socket의 안전성을 생각한다면 nickname과 userId를 합쳐서 JWT 토큰을 만들어야 하는것 아닐까?
-- 주어진 목표를 전부 달성한 후 진행해야할 사항
- 자바스크립트의 비동기 방식 학습 : 순차접근 3
- Node.js 교과서 학습 : 예습 5
- Socket 통신 학습 : 기능추가의 만족감 1
- 테스트 코드 작성 : 프로젝트의 완성 2
- ORM 사용법 학습 : 코드 추상화 4
게시글 수정 실패
- API문서 형식대로 데이터 전달이 되지 않아 오류 발생
게시글 삭제, 댓글 삭제 실패
- React에서 데이터 전달이 되지 않음
== Socket ==
소켓 : 데이터를 송수신하기 위해 반드시 거쳐야 하는 연결부
패킷 : 소켓을 통해 송수신하는 데이터 덩어리
Socket.io
- 웹 소켓을 포함해, 웹소켓을 사용하지 못하는 환경에서도 웹소켓과 비슷하게 사용 가능하도록 구현해놓은 라이브러리
$ npm install socket.io
app 객체 : express로 기존처럼 API를 개발하거나 프론트엔드 파일을 서빙하는 용도로 사용
io 객체 : 기존처럼 클라이언트와 데이터를 주고 받는 용도로 사용
// Socket은 Express와 별도로 움직여야 하는데 데이터 통신은 무엇을 기준으로 하는가?
-- Node.js Socket
io.on("connection", (socket) => {} );
- 소켓 연결 이벤트 핸들링
socket.on("disconnect", () => {} )
- 연결이 종료되었을때 자동으로 실행되는 이벤트
socket.emit("<String>", {} )
- <String>에 해당하는 이벤트를 실행한다.
socket.on("<string>", (data) => {} );
- <String>에 해당하는 이벤트를 수신받는다.
- 클라이언트로 부터 메시지를 수신시 실행한다.
socket.on("close", () => {} );
- 에러 발생시 실행되는 이벤트
--Node.js ws
웹 소켓
- 이벤트 기반으로 작동
- 실시간으로 데이터를 전달받으므로 항상 대기하고 있어야 한다.
- connection 이벤트는 클라이언트가 서버와 웹 소켓 연결을 맺을 때 발생
- req.headers['x-forwarded-for'] || req.connection.remoteAddress
- 클라이언트의 IP를 알아내는 유명한 방법
- proxy-addr 패키지를 사용해도 가능하다.
웹 소켓의 상태
- OPEN일 때만 에러 없이 메시지를 보낼 수 있다.
- CONNECTING (연결 중)
- OPEN (열림)
- CLOSING (닫는 중)
- CLOSED (닫힘)
WebSocket.Server({http.listen});
- ws 서버에 http 객체를 접속한다.
wss.on("connection", (ws,request)=> {} )
- 웹 소켓 연결시 사용
ws.on("message", (message) => {} )
- 클라이언트로부터 message 수신시 실행
ws.on("error", (error) => {} )
- 웹 소켓 연결 중 문제가 생겼을 때 실행
ws.on("close", () => {} )
- 클라이언트와 연결이 끊어졌을 때 발생
ws.interval = setInterval( () => {}, 2000 )
- 2초마다 클라이언트로 메시지를 전송한다.
-- ws html
new webSocket("ws://localhost:3000");
- localhost:3000 포트로 webSocket을 접속한다.
webSocket.onopen = function () {}
- 웹 소켓과 연결한다.
webSocket.onmessage = function (event) {}
- 웹 소켓에서 수신받을 경우 실행된다.
webSocket.send(<String>)
- 클라이언트에서 서버로 데이터를 전송한다.
'항해99 > 필기노트' 카테고리의 다른 글
[필기노트] 2021-07-20 SQL, TRIGGER (0) | 2021.07.21 |
---|---|
[필기노트] 2021-07-19 SQL UNION, CONCAT_GROUP, CASE (0) | 2021.07.20 |
[필기노트] 2021-07-17 SQL, Cookie, Sequelize Migrate (0) | 2021.07.18 |
[필기노트] 2021-07-16 프로젝트의 목표, DB 생성 및 설정, 쿠키 (0) | 2021.07.17 |
[필기노트] 2021-07-15 SQL, 면담, Socket, session (0) | 2021.07.16 |