티스토리 뷰
- 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>



'웹 개발 > SpringBoot' 카테고리의 다른 글
| [Spring Boot] 게시판 만들기4 (게시판 댓글 DB insert) (2) | 2022.11.21 |
|---|---|
| [Spring Boot] 게시판 만들기3 (게시글 Insert 하기) (1) | 2022.11.18 |
| [Spring Boot] 게시판 만들기 (0) | 2022.11.15 |
| [Spring Boot] 이메일 찾기 (3) | 2022.11.14 |
| [Spring Boot] 로그인 구현 (2) | 2022.11.10 |