day 09

유요한·2022년 12월 23일
1

Spring

목록 보기
12/15
post-thumbnail

Controller의 메서드 리턴 타입을 복합적인 데이터가 들어간 객체 타입으로 지정할 수 있는데, 이 경우는 주로 JSON데이터를 만들어 내는 용도로 사용합니다.

이를 위해서는 jackson-databind 라이브러리를 pom.xml에 추가합니다.

  <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.4</version>
        </dependency>

파일 업로드 처리

파일 업로드를 하기 위해서는 전달되는 파일 데이터를 분석해야 하는데, 이를 위해서 Servlet 3.0 전까지는 commons의 파일 업로드를 이용하거나 cos.jar 등을 이용해서 처리를 해왔습니다. Servlet 3.0 이후(Tomcat 7.0)에는 기본적으로 업로드 되는 파일을 처리할 수 있는 기능이 추가되어 있으므로 더 이상 추가적인 라이브러가 필요로 하지 않습니다.

Spring Legacy Project로 생성하면 Servlet 2.5를 기준으로 생성되기 때문에 2.5 이하 버전에서 많이 사용하는 commons-fileupload를 이용하려고 합니다.

pom.xml

       <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>

라이브러리를 추가한 후 파일이 임시로 업로드될 폴더를 C드라이브 아래 upload/tmp로 작성합니다.

servlet-context은 스프링 MVC의 특정한 객체(빈)을 설정해서 파일을 처리합니다. 다른 객체(Bean)를 설정하는 것과 달리 파일 업로드의 경우에는 반드시 id 속성의 값을 multipartResolver로 정확하게 지정해야 하므로 주의가 필요합니다.

아래의 코드를 추가해줍니다.

servlet-context.xml

    <beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <beans:property name="defaultEncoding" value="utf-8" />
        <!-- 1024 * 1024 * 10 bytes 10MB -->
        <beans:property name="maxUploadSize" value="104857560"/>
        <!-- 1024 * 1024 * 2 bytes 2MB -->
        <beans:property name="maxUploadSizePerFile" value="2097152" />
        <beans:property name="uploadTempDir" value="file:/C:/upload/tmp"/>
        <beans:property name="maxInMemorySize" value="10485756" />
    </beans:bean>

maxUploadSize는 한 번의 Request로 전달될 수 있는 최대의 크기를 의미하고, maxUploadSizePerFile은 하나의 파일 최대 크기, maxInMemorySize는 메모리상에서 유지하는 최대의 크기를 의미합니다. 이 크기 이상의 데이터는 uploadTemDir에 임시 파일의 형태로 보관됩니다. 여기에서 절대 경로를 이용하려면 URL형태로 제공해야 하기 때문에 file:/로 시작하도록 합니다. defaultEncoding은 업로드하는 파일의 이름이 한글일 경우 깨지는 문제를 처리합니다.

SampleController에서는 다음과 같이 get방식으로 파일을 업로드할 화면을 처리합니다.

SampleControll

    @GetMapping("/exUpload")
    public void exUpload() {
        log.info("/exUpload.................");

    }

파일 업로드를 해 볼 /WEB-INF/views/sample/exUpload.jsp 파일을 작성합니다.

exUpload.js

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>exUpload</title>
</head>
<body>
    <form action="/sample/exUploadPost" method="post" enctype="multipart/form-data">
        <div>
            <input type="file" name="files">
        </div>
        <div>
            <input type="file" name="files">
        </div>
        <div>
            <input type="file" name="files">
        </div>
        <div>
            <input type="file" name="files">
        </div>
        <div>
            <input type="file" name="files">
        </div>
        <div>
            <input type="submit">
        </div>
    </form>
</body>
</html>

exUpload.jsp는 여러 개의 파일을 한꺼번에 업로드하는 예제로 작성해봅니다. <form> 태그의 action 속성, method 속성, enctype 속성에 주의해서 작성해야 합니다.

