코딩항해기

[과제/Spring] board insert 구현하기 본문

problem solving/과제&실습 코딩

[과제/Spring] board insert 구현하기

miniBcake 2024. 10. 7. 20:05

 

 

현재 배운 내용으로 board insert 구현하기

 

1. 글 작성 페이지로 사용자의 요청 받기

2. 요청 추출하기 (/boardWrite)

3. 요청 처리하기 (boardWriteController)

4. 응답하기 (메인페이지로 이동, main.do)

 

톰캣 서버 세팅을 해본다고 했는데, 서버는 켜지는데 페이지 접근이 되지 않는다..ㅠ 해서 테스트를 해보지 못했기 때문에 오류가 있을 수 있다. 

 

1번을 수행하기 위해서는 사용자로부터 입력을 받을 페이지가 필요하다.

<%@ 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>게시글 작성 페이지</h1>

<form action="boardWrite.do" method="POST">
    <input type="text" name="title" placeholder="제목을 입력하세요.">
    <textarea name="content" placeholder="내용을 입력하세요."></textarea>
    <input type="submit" value="글 작성">
</form>
</body>
</html>

 

 

글 작성을 완료하면 boardwrite.do요청이 POST형식으로 가게 된다.

이 요청은 web.xml에 작성된 .do로 끝나는 모든 요청을 받는 DispatcherServlet인 ds로 가게 된다.

여기에 사용된 DispatcherServlet은 springframework가 제공해주는 Servlet이다. 

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0">
    <servlet>
        <servlet-name>ds</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--스프링에서 제공하는 Servlet 사용-->
    </servlet>
    <servlet-mapping>
        <servlet-name>ds</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

 

 

그러고나면 ds, 즉 DispatcherServlet의 설정을 작성할  ds-servlet.xml을 필요로하게 된다.

ds-servlet.xml에는 ds가 의존성을 갖는 HandlerMapping과 ViewResolver가 등록되어 있어야하는데, 아직 ViewResolver 진도를 나가지 않았으므로 HandlerMapping만 작성해보도록 하겠다.

 

<?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 class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <!--<prop key="키 값 ">밸류 값</prop>-->
                <prop key="/login.do">login</prop>
                <prop key="/main.do">main</prop>
                <!-- /boardWrite.do 요청이 오면 객체를 반환할 수 있도록 있도록 등록 -->
                <prop key="/boardWrite.do">boardWrite</prop>
            </props>
        </property>
    </bean>

    <bean class="com.koreait.app.view.member.LoginController" id="login"/>
    <bean class="com.koreait.app.view.member.MainController" id="main"/>
    <!-- boardWriteController Bean 등록 -->
    <bean class="com.koreait.app.view.board.BoardWriteController" id="boardWrite"/>

</beans>

 

 

먼저 새로 만들 BoardWriteController를 Bean으로 등록하고 이 Bean 객체를 HandlerMapping에 등록한다. 여기서 사용된 HandlerMapping 또한 SpringFramework에서 제공해주고 있다.

 

이제 등록되는 객체이는 BoardWriteController를 만들어야한다. 이때 BoardWriteController는 org.springframework.web.servlet.mvc.Controller를 구현한다. (메서드 시그니처를 통일하기 위함이다.)

 

public class BoardWriteController implements Controller {
    @Autowired
    private BoardDAO boardDAO;

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //입력받은 값 DTO에 저장
        BoardDTO data = new BoardDTO();
        data.setTitle(request.getParameter("title"));
        data.setContent(request.getParameter("content"));
    
        //반환할 객체 생성
        ModelAndView mav = new ModelAndView();
        //완료 후 이동할 페이지, 이동할 Controller(요청)
        mav.setViewName("main.do");

        if(!boardDAO.insert(data)){ //DB에 추가
            //insert 실패 시
            System.out.println("Insert failed");
            throw new RuntimeException("Insert failed");
        }

        return mav;
    }
}

 

 

여기서 serviceImpl를 사용하는 것 같은데 아직은 DAO로 진행하고 있다. DAO는 여러 객체가 필요없고 하나만 있으면 되기 때문에 의존주입을 받기로 했다. (DAO에는 @Repository 어노테이션이 달려있어 이미 컨테이너에 bean으로 등록되어있다.) 반면 DTO와 ModelAndView는 자료형으로 새롭게 만들어 반환하는 것이 맞기 때문에 new를 사용했다.

 

성공적으로 insert가 진행됐다면 main.do를 통해 main.jsp로 이동할 것이고, 만약 실패하게 된다면 비체크 예외인 RuntimeException을 일으켜 500 페이지로 이동하게 될 것이다. 

 

 

boardDAO insert (DAO 기능은 JSP기반 프로젝트의 JDBC와 변동 없으므로 정리만 했다.)

더보기
    public boolean insert(BoardDTO boardDTO) {
        System.out.println("board insert start");
        Connection conn=JDBCUtil.connect();
        PreparedStatement pstmt = null;
        try {
            pstmt=conn.prepareStatement(INSERT);
            pstmt.setString(1, boardDTO.getTitle());
            pstmt.setString(2, boardDTO.getContent());
            if(pstmt.executeUpdate() <= 0){
                System.out.println("board insert result failed");
                return false;
            }
        } catch (SQLException e) {
            System.out.println("SQLException: " + e.getMessage());
            return false;
        } finally {
            JDBCUtil.disconnect(pstmt,conn);
            System.out.println("board insert end");
        }
        System.out.println("board insert true");
        return true;
    }