[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("숫자가 아닙니다.");
    }
    
    // 숫자가 들어왔을 경우 : 숫자입니다.
    // 문자가 들어왔을 경우 : 숫자가 아닙니다.
    반응형

    댓글