본문 바로가기

clone toy projects/node_express_sns

팔로잉과 해시태그

다른 사용자를 팔로우 하는 기능을 만들기 위해 routes/user.js와 controllers/user.js를 작성합니다.

POST /user/:id/follow 라우터입니다. :id 부분이 req.params.id가 됩니다. 

 

먼저 팔로우할 사용자를 데이터베이스에서 조회한 후,

 Sequelize에서 추가한 addFollowing 메서드로 현재 로그인한 사용자와의 관계를 지정합니다.

 팔로잉 관계가 생겼으므로 req.user에도 팔로워와 팔로잉 목록을 저장합니다.

 앞으로 사용자 정보를 불러올 때는 팔로워와 팔로잉 목록도 같이 불러오게 됩니다.

 req.user를 바꾸려면 deserializeUser를 아래와 같이 조작해야 합니다

세션에 저장된 아이디로 사용자 정보를 조회할 때 팔로잉 목록과 팔로워 목록도 같이 조회합니다. 

include에서 계속 attributes를 지정하고 있는데, 이는 실수로 비밀번호를 조회하는 것을 방지하기 위해서입니다.

Note: deserializeUser 캐싱하기
라우터가 실행되기 전에 deserializeUser가 먼저 실행됩니다. 

따라서 모든 요청이 들어올 때마다 매번 사용자 정보를 조회하게 됩니다. 

 

서비스의 규모가 커질수록 더 많은 요청이 들어오게 되고, 그로 인해 데이터베이스에도 더 큰 부담이 주어집니다. 

따라서 사용자 정보가 빈번하게 바뀌는 것이 아니라면 캐싱을 해두는 것이 좋습니다. 

 

다만, 캐싱이 유지되는 동안 팔로워와 팔로잉 정보가 갱신되지 않는 

단점이 있으므로 캐싱 시간은 서비스 정책에 따라 조절해야합니다.

실제 서비스에서는 메모리에 캐싱하기보다는 레디스 같은 데이터베이스에 사용자 정보를 캐싱합니다. 

 

 

팔로잉/팔로워 숫자와 팔로우 버튼을 표시하기 위해 routes/page.js를 수정합니다.

 

로그인한 경우에는 req.user가 존재하므로 팔로잉/팔로워 수와 팔로워 아이디 리스트를 넣습니다

팔로워 아이디 리스트를 넣는 이유는 팔로워 아이디 리스트에 게시글 작성자의 아이디가 존재하지 않으면

팔로우 버튼을 보여주기 위해서입니다.

 

 

 

 

해시태그로 조회하는 GET /hashtag 라우터입니다. 

 

 

쿼리 스트링으로 해시태그 이름을 받고, 해시태그 값이 없는 경우 메인 페이지로 돌려보냅니다.

 

데이터베이스에서 해당 해시태그를 검색한 후, 

해시태그가 있다면 시퀄라이즈에서 제공하는 getPosts 메서드로 모든 게시글을 가져옵니다. 

 

가져올 때는 작성자 정보를 함께 조회합니다. 

조회 후 메인 페이지를 렌더링하면서 전체 게시글 대신 조회된 게시글만 twits에 넣어 렌더링합니다. 

 

 

마지막으로 routes/post.js와 routes/user.js를 app.js에 연결합니다. 

업로드한 이미지를 제공할 라우터(/img)도 express.static 미들웨어로 uploads 폴더와 연결합니다. 

express.static을 여러 번 쓸 수 있다는 사실을 기억해두세요. 

이제 uploads 폴더 내 사진들이 /img 주소로 제공됩니다.

 

 

이제 서버를 키고 로그인, 게시글 작성, 팔로잉, 해시태그 검색 등의 기능을 사용해보자.

 

 

 

 

핵심정리

• 서버는 요청에 응답하는 것이 핵심 임무이므로 요청을 수락하든 거절하든 상관없이 반드시 응답해야 합니다. 

   이때 한 번만 응답 해야 에러가 발생하지 않습니다.
• 개발 시 서버를 매번 수동으로 재시작하지 않으려면 no demon을 사용하는 것이 좋습니다.
• dotenv 패키지와 .env 파일로 유출되면 안되는 비밀키를 관리합시다.
• 라우터는 routes 폴더에, 데이터베이스는 models 폴더에, HTML 파일은 views 폴더에 구분하여 

    저장하면 프로젝트 규모가 커져도 관리하기 쉽습니다.
• 데이터베이스를 구성하기 전에 데이터 간 1:1, 1:N, N:M 관계를 잘 파악합시다.
   routes middleware.js처럼 라우터 내에 미들웨어를 사용할 수 있다는 것을 기억합시다.
• Passport의 인증 과정을 기억해둡시다. 특히 serializeUser와 deserializeUser가 언제 호출되는지 파악하고 있어야 합니다.
• 프론트엔드 form 태그의 인코딩 방식이 multipart일 때는 multer와 같은 multipart 처리용 패키지를 사용하는 것이 좋습니다.