[Feat] 9주차 미션_누누 - #65
Conversation
wldmsdl7
left a comment
There was a problem hiding this comment.
전체적으로 워크북 기반으로 잘 구현해주신 것 같아 !
다만 워크북에서는 tsoa 기반 인증 구조를 사용하고 있는데,
현재 일부 API들은 app.get으로 직접 라우터를 등록하고 있어 인증 및 라우팅 방식이 조금 혼재된 것 같아.
@Security("jwt")와 Controller 기반 구조로 통일해주면 인증 흐름과 Swagger 문서화까지 더 일관성 있게 가져갈 수 있을 것 같아 ~
어려웠던 인증 로직일 수 있는데, 잘해준 것 같아 ~ 수고했어 !
There was a problem hiding this comment.
이전 주차에서 tsoa를 적용하며 라우터들을 Controller 단으로 분리해두었는데,
현재 일부 API들은 tsoa를 사용하지 않고 app.get으로 직접 라우터를 등록하고 있네 .. !!
워크북 코드를 기반으로 작성했더라도, 라우팅 방식은 하나로 통일해서 정리해두는 게 좋아 ~
| let user = await prisma.user.findFirst({ | ||
| where: { | ||
| email, | ||
| }, | ||
| }); | ||
|
|
||
| if (!user) { | ||
| user = await prisma.user.create({ | ||
| data: { | ||
| email, | ||
| password: "GOOGLE_LOGIN_USER", | ||
| name: profile.displayName, | ||
| gender: "MALE", | ||
| birthDate: new Date("1970-01-01"), | ||
| address: "추후 수정", | ||
| phoneNumber: null, | ||
| }, | ||
| }); | ||
| } |
There was a problem hiding this comment.
현재 googleVerify 내부에서 사용자 조회 및 생성 로직가지 함께 처리하고 있어서 Strategy 계층이 인증 역할 외의 책임도 함께 가지고 잇는 것 같아.
지금 구조도 동작에는 문제가 없지만, OAuth Strategy에서는 인증 결과만 전달하고, 실제 회원 조회/생성 로직은 Service 단으로 분리해주면 계층 역할이 더 명확해질 것 같아.
특히 현재는 prisma.user.findFirst와 같은 함수까지 호출하고 있어 DB 접근 책임까지 함께 포함되어 있는 것 같아.
| let user = await prisma.user.findFirst({ | ||
| where: { | ||
| email, | ||
| }, | ||
| }); | ||
|
|
||
| if (!user) { | ||
| user = await prisma.user.create({ | ||
| data: { | ||
| email, | ||
| password: "KAKAO_LOGIN_USER", | ||
| name: name, | ||
| gender: "MALE", | ||
| birthDate: new Date("1970-01-01"), | ||
| address: "추후 수정", | ||
| phoneNumber: null, | ||
| }, | ||
| }); | ||
| } |
| const name = profile.displayName || "카카오유저"; | ||
|
|
||
| if (!email) { | ||
| throw new Error("카카오 계정 이메일이 없습니다."); |
There was a problem hiding this comment.
여기도 커스텀 에러를 만들어 전역으로 에러 핸들링을 해주는 게 좋지 않을까 ?
| async (payload, done) => { | ||
| try { | ||
| const user = await prisma.user.findFirst({ | ||
| where: { | ||
| id: BigInt(payload.id), | ||
| }, | ||
| }); |
| const isLogin = passport.authenticate("jwt", { session: false }); | ||
|
|
||
| app.get("/mypage", isLogin, (req, res) => { | ||
| const user = req.user as User; |
There was a problem hiding this comment.
지금처럼 Express 라우터에 직접 인증 미들웨어를 붙이는 방식보다는 tsoa 컨트롤러에서 @Security("jwt")를 사용하는 방식이 더 좋을 것 같아 !
📂 관련 이슈
🛠️ 작업 사항
userId = 1→const user = req.user as User수정@Request데코레이션 추가auth.middleware.ts에expressAuthentication함수 추가tsoa.json에"authenticationModule": "./src/middlewares/auth.middleware.ts"추가@Security("jwt")데코레이션 추가📸 관련 이미지 (스크린샷 또는 동영상)
정보 수정 API
로그인 보호
💬 기타 설명