exUpload.jsp의 action 속성값은 /sample/exUploadPost로 작성되었으므로, 이에 맞는 메서드를 SampleController에 추가합니다.

    @PostMapping("/exUploadPost")
    public void exUploadPost(ArrayList<MultipartFile> files) {
        files.forEach(file -> {
            log.info("---------------------------");
            // 파일 업로드명
            log.info("name : " + file.getOriginalFilename());
            log.info("size : " + file.getSize());
        });
    }

스프링 MVC는 전달되는 파라미터가 동일한 이름으로 여러 개 존재하면 배열로 처리가 가능하므로 파라미터를 MultipartFile의 배열 타입으로 작성합니다.


더미 데이터 추가

테이블을 생성하고 나면 여러 개의 데이터를 추가해 주는데 이런 의미 없는 데이터를 흔히 토이 데이터 혹은 더미 데이터라고 합니다.

insert into spring_board (boardTitle, boardContents, userId) 
values('테스트 제목1', 'apple이 작성한 테스트 내용1', 'apple');

여러개 한번에 하기

insert into spring_board (boardTitle, boardContents, userId)
values	('테스트 제목1', 'apple이 작성한 테스트 내용1', 'apple'), 
		('테스트 제목2', 'banana이 작성한 테스트 내용2', 'banana'),
        ('테스트 제목3', 'cheery이 작성한 테스트 내용3', 'cheery'),
        ('테스트 제목4', 'durian이 작성한 테스트 내용4', 'durian');

등록덴 데이터를 배로 계속 증가시키기

insert into spring_board (boardTitle, boardContents, userId) 
(select boardTitle, boardContents, userId from spring_board);

log.info 한글 깨짐

C:\Program Files\JetBrains\IntelliJ IDEA 2022.2.3\bin
위치에 들어갑니다.

  • 맨 아랫줄에 -Dfile.encoding=UTF-8 를 추가해준 후 저장한다. 이후 IntelliJ를 다시 실행하도록 한다.

두번째 방법

  • 맨 아랫줄에 -Dfile.encoding=UTF-8 를 추가해준 후 저장한다. 이후 IntelliJ를 다시 실행하도록 한다.



  • VM options에 다음 옵션을 추가하여 준다.

    "-Dfile.encoding=UTF-8"


여태까지 user에 관련된 것만 처리를 했지만 이제부터는 board에 관련된 것을 나가려고 합니다.

list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>list</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
    <link rel="shortcut icon" href="#">
    <meta name="description" content=""/>
    <meta name="keywords" content=""/>
    <link rel="stylesheet" href="/resources/assets/css/main.css"/>
    <style>
        #banner input, #banner select, #banner option {
            color: #000000;
        }
        select {
            width: 15%;
            text-align: center;
            padding: 20px;
            display: inline;
        }

        #keyword {
            width: 55%;
            display: inline;
        }
        #keyword+a {
            border: 1px solid #fff;
        }
    </style>
</head>
<body class="is-preload">
<!-- Header -->
<header id="header" class="alt">
    <a class="logo" href="/">Spring <span>Board</span></a>
    <nav id="nav">
        <ul>
            <c:choose>
                <c:when test="${loginUser == null}">
                    <li class="current"><a href="/">Home</a></li>
                    <li><a href="/user/join">Join</a></li>
                    <li><a href="/user/login">Login</a></li>
                </c:when>
                <c:otherwise>
                    <li>${loginUser}님 환영합니다!</li>
                    <li class="current"><a href="/">Home</a></li>
                    <li><a href="/board/list">Board</a></li>
                    <li><a href="/user/logout">Logout</a></li>
                </c:otherwise>
            </c:choose>
        </ul>
    </nav>
</header>

