데이터 그 자체로 의미 있는 것을 담고 있는 객체이다.
DTO와 동일한 개념이나 차이점은 Read–Only 속성 객체이다.
VO : 사용 되는 값이 객체로 표현 되며, 값 변경이 없는 경우를 말한다.
전송되는 데이터의 컨테이너이다.
VO와 동일하게 데이터를 저장하여 사용하도록 하는 부분에서 필요하다.
VO와 비교를 하여 보면 DTO는 다른 레이어로 데이터를 전달하는 작업을 처리하는 객체이다.
DTO : 데이터의 전송을 위한 객체이며, 비지니스 로직까지 담아서 사용하기 한다.
create table board(
bno int auto_increment primary key,
title varchar(150),
content varchar(2000),
writer varchar(50),
regdate timestamp default now(), # 입력값이 없으면 현재시간 입력
updatedate timestamp default now(), # 입력값이 없으면 현재시간 입력
);
package com.myapp.bbs.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.myapp.bbs.model.BoardVO;
import com.myapp.bbs.service.BoardService;
import lombok.extern.java.Log;
@Controller
@RequestMapping("/board")
@Log // console의 Log 출력 (print out 대신 사용)
public class BoardController {
private BoardService boardService;
public BoardController(BoardService boardService) {
this.boardService = boardService;
}
@GetMapping("/list")
public String boardListGet() {
log.info("게시판 리스트 페이지 진입");
return "list";
}
@GetMapping("/enroll")
public String boardEnrollGet(Model model) {
log.info("게시판 등록 페이지 진입");
model.addAttribute("board", new BoardVO());
return "enroll";
}
@PostMapping("/enroll")
public String boardEnrollPost(BoardVO board, RedirectAttributes attr) {
boardService.enroll(board);
attr.addFlashAttribute("message", "게시글 등록 완료!");
return "redirect:/board/list"; // Post 다음 Redirect
}
}
package com.myapp.bbs.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.myapp.bbs.model.BoardVO;
@Mapper
public interface BoardMapper {
public void enroll(BoardVO board); // 게시판 글 등록
}
<?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">
<!-- com.myapp.bbs.dao 패키지 안의 BoardMapper.java를 여기서 입력하겠다는 설정 -->
<mapper namespace="com.myapp.bbs.dao.BoardMapper">
<!-- board 테이블에 데이터 넣기 -->
<insert id="enroll" parameterType="BoardVO">
<!-- application.properties에 설정을 하지 않았다면 resultType="com.myapp.bbs.model.BoardVO" 라고 적었야함 -->
insert into board(title, content, writer)
values (#{title}, #{content}, #{writer});
</insert>
</mapper>
package com.myapp.bbs.service;
import com.myapp.bbs.model.BoardVO;
public interface BoardService {
public void enroll(BoardVO board); // 게시판 글 등록
}
package com.myapp.bbs.service;
import org.springframework.stereotype.Service;
import com.myapp.bbs.dao.BoardMapper;
import com.myapp.bbs.model.BoardVO;
@Service
public class BoardServiceImpl implements BoardService {
private BoardMapper boardMapper;
public BoardServiceImpl(BoardMapper boardMapper) {
this.boardMapper = boardMapper;
}
@Override
public void enroll(BoardVO board) {
boardMapper.enroll(board);
}
}
package com.myapp.bbs.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping(value = {"/", "/dashboard"})
public String dashBoard() {
return "pages/dashboard";
}
@GetMapping("/tables")
public String showTable() {
return "pages/tables";
}
@GetMapping("/profile")
public String showProfile() {
return "pages/profile";
}
@GetMapping("/sign-in")
public String login() {
return "pages/sign-in";
}
@GetMapping("/sign-up")
public String register() {
return "pages/sign-up";
}
}