E-book (6) 작가 등록

이율곡·2023년 1월 25일
0

Project

목록 보기
8/15
post-thumbnail

서두

작가등록 페이지와 기능을 추가했다. 도서를 등록할 때 작가를 넣지 않고 따로 뺀 이유는 작가 이름이 중복될 수도 있고 따로 관리해줄 필요가 있다고 판단했기 때문이다.


Table

CREATE TABLE author (
	author_number INT PRIMARY KEY AUTO_INCREMENT NOT NUlL,
	author_name VARCHAR(100) NOT NULL ,
	birth CHAR(8) NOT NULL,
	best_book VARCHAR(200) NOT NULL,
	created_at TIMESTAMP DEFAULT NOW() NOT NULL,
	updated_at TIMESTAMP DEFAULT NOW() NOT NULL,
	admin_number INT NOT NULL,
	FOREIGN KEY (admin_number) REFERENCES admin (admin_number)
);

작가 테이블이다. 생일과 대표작을 통해 동명이인을 판별하려 했다. 그리고 admin_number로 등록한 사람이 누구인지 남겼다.


Routes

Routes는 그대로 adminRoutes를 사용했다.

const authorController = require('../controllers/admin/author');

...

routes.get('/authorRegist', authorController.getAuthorRegist);

routes.post('/authorRegistAction', authorController.authorRegistAction);

새로운 authorController를 추가했다. 그래서 작가 등록으로 이동하는 페이지와 등록 액션을 만들어주었다.


Controller

Controller는 admin폴더에 새롭게 author.js를 만들었다.

const Author = require('../../models/admin/author');

exports.getAuthorRegist = (req, res, next) => {
  res.render("admin/regist/author", {
    pageTitle: "E-Book Author Regist",
    member: req.session.user,
    admin: req.session.admin,
  });
};

exports.authorRegistAction = (req, res, next) => {
  let authorName = req.body.authorName;
  let birth = req.body.birth;
  let bestBook = req.body.bestBook;
  let adminNumber = req.session.admin.admin_number;

  Author.authorRegistAction(authorName, birth, bestBook, adminNumber,(err) => {
    if(err) {
      console.log('작가 등록 오류 : ' + err);
    } else {
      console.log('작가 등록 성공!');
      res.render("admin/adminIndex", { 
        pageTitle: "Welcome E-book Admin Page",
        member: req.session.user,
        admin: req.session.admin,
      });
    }
  })
};

첫 번째 컨트롤러는 작가 등록 페이지로 이동하는 역할이다. 두 번째 컨트롤러는 작가 등록할 때 모델로 값을 보내주는 컨트롤러이다. 작가이름, 생년월일, 대표작, 관리자 번호를 모델로 넘겨준다. 그리고 성공하면 인덱스 화면으로 넘어간다.


Model

Model도 마찬가지로 admin폴더에 author.js를 추가했다.

module.exports = class Author {
  constructor(authorName, birth, bestBook) {
    this.authorName = authorName;
    this.birth = birth;
    this.bestBook = bestBook;
  }

  static authorRegistAction(name, birthday, best, adminNumber, cb) {
    if (name && birthday && best) {
      var sql =
        "INSERT INTO author (author_name, birth, best_book, admin_number) VALUES (?, ?, ?, ?)";
      var param = [name, birthday, best, adminNumber];

      connection.query(sql, param, (err, row, fields) => {
        if (err) {
          console.log("작가 등록 쿼리 오류 : " + err);
        } else {
          console.log("작가 등록 성공!");
          cb();
          connection.end();
        }
      });
    } else {
      console.log("입력값을 확인해주세요.");
    }
  }
};

작가등록은 회원가입과 똑같다. 그다지 어려운 부분은 없었다. 이번 모델을 작성하면서 전보다 이해를 하며 스스로 작성했다는 것을 체감했다.


View

View도 regist폴더에 author.ejs를 추가했다.

<%- include('../../admin/includes/admin-head-nav.ejs')%>
    <div class="container px-4 px-lg-5">
        <div class="row gx-4 gx-lg-5 align-items-center my-5 ">
            <form action="/authorRegistAction" method="POST">
                <label for="authorName">작가명</label>
                <input type="text" name="authorName" id="authorName" placeholder="작가 이름을 입력해주세요.">
                <label for="birth">생년월일</label>
                <input type="text" name="birth" id="birth" placeholder="예시) 19991031">
                <label for="bestBook">대표작/최신작</label>
                <input type="text" name="bestBook" id="bestBook" placeholder="대표작 또는 최신작">
                <button type="submit" class="btn btn-primary">등록하기</button>
            </form>
        </div>
    </div>
<%- include('../../admin/includes/admin-footer.ejs')%>   

View는 단순히 3가지 정보만 받았다. 작가명과 생년월일, 대표작 값을 넣고 컨트롤러로 보내면 된다.


정리하기

이번에는 작가등록을 만들었다. 회원가입과 비슷하기 때문에 그리 오래 걸리지는 않았다. 전보다 다른 점은 인터넷을 보고 이해하며 작성하지 않고 내가 생각해서 작성했다는 점이다. 이 부분이 조금 성장했구나라 생각하고 뿌듯함을 느꼈다. 천천히 성장해가고 싶다.

profile
음악을 좋아하는 사람이 음악을 만들 듯, 개발을 좋아하게 될 사람이 쓰는 개발이야기

0개의 댓글