2022. 7. 10. 23:55ㆍ항해99 일지
이번 WIL의 키워드 : 실전 프로젝트를 진행하며 기술적으로 막혔던 부분은 무엇인가요? 해결했다면 어떻게 해결했는지 과정을 작성
이번 주차는 특별히 새로운 기능을 추가하는 것 보다는 프로젝트에서 가장 핵심이라고 할 수 있는 것 중 하나인 워크스페이스에 관해
고민해 본 주차였다. 원래 기본 CRUD는 구현해놓은 상태에서 필요한 기능들을 구현해야 할 때마다 그때 그때 추가하려고 했는데
워크스페이스가 있어야하는 시점이 되었다.
워크스페이스란 협업 툴에서 팀원들끼리 공유하는 공간을 뜻하는데 소소한 문제부터 워크스페이스의 접근 권한에 관해 미들웨어를 하나 추가하는 문제에대해 생각했다.
1. 소소한 문제 - 스키마 구성
워크스페이스 스키마를 구상하는 데 있어서 어떤 요소들이 들어가야 할지 정해야했다.
이름, 만든 사람, 팀원 목록정도만 정했다.
워크스페이스 이름은 만든사람만 다르면 중복된다고 생각했다.
그래서 워크스페이스 이름은 (만든사람이름+워크스페이스이름) 으로 DB에 저장하기로 했다. 이렇게 저장할 경우 워크스페이스 이름이 중복되더라도 만든사람이름까지 같을 수 없으므로 중복될 수 없다.
팀원 목록은 이름부터 배열로 했어야 할 것 같아서 일단 배열로 선언해놓고 어떻게 추가해나갈지 고민했는데
memberList: [new mongoose.Schema({memberEmail: String, memberName: String})]
이렇게 구성한 후에 이런 형식으로 배열에 추가하고 저장해주었다.
myWorkSpace.memberList.push({
memberEmail: existCheck.userEmail,
memberName: existCheck.userName,
});
myWorkSpace.save();
그리고 그동안 배열 내 값을 확인할 때 익숙한 반복문 식으로만 확인하곤 했는데 부끄럽지만 이번에 처음으로 filter를 사용하여 존재여부를 확인하거나 삭제기능에 사용했다.
const existMember = myWorkSpace.memberList.filter(
(memberInfo) => memberInfo.memberEmail === userEmail
);
2. 워크스페이스 접근권한 미들웨어 추가
해당 워크스페이스 멤버인지 아닌지를 확인하고 접근 권한을 주기위해 미들웨어를 추가했다.
지금까지는 authMiddleware 정도를 이용해서 로그인한 유저만 서비스를 이용하는데 쓰였다.
또 본인이 쓴 글만 수정, 삭제가 가능한 정도로 API에 조건을 추가해서 비교하는정도였다면 워크스페이스 내 멤버가 얼마나 될지도 모르는 상황에서 마냥 반복문으로 확인할 수도 없는 노릇이였다. 그래서 auth미들웨어가 대문정도라면 현관문 느낌으로 통과해야하는 미들웨어를 떠올렸다. 라우터에 두 미들웨어를 모두 장착했다. 로그인과 워크스페이스 멤버여야 권한이 생긴다.
//클라이언트에서 API콜을 받았을때 현재 접속해있는 유저가 해당 워크스페이스의 멤버인지 아닌지를 판별하는 middleware 함수입니다.
const workSpace = require("../schemas/workSpace");
module.exports = async (req, res, next) => {
try {
const { workSpaceName } = req.params;
const userEmail = res.locals.User.userEmail;
const existWorkSpace = await workSpace.findOne({ name: workSpaceName });
if (existWorkSpace === null) {
res.status(400).send({
ok: false,
errorMessage: "해당 워크 스페이스는 존재하지 않습니다",
});
return;
}
const existMember = existWorkSpace.memberList.filter(
(memberInfo) => memberInfo.memberEmail === userEmail
);
if (!existMember.length) {
res.status(400).send({
ok: false,
errorMessage: "본 유저는 멤버가 아닙니다.",
});
return;
}
next();
} catch (error) {
console.log("member check error", error);
res.status(400).send({
ok: false,
errorMessage: "서버에러: isMember 체크 실패",
});
return;
}
};
3. 소켓 join room 이벤트 정해져있지 않은 방 이름 설정하기
개인메시지 room 이름을 설정해야하는데 두 사람이 공통의 이름으로 들어가는 것이 필요해서
그저 바로 떠오른 생각으로 두 유저의 이름을 조합해서 가나다 순으로 정렬해서 방 이름을 설정해서 클라이언트 측에 emit하는
이벤트를 구성했다.
'항해99 일지' 카테고리의 다른 글
77/99 실전프로젝트 막바지 코드 리팩토링 (0) | 2022.07.24 |
---|---|
74/99 도커 빌드 (맥 - ubuntu 호환) / nginx이용 https (실패) (0) | 2022.07.21 |
56/99 트러블슈팅? mongoError, url 중복 (0) | 2022.07.03 |
49/99 클론코딩 주차 - Socket.io의 시작 (0) | 2022.06.26 |
42/99 첫 협업을 마무리하며. (0) | 2022.06.19 |