๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Web/๐ŸŒฟ Spring boot

Spring boot - Controller, Service, DAO, Mapper

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๋ฌธ์„ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

์ „์ฒด์ ์ธ ํ๋ฆ„์€ ์—ฌ๊ธฐ๊นŒ์ง€ ์ž…๋‹ˆ๋‹ค.

 

 

 

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ทธ๋ฆผ์„ ๋ณด๋ฉฐ ์ •๋ฆฌํ•˜๋ฉด์„œ ํฌ์ŠคํŒ…์„ ๋งˆ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค.