일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 앱개발
- 쪽지기능
- 노드개발자
- 프로그래머스
- springboot
- 코테
- Python
- 코딩테스트
- 코딩
- 자바
- 백준 2667
- 이메일인증
- 알고리즘
- Gmail인증
- SWEA
- 실버5
- 1260
- 노드프로젝트
- static final
- Java
- nodejs
- email인증
- 깊이우선탐색
- 노드개발
- 너비우선탐색
- DFS
- BFS
- 브실이의입시전략
- 백준
- 파이썬
- Today
- Total
데옹의 블로그
Node.js 로 간단 쪽지 기능 구현 (1) 본문
UMC 1기부터 이어진 프로젝트를 계속 진행 중인디
socket.io를 사용하여 DM 기능을 넣으려 했는데 잘 안되는 부분도 있었고, 우리가 원하는 기능을 구현하기엔 시간이 좀 더 걸릴 것 같아서 그냥 쪽지를 구현해봤습니다!
처음에 생각한 기능은 엄청 간단한 것들이었고.. 결과물 또한 간단한 것 같네야;
- 쪽지 방 (socket에선 room?) 을 생성
- 쪽지 방 확인하기 (카톡 방 처럼 리스트로 보이게 하려 했음)
- 쪽지 보내기
- 쪽지 확인하기
- 쪽지 방 나가기
쉽게 쉽게 갔습니다. 오랜만이라 좀 뇌정지 올 때도 있었지만 ㅠ
들어갑니다..
우선 DB는 아래와 같이 구성이 되어있었어요.
- Msg - 쪽지 내용(text)를 저장하는 곳
- MsgRoom - 쪽지 방 정보를 저장하는 곳
DB에 대해서 자세히는 말하기 힘들지만, 두개로 나눈 이유는 마지막 delete 연산을 위해서 나누었습니다.
일단은 route.js 는 이렇게 구성을 했습니다.
// 1. 쪽지 방 생성
app.post("/msg/:userIdx", msgController.createMsgRoom);
// 2. 쪽지 방 확인
app.get("/msg/room/:userIdx", msgController.getMsgRoom);
// 3. 쪽지 보내기
app.post("/msg/room/:roomId", msgController.sendMsg);
// 4. 쪽지 확인
app.get("/msg/roomcheck/:userIdx", msgController.getMsg);
// 5. 쪽지 방 삭제
app.delete("/msg/deleteroom/:userIdx", msgController.deleteMsg);
URL은 그냥 임의로 했어요.
아직 팀원들에게 코드 리뷰를 제대로 하지 않은 상태라서 팀장님이랑 상의 후 짜야하는데 일단은 테스트가 필요하니까 임의로 넣어두었습니다.
여기부터 하나의 API씩 진행을 해보겠습니다.
{ Controller - Service(create, update, delete logic) - Provider(read) - Dao) 로 구성돼서 좀 깁니다.
1. 쪽지 방 생성
- Controller.js
// 쪽지 방 생성
exports.createMsgRoom = async function (req, res) {
const userIdx = req.params.userIdx; // 나중에 jwt로 변경
const matchIdx = req.body.matchIdx;
if(!matchIdx) return res.send(response(baseResponse.ERRORNAME));
// 여기엔 에러를 만들어 넣으면 됩니다.
// JWT를 사용할 것이니 userIdx가 비어 있지는 않겠죠
const roomId = userIdx + '_' + matchIdx; // roomId ex) '1_2'
const result = await msgService.createMsgRoom(userIdx, matchIdx, roomId);
return res.send(baseResponse.SUCCESS);
}
기본적인 쪽지 방 생성입니다. 저는 roomId를 보기 편하기 위해
- 방을 만든 사람의 식별자_방에 참여한 사람의 식별자
로 설정하기로 했습니다. 그래서 저렇게 userIdx와 matchIdx를 붙여서 새로 만든 뒤 데이터를 넘겨줄거에요.
data type은 varchar() 입니다.
여기선 그냥 간단하게 넘어가요.
- Service.js
// 쪽지 방 생성
exports.createMsgRoom = async function (userIdx, matchIdx, roomId) {
try {
const params = [userIdx, matchIdx, roomId];
const connection = await pool.getConnection(async (conn) => conn);
const createRoomResult = await msgDao.createMsgRoom(connection, params);
connection.release();
return response(baseResponse.SUCCESS);
}
catch (err) {
logger.error(`App - createMsgRoom Service error\n: ${err.message}`);
return errResponse(baseResponse.DB_ERROR);
}
}
우선 받아온 데이터를 파라미터 배열에 넣어줍시다. 당연히 쿼리문에 넣을 순서 그대로 넣어야해요.
여기도 딱히 특별한게 없네요. 그냥 params라는 객체에 파라미터들을 넣어서 Dao로 보내는 비즈니스 로직일 뿐입니다.
Dao.js는 너무나도 간단한 INSERT문이기 때문에 뺍니다.
2. 쪽지 방 확인
이거도 너무 간단한데요. 그냥 GET입니다.
userIdx에 내가 속해있는지만 보면 되는 간단한 Query 하나면 끝날 일이죠..
- Controller.js
// 쪽지 방 조회
exports.getMsgRoom = async function (req, res) {
const userIdx = req.params.userIdx; // JWT로 변경 예정
const result = await msgProvider.getMsgRoom(userIdx);
return res.send(response(baseResponse.SUCCESS, result));
}
Controller에선 딱히 말할 것이 없습니다. 오류가 난다면.. DB 에러가 끝일테니까요.
- Provider.js
// 쪽지 방 확인
exports.getMsgRoom = async function (userIdx) {
try {
const params = [userIdx, userIdx];
const connection = await pool.getConnection(async (conn) => conn);
const getMsgRoomResult = await msgDao.getMsgRoom(connection, params);
connection.release();
return getMsgRoomResult;
} catch (err) {
logger.error(`getMsgRoom Provider error\n: ${err.message}`);
return errResponse(baseResponse.DB_ERROR);
}
}
여기도 할 말은 없습니다. 그냥 userIdx를 두 번 쓰게 되었다는거?ㅋ
근데 왜 두개를 썼는가 하면 Dao.js 파일에서 쿼리문을 이렇게 작성했습니다.
SELECT roomId
FROM MessageRoom
WHERE userIdx = ? OR matchIdx = ?;
내가 들어가있는 방에 userIdx가 나일지 matchIdx가 나일지 모르기 때문에 모두 불러와야겠죠.
3. 쪽지 보내기
여기까진 1시간 내로 다 끝낼 수 있습니다. 너무 쉽거든요.
- Controller.js
// 쪽지 보내기
exports.sendMsg = async function (req, res) {
const roomId = req.params.roomId;
const {senderIdx, text} = req.body;
const result = await msgService.sendMsg(roomId, senderIdx, text);
return res.send(baseResponse.SUCCESS);
}
- Service.js
// 채팅 보내기
exports.sendMsg = async function (roomId, senderIdx, text) {
try {
const params = [roomId, senderIdx, text];
const connection = await pool.getConnection(async (conn) => conn);
const sendMsgResult = await msgDao.sendMsg(connection, params);
connection.release();
return response(baseResponse.SUCCESS);
}
catch (err) {
logger.error(`App - sendMsg Service error\n: ${err.message}`);
return errResponse(baseResponse.DB_ERROR);
}
}
Dao.js 는 간단한 INSERT 입니다.
여기까지 쓰고 다음 게시물로 이동하도록 하겠습니다..너무 길어져서 가독성 떨어지는 것 같거든요.
'NodeJS' 카테고리의 다른 글
Node.js 로 간단 쪽지 기능 구현 (2) (2) | 2022.08.25 |
---|