본문 바로가기

웹개발

게시판-카테고리, 검색

지금까지는 게시판 하나에 글이 전부 올라가는 방식이었는데 이번에는 게시판을 여러 카테고리로 나누어서 만들 것이다.

 

category: {
    type: DataTypes.STRING,
    allowNull: false
  }

우선 posts 테이블에 category라는 속성을 추가해준다.

board.js 파일에

const categories = ['자유', '만화', '공부'];

이런 식으로 카테고리 배열을 만들고, write 링크로 갈 때 categories 배열을 보내준다.

<div>
    <label for="category">카테고리:</label>
    <select id="category" name="category">
        <% categories.forEach(c => { %>
            <option value="<%= c %>"><%= c %></option>
        <% }) %>
    </select><br>
</div>

글을 쓸 때 categories 안에 있는 값들을 이용해 선택하는 부분을 만든다. 그리고 write로 post 요청을 보낼 때

db.posts.create({
    title: title,
    content: content,
    writer: req.session.user.username,
    secret: secret === 'on',
    password: hashedPassword,
    category: category

이렇게 category를 테이블에 같이 넣어준다.

 

router.get('/main/:category',async (req, res) => {
    const category = req.params.category;
    const posts = await db.posts.findAll({ where: { category } });
    if (!categories.includes(category)) {
        return res.redirect('/');
      }
    res.render('board/main',{posts: posts, category: category});
});

메인 부분도 바뀌었는데, category를 파라미터로 받아서 where을 이용해 해당 카테고리에 맞는 게시글들만 찾았다.

그리고 categories 배열에 없는 카테고리가 링크로 들어오면 다시 원래 페이지로 돌아가게 했다.

 

<% categories.forEach(c => { %>
    <a href="/board/main/<%= c %>"><%= c %>게시판</button> <br>
<% }) %>

index.ejs 파일을 수정해서 게시판의 카테고리들이 보이게 했다.

 

 

<게시글 검색>

<form action="/board/search" method="get">
    <select id="category" name="category">
        <% categories.forEach(c => { %>
            <option value="<%= c %>"><%= c %></option>
        <% }) %>
        <option value="all">전체</option>
    </select>

    <select name="type">
        <option value="title">제목</option>
        <option value="content">내용</option>
    </select>

    <input type="text" name="query" required>
    <button type="submit">검색</button>
</form>

검색할 게시판의 카테고리를 선택하거나 전체를 선택하고, 제목으로 검색할지 내용으로 검색할지를 선택하고 

검색 내용을 입력하는 form을 main.ejs 파일에 작성하였다.

 

const Sequelize = require('sequelize');
const seq = Sequelize.Op;
router.get('/search', async (req, res) => {
    const { query, category, type } = req.query;
    
    const whereClause = {
        [type]: {
            [seq.like]: '%' + query + '%'
        }
    };

    if(category !== "all"){
        whereClause.category = category;
    }

    const post = await db.posts.findAll({ where: whereClause });
    res.render('board/search', { post });
});

라우터에서 search 링크를 만들어서 sequelize의 like 구문을 가져와서 where 구문을 완성하였다.

category가 all일 때는 category는 지정하지 않고 전체 게시글을 검색해온다. 

검색으로 post 변수에 게시글을 담고 search.ejs 파일을 렌더링한다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><%= post.title %></title>
    <link href="/public/main.css" rel="stylesheet" />
</head>

<body>
    <h1>검색 결과</h1>
    <ul>
        <% post.forEach(post => { %>
            <li><a href="/board/read/<%= post.idx %>"><%= post.title %></a></li>
        <% }) %>
    </ul>
</body>

</html>

search.ejs 파일은 main 파일과 같은 형식이다.