블로그 express + mongodb 로 만들기

블로그 만들기(9) - 코드정리 및, 코드 세분화하기

Uijeong 2023. 12. 26. 03:26

1. 로그아웃 기능

2. 회원정보 수정 예외처리

3. 코드들 성능개선 및 예외처리, routes 폴더에 파일 세분화하기

 

로그아웃을 하는 기능이 필요할것 같아서 만들어 봤습니다.

 

비 로그인 상태일 때는 nav의 탭에 로그인이

로그인 상태일 때는 nav의 탭이 로그아웃으로 변하면 좋아 보입니다.

 

ejs 파일이라 if 문을 이용하면 쉽게 구현 가능할것 같네요

 

 nav를 include 형식으로 불러오므로, ejs 파일에서 여기서 userId를 사용하려면 nav를 사용하는 모든 ejs 파일에

req.session.userId를 보내줘야 하는데

그냥 사용하기 편하게 미들웨어 이용해서 사용하려면

 

이제 로그아웃 기능을 살펴보면, 로그아웃 버튼을 눌렀을때 /logout 으로 get 요청을 보내고

server.js에서 처리하면 될것 같습니다.

 

이때 destroy((err)=>{}) 함수를 사용하면 session을 파괴할수 있습니다.

근데 앞에 if문으로 뭘 써뒀죠?

req.session.userId 가 존재할 경우만 로그아웃을 수행하도록 간단한 예외처리를 해뒀습니다.

이러면 직접 로그아웃 하는 경우만 로그아웃이 될 것 같네요.

 

로그아웃 기능은 구현 끝입니다.

 

회원정보 수정할때 다른사람이 수정하지 못하고, 현재 로그인 해있는 사람만 수정 가능하도록 하면 좋을것 같네요.

 

이렇게 하면 될것 같은데

각 필드를 만약에 비운 상태로 업데이트 할 경우를 대비해야 할것 같은데요

if 문을 써서 세분화 해주면 좋을것 같습니다.

 

이렇게 필드에 값이 채워져 있으면, 수정하기 버튼을 클릭했을때 req.body.name 에 필드 값이 들어오고

필드값이 존재할경우, updateDate= {} 변수에 추가해주고

updateOne() 함수를 사용해서 db에 저장된 값을 수정해주면 되겠네요.

 

 

 

잘 동작하네요.

 

이제

 

3. 코드들 성능개선 및 예외처리, routes 폴더에 파일 세분화하기 할 차례입니다.

 

먼저 파일을 분류하자면

1. 게시판 기능 관련

2. 회원 기능 관련

3. 프로필 관련

 

이렇게 크게 3개로 분류해주면, 기능별로 깔끔하게 정리될것 같습니다.

posts.js, users.js, profile.js 이렇게 3개로 분류해주고

 

기능을 만드면서 사용했던 require, app.use 들 추가해주고

//dotenv 설정
require('dotenv').config();
const express = require('express');
const bcrypt = require('bcrypt');
const session = require('express-session');
const { MongoClient, ObjectId } = require('mongodb');

const app = express();

// bodyparser 설정  
app.use(express.urlencoded({ extended: true })); // 폼 데이터 처리
app.use(express.json()); // JSON 데이터 처리


app.use(session({
    secret: process.env.SESSION_SECRET, // 세션 암호화 키
    resave: false, // 세션 데이터가 변경되지 않았을 때도 세션 저장소에 다시 저장할지 여부
    saveUninitialized: true, // 세션이 초기화되지 않은 상태로 저장할지 여부
    cookie: {
      secure: false, // HTTPS를 사용할 경우 true로 설정
      maxAge: 1000 * 60 * 60 // 쿠키 유효 시간 (예: 1시간)
    }
  }));

// 세션 확인 로직 미들웨어
app.use((req, res, next) => {
    res.locals.userId = req.session.userId;
    next();
});

// ejs 설정
app.set('view engine', 'ejs');
// 정적 파일 제공을 위한 내장 미들웨어 설정
app.use(express.static('public'));

 

 

module.exports = function(db){

return router;

}

각 모듈에서 이렇게 export 해주면

server.js 에서 app.use(require('./routes/posts')(db)); 이런식으로 코드 등록해주면 된다고 하네요.

routes 하는 방법 몰라서 gpt 한테 물어봤습니다.

 

1. 기능을 분류한다

2. 모듈화해서 export 한다

3. server.js 에 가져와서 사용한다

 

주요사항은 function(db) { return router; } 형태를 사용하는 이유는 

데이터베이스 연결을 라우트 모듈과 공유하기 위해서 그렇다고 합니다.

 

posts.js

 

users.js

 

profile.js

 

 

server.js

 

이렇게 간략하게 코드를 세분화 했습니다.

이제 기능 새로운 기능 만들때면, routes 파일에 새로 파일 하나 만들어서 세분화 시켜두면

코드 유지 보수성 측면에서 도움이 될것 같네요

앞으로는 이런식으로 개발해 보겠습니다. 한가지 배웠네요

 

오늘 포스팅은 여기까지하고, 다음 포스팅은 게시글에 작성 가능한 댓글 기능을 개발해 보도록 하겠습니다.