본문 바로가기
학교수업 이야기/캡스톤 디자인(3-2)

디비 구상(1)

by 꾸욱꾸우욱 2020. 12. 29.

필요하다 생각한 데이터베이스는 user, free_board, vote_board, vote, comment, recommend, preference, image, furniture이다.

각각의 구상 이유를 목표했던 어플의 기능과 함께 설명하겠다.

 

사용자는 회원가입을 진행한 후 로그인을 진행한다. (user)

첫 로그인을 한 경우 선호도를 조사한다. 이때 특정 사진을 보여준 후 선택한 값을 전달받는다. (preference)

변경하고자 하는 사진을 등록한다. 이때 대기시간이 생긴다. (image)

대기시간을 활용하여 게시판 기능을 이용할 수 있다.

자유게시판이 있으며 자유롭게 글을 쓸 수 있고 여러사진을 올릴 수 있다. (free_board)

투표게시판이 있으며 사진을 두 장 올려 그 중 투표를 할 수 있다. (vote_board, vote)

인기게시판이 있으며 이는 자유게시판의 글 중 인기순, 시간순으로 정렬하여 보여준다.

각 게시판은 댓글과 추천이 가능하다. (comment, recommend)

특정 시간이 지나고 사진 변경이 완료되면 결과들을 보여주며, 추천 가구도 함께 보여준다. (furniture)

 

간단하게 요약한 어플의 사용과정이며 데이터베이스가 필요한 경우이다.

다음으로 앞서 설명한 데이터베이스를 models폴더에 작성한 예시이다.

// users.js
'use strict';
module.exports = (sequelize, DataTypes) => {
    const users = sequelize.define('users', {
        ID: {
            type: DataTypes.STRING(20),
            allowNull: false,
            primaryKey: true
        },
        PW: {
            type: DataTypes.STRING.BINARY,
            allowNull: false
        },
        email: {
            type: DataTypes.STRING(30),
            allowNull: false
        },
        salt: {
            type: DataTypes.STRING
        }
    });
    return users;
};

user의 데이터베이스이다. ID가 키 값이며 PW, email, 그리고 salt를 저장한다. salt는 SHA-512 암호화 기법에서 사용한다. 데이터베이스에 PW를 저장하기전, salt를 생성하여 SHA-512 기법으로 변환하여 저장한다. SHA-512는 단방향 암호화 기법으로 복호화가 불가능하다. 그러므로 로그인을 시도할 경우 입력받은 비밀번호를 salt를 이용해 암호화한 뒤 비교하기 위해 필요하다.


// free_boards.js
'use strict';
module.exports = (sequelize, DataTypes) => {
    const free_boards = sequelize.define('free_boards', {
        postNum: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            allowNull: false,
            primaryKey: true
        },
        title: {
            type: DataTypes.STRING(20),
            allowNull: false
        },
        contentText: {
            type: DataTypes.TEXT,
            allowNull: false
        },
        contentImage: {
            type: DataTypes.STRING
        },
        writer: {
            type: DataTypes.STRING(20),
            allowNull: false
        },
        recommend: {
            type: DataTypes.INTEGER,
            allowNull: false
        }
    });
    return free_boards;
};

free_board, 즉, 자유게시판 데이터베이스이다. postNum은 해당 게시물의 번호로 키 값이다. title은 제목, contentText는 본문, contentImage는 첨부된 이미지, writer는 작성자, recommend는 추천 수 이다.

contentImage의 저장을 많이 고민하였다. Blob을 이용하여 저장하는 것도 고려해보았으나 디비에 사진을 다 저장하는 것이 비효율적이었다. 대신 선택한 것이 서버에 저장된 이미지의 URI를 저장하는 것이었다. 해당 URI를 저장해두어 필요한 경우 경로에 있는 이미지를 불러오는 방식으로 생각하였다. 여러장의 이미지를 올릴 수 있으므로 해당 이미지 URI들을 JSON형식으로 만든 뒤 스트링화 하여 저장하는 것으로 결정하였다.


// vote_boards.js
'use strict';
module.exports = (sequelize, DataTypes) => {
    const vote_boards = sequelize.define('vote_boards', {
        postNum: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            allowNull: false,
            primaryKey: true
        },
        title: {
            type: DataTypes.STRING(20),
            allowNull: false
        },
        contentText: {
            type: DataTypes.TEXT,
            allowNull: false
        },
        contentImage1: {
            type: DataTypes.STRING
        },
        contentImage2: {
            type: DataTypes.STRING
        },
        writer: {
            type: DataTypes.STRING(20),
            allowNull: false
        },
        recommend: {
            type: DataTypes.INTEGER,
            allowNull: false
        }
    });
    return vote_boards;
};

vote_board, 투표게시판 데이터베이스이다. 자유게시판과 크게 다르지 않으나 contentImage 저장 방식이 다르다. 이는 사실 개발과정에서 수정된 것으로 초기에는 이미지를 여러장 저장할 방법을 생각지 못하였다. 그렇기에 다음과 같이 두 가지로 저장할 수 있게 한 것이다.


// votes.js
'use strict';
module.exports = (sequelize, DataTypes) => {
    const votes = sequelize.define('votes', {
        voteNum: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            allowNull: false,
            primaryKey: true
        },
        postNum: {
            type: DataTypes.INTEGER,
            allowNull: false
        },
        user: {
            type: DataTypes.STRING(20),
            allowNull: false
        },
        choice: {
            type: DataTypes.INTEGER,
            allowNull: false
        }
    });
    return votes;
};

투표 정보 데이터베이스로 투표한 사람의 데이터가 담긴다. voteNum은 투표 고유 번호로 키값이다. postNum은 해당 투표가 진행된 게시글의 번호이며 user는 투표자, choice는 둘 중 어떤 이미지를 선택하였는지이다.

 

글이 길어진 듯 하여 다음글에서 마저 설명하도록 하겠다.

'학교수업 이야기 > 캡스톤 디자인(3-2)' 카테고리의 다른 글

user 기능(2)  (0) 2021.01.06
user 기능(1)  (0) 2020.12.30
디비 구상(2)  (0) 2020.12.29
서버 개발 시작  (0) 2020.12.22
주제 선정 및 공부  (0) 2020.12.21