package com.study.springboot;

import com.study.springboot.dao.IBoardDAO;
import com.study.springboot.dao.IReplyDAO;
import com.study.springboot.dto.BoardDTO;


import com.study.springboot.dto.ReplyDTO;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;


@Controller
public class MyController {

    @Autowired
    IBoardDAO boardDao;
    @Autowired
    IReplyDAO replyDao;

    @RequestMapping("/")
    //@ResponseBody
    public String root() {
        //return "root함수 호출";
        return "redirect:listForm";
    }

    @RequestMapping("/listForm")
    public String listForm(Model model) {
        List<BoardDTO> list = boardDao.list();
        model.addAttribute("list", list);

        System.out.println(list);
        return "listForm";
    }

    @RequestMapping("/writeForm")
    public String wirteForm() {


        return "writeForm";
    }

    @RequestMapping("/writeAction")
    @ResponseBody
    public String wirteAction(@RequestParam("board_name") String board_name,
                              @RequestParam("board_title") String board_title,
                              @RequestParam("board_content") String board_content,
                              HttpServletRequest request) {
        int result = boardDao.write(board_name, board_title, board_content);
        if(result == 1) {
            System.out.println("글쓰기 성공!");
//            request.getSession().setAttribute("alert_message", "글쓰기 성공!");

//            return "redirect:listForm";
            return"<script>alert('글쓰기 성공!'); location.href='/listForm';</script>";
        } else {
            System.out.println("글쓰기 실패!");
//            request.getSession().setAttribute("alert_message", "글쓰기 실패!");
//            return "redirect:writeForm";
            return"<script>alert('글쓰기 실패!')</script>; location.href='/writeForm';</script>";
        }
    }

    @RequestMapping("/contentForm")
    public String contentForm(@RequestParam("board_idx") String board_idx,
                              Model model) {
        //조회수 증가
        boardDao.hit(board_idx);

        //게시글 보기
        BoardDTO dto = boardDao.viewDto(board_idx);
        System.out.println(dto);
        model.addAttribute("dto", dto);

        //댓글 리스트 가져오기
        List<ReplyDTO> reply_list = replyDao.reply_list(board_idx);
        model.addAttribute("reply_list", reply_list);

        return "contentForm";
    }

    @RequestMapping("/updateAction")
    @ResponseBody
    public String updateAction(@RequestParam("board_idx") String board_idx,
                               @RequestParam("board_name") String board_name,
                               @RequestParam("board_title") String board_title,
                               @RequestParam("board_content") String board_content,
                               HttpServletRequest request,
                               Model model) {
        int result = boardDao.updateDto(board_idx, board_name, board_title, board_content);
        if(result == 1) {
            System.out.println("글수정 성공!");
//            request.getSession().setAttribute("alert_message", "글수정 성공!");
//            return "redirect:listForm";
            return"<script>alert('글수정 성공!'); location.href='/listForm';</script>";
        } else {
            System.out.println("글수정 실패!");
//            request.getSession().setAttribute("alert_message", "글수정 실패!");
//            return "redirect:contentForm?board_idx=" + board_idx;
            return"<script>alert('글수정 실패!'); location.href='/contentForm?board_idx=" + board_idx + "';</script>";
        }
    }

    @RequestMapping("/deleteAction")
    @ResponseBody
    public String deleteAction(@RequestParam("board_idx") String board_idx,
                               HttpServletRequest request) {
        int result = boardDao.deleteDto(board_idx);
        if(result == 1) {
            System.out.println("글삭제 성공!");
//            request.getSession().setAttribute("alert_message", "글삭제 성공!");
//            return "redirect:listForm";
            return"<script>alert('글삭제 성공!'); location.href='/listForm';</script>";
        } else {
            System.out.println("글삭제 실패!");
//            request.getSession().setAttribute("alert_message", "글삭제 실패!");
//            return "redirect:contentForm?board_idx=" + board_idx;
            return"<script>alert('글삭제 실패!'); location.href='/contentForm?board_idx=" + board_idx + "';</script>";
        }
    }

