MVC 구조란?
일종의 역할 분담, 아래처럼 각각 나누어서 담당함
- 데이터는 Model
- 화면은 View
- 처리는 Controller
- https://namaniflow.tistory.com/162
Web Browser가 데이터를 요청하면 -> DB에서 데이터를 반환하고 -> 웹 브라우저가 최종적으로 데이터를 받음
- Controller: 웹 브라우저의 요청을 처리한 후, Service를 호출함
- Service: 비즈니스 로직 수행하고, DB에 접근하는 DAO를 이용해 결과값을 받음
- DAO (Data Access Object): DB에 접속하여 비즈니스 로직 실행에 필요한 쿼리 호출
- DB (Database): DB에서 쿼리 실행하고 결과값을 반환
- 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는 두 가지를 구현해야 함
- Service interface
- 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
'TIL' 카테고리의 다른 글
[TIL] 쿠키 (Cookie), 세션 (Session), 토큰 (Token) (1) | 2024.10.15 |
---|---|
[TIL] CSR, SSR이란? (2) | 2024.10.02 |
[TIL/Git] -b는 무엇이고, `git branch -b branch name`은 왜 안 되는가? (0) | 2024.10.01 |
[TIL/Docker] Host 포트와 Container 포트란? (0) | 2024.09.30 |
[TIL] 데이터(data)와 정보(information)의 차이 (0) | 2024.09.30 |