<!-- Banner -->
<div id="banner">
    <div class="wrapper style1 special">
        <div class="inner">
            <h1 class="heading alt">Board</h1>
            <p>게시판 목록</p>
            <a href="#" class="button primary" style="float: right; border-bottom: 1px solid #fff; border-radius: 0px; border-top: 1px solid #fff">글 등록 </a>
            <div class="table-wrapper" style="clear: both">
                <table>
                    <thead>
                        <tr>
                            <th>번호</th>
                            <th>제목</th>
                            <th>작성자</th>
                            <th>작성시간</th>
                            <th>수정시간</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                        </tr>
                    </tbody>
                </table>
            </div>
            <form>
                <div>
                    <select name="type">
                        <option value="">검색</option>
                        <option value="">제목</option>
                        <option value="">내용</option>
                        <option value="">작성자</option>
                        <option value="">제목 또는 내용</option>
                        <option value="">제목 또는 작성자</option>
                        <option value="">제목 또는 내용 또는 작성자</option>
                    </select>
                    <input type="text" name="keyword" id="keyword">
                    <a href="#" class="button primary">검색</a>
                </div>
            </form>
            <div>
                <code>&lt;</code>
                <code>1</code>
                <code>2</code>
                <code>3</code>
                <code>4</code>
                <code>5</code>
                <code>&gt;</code>
            </div>
        </div>
    </div>
</div>

<!-- Scripts -->
<script src="/resources/assets/js/jquery.min.js"></script>
<script src="/resources/assets/js/jquery.dropotron.min.js"></script>
<script src="/resources/assets/js/browser.min.js"></script>
<script src="/resources/assets/js/breakpoints.min.js"></script>
<script src="/resources/assets/js/util.js"></script>
<script src="/resources/assets/js/main.js"></script>
</body>
</html>

view를 만들어 줬으니 이제는 controller가 필요합니다.

BoardController

