Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

승띵이의 개발일지

[Spring Boot] 게시판 만들기 2 (게시판 별 구분) 본문

언어/Spring Boot

[Spring Boot] 게시판 만들기 2 (게시판 별 구분)

승띵이 2022. 11. 16. 13:31
게시판 만들기 2탄

 

게시판 만들기 2탄에서는 게시판 만들기 1에서 만들었던 게시판을 게시판의 종류에 따라 구분하는 작업을 수행해보려고 한다.

 

게시판 만들기 1 : https://myung-it.tistory.com/39

 

[Spring Boot] 게시판 만들기 1(feat. CKEditor5)

게시판 만들기 오늘은 페브리즈 페이지에 게시판 기능을 구현해 보려고 한다. 게시판은 크게 공지사항, 자유게시판, Q&A 3개의 게시판으로 나누어 구현해 보려고 한다. 오늘도 고고고~ CKEditor CKEdi

myung-it.tistory.com

 

본 포스팅에서 구현하고자 하는 작업의 목표는 localhost:8080/bbs/write에서 get 방식으로 접근하였을 때 bid 값이 boards 테이블에 존재하는 id의 값인지 확인한 후 해당 값이 존재한다면 접속, 아닐 시 '존재하지 않는 게시판입니다' 라는 alert가 팝업되게 하는 것을 목적으로 한다.

 

또한, 해당 bid 값에 따라 해당 페이지의 타이틀을 공지사항, 자유게시판, Q&A에 따라 '공지사항-글쓰기', 자유게시판-글쓰기', Q&A-글쓰기'로 구분하는 작업까지 수행하려고 한다.

 

그럼 시작

 

결과

 

bid 값이 DB에 존재하는 값이라면 해당 레코드의 'text 값-글쓰기' 형태로 페이지 나타남

 

bid 값이 DB에 존재하지 않는 id 값이라면 '존재하지 않는 게시판입니다' 팝업

 

 

BbsMapper.xml

 

<select id="selectBoardById" resultType="com.smchoi.studymemberbbs.entities.bbs.BoardsEntity">
    select `id`   as 'id',
           `text` as 'text'
    from study_bbs.boards
    where binary `id` = #{id}
    limit 1
</select>

 

study_bbs.boards를 select 하기 위한 Mapper 파일을 생성해주었다. 

 

해당 쿼리문은 id로 구분을 하기 위해 where 절에 id = #{id} 조건을 걸어주었다.

 

 

IBbsMapper

 

@Mapper
public interface IBbsMapper {

    BoardsEntity selectBoardById(@Param(value = "id") String id);
}

 

Mapper xml 파일에서 만든 select 문을 사용하기 위한 인터페이스를 생성하였다. 

해당 인터페이스에 BoardEntity 타입의 selectBoardById 객체를 생성, 매개변수를@Param(value="id) String id로 설정하여 id 값을 매개변수로 가지도록 하였다.

 

또한, 해당 인터페이스에 @Mapper 어노테이션을 걸어줌으로써 Service 클래스에서 사용할 수 있도록 조치하였다.

 

BbsService

 

@Service(value = "com.smchoi.studymemberbbs.services.BbsController")
public class BbsService {

    private final IBbsMapper bbsMapper;

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

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

    }
}

 

BbsService 클래스를 서비스 형태로 생성, private final IBbsMapper bbsMapper로 선언 후 생성자를 생성하여 BbsService(IBbsMapper bbsMapper) {this.bbsMapper = bbsMapper} 에 @Autowired 형태로  만들어주었다.

 

BoardEntity getBoard(String id)를 생성하여 bbsMapper.selectBoardById(id)를 반환해 준다. 

 

본 작업은 String id 값이 DB 내에 존재 유무를 확인할 수 있는 작업이다.

 

BbsController

 

@Controller(value = "com.smchoi.studymemberbbs.controllers.BbsController")
@RequestMapping(value = "/bbs")
public class BbsController {

    private final BbsService bbsService;

    @Autowired
    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) {
        // login 에서 setAttribute 값을 가져옴. 세션에서 가져왔다는 뜻
        // required 가 true 이면 값이 무조건 존재하여야하지만(없으면 400 오류) false 인 경우 값이 없어도 null 값으로 처리가 된다.
        ModelAndView modelAndView;


        if (user == null) { // 로그인 확인 작업. 해당 user 는 Session 에서 가져온 값이다.
            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("bid", this.bbsService.getBoard(bid).getText());
            }
        }
        return modelAndView;
    }
}

 

기존의 BbsController에서 추가적인 구문을 기술하였다. 

 

user가 로그인 된 상태에서 만일 bid 값이 null이거나 this.bsService.getBoard(bid) 값이 null이라면 CommonResult.FAILURE의 name()을 modelAndView.addObject로 추가, 아닐 시 CommonResult.SUCCESS를 modelAndView.addObject로 추가해 주었다. 

 

또한, 해당 this.bbsService.getBoard(bid).getText() 값을 "bid" 라는 이름으로  modelAndView에 추가해 주었다.

해당 작업은 현재 주소의 bid 값이 무엇인지에 따라 게시판의 이름을 구분하기 위해 하는 작업이다. 

 

write.html

 

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

 

write.html 파일에 <script> 태그를 추가하여 js 기능을 추가해 주었다.

 

<script> 태그에 th:if="${result.eqals('FAILURE)}" 조건절을 추가해주어 만약 (modelAndView의) result가 FAILURE 이라면(bid == null || this.bbsService.getBoard(bid) == null) '존재하지 않는 게시판입니다' 라는 alert를 띄우도록 구현하였다.

 

그리고 만일 window.history.length가 1보다 크다면(이 전 페이지 기록이 존재한다면) 그 전 페이지로 돌아가도록, 아닐 시 윈도우 창이 꺼지도록 해 주었다.

 

<h1 class="title" rel="title" th:text="${bid + '-글쓰기'}"></h1>

 

title에 th:text="${ bid+ '-글쓰기' }" 로 설정해주어 해당 bid의 text + -'글쓰기' 형태로 title이 표시되도록 하였다.

Comments