Spring Boot에서 가장 중요한 개념인
에 대해 알아봅시다!
Spring Boot는 MVC구조를 따른다.
MVC 패턴
- Model, View, Controller의 약자
- 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴
위와 같은 흐름으로 Web Browser가 데이터를 요청하면 DB에서 데이터를 return 하여 Web Browser가 데이터를 받을 수 있게 되는 것이다.
그럼 이제 세부적으로 각각의 기능을 살펴보자!
이제 실제 동작을 살펴보자!
데이터를 주고 받을때 사용하는 객체인 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;
}
웹 브라우저의 요청을 전담하여 처리하는 컨트롤러를 만든다.
[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 로 접속하게 되면 이 어노테이션을 가진 메소드로 매핑이 됩니다.
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를 구현한 클래스를 만들어 보자.
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를 사용하지않고 매퍼를 사용할 것입니다.(MyBatis는 DAO대신 Mapper사용)
Mapper를 사용하면 일일이 DAO를 만들지 않고 인터페이스만을 이용해서 좀더 편하게 개발할 수 있습니다.
MyBatis는 자바코드와 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 파일에서 중요한 것은
의미는 다음과 같습니다.
다시 위의 코드를 살펴보면, 매퍼 인터페이스의 메소드 명 과 XML의 id 가 같은 값인 것을 알 수 있습니다.
Data Access Object의 약자로 DB의 data에 접근하기 위한 객체입니다.
일반적으로 DB에 접근하는 코드는 SQL이기 때문에 Java에서 SQL을 사용하려면 Connection을 생성하고, 직접 쿼리문을 작성하여 Connection을 닫는 과정이 필요합니다.
그러나 이는 번거롭고 코드의 가독성을 떨어뜨리기 때문에, 어플리케이션에서 사용할 DB로직을 객체 하나에 메서드로 구현하고, 이를 호출하여 사용하도록 만든 것을 DAO라고 합니다.
DAO는 오버헤드를 줄일 수 있다는 장점이 있습니다. 실제 WA(웹 어플리케이션)에 다수의 사용자가 접속하여 DB I/O이벤트가 많이 발생할 경우, Connection이 많이 생기며 반응속도가 느려집니다.
하지만 DAO는 오직 1개의 Connection으로 다수의 요청을 모두 수행하기 때문에 WA의 안정된 운영을 보장합니다.
참고사이트
https://dalpaeng00.tistory.com/83
https://frtt0608.tistory.com/7