[Study #31] 게시판의 오류 잡기

반응형

 

 

01. Index 화면 구동

 

[ STEP 1 ] 오늘 날짜의 프로젝트 생성하고 버전 변경하기

프로젝트 생성
pom.xml

 

 

[ STEP 2 ] 기본 파일 삭제하기

 

[ STEP 3 ] 'IndexController.java' 파일 생성

package com.peazh.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class IndexController { // 처음 페이지 시작했을 때 @GetMapping("/") public String index() { return "index"; } }

 

[ STEP 4 ] 'index.jsp' 파일 생성

<%@ page language="java" contentType="text/html; charset=UTF-8" ​​​​pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>인덱스입니다.</title> </head> <body> <h1>index</h1> </body> </html>

 

실행화면

 

 

02. 에러 처리하기

[ STEP 1 ] 'main.jsp' 파일이 없는 상태에서 main 페이지로 이동해보기 (=에러 상황)

<%@ page language="java" contentType="text/html; charset=UTF-8" ​​​​pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>인덱스입니다.</title> </head> <body> <h1>index</h1> <a href="./main">main</a> </body> </html>

실행화면

 

[ STEP 2 ] 파일의 경로 줄여주기 위해서 'servlet-context.xml' 파일에서 코드 추가하기

파일의 위치

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> <resources mapping="/resources/**" location="/resources/" /> <resources location="/resources/css/" mapping="/css/**" /> <resources location="/resources/img/" mapping="/img/**" />

 

[ STEP 3 ] 'ErrorController.java' 파일 생성

package com.peazh.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class ErrorController { @GetMapping("/error404") public String error404() { return "error404"; } }

 

[ STEP 4 ] 이미지 폴더 만들어서 'error404'가 발생했을 때 나올 이미지 넣기

 

[ STEP 5 ] 'errorController.jsp' 파일 생성

<%@ page language="java" contentType="text/html; charset=UTF-8" ​​​​pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <img alt="error" src="./img/error.jpg" style="width: 50%"> <h1>error</h1> <h3>에러가 발생했습니다.</h3> </body> </html>

실행화면

 

 

03. 게시판 만들기

[ STEP 1 ] 'BoardController.java' 파일 생성하기

package com.peazh.web; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class BoardController { // 1. board 리스트 보는 화면 = board.jsp @GetMapping("/board") public String board(Model model) { // 데이터 붙이기 model.addAttribute("name", "1234"); return "board"; } // 2. detail 상세보기 화면 = detail.jsp }

 

[ STEP 2 ] 'board.jsp' 파일 생성하기

<%@ page language="java" contentType="text/html; charset=UTF-8" ​​​​pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>게시판</title> </head> <body> <h1>게시판 : ${name }</h1> <a href="./board">게시판</a> <a href="./main">main</a> </body> </html>

실행화면

 

[ STEP 3 ] 'BoardController.java'와 연결할 'BoardService.java' 파일 생성하기

package com.peazh.web; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Service; @Service public class BoardService { public List<Integer> boardList() { List<Integer> list = new ArrayList<Integer>(); for (int i = 1; i < 11; i++) { list.add(i); } return list; } }

 

- 'board.jsp' 파일 수정

<%@ page language="java" contentType="text/html; charset=UTF-8" ​​​​pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>게시판</title> </head> <body> <h1>게시판 : ${name }</h1> ${list } </body> </html>

 

- 'BoardController.java' 파일 수정

package com.peazh.web; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class BoardController { @Autowired private BoardService service; // 1. board 리스트 보는 화면 = board.jsp @GetMapping("/board") public String board(Model model) { // 데이터 붙이기 model.addAttribute("name", "1234"); // service에서 메서드 불러오기 List<Integer> list = service.boardList(); model.addAttribute("list", list); return "board"; } // 2. detail 상세보기 화면 = detail.jsp }

실행화면

 

 

04. 리스트가 없을 경우 처음 index 화면으로 돌아가기

 

[ STEP 1 ] 'BoardController.java' 파일에서 아래의 코드 추가하기

// 리스트의 데이터가 있다면 보드로 이동하기 if (!list.isEmpty()) { model.addAttribute("list", list); return "board"; } else { return "redirect:/";// 리다이렉트 : 다시 컨트롤러 지나감 (= /란 요청을 다시 함) }

 

[ STEP 2 ] 리스트가 없을 경우 실행화면

실행화면

 

 

05. DB랑 board 이어주기

 

[ STEP 1 ] 'pom.xml' 파일에서 jar파일 import하기 (아래의 코드 추가)

<!-- spring jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework-version}</version> </dependency> <!-- 파일업로드 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> <!-- mariadb-java-client --> <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>3.0.8</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!-- mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency>

 

[ STEP 2 ] 'servlet-context.xml'에서 코드 추가하기

<beans:import resource="classpath:/spring/*-context.xml"/>

 

[ STEP 3 ] 'spring' 폴더 만들고 폴더 안에 database-context.xml 파일 만들기

 

- 'database-context.xml' 코드

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="username" value="dbID"></property> <property name="password" value="dbPW"></property> <property name="url" value="jdbc:mariadb://localhost:3306/db주소"></property> <property name="driverClassName" value="org.mariadb.jdbc.Driver"></property> </bean> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="mapperLocations" value="classpath:/mybatis/mappers/*-mapper.xml"></property> <property name="configLocation" value="classpath:/mybatis/config/mybatisConfig.xml"></property> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryBean"></constructor-arg> </bean> </beans>

 

[ STEP 4 ] src/main/resources/mybastis 안에 config, mappers 각각의 폴더 만들고 xml 파일 생성하기

폴더 생성 위치

 

- 'mybatisConfig.xml' 파일

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration ​​PUBLIC "-//mybatis.org//DTD Config 3.0//EN" ​​"https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> ‌‌<typeAlias type="java.lang.Integer" alias="integer"/> ‌‌ </typeAliases> </configuration>

 

- 'board-mapper.xml' 파일

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper ​​​​PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ​​​​"https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="board"> <select id="boardList" resultType="com.peazh.web.BoardDTO"> ‌‌SELECT * FROM board ‌‌LIMIT 10 </select> </mapper>

 

[ STEP 5 ] 'BoardDTO.java' 파일 생성

package com.peazh.web; public class BoardDTO { private int bno, blike; private String btitle, bcontent, bdate, bwrite; public int getBno() { ‌‌return bno; } public void setBno(int bno) { ‌‌this.bno = bno; } public int getBlike() { ‌‌return blike; } public void setBlike(int blike) { ‌‌this.blike = blike; } public String getBtitle() { ‌‌return btitle; } public void setBtitle(String btitle) { ‌‌this.btitle = btitle; } public String getBcontent() { ‌‌return bcontent; } public void setBcontent(String bcontent) { ‌‌this.bcontent = bcontent; } public String getBdate() { ‌‌return bdate; } public void setBdate(String bdate) { ‌‌this.bdate = bdate; } public String getBwrite() { ‌‌return bwrite; } public void setBwrite(String bwrite) { ‌‌this.bwrite = bwrite; } }

 

[ STEP 6 ] 'BoardDAO.java' 파일 생성

package com.peazh.web; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @Repository public class BoardDAO { @Autowired private SqlSession sqlSession; public List<BoardDTO> boardList() { ‌‌return sqlSession.selectList("board.boardList"); // 네임스페이스.id } }

 

 

 

[ STEP 7 ] 'BoardService.java' 파일 수정

 

- 'BoardDAO'에게 일 시기키

package com.peazh.web; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class BoardService { @Autowired private BoardDAO boardDAO; public List<BoardDTO> boardList() { ‌‌return boardDAO.boardList(); } }

실행화면

 

[ STEP 8 ] 'board.jsp'에서 jstl 사용해서 게시판 구동하기

<%@ page language="java" contentType="text/html; charset=UTF-8" ​​​​pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>게시판</title> </head> <body> <h1>게시판 : ${name }</h1> <table> <tr> <th>번호</th> <th>제목</th> <th>작성자</th> <th>작성일</th> <th>좋아요</th> </tr> <c:forEach items="${list }" var="row"> <tr> <td>${row.bno }</td> <td>${row.btitle }</td> <td>${row.bwrite }</td> <td>${row.bdate }</td> <td>${row.blike }</td> </tr> </c:forEach> </table> </body> </html>

실행화면

 

[ STEP 9 ] 'board-mapper.xml'에서 게시판이 역순으로 나오게 아래의 코드 추가하기

SELECT * FROM board ORDER BY bno DESC LIMIT 10

 

[ STEP 10 ] 'board.jsp'에서 a태그 넣기 (게시글을 눌렀을 때 해당 게시글로 이동하기 위함)

<%@ page language="java" contentType="text/html; charset=UTF-8" ​​​​pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>게시판</title> </head> <body> <h1>게시판 : ${name }</h1> <table> ‌‌<tr> ‌‌‌<th>번호</th> ‌‌‌<th>제목</th> ‌‌‌<th>작성자</th> ‌‌‌<th>작성일</th> ‌‌‌<th>좋아요</th> ‌‌</tr> ‌‌<c:forEach items="${list }" var="row"> ‌‌‌<tr> ‌‌‌‌<td>${row.bno }</td> ‌‌‌‌<td><a href="./detail?bno=${row.bno }">${row.btitle }</a></td> ‌‌‌‌<td>${row.bwrite }</td> ‌‌‌‌<td>${row.bdate }</td> ‌‌‌‌<td>${row.blike }</td> ‌‌‌</tr> ‌‌</c:forEach> </table> </body> </html>

실행화면

 

[ STEP 11 ] 'BoardController.java'에서 아래의 코드 추가하기 (detail 페이지로 이동)

// 2. detail 상세보기 화면 = detail.jsp @GetMapping("/detail") public String detail(HttpServletRequest request) { String bno = request.getParameter("bno"); int no = Integer.parseInt(bno); return "detail"; }

 

06. 주소에 숫자 외엔 들어오지 못하도록 처리하기

 

[ 방법 1 ] 'isDigit' 이용하기

  • 한글자씩 검사해서 숫자가 들어오면 true, 숫자 외에 글자가 들어오면 false 값을 반환해줌
// bno 길이만큼 돌면서 숫자를 하나씩 꺼내기 for (int i = 0; i < bno.length(); i++) { System.out.println(Character.isDigit(bno.charAt(i))); // '117'번을 눌렀다면 true, true, true // '117번'을 눌렀다면 true, true, true, false

 

[ 방법 2 ] 'try-catch' 이용하기

  • 오류가 없다면 try에 있는 문장이 출력, 오류가 나면 catch에 있는 문장이 출력
try { int no = Integer.parseInt(bno); System.out.println("숫자입니다."); } catch (Exception e) { System.out.println("숫자가 아닙니다."); } // 숫자가 들어왔을 경우 : 숫자입니다. // 문자가 들어왔을 경우 : 숫자가 아닙니다.
반응형

댓글