Spring/[Spring]Board(기본 게시판)

스프링 게시판 만들기 - 1(게시판 목록 보여주기,mvc패턴)

Ms.Pudding 2022. 1. 12. 18:41

mvc패턴이란 디자인 패턴 중의 하나이며 model,view,controller의 약자이다.

디자인 패턴이란 어떤 특정 프로그램을 더 쉽고 편리하게 사용하기위해 만든 특정한 방법들을 말한다.

예를 들어 jquery는 $('#...') 달러 표시로 id를 셀렉트 할 수 있지만 , 자바스크립트를 사용하는 경우 getElementsById('')를사용하여 제이쿼리의 디자인 패턴으로 더 편하게 개발을 할 수 있다. 

사용자가 controller를 통해서 데이터를 요청하면 controller는 model을 통해서 데이터를 가져오고  view를 통해 사용자에게 결과 값을 보여준다. 


 

스프링 개발 순서 

controller -> vo -> db -> mapper.xml ->  mapper -> service -> html 

 

실제 사용자가 보여지는 순서 

controller -> service -> vo -> db -> mapper -> vo -> service -> controller 


 

단순 게시판 목록만 보여주는 화면을 만들어보자 

 

1.Controller

@Controller
public class BoardController{

	@GetMapping("/board/list")
	public ModelAndView getBoardList(){
    	ModelAndView view = new ModelAndView();
        view.setModelName("경로");
        return view;
    
    }
}

 

2.vo

@Getter
@Setter
@ToString
public class BoardVO{
	private int BoardNo;
    private String writer;
    private String title;
    private String content;
	private String regDate;
    private String updateDate;
    private STring originFileName;
    private String storedFileName;

}

 

3.db

create table board(
	board_no int auto_increment,
	title varchar(200) not null,
	content varchar(4000) default '',
	writer varchar(50) not null,
	reg_date datetime default now(),
	update_date datetime default now(),
	origin_file_name varchar(255) default '',
	stored_file_name varchar(1000) default '',
	primary key(board_no)

);

 

 

4.mapper.xml

<mapper namespace = "boardmapper가 있는 주소">
<select id="getBoardList" resultType="vo가 있는 주소">
select board_no,
title,
content,
writer,
date_formate(reg_date, '%Y-%m-%d %H:%i:%s') as regDate
from board
order by reg_date desc
</select>
</mapper>

 

5.

@Mapper
public interface BoardMapper{

	public List<BoardVO> getBoardList() throws Exception;
    
}

 

 

6.Service

@Service
@AllArgsConstructor
public class BoardService{
	private BoardMapper boardMapper;
    
	public List<BoardVO> getBoardList() throws Exception{
    	return boardMapper.getBoardList();
    };

}

List형태로 BoardVO를 받아오겠다. 

(List는 요소의 중복저장을 허락하고 , 들어온 순서대로 저장한다. ) 

 

7.html 

<form id="board" th:action="@{search}"  method="get">
     <a th:href="@{register}">글쓰기</a>
      <input type="text" name="keyword"/> <input type="submit" value="검색"/>
             <table class="table" style="border: 1px solid;">
                    <thead>
                    <tr>
                        <td style="border:1px solid;text-align:center;width:80px">번호</td>
                        <td style="border:1px solid;text-align:center;width:320px">제목</td>
                        <td style="border:1px solid; text-align: center;width:100px">작성자</td>
                        <td style="border:1px solid; text-align: center;width:180px">등록일자</td>


                    </tr>

                    </thead>
                    //나중에 자바스크립트 할 때 
                    <tbody id="boardRows">

                    </tbody>
                </table>
            </form>

일단 이 부분을 html화면으로 만들면 이렇게 윗부분만 표시되는 부분이며 

글쓰기
번호 제목 작성자 등록일자

tbody id = "boardRows' 이 부분이 , 실제 게시판 목록들이 들어가는 부분이다.

사용자가 게시판을 한개씩 추가 했을 때, 게시판 목록부분만 데이터의 변화가 일어나기 떄문에 전체 페이지를 로드할 필요가 없다. 이럴때 사용하는 것이 ajax, 즉 비동기성 기능을 사용하는데 ajax를 사용하면 브라우저 내에서 비동기 기능(신호를 보냈을 때 새로운 HTML을 로딩 할 필요 없이 동작을 수행)을 사용할 수 있다.

 

동기는 추구하는 같은 행위(목적)가 동시에 이루어지는 것을 말하며, 비동기는 추구하는 행위(목적)가 다를 수도 있고, 동시에 이루어지지도 않는 것을 말한다. 즉 ajax는 모든 데이터가 동시에 움직이지 않아도 자기만 움직일 수 있기 떄문에 비동기성이라고 부른다.

 

 

7. ajax

 

 

<script>

    function getBoard(){
    $.ajax({
            url: '/api/board/list',
            type : 'GET',
            dataType : 'json',
            data : null
    }).done(function (result){
           var tbody = $('#boardRows');
           //로드될때마다 기존 로딩된 데이터 지워서
           tbody.empty();
           //each (대상함수(인덱스 , 객체) {} ); each 가 대상에서 data 는 boardapi controller에 있는거임
           $.each(result.data, function(index,obj){
           var tr = $('<tr></tr>')
           var td = '';
           td += '<td style = "text-align:center">' + obj.boardNo+'</td>';
           td += '<td style = "text-align:left">' + obj.title+'</td>';
           td += '<td style = "text-align:left">' + obj.writer+'</td>';
           td += '<td style = "text-align:left">' + obj.regDate+'</td>';
            //apend tr에 넣는 다는 뜻 , tbody에 넣는다는 뜻
            tr.append(td);
            tbody.append(tr);

           })
    });
    }

    $(document).ready(function(){
     getBoard();
    })

여기서 보면 result.data 이건 내가 boardapi에 담아둔 리스트들

function (index , obj) 여기서 index는 리스트의 인덱스 또는 키를 의미함  obj 는 해당 인덱스나 키가 가진 값을 의미한다.

 

$(document) = html 이 화면에 뜨면

ready(function(){

getBoard();

}

getBoard()함수를 실행시켜라...

콜백함수로 볼 수 있다. 함수가 실행되면 끝이 생길 때까지 또 다른 함수를 부른다. 위에 function(result)부분에 아무것도 안나오면 document가 뜨지 않아서 getBoard()도 실행되지 않는다. 

 

 

api 

 

package com.survey.web.controller.gallary;

import com.survey.web.service.gallary.GallaryService;
import com.survey.web.vo.gallary.GallaryVO;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@AllArgsConstructor
public class GallaryApiController {
    private final GallaryService service;
    @GetMapping("/api/gallary/list")
    public Map<String,Object> getGallary() throws Exception {
        Map<String,Object> resultMap = new HashMap<String,Object>();
        try{
            List<GallaryVO> list = service.getGalList();
            resultMap.put("data",list);
        }catch(Exception e){
            e.printStackTrace();
        }

        return resultMap;

    }


}

 

 

여기서 api 기능을 설명해보자

 

api는 프로그램과 응용 프로그램이 서로 상호작용 하는 것을 도와주는 매개체 이다.

사용자에게서 요청이 오면 그걸 잘 정리해서 응용 프로그램과 상호작용하여 요청된 값을 전달한다.