package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/board/*")
public class BoardController {

    @GetMapping("/list")
    public void list() {

    }
}

mysql에서 DB관련된 것을 만들어줘야 합니다.

use web0315;

create table spring_user(
	userId varchar(300) primary key,
    userPw varchar(300) not null,
    userName varchar(300) not null
);

create table spring_board(
	boardNum bigint primary key auto_increment,
    boardTitle varchar(300) not null,
    boardContents varchar(6000) not null,
    userId varchar(300),
    regDate datetime default now(),
    updateDate datetime default now(),
    constraint board_user_fk foreign key(userId) references spring_user(userId)
);

select * from spring_user;
drop table spring_board;
drop table spring_user;
select * from spring_board order by boardnum desc;

insert into spring_board (boardTitle, boardContents, userId) values('테스트 제목1', 'apple이 작성한 테스트 내용1', 'apple');
insert into spring_board (boardTitle, boardContents, userId) values('테스트 제목2', 'banana이 작성한 테스트 내용2', 'banana');
insert into spring_board (boardTitle, boardContents, userId) values('테스트 제목3', 'cheery이 작성한 테스트 내용3', 'cheery');
insert into spring_board (boardTitle, boardContents, userId) values('테스트 제목4', 'durian이 작성한 테스트 내용4', 'durian');
insert into spring_board (boardTitle, boardContents, userId)
values	('테스트 제목1', 'apple이 작성한 테스트 내용1', 'apple'), 
		('테스트 제목2', 'banana이 작성한 테스트 내용2', 'banana'),
        ('테스트 제목3', 'cheery이 작성한 테스트 내용3', 'cheery'),
        ('테스트 제목4', 'durian이 작성한 테스트 내용4', 'durian');

insert into spring_board (boardTitle, boardContents, userId) (select boardTitle, boardContents, userId from spring_board);

다음은 DTO를 만들어 줘야 합니다.

BoardDTO

package com.example.domain;

import lombok.Data;

@Data
public class BoardDTO {
    private Long boardNum;
    private String boardTitle;
    private String boardContents;
    private String userId;
    private String regDate;
    private String updateDate;
}

DTO를 만들어 줬으면 mapper을 만들어줘야 합니다.

BoardMapper

package com.example.mapper;

import com.example.domain.BoardDTO;

import java.util.List;

public interface BoardMapper {
    List<BoardDTO> getList();
}

그런 다음 xml로 관리를 하려면 mapper.xml을 추가해야 합니다.

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.mapper.BoardMapper">
    <select id="getList" resultType="com.example.domain.BoardDTO">
        <!-- 0 <boardNum하면 과로 처리하지만 CDATA안에 써주면 제대로 사용 가능하다-->
        <![CDATA[
            select * from spring_board where 0<boardNum order by  boardNum desc limit  0,10
        ]]>
    </select>
</mapper>

테스트!

BoardMapper

package com.example.mapper;

import lombok.Setter;
import lombok.extern.log4j.Log4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@Log4j
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class BoardMapperTest {
    @Setter(onMethod_ = @Autowired)
    private BoardMapper mapper;

    @Test
    public void listTest() {
        log.info(mapper.getList());
    }
}

다음과 같이 뜨는 것을 확인 할 수 있습니다.

그러면 service 작업을 해줘야 한다.

BoardService

package com.example.service;

import com.example.domain.BoardDTO;

import java.util.List;

public interface BoardService {
    public List<BoardDTO> getList();

    public void regist(BoardDTO board);
    public BoardDTO get(Long boardNum);
    public boolean modify(BoardDTO board);
    public boolean remove(Long boardNum);
}

BoardServiceImpl

package com.example.service;

import com.example.domain.BoardDTO;
import com.example.mapper.BoardMapper;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Log4j
public class BoardServiceImpl implements BoardService {
    @Setter(onMethod_ = @Autowired)
    private BoardMapper mapper;

    @Override
    public List<BoardDTO> getList() {
        log.info("==========getList============");
        return mapper.getList();
    }

    @Override
    public void regist(BoardDTO board) {

    }

    @Override
    public BoardDTO get(Long boardNum) {
        return null;
    }

    @Override
    public boolean modify(BoardDTO board) {
        return false;
    }

    @Override
    public boolean remove(Long boardNum) {
        return false;
    }
}

list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>list</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
    <link rel="shortcut icon" href="#">
    <meta name="description" content=""/>
    <meta name="keywords" content=""/>
    <link rel="stylesheet" href="/resources/assets/css/main.css"/>
    <style>
        #banner input, #banner select, #banner option {
            color: #000000;
        }
        select {
            width: 15%;
            text-align: center;
            padding: 9px;
            display: inline;
        }

        #keyword {
            width: 55%;
            display: inline;
        }
        #keyword+a {
            border: 1px solid #fff;
        }
        th, td {
            text-align: center !important;
        }
    </style>
</head>
<body class="is-preload">
<!-- Header -->
<header id="header" class="alt">
    <a class="logo" href="/">Spring <span>Board</span></a>
    <nav id="nav">
        <ul>
            <c:choose>
                <c:when test="${loginUser == null}">
                    <li class="current"><a href="/">Home</a></li>
                    <li><a href="/user/join">Join</a></li>
                    <li><a href="/user/login">Login</a></li>
                </c:when>
                <c:otherwise>
                    <li>${loginUser}님 환영합니다!</li>
                    <li class="current"><a href="/">Home</a></li>
                    <li><a href="/board/list">Board</a></li>
                    <li><a href="/user/logout">Logout</a></li>
                </c:otherwise>
            </c:choose>
        </ul>
    </nav>
</header>

<!-- Banner -->
<div id="banner">
    <div class="wrapper style1 special">
        <div class="inner">
            <h1 class="heading alt">Board</h1>
            <p>게시판 목록</p>
            <a href="/board/regist" class="button primary" style="float: right; border-bottom: 1px solid #fff; border-radius: 0px; border-top: 1px solid #fff">글 등록 </a>
            <div class="table-wrapper" style="clear: both">
                <table>
                    <thead>
                        <tr>
                            <th style="width: 10%;">번호</th>
                            <th style="width: 40%">제목</th>
                            <th style="width: 15%;">작성자</th>
                            <th style="width: 35%;">작성시간</th>
                        </tr>
                    </thead>
                    <tbody>
                    <c:choose>
                        <c:when test="${list != null and list.size() > 0}" >
                            <c:forEach items="${list}" var="board">
                                    <tr>
                                        <td>${board.boardNum}</td>
                                        <td>${board.boardTitle}</td>
                                        <td>${board.userId}</td>
                                        <td>${board.regDate}
                                            <c:if test="${board.regDate != board.updateDate}">
                                                (${board.updateDate})</td>
                                            </c:if>
                                    </tr>
                                </c:forEach>
                            </c:when>
                        </c:choose>
                    </tbody>
                </table>
            </div>
            <form>
                <div>
                    <select name="type">
                        <option value="">검색</option>
                        <option value="">제목</option>
                        <option value="">내용</option>
                        <option value="">작성자</option>
                        <option value="">제목 또는 내용</option>
                        <option value="">제목 또는 작성자</option>
                        <option value="">제목 또는 내용 또는 작성자</option>
                    </select>
                    <input type="text" name="keyword" id="keyword">
                    <a href="#" class="button primary">검색</a>
                </div>
            </form>
            <div>
                <code>&lt;</code>
                <code>1</code>
                <code>2</code>
                <code>3</code>
                <code>4</code>
                <code>5</code>
                <code>&gt;&gt;</code>
            </div>
        </div>
    </div>
</div>

<!-- Scripts -->
<script src="/resources/assets/js/jquery.min.js"></script>
<script src="/resources/assets/js/jquery.dropotron.min.js"></script>
<script src="/resources/assets/js/browser.min.js"></script>
<script src="/resources/assets/js/breakpoints.min.js"></script>
<script src="/resources/assets/js/util.js"></script>
<script src="/resources/assets/js/main.js"></script>
</body>
</html>

regist.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>Board</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
    <link rel="shortcut icon" href="#">
    <meta name="description" content=""/>
    <meta name="keywords" content=""/>
    <link rel="stylesheet" href="/resources/assets/css/main.css"/>
    <style>
        #banner input, #banner select, #banner option {
            color: #000000;
        }
        input:not(.button), textarea {
            border: 1px solid black !important;
            color: #000000 !important;
        }
        #banner .write_area input::placeholder {
            color: #ccc !important;
        }
        .write_area {
            width: 70%;
            margin: 0 auto;
        }
        .write_area input {
            margin-bottom: 32px;
        }
        .write_area > form > div {
            margin-bottom: 32px;
        }
        .write_area > form > div:nth-of-type(odd) > h4 {
            float: left;
        }
        .write_area > form > div:nth-of-type(odd) > input {
            float: right;
            width: 70%;
        }
        form h4 {
            line-height: 3.25rem;
        }
        hr {
            clear: both;
        }
    </style>
</head>
<body class="is-preload">
<!-- Header -->
<header id="header" class="alt">
    <a class="logo" href="/">Spring <span>Board</span></a>
    <nav id="nav">
        <ul>
            <c:choose>
                <c:when test="${loginUser == null}">
                    <li class="current"><a href="/">Home</a></li>
                    <li><a href="/user/join">Join</a></li>
                    <li><a href="/user/login">Login</a></li>
                </c:when>
                <c:otherwise>
                    <li>${loginUser}님 환영합니다!</li>
                    <li class="current"><a href="/">Home</a></li>
                    <li><a href="/board/list">Board</a></li>
                    <li><a href="/user/logout">Logout</a></li>
                </c:otherwise>
            </c:choose>
        </ul>
    </nav>
</header>

<!-- Banner -->
<div id="banner">
    <div class="wrapper style1 special">
        <div class="inner">
            <h1 class="heading alt">Board</h1>
            <p>게시판 등록</p>
            <a href="/board/list" class="button primary" style="float: right; border-bottom: 1px solid #fff; border-radius: 0px; border-top: 1px solid #fff">목록 보기 </a>
            <br />
            <br />
            <br />
            <div class="write_area" style="clear: both">
                <form name="boardForm" method="post" action="/board/regist">
                    <div class="col-12">
                        <h4>제목</h4>
                        <input name="boardTitle" type="text" placeholder="Title">
                    </div>
                    <div class="col-12">
                        <h4>내용</h4>
                        <textarea name="boardContents" placeholder="Contents" rows="10"></textarea>
                    </div>
                    <hr />
                    <div>
                        <h4>작성자</h4>
                        <input name="userId" type="text" value="${loginUser}" readonly />
                    </div>
                    <hr />
                    <div>
                        <input type="submit" value="등록"  class="button primary">
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>

<!-- Scripts -->
<script src="/resources/assets/js/jquery.min.js"></script>
<script src="/resources/assets/js/jquery.dropotron.min.js"></script>
<script src="/resources/assets/js/browser.min.js"></script>
<script src="/resources/assets/js/breakpoints.min.js"></script>
<script src="/resources/assets/js/util.js"></script>
<script src="/resources/assets/js/main.js"></script>
</body>
</html>

BoardController

    @GetMapping("/regist")
    public void regist() {

    }

BoardMapper

void insert(BoardDTO board);
int getMaxBoardNum(String userId);

여기서 실패와 성공을 구현하려면 void가 아니라 boolean으로 하면된다.

그 다음은 mapper.xml을 만들어야 한다.

BoardMapper.xml

    <insert id="insert">
        insert into spring_board (boardTitle, boardContents, userId) values (#{boardTitle}, #{boardContents}, #{userId})
    </insert>
  <select id="getMaxBoardNum" resultType="_int">
        select max(boardNum) from spring_board where userId=#{userId}
    </select>

BoardService

   public void regist(BoardDTO board);
   public int getMaxBoardNum(String userId);

BoardServiceImpl

   @Override
    public void regist(BoardDTO board) {
        mapper.insert(board);
    }
    
       @Override
    public int getMaxBoardNum(String userId) {
        return mapper.getMaxBoardNum(userId);
    } 

BoardController

    @PostMapping("/regist")
    // Model model도 request로 넘겨주는 것이라
    // redirect면 다 날라간다.
    // 이럴때 RedirectAttributes 매개변수를 사용한다.
    public String reggist(BoardDTO board, RedirectAttributes ra) {
        service.regist(board);
        int boardNum = service.getMaxBoardNum(board.getUserId());
        ra.addFlashAttribute("boardNum", boardNum);
        return "redirect:/board/list";
    }

list.jsp
body 밑에 바로 써준다.

<c:if test="${boardNum != null}">
    <script>alert("${boardNum}번 게시글 작성 완료!")</script>
</c:if>

BoardMapperTest

 @Test
    public void  insertTest() {
        BoardDTO board = new BoardDTO();
        log.info("------------------------------");
        board.setBoardNum(1L);
        board.setBoardTitle("zxzz45");
        board.setBoardContents("테스트중입니다.");
        board.setUserId("zxzz45");
        board.setRegDate("2022-12-27");
        board.setUpdateDate("2022-12-27");

        log.info(board);
    }

    @Test
    public void getMaxBoardNumTest() {
        log.info(mapper.getMaxBoardNum("apple"));


    }

BoardServiceTest

  @Test
    public void insertTest() {
        BoardDTO board = new BoardDTO();
        board.setBoardNum(1L);
        board.setBoardTitle("zxzz45");
        board.setBoardContents("테스트중입니다.");
        board.setUserId("zxzz45");
        board.setRegDate("2022-12-27");
        board.setUpdateDate("2022-12-27");

        log.info(board);
    }

    @Test
    public void getMaxBoardNumTest() {
        log.info(service.getMaxBoardNum("apple"));
    }

profile
발전하기 위한 공부

0개의 댓글