Controller, Service, DAO, Mapper
Spring boot ์์ ์ค์ํ ๊ฐ๋ ์ธ
Controller, Service, DAO, Mapper์ ๋ํด์ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.
Spring boot ๋ MVC๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
๋ค์ ๊ทธ๋ฆผ์ MVC ๊ตฌ์กฐ๋ฅผ ๋ํ๋ ๋๋ค.
์ด๋ก ์ ์ธ ๋ด์ฉ๋ง ๊ฐ์ง๊ณ ์ด๋ค ์ญํ ์ ์ํํ๋์ง ํ๋ฒ์ ์ดํดํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค.
์ง์ ์ค์ต์ ํตํด์ ๊ฐ๊ฐ์ด ์ด๋ค ์๋ฏธ๋ฅผ ํ๋์ง ์์ ๋ณผ๊ฒ์ ๋๋ค.
์ฒ์์ ๊ฐ๋ ์ด ์์ํด๋ ์ฐ๋ฆฌ๋ ํ ์ ์์ต๋๋ค!
๊ทธ๋ผ ๋จ์ํ๊ฒ ํ์ดํ๊ฐ ์๋ฏธํ๋ ๊ฒ์ ๋ฌด์์ผ๊น์?
>> ๋ฐฉํฅ์ผ๋ก ํ๋ฅธ๋ค๋ ๊ฒ์ ๋ฌด์์ ์๋ฏธ ํ๋ ๊ฑธ๊น์?
<< ๋ฐฉํฅ์ผ๋ก ํ๋ฅด๋ ๊ฒ์ ๋ฌด์์ ์๋ฏธ ํ๋ ๊ฑธ๊น์?
๋ค์ ๊ทธ๋ฆผ์ ์ดํด ๋ด ์๋ค!
๊ทธ๋ฆผ์ ์ดํด๋ณด๋ฉด
>> ๋ฐฉํฅ ํ๋ฆ์ ๊ทธ ๋ค์ ์์ญ์ ํธ์ถ์ ํ๋ ๊ฒ์ด๊ณ
<< ๋ฐฉํฅ ํ๋ฆ์ ๊ทธ ์์ญ์ return ํ ๊ฐ์ ๋ฐ์์ค๋ ๊ฒ์ ๋๋ค.
์ ์ฒด์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ์ ์ด๋ ๊ฒ ๋ฉ๋๋ค.
์ด๋ฐ ํ๋ฆ์ผ๋ก Web Browser๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ์ ํ๋ฉด
DB์์ ๋ฐ์ดํฐ๋ฅผ return ํ์ฌ Web Browser๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
ํฐ ํ์ ๊ธฐ์ตํ๋ฉด์ ๊ฐ๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ์์ ๋ด ์๋ค!
Controller
Controller๋ ์น ๋ธ๋ผ์ฐ์ ์ ์์ฒญ์ ์ ๋ดํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
Controller๊ฐ Service๋ฅผ ํธ์ถ ํฉ๋๋ค.
Service
Service๋ ๋น์ง๋์ค ๋ก์ง์ ์ํ ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ DAO๋ฅผ ์ด์ฉํด์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์ ์ต๋๋ค.
DAO
DAO๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ์ฌ ๋น์ฆ๋์ค ๋ก์ง ์คํ์ ํ์ํ ์ฟผ๋ฆฌ๋ฅผ ํธ์ถํฉ๋๋ค.
DB
DB์์ ์๋ง์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํฉ๋๋ค.
DTO
Data Transfer Object์ ์ฝ์๋ก
๊ฐ ๊ณ์ธต์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ฅผ ๋งํฉ๋๋ค.
* ๊ฐ ๊ณ์ธต์ด๋ ๋ทฐ, ์ปจํธ๋กค๋ฌ, ์๋น์ค, DAO, DB๋ฅผ ๋งํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด ํ๋ฆ์ด ์ค์ ๋ก๋ ์ด๋ป๊ฒ ์๋ํ๋ ์ง ํ์ธํด๋ด ์๋ค.
๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด์ธ DTO๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
[BoardDto.java]
package board.board.dto;
import lombok.Data;
@Data
public class BoardDto {
private int boardIdx;
private String title;
private String contents;
private int hitCnt;
private String creatorId;
private String createdDatetime;
private String updaterId;
private String updatedDatetime;
}
Controller
์น ๋ธ๋ผ์ฐ์ ์ ์์ฒญ์ ์ ๋ดํ์ฌ ์ฒ๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค์ด ๋ด ์๋ค.
[BoardController.java]
@Controller //ํด๋น ํด๋์ค๋ฅผ ์ปจํธ๋กค๋ฌ๋ก ๋์ํ๊ฒ ํ๋ค.
public class BoardController {
@Autowired
private BoardService boardService;
@RequestMapping("/apple") // ์ด ์ฃผ์๋ก ์ ์ํ๋ฉด ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.(๋งคํํ๋ค.)
public ModelAndView openBoardList() throws Exception{
ModelAndView mv = new ModelAndView("/apple/boardList");
List<BoardDto> list = boardService.selectBoardList();
mv.addObject("list",list);
return mv;
}
}
@Controller ์ด๋ ธํ ์ด์
: @Controller ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ ์ด ํด๋์ค๊ฐ ์ปจํธ๋กค๋ฌ ํด๋์ค ๋ผ๋ ๊ฒ์ ์๋ ค์ค๋๋ค.
์ฌ์ฉ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ด ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋ฉ๋๋ค.
@RequestMappring("/apple") ์ด๋ ธํ ์ด์
: baseurl/apple ๋ก ์ ์ํ๊ฒ ๋๋ฉด ์ด ์ด๋ ธํ ์ด์ ์ ๊ฐ์ง ๋ฉ์๋๋ก ๋งคํ์ด ๋ฉ๋๋ค.
List<BoardDto> list = boardService.selectBoardList();
์ด ๋ถ๋ถ์ด Service๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ ๋๋ค.
Service์ ๋ฐํ๊ฐ์ list ์ ์ ์ฅํ๊ณ ์์ต๋๋ค.
๊ทธ๋ผ Service๋ฅผ ํธ์ถํ๋ฉด ์ด๋ป๊ฒ ๋์ํ๋ ์์ ๋ด ์๋ค.
Service
Service๋ ๋๊ฐ์ง๋ฅผ ๊ตฌํํด์ผํฉ๋๋ค.
โ service interface
โก service interface๋ฅผ ๊ตฌํํ class ๋ง๋ค๊ธฐ (service interface ๊ตฌํ์ฒด)
service interface๋ฅผ ๋ง๋ค์ด๋ด ์๋ค.
[BoardService.java]
package board.board.service;
import board.board.dto.BoardDto;
import java.util.List;
public interface BoardService {
List<BoardDto> selectBoardList() throws Exception;
}
service interface๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ด ์๋ค.
[BoardServicelmpl.java]
package board.board.service;
import board.board.dto.BoardDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import board.board.mapper.BoardMapper;
import java.util.List;
@Service
public class BoardServicelmpl implements BoardService {
@Autowired
private BoardMapper boardMapper;
@Override
public List<BoardDto> selectBoardList() throws Exception {
return boardMapper.selectBoardList();
}
}
@Service ์ด๋ ธํ ์ด์
: @Service ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ ์ด ํด๋์ค๊ฐ ์๋น์ค ํด๋์ค๋ผ๋ ๊ฒ์ ์๋ ค์ค๋๋ค.
Mapper๋ ๋ค์์ผ๋ก ๊ตฌํํ ๊ฒ์ ๋๋ค.
'Service๊ฐ DAO๋ฅผ ํธ์ถํ๋ค' ๋ผ๋ ๊ฒ์ ๊ธฐ์ตํ์๋์?
์ฐ๋ฆฌ๋ DAO๋ฅผ ์ฌ์ฉํ์ง์๊ณ ๋งคํผ๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
Service๊ฐ ๋งคํผ๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ ์ด ๋ถ๋ถ ์ ๋๋ค.
return boardMapper.selectBoardList();
๋ค์์ผ๋ก DAO๋ฅผ ์ค๋ช ํ๋ฉด์ ๋ ์์ธํ ์์๋ด ์๋ค.
Mapper
๋ง์ด๋ฐํฐ์ค(Mybais)๋ Mapper ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฐ๋ฆฌ๋ DAO๋์ ๋งคํผ๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
๋งคํผ๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ์ผ์ด DAO๋ฅผ ๋ง๋ค์ง ์๊ณ ์ธํฐํ์ด์ค๋ง์ ์ด์ฉํด์ ์ข๋ ํธํ๊ฒ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
๋ง์ด๋นํฐ์ค๋ ์๋ฐ์ฝ๋์ SQL๋ฌธ์ ๋ถ๋ฆฌํ์ฌ ํธ๋ฆฌํ๊ฒ ๊ด๋ฆฌํ๋๋ก ํฉ๋๋ค.
SQL๋ฌธ์ *.xml ํ์์ผ๋ก ์ ์ฅํฉ๋๋ค.
๋งคํผ ์ธํฐํ์ด์ค์ XML์ ๋ง๋ค์ด๋ด ์๋ค.
[BoardMapper.java]
package board.board.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import board.board.dto.BoardDto;
@Mapper
public interface BoardMapper {
List<BoardDto> selectBoardList() throws Exception;
}
@Mapper ์ ๋ํ ์ด์ ์
: @Mapper ์ด๋ ธํ ์ด์ ์ ๋ถ์ด๋ฉด Mapper ์ธํฐํ์ด์ค๋ก ์ธ์ํฉ๋๋ค.
*.xml ํ์์ ํ์ผ์ ๋ง๋ค์ด ์ํ๋ SQL ๋ฌธ์ ์์ฑํฉ๋๋ค.
[sql.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="board.board.mapper.BoardMapper">
<select id="selectBoardList" resultType="board.board.dto.BoardDto">
<![CDATA[
SELECT
board_idx,
title,
hit_cnt,
created_datetime
FROM
t_board
WHERE
deleted_yn = 'N'
ORDER BY board_idx DESC
]]>
</select>
</mapper>
XML ํ์ผ์์ ์ค์ํ ๊ฒ์
- namespace
- id
- resultType ์ ๋๋ค.
์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
namespace
: Mapper์ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ ์ต๋๋ค.
id
: ๋งคํผ ์ธํฐํ์ด์ค์ XMLํ์ผ์ ๋งค์นญ ์ํค๊ธฐ ์ํด์ ๋งคํผ ์ธํฐํ์ด์ค์ ๋ฉ์๋ ๋ช ๊ณผ XML ํ์ผ์ id๋ฅผ ๋์ผํ๊ฒ ์์ฑํด์ค์ผ ํฉ๋๋ค.
resultType
: SQL๋ฌธ์ ์คํํ๊ณ ๊ฒฐ๊ณผ๊ฐ์ ์ด๋ค ํ์์ผ๋ก ๋ฐํํ ์ง๋ฅผ ๋ํ๋ ๋๋ค. ์ฌ๊ธฐ์๋ BoardDto ๊ฐ์ฒด๋ก ๋ฐํํฉ๋๋ค.
์๋๋ ๋งคํผ ์ธํฐํ์ด์ค์ ๋ฉ์๋ ๋ช
๊ณผ XML์ id
๊ฐ ๊ฐ์ ๊ฐ์ธ ๊ฒ์ ์ ์ ์์ต๋๋ค.
@Mapper
public interface BoardMapper {
List<BoardDto> ๐selectBoardList()๐ throws Exception;
}
[BoardMapper.java]
<select ๐id="selectBoardList"๐ resultType="board.board.dto.BoardDto">
[sql.xml]
์ด๋ ๊ฒ SQL Mapper์ธ XML ํ์ผ์ namespace์ id๋ฅผ ๋งตํํ์ฌ SQL๋ฌธ์ ํธ์ถํ์ฌ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํฉ๋๋ค.
์ ์ฒด์ ์ธ ํ๋ฆ์ ์ฌ๊ธฐ๊น์ง ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๊ทธ๋ฆผ์ ๋ณด๋ฉฐ ์ ๋ฆฌํ๋ฉด์ ํฌ์คํ ์ ๋ง์น๊ฒ ์ต๋๋ค.