== 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", () => {} );
- 에러 발생시 실행되는 이벤트
1. 댓글 작성하면 최근에 작성한 댓글이 위로 올라오게
2. 검색시 title, artist 필드 2곳에서 전부 검색이 가능하도록 설정
3. Search, getPosts, comment, Favorites 끊어서 가져오기
- 리미트 start limit를 프론트에서 지정
-- 1. 댓글 작성하면 최근에 작성한 댓글이 위로 올라오게
SELECT c.commentId, c.userId, u.nickname, c.comment
FROM Comments AS c
JOIN Users AS u
ON c.userId = u.userId AND c.postId = 11
ORDER BY commentId DESC;
- ORDER BY를 붙여 내림차순으로 코멘트를 가져온다.
-- 2. 검색시 title, artist 필드 2곳에서 전부 검색이 가능하도록 설정
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 '%iu%' or artist like '%iu%';
- 검색 데이터를 title과 artist 기준으로한다
- 대소문자는 구별하지 않는다.
만약 대소문자를 구별하고 싶다면?
select postId, img,
case when postId in (select postId from Favorites where userId = 1) then "TRUE" else "FALSE" end as favorite
from Posts
where BINARY(title) like '%IU%' or BINARY(artist) like '%IU%';
- title 컬럼을 바이너리화 시켜 대소문자를 구별하도록 설정한다.
-- 3.
SELECT 문의 마지막에 LIMIT (시작 인덱스, 가져올 갯수)
-SEARCH
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 '%iu%' OR artist LIKE '%iu%'
LIMIT 0,5;
Joi.min()
- String에서는 문자의 갯수를 확인
- Number에서는 숫자의 크기를 나타냄
JSON에서 DATE 속성을 넣을 때는 숫자로 현재의 시간을 나타내야한다.
SELECT c.commentId, c.userId, u.nickname, c.comment
FROM Comments AS c
JOIN Users AS u
ON c.userId = u.userId AND c.postId = 3
ORDER BY commentId DESC
LIMIT 0,1;
-- Socket
Socket.IO
- 폴링 방식으로 서버와 연결
- 폴링 연결 후, 웹 소켓을 사용할 수 있다면 웹 소켓으로 업그레이드 한다.
- 웹 소켓을 지원하지 않는 브라우저는 폴링 방식으로 실행
app.set('io',io)
- 라우터에서 io 객체를 쓸 수 있게 저장해둔다
- req.app.get('io')로 접근할 수 있다.
io.of
- Socket.IO에 네임스페이스를 부여하는 메서드
- of 메서드를 사용하면 다른 네임스페이스를 만들어 접속할 수 있다.
- 같은 네임스페이스끼리만 데이터를 전달한다.
room.on
- io.of('/room')으로 설정해 /room 네임스페이스에 이벤트 리스너를 붙여준 것
chat.on
- io.of('/chat')으로 설정해 /chat 네임스페이스에 이벤트 리스너를 붙여준 것
- 네임스페이스 접속 시 socket.join 메서드가 있고, 접속 해제시 socket.leave 메서드가 있다.
- 각각 방에 들어가고 방에서 나가는 메서드
io.use
-미들웨어를 장착할 수 있다.
- 모든 웹 소켓 연결 시 마다 실행되도록 설정하는 것
- socket.request 객체 안에 socket.request.session 객체가 생성된다.
socket.to
- 특정 위치에 데이터를 보낼 수 있다.
- 세션 미들웨어와 socket.IO를 연결할 경우 웹 소켓에서 세션을 사용할 수 있다.
axios
- 브라우저에서 axios 요청을 보낼 때는 자동으로 쿠키를 같이 넣어서 보낸다.
- 서버에서 axios 요청을 보낼때는 쿠키가 같이 보내지지 않는다.
- 따라서 express-session이 요청자가 누구인지 판단할 수 없다.
- 요청 헤더에 Session Cookie를 넣을 경우 express-session이 요청자가 누구인지 판단할 수 있다.
express-session
- 세션 관리용 미들웨어
- 로그인 등의 이유로 세션을 구현하거나 특정 사용자를 위한 데이터를 임시적으로 저장해둘 때 사용한다.
- 세션은 사용자별로 req.session 객체 안에 유지된다.
-- 튜터님 상담
미들웨어를 로그인 이외 사용자들의 정보를 수집하는 것을 구성해보는게 어떨까?
프로젝트 스트럭쳐를 이해하기
코드의 작성은 글을 읽는것 처럼 각 기능을 어떻게 만들었다는걸 확실하게 이해할 수 있도록 작성해야한다.
단순한 기능을 추가하는 것 보다 코드 고도화를 추구해 지금의 코드를 잘 짜는게 중요하다.
실시간 스트림 서비스를 구현해보는건 어떨까?
내가 뭘 잘하는지 확실히 하고 가는게 중요
- Docker
이미지 빌드 > 확인
1. 로컬에서 확인
2. 볼륨
- 도커에 있는 파일이랑 내 파일이랑 동일하게 연동
- 노드 핫 리로드랑 연동하면 개발하면서 도커에 수정할 수 있다.
- 깃과 동일하게 수정된게 바로 반영된다 .
- 볼륨 옵션알아보기
3. DB 올리기
4. 모든과정에 하나로만듬 / 도커 컴포우즈
테스트 프레임워크를 구현해보는 것
- Jest, Supertest
프리커밋 : 린트를 넣으면 린팅이 되서 올라간다.
- 코드가 모두 통일된 형태로 올라간다.
'항해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-14 SQL SubQuery, JOIN, Socket, ws (0) | 2021.07.15 |