ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 게시판 목록 조회 기능(1)
    프로젝트 일지/Spring Boot & MyBatis - 게시판 2022. 8. 14. 20:11

     

    - DB 테이블 설계 및 DTO 작성
    1. 화면 설계서 참조하여 ERD 그려보기
    2. ERD 기준으로 테이블 작성
    - DDL문 작성/실행 하여 테이블 생성
    3. 관련 테이블들에 대한 DTO 생성
    - getter/setter 클래스 객체

    3. 관련 로직 개발
    - 목록 조회에 해당 하는 프로세스 모두 작성 
    4. 로컬 서버 정상 실행 확인
    - 마이바티스 연동/셋팅 및 기타 개발 오류에 의한 다양한 에러발생 예상
    - 해당 에러에 대한 이슈들에 대한 원인 및 해결(개발자의 숙명. 실무에서 개발하는 시간보다 이슈해결이 더 오래걸리기도 하는듯)
    5. 로컬 정상 실행까지 확인 후, 호출 결과 확인
    - postman으로 조회기능에 대한 request uri 호출(json)하여 결과 확인 

    - 게시판 목록 조회 기능 개발

    1. 마이바티스 연동 
    2. 게시판 목록 조회 쿼리 짜서, DBMS로 조회 결과 확인  
    - 테스트 데이터 insert 쿼리 DML문 작성하여 데이터 생성 후 목록 조회 쿼리 확인

     

    https://romanticdeveloper.tistory.com/38

     

    <스프링 부트 Spring boot> 게시판 구현 - 글 목록 조회

    - 게시판 글 목록 조회 기능 스프링보다 훨씬 간편하게 글 목록 조회 기능 구현이 가능하다. 순서는 다음과 같다. 1) Controller에 글 목록 조회 시 실행되는 메서드를 만든다. 매핑은 Get으로 한다. @G

    romanticdeveloper.tistory.com

     

    프로젝트 패키지의 구성은 다음과 같다

    DB - Mapper - Service - Controller - Client(browser)

     

    <BoardApplication.java>

    package com.example.board;
    
    import javax.sql.DataSource;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;
    import org.springframework.context.annotation.Bean;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    
    
    @SpringBootApplication
    @EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class}) //whitelabel 오류처리
    
    public class BoardApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(BoardApplication.class, args); 
    	}
    
    	/*
    	* SqlSessionFactory 설정 
    	* Mybatis의 SqlSessionFactory 반환 
    	* 스프링부트 실행 시 DataSource객체를 이 메서드 실행시 주입해서 결과를 만들고 그 결과를 스프링 내 빈으로 사용
    	*/
    
    	@Bean // 스프링에 필요한 객체 생성
    	public SqlSessionFactory sqlessionFactory (DataSource datasource) throws Exception{
    		
    		SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    		
    		sessionFactory.setDataSource(datasource);
    		return sessionFactory.getObject();
    				
    	}
    	
    }

     

    <BoardDTO.java>

    package com.example.board;
    
    public class BoardDTO {
    	
    	private String idx;
    	private String title;
    	private String content;
    	private String writer;
    	private String regdate;
    	
    	private String userId;
    	private String userPw;
    	private String userName;
    	
    	public String getidx() {
    		return idx;
    	}
    	public void setidx(String idx) {
    		this.idx = idx;
    	}
    	public String getTitle() {
    		return title;
    	}
    	public void setTitle(String title) {
    		this.title = title;
    	}
    	public String getContent() {
    		return content;
    	}
    	public void setContent(String content) {
    		this.content = content;
    	}
    	public String getWriter() {
    		return writer;
    	}
    	public void setWriter(String writer) {
    		this.writer = writer;
    	}
    	public String getRegdate() {
    		return regdate;
    	}
    	public void setRegdate(String regdate) {
    		this.regdate = regdate;
    	}
    	public String getUserId() {
    		return userId;
    	}
    	public void setUserId(String userId) {
    		this.userId = userId;
    	}
    	public String getUserPw() {
    		return userPw;
    	}
    	public void setUserPw(String userPw) {
    		this.userPw = userPw;
    	}
    	public String getUserName() {
    		return userName;
    	}
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    	
    }

     

    <BoardMapper.java>

    package com.example.board.mapper;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Mapper;
    
    import com.example.board.BoardDTO;
    
    
    @Mapper
    // 데이터 접근 객체인 DAO와 같은 역할
    // 마이바티스에서는 DAO보다 SqlSessionDaoSupport나  SqlSessionTemplate를 사용하기를 권장함.
    // 매퍼를 사용하면 일일이 DAO를 만들지 않고, 인터페이스만을 이용해 편하게 개발이 가능
    public interface BoardMapper {
    	
    	// 게시글 개수
    	public int boardCount() throws Exception;
    	
    	// 게시글 목록
    	public List<BoardDTO> boardList() throws Exception;
    	
    	// 게시글 상세
    	public BoardDTO boardContent(int bno) throws Exception;
    	
    	// 게시글 수정
    	public void boardUpdate(BoardDTO board) throws Exception;
    	
    }

     

    <BoardMapper.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="com.example.board.mapper.BoardMapper">	<!-- xml파일을 사용할 mapper가 있는 경로 -->
      
    	<!-- <select> 태그를 이용하여 select 쿼리임을 나타냄. -->
        <!-- 앞서 mapper에서 말했던 메소드의 이름은 select 쿼리의 id값과 같아야함. -->
    	<select id="boardList" resultType="com.example.board.BoardDTO">	
    		<![CDATA[
    
    			SELECT
    				idx, title, writer, regdate
    			FROM
    				board_table 
    			ORDER BY idx DESC  
    
    		]]>
    	</select>
    	
    </mapper>

     

    <BoardService.java>

    package com.example.board.service;
    
    import java.util.List;
    
    import com.example.board.BoardDTO;
    
    public interface BoardService {
    
        List<BoardDTO> boardList() throws Exception;
    
    }

     

    <BoardServiceImpl.java>

    package com.example.board.service;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.example.board.BoardDTO;
    import com.example.board.mapper.BoardMapper;
    
    
    @Service       // 서비스임을 선언
    public class BoardServiceImpl implements BoardService{
    
    	@Autowired // Mapper와 연결
    	private BoardMapper boardMapper;
    
    	@Override
    	public List<BoardDTO> boardList() throws Exception {
    		return boardMapper.boardList();
    	}
    }

     

    <BoardController.java>

    package com.example.board.controller;
    
    import java.util.List;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.servlet.ModelAndView;
    import com.example.board.service.BoardService;
    
    
    @Controller // 컨트롤러 선언
    public class BoardController {
    
        @Autowired
        private BoardService boardService;      //서비스와 연결
    
        @RequestMapping("/openBoardList.do")    //노테이션의 값으로 주소 지정
        public String openBoardList() throws Exception{
        	
        	System.out.println("BoardController 작동");
        	
        	return "BoardList";
        	
        }
    }

     

    <BoardList.jsp>

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!-- forEach사용 -->
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8"> 
    <title>게시판</title>
    </head>
    <body>
    
    <form action=""> <!-- 검색기능. action 기능을 통해 넘어가게 -->
    	<select name = "search" >
    		<option value="제목" >제목</option>
    		<option value="작성자" >작성자</option>	
    	</select>
    	<input type="text" name="searchBox">
    	<input type="submit" value="검색">
    </form>	
    
    <div class="container">
    	<table class="table">
    		<colgroup>
    			<col width="15%"/>
    			<col width="*"/>
    			<col width="15%"/>
    			<col width="25%"/>
    		</colgroup>
    		<thead>
    			<tr>  
    				<th scope="col">번호</th>
    				<th scope="col">제목</th>
    				<th scope="col">작성자</th>
    				<th scope="col">등록일</th>
    			</tr>
    		</thead>
    		<tbody>
    			<c:forEach var="list" items="${list }">
    			<tr>	
    				<td ${list.idx}></td>
    				<td ${list.title}></td>
    				<td ${list.writer}></td>
    				<td ${list.regdate}></td>
    			</tr>
    			</c:forEach>
    		</tbody>
    	</table>
    </div>
    
    </body>
    </html>

     

     

    이렇게 만들어주면

    이렇게 뜨는데

    나는 분명 board_table 이라는 db테이블에 데이터를 하나 넣어줬는데 왜 뜨지 않는걸까...

    아마 db연동이 제대로 되지 않은 것 같다 하하하

     

    다음 게시물에서는 로그를 추가해서 오류가 어디서 일어났는지 찾아보고 수정하자

Designed by Tistory.