티스토리 뷰

- boards.db

create schema study_bbs;

create table study_bbs.boards
(
    `id`   varchar(10)  not null,
    `text` varchar(100) not null,
    constraint primary key (`id`)
);

insert into study_bbs.boards(`id`, `text`)
values ('free', '자유게시판'),
       ('notice', '공지사항'),
       ('qna', 'QNA');

board.db에서 id값을 넣는 이유는 주소 값을 구분하기 위해 만들어준다. 


- BbsMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="dev.shlee.studymemberbbs.mappers.IBbsMapper">
    <select id="selectBoardById"
            resultType="dev.shlee.studymemberbbs.entities.bbs.BoardEntity">
        SELECT `id`   AS `id`,
               `text` AS `text`
        FROM `study_bbs`.`boards`
        WHERE BINARY `id` = #{id}
        LIMIT 1
    </select>


</mapper>

매퍼에서는 id와 text를 select해주고 id를 조건으로 걸어준다.


- IBbsMapper.interface

package dev.shlee.studymemberbbs.mappers;

import dev.shlee.studymemberbbs.entities.bbs.BoardEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface IBbsMapper {
    BoardEntity selectBoardById(@Param(value = "id") String id);
}

xml에서 select한 값을 사용하기 위해 IBbsMapper인터페이스를 만들어주고 @param 태그를 사용하여 매개변수의 값을 명시한다.

value 속성값에는 명시된 객체가 지원하는 값이라면 어떠한 값이라도 사용할 수 있다.


- BbsService

package dev.shlee.studymemberbbs.services;

import dev.shlee.studymemberbbs.entities.bbs.BoardEntity;
import dev.shlee.studymemberbbs.entities.member.EmailAuthEntity;
import dev.shlee.studymemberbbs.enums.CommonResult;
import dev.shlee.studymemberbbs.interfaces.IResult;
import dev.shlee.studymemberbbs.mappers.IBbsMapper;
import dev.shlee.studymemberbbs.entities.bbs.BoardEntity;
import dev.shlee.studymemberbbs.mappers.IBbsMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service(value = "dev.shlee.studymemberbbs.services.BbsService")
public class BbsService {

    private final IBbsMapper bbsMapper;

    public BbsService(IBbsMapper bbsMapper) {
        this.bbsMapper = bbsMapper;
    }

    public BoardEntity getBoard(String id){
        return this.bbsMapper.selectBoardById(id);
    }


}

Service에서 selectBoardById에 DB에 id값을 select 하고 리턴해준다. 


- BbsController

package dev.shlee.studymemberbbs.controllers;

import dev.shlee.studymemberbbs.entities.bbs.BoardEntity;
import dev.shlee.studymemberbbs.entities.member.UserEntity;
import dev.shlee.studymemberbbs.enums.CommonResult;
import dev.shlee.studymemberbbs.mappers.IBbsMapper;
import dev.shlee.studymemberbbs.services.BbsService;
import dev.shlee.studymemberbbs.entities.member.UserEntity;
import dev.shlee.studymemberbbs.enums.CommonResult;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;


@Controller(value = "dev.shlee.studymemberbbs.controllers.BbsController")
@RequestMapping(value = "/bbs")
public class BbsController {
    private final BbsService bbsService;

    public BbsController(BbsService bbsService) {
        this.bbsService = bbsService;
    }

    @RequestMapping(value = "write",
            method = RequestMethod.GET, produces = MediaType.TEXT_HTML_VALUE)
  
    public ModelAndView getWrite(@SessionAttribute(value = "user", required = false) UserEntity user,
                                 @RequestParam(value = "bid", required = false) String bid
                                 ){
        ModelAndView modelAndView;
        if (user == null) { //로그인 확인
            modelAndView = new ModelAndView("redirect:/member/login");
        } else {
            modelAndView = new ModelAndView("bbs/write");
            if (bid == null || this.bbsService.getBoard(bid) == null) {
                modelAndView.addObject("result", CommonResult.FAILURE.name());
            } else {
                modelAndView.addObject("result", CommonResult.SUCCESS.name());
                modelAndView.addObject("text", this.bbsService.getBoard(bid));


            }
        }
        return modelAndView;
    }


}

@sessinAttribute를 사용하여 전에 만들었던 PostLogin(로그인 성공 여부)를 판단하는 controller를 가져온다. 결국 valie 옆에 user는 MemberConroller에 sesiion에서 가져온 것이다. required = false는 400 오류를 방지하기 위해서 사용한다. 

 

@RequestParam(value = "bid", required = false) String bid 는 파라미터 bid가 존재하지 않으면 String bid는 null값을 돌려준다. 

게시판을 사용하기 위해서는 로그인을 한 상태여야 할 것이다. 그렇기 때문에 로그인 여부를 먼저 판단하여야 한다. 

 

만약 user가 null이라면 로그인에 실패한 것이기 때문에 redirect를 통해 로그인 화면을 보여준다. 하지만 성공하게 된다면 bbs/write 통해 게시판 화면을 보여주게 된다. 

 

공지사항, 자유게시판, q&a의 주소값은 달라야 하므로 만약 bid가 null이거나 서비스에서 생성했던 id(free, notice, qna) 값을 bid에 넣어서 만약 free=, notice=, qna= 가 null일 때 result값을 FAILURE를 넣는다. 아래 스크립트를 통해 FAILURE일 경우에는 "존재하지 않는 게시판" 경고창이 나올 것이다. 

 

FAILURE가 아니라면 result에 SUCCESS 값을 넣고 text에 서비스에 생성했던 getBoard의 bid값을 text에 넣는다. 


write.html

<script th:if="${result.equals('FAILURE')}">
    alert('존재하지않는 게시판 입니다.');
    if(window.history.length>1){
        window.history.back();
    }else{
        window.close();
    }
</script>

아래의 구문을 작성한 이유는 아래의 사진처럼 h1태그를 주소값이 변할 때마다 바뀌게 하기 위함이다.

getBoard(bid)를 사용하면 bid값만 가지고 오게 된다고 생각하게 되는데 xml에서 select 할 때 분명 text값도 같이 select 한 것을 기억할 것이다.

그렇기 때문에 bid 값을 가져와도 text 값이 같이 있다는 것을 알 수 있다. 

 

그러므로 write.html에 th:text를 사용하여 getText 값을 가져오면 DB에서 입력한 text값을 가져오고 주소값이 변할 때마다 바뀌는 것을 볼 수 있다. 

modelAndView.addObject("text", this.bbsService.getBoard(bid));

- write.hrml

<h1 class="h1" th:text="${text.getText()}"></h1>

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함