profile image

L o a d i n g . . .

MVC 구조란?

일종의 역할 분담, 아래처럼 각각 나누어서 담당함

>> 방향 흐름은 그 다음 영역 호출 / << 방향 호출은 그 영역에 return 한 값 받아오기

 

Web Browser가 데이터를 요청하면 -> DB에서 데이터를 반환하고 -> 웹 브라우저가 최종적으로 데이터를 받음

  1. Controller: 웹 브라우저의 요청을 처리한 후, Service를 호출함
  2. Service: 비즈니스 로직 수행하고, DB에 접근하는 DAO를 이용해 결과값을 받음
  3. DAO (Data Access Object): DB에 접속하여 비즈니스 로직 실행에 필요한 쿼리 호출
  4. DB (Database): DB에서 쿼리 실행하고 결과값을 반환
  5. DTO (Data Transfer Object): 각 계층이 데이터를 주고 받을 때 사용하는 객체이다. 각 계층은 View, Controller, Service, DAO, DB를 말한다.

DTO

데이터를 주고 받을 때 사용하는 객체

package board.board.dto;

import lombok.Data;

@Data // 해당 클래스가 DTO 임을 알림
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

웹 브라우저의 요청을 전담하여 처리함

@Controller   //해당 클래스가 컨트롤러임을 알림
public class BoardController {
	
	@Autowired // 스프링이 BoardService의 구현체를 자동으로 찾아서 주입, 객체 생성 필요 없이 사용 가능
	private BoardService boardService;
	
	@RequestMapping("/apple")    // 이 주소로 접속하면 이 메소드를 호출한다.(매핑한다.)
	public ModelAndView openBoardList() throws Exception{
		ModelAndView mv = new ModelAndView("/apple/boardList");
		
		List<BoardDto> list = boardService.selectBoardList(); // Service 호출
		mv.addObject("list",list);
		
		return mv;
	}
}

Service

Service는 두 가지를 구현해야 함

  1. Service interface
  2. Service interface를 구현한 class 만들기 (Service interface 구현체)
// BoardService.java

package board.board.service;
import board.board.dto.BoardDto;
import java.util.List;

// Service interface
public interface BoardService {
	List<BoardDto> selectBoardList() throws Exception;
	
}

 

// 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 interface 구현
@Service // 이 클래스가 Service인 것을 알림
public class BoardServicelmpl implements BoardService {
	
	@Autowired // 스프링이 boardMapper에 자동으로 의존성 주입
	private BoardMapper boardMapper;
	
	@Override
	public List<BoardDto> selectBoardList() throws Exception {
        // Service가 DAO를 호출하지만 여기선 DAO를 쓰지 않고 Mapper를 사용함
		return boardMapper.selectBoardList();
	}

}

Mapper

MyBatis는 Mapper 인터페이스를 제공함

Mapper를 사용하면 일일이 DAO를 만들지 않고, 인터페이스만을 이용해서 좀 더 편하게 개발 가능

MyBatis는 자바 코드와 SQL문을 분리하여 편리하게 관리하도록 만듦

package board.board.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import board.board.dto.BoardDto;

@Mapper // Mapper interface로 인식
public interface BoardMapper {
	List<BoardDto> selectBoardList() throws Exception;
}

 

-- 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">
   
-- namespace: Mapper의 전체 경로 적기
-- id: Mapper interface의 Method 이름과 XML 파일의 id를 동일하게 작성해야 함
-- resultType: SQL문 실행하고 결과값을 어떤 형식으로 반환할지 나타냄

<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>

출처

1. https://dalpaeng00.tistory.com/83

2. https://velog.io/@pahyork/Spring-Boot-Controller-Service-DAO-Mapper

복사했습니다!