    @RequestMapping("/writeReplyAction")
    @ResponseBody
    public String wirteReplyAction(@RequestParam("reply_name") String reply_name,
                                   @RequestParam("reply_content") String reply_content,
                                   @RequestParam("reply_board_index") String reply_board_index,
                                   HttpServletRequest request) {
        int result = replyDao.reply_write(reply_name, reply_content, reply_board_index);
        if(result == 1) {
            System.out.println("댓글달기 성공!");
//            request.getSession().setAttribute("alert_message", "글쓰기 성공!");

//            return "redirect:listForm";
            return"<script>alert('댓글달기 성공!'); location.href='/contentForm?board_idx=" + reply_board_index + "';</script>";
        } else {
            System.out.println("댓글달기 실패!");
//            request.getSession().setAttribute("alert_message", "글쓰기 실패!");
//            return "redirect:writeForm";
            return"<script>alert('댓글달기 실패!'); location.href='/contentForm?board_idx=" + reply_board_index + "';</script>";
        }
    }

    @RequestMapping("/deleteReplyAction")
    @ResponseBody
    public String deleteReplyAction(@RequestParam("reply_idx") String reply_idx,
                                    @RequestParam("board_idx") String board_idx,
                               HttpServletRequest request) {
        int result = replyDao.reply_deleteDto(reply_idx);
        if(result == 1) {
            System.out.println("댓글삭제 성공!");
//            request.getSession().setAttribute("alert_message", "글삭제 성공!");
//            return "redirect:listForm";
            return"<script>alert('댓글삭제 성공!'); location.href='/contentForm?board_idx=" + board_idx + "';</script>";
        } else {
            System.out.println("댓글삭제 실패!");
//            request.getSession().setAttribute("alert_message", "글삭제 실패!");
//            return "redirect:contentForm?board_idx=" + board_idx;
            return"<script>alert('댓글삭제 실패!'); location.href='/contentForm?board_idx=" + board_idx + "';</script>";
        }
    }
}
package com.study.springboot.dao;

import com.study.springboot.dto.BoardDTO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface IBoardDAO {
    public List<BoardDTO> list();

    public int write(String board_name, String board_title, String board_content);

    public BoardDTO viewDto(String board_idx);

    public int updateDto(String board_idx, String board_name, String board_title, String board_content);

    public int deleteDto(String board_idx);

    public int hit(String board_idx);
}
package com.study.springboot.dao;

import com.study.springboot.dto.ReplyDTO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface IReplyDAO {
    public List<ReplyDTO> reply_list(String reply_index);
    public int reply_write(String reply_name, String reply_content, String reply_index);
    public int reply_deleteDto(String reply_idx);
}
package com.study.springboot.dto;

import lombok.Data;

import java.util.Date;

@Data
public class BoardDTO {
    private int board_idx;
    private String board_name;
    private String board_title;
    private String board_content;
    private Date board_date;
    private int board_hit;

    public BoardDTO(int board_idx, String board_name, String board_title, String board_content, Date board_date, int board_hit) {
        this.board_idx = board_idx;
        this.board_name = board_name;
        this.board_title = board_title;
        this.board_content = board_content;
        this.board_date = board_date;
        this.board_hit = board_hit;
    }
}
package com.study.springboot.dto;

import lombok.Data;

import java.util.Date;

@Data
public class ReplyDTO {
    private int reply_idx;
    private String reply_name;
    private String reply_content;
    private Date reply_date;
    private int reply_board_idx;

    public ReplyDTO(int reply_idx, String reply_name, String reply_content, Date reply_date, int reply_board_idx) {
        this.reply_idx = reply_idx;
        this.reply_name = reply_name;
        this.reply_content = reply_content;
        this.reply_date = reply_date;
        this.reply_board_idx = reply_board_idx;
    }
}
<?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.study.springboot.dao.IBoardDAO">
    <select id="list" resultType="com.study.springboot.dto.BoardDTO">
        SELECT * FROM BOARD ORDER BY BOARD_DATE DESC
    </select>

    <insert id="write">
        insert into board (board_idx,
                           board_name,
                           board_title,
                           board_content,
                           board_date)
        values (board_seq.nextval,
                #{param1},
                #{param2},
                #{param3},
                sysdate)
    </insert>

    <select id="viewDto" resultType="com.study.springboot.dto.BoardDTO">
        SELECT * FROM BOARD WHERE BOARD_IDX = #{param1}
    </select>

    <update id="updateDto">
        UPDATE BOARD SET board_name = #{param2},
                         board_title = #{param3},
                         board_content = #{param4}
        WHERE board_idx = #{param1}
    </update>

    <delete id="deleteDto">
        DELETE FROM BOARD WHERE BOARD_IDX = #{param1}
    </delete>

    <update id="hit">
        UPDATE BOARD SET BOARD_HIT = BOARD_HIT + 1
        WHERE BOARD_IDX = #{param1}
    </update>
</mapper>
<?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.study.springboot.dao.IReplyDAO">
    <select id="reply_list" resultType="com.study.springboot.dto.ReplyDTO">
        SELECT * FROM REPLY
        WHERE REPLY_BOARD_IDX=#{param1}
        ORDER BY REPLY_DATE DESC
    </select>

    <insert id="reply_write">
        INSERT INTO REPLY (reply_idx,
                           reply_name,
                           reply_content,
                           reply_date,
                           reply_board_idx)
        VALUES (reply_board_seq.nextval,
                #{param1},
                #{param2},
                sysdate,
                #{param3})
    </insert>

    <delete id="reply_deleteDto">
        DELETE FROM REPLY WHERE REPLY_IDX = #{param1}
    </delete>
</mapper>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="jakarta.tags.fmt" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>글 내용</title>
<%--    <script>--%>
<%--        let isEmpty = function(value) {--%>
<%--            if(value == "" || value == null || value == undefined ||--%>
<%--                (value != null && typeof value == "object" && !Object.keys(value).length)) {--%>
<%--                return true;--%>
<%--            } else {--%>
<%--                return false;--%>
<%--            }--%>
<%--        };--%>

<%--        let alert_message = "${alert_message}";--%>
<%--        if(!isEmpty(alert_message)){--%>
<%--            alert(alert_message);--%>
<%--        }--%>
<%--    </script>--%>
    <style>
        * {
            margin: 0 auto;
            padding: 0 auto;
            overflow: hidden;
        }
        td, h2 {
            text-align: center;
        }
    </style>
</head>
<body>
    <h2>글 내용</h2>
    <form action="updateAction" method="post">
        <table width="500" cellpadding="0" cellspacing="0" border="1">
            <input type="hidden" name="board_idx" value="${dto.board_idx}">
            <tr>
                <td>번호</td>
                <td>${dto.board_idx}</td>
            </tr>
            <tr>
                <td>조회수</td>
                <td>${dto.board_hit}</td>
            </tr>
            <tr>
                <td>이름</td>
                <td>
                    <input type="text" name="board_name" value="${dto.board_name}" size="50">
                </td>
            </tr>
            <tr>
                <td>제목</td>
                <td>
                    <input type="text" name="board_title" value="${dto.board_title}" size="50">
                </td>
            </tr>
            <tr>
                <td>내용</td>
                <td>
                    <textarea rows="10" cols="50" name="board_content">${dto.board_content}</textarea>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    &nbsp;&nbsp;<input type="submit" value="수정하기">&nbsp;&nbsp;
                    <a href="listForm"><input type="button" value="목록보기"></a>&nbsp;&nbsp;
                    <a href="deleteAction?board_idx=${dto.board_idx}"><input type="button" value="삭제하기"></a>&nbsp;&nbsp;
                </td>
            </tr>
        </table>
    </form>
    <br>
    <form action="writeReplyAction" method="post">
        <table width="500" cellpadding="0" cellspacing="0" border="1">
            <tr>
                <td colspan="2">
                    <input type="hidden" name="reply_board_index" value="${dto.board_idx}">
                    <label>댓글</label><textarea rows="2" cols="50" name="reply_content"></textarea><br>
                    <label>별명</label><input type="text" name="reply_name" value=""><br>
                    <input type="submit" value="댓글달기">
                </td>
            </tr>
        </table>
    </form>
    <br>
    <table width="500" cellpadding="0" cellspacing="0" border="1">
        <tr>
            <th>별명</th>
            <th>내용</th>
            <th>날짜</th>
            <th>삭제</th>
        </tr>
        <c:forEach var="reply_dto" items="${reply_list}">
            <tr>
                <td>${reply_dto.reply_name}</td>
                <td>${reply_dto.reply_content}</td>
                <td>
                    <c:set var="dateVar" value="${reply_dto.reply_date}" />
                    <fmt:formatDate value="${dateVar}" pattern="yyyy-MM-dd HH:mm:ss" />
                </td>
                <td>
                    <a href="deleteReplyAction?reply_idx=${reply_dto.reply_idx}&board_idx=${dto.board_idx}"><button>삭제</button></a>
                </td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="jakarta.tags.fmt" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>게시판 목록보기</title>
    <%--    <script>--%>
    <%--        let isEmpty = function(value) {--%>
    <%--            if(value == "" || value == null || value == undefined ||--%>
    <%--                (value != null && typeof value == "object" && !Object.keys(value).length)) {--%>
    <%--                return true;--%>
    <%--            } else {--%>
    <%--                return false;--%>
    <%--            }--%>
    <%--        };--%>

    <%--        let alert_message = "${alert_message}";--%>
    <%--        if(!isEmpty(alert_message)){--%>
    <%--            alert(alert_message);--%>
    <%--        }--%>
    <%--    </script>--%>
    <style>
        * {
            margin: 0 auto;
            padding: 0 auto;
            overflow: hidden;
        }
        td, h2 {
            text-align: center;
        }
    </style>
</head>
<body>
<h2>게시판 글목록</h2>
<table width="500" cellpadding="0" cellspacing="0" border="1">
    <tr>
        <th>번호</th>
        <th>이름</th>
        <th>제목</th>
        <th>날짜</th>
        <th>조회수</th>
    </tr>
    <c:forEach var="dto" items="${list}">
        <tr>
            <td>${dto.board_idx}</td>
            <td>${dto.board_name}</td>
            <td>
                <a href="contentForm?board_idx=${dto.board_idx}">${dto.board_title}</a>
            </td>
            <td>
                <c:set var="dateVar" value="${dto.board_date}" />
                <fmt:formatDate value="${dateVar}" pattern="yyyy-MM-dd HH:mm:ss" />
            </td>
            <td>${dto.board_hit}</td>
        </tr>
    </c:forEach>
    <tr>
        <td colspan="5"><a href="writeForm">글작성</a></td>
    </tr>
</table>
<script>
    /* 웹브라우저 back키 눌렀을 때, 페이지 재로딩 */
    window.onpageshow = function(event) {
        if(event.persisted) {
            document.location.reload();
        }
    }
</script>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>글쓰기</title>
    <%--    <script>--%>
    <%--        let isEmpty = function(value) {--%>
    <%--            if(value == "" || value == null || value == undefined ||--%>
    <%--                (value != null && typeof value == "object" && !Object.keys(value).length)) {--%>
    <%--                return true;--%>
    <%--            } else {--%>
    <%--                return false;--%>
    <%--            }--%>
    <%--        };--%>

    <%--        let alert_message = "${alert_message}";--%>
    <%--        if(!isEmpty(alert_message)){--%>
    <%--            alert(alert_message);--%>
    <%--        }--%>
    <%--    </script>--%>
    <style>
        * {
            margin: 0 auto;
            padding: 0 auto;
            overflow: hidden;
        }
        td, h2 {
            text-align: center;
        }
    </style>
</head>
<body>
    <h2>글쓰기</h2>
    <form action="writeAction" method="post">
        <table width="500" cellpadding="0" cellspacing="0" border="1">
            <tr>
                <td>이름</td>
                <td>
                    <input type="text" name="board_name" value="" size="50">
                </td>
            </tr>
            <tr>
                <td>제목</td>
                <td>
                    <input type="text" name="board_title" value="" size="50">
                </td>
            </tr>
            <tr>
                <td>내용</td>
                <td>
                    <textarea rows="10" cols="50" name="board_content"></textarea>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    &nbsp;&nbsp;<input type="submit" value="글쓰기">&nbsp;&nbsp;
                    <a href="listForm"><input type="button" value="목록보기"></a>
                </td>
            </tr>

        </table>
    </form>
</body>
</html>

db.sql(text)(아래)

create table board(
    board_idx       number(4) primary key,
    board_name      varchar2(20),
    board_title     varchar2(100),
    board_content   varchar2(300),
    board_date      date default sysdate,
    board_hit       number(4) default 0
);

create SEQUENCE board_seq;

insert into board (board_idx,board_name, board_title, board_content, board_date)
values (board_seq.nextval, '사임당', '글 제목3', '글 내용3', sysdate);

select * from board;

create table reply(
    reply_idx       number(4) primary key,
    reply_name      varchar2(20),
    reply_content   varchar2(300),
    reply_date      date default sysdate,
    reply_board_idx       number(4)
);

create SEQUENCE reply_board_seq;

insert into reply (reply_idx,reply_name, reply_content, reply_date, reply_board_idx)
values (reply_board_seq.nextval, '심봉사', '댓글 제목3', sysdate, 3);

select * from reply;

commit;

출처 - https://www.youtube.com/@CodingTutor/featured

+ Recent posts