[Spring Boot] Controller, Service, DAO, Mapper

Benjamin·2022년 11월 14일
0

Spring

목록 보기
1/5

Spring Boot에서 가장 중요한 개념인

  • Controller
  • Service
  • DAO
  • Mapper

에 대해 알아봅시다!

Spring Boot는 MVC구조를 따른다.

MVC 패턴

  • Model, View, Controller의 약자
  • 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴

위와 같은 흐름으로 Web Browser가 데이터를 요청하면 DB에서 데이터를 return 하여 Web Browser가 데이터를 받을 수 있게 되는 것이다.

그럼 이제 세부적으로 각각의 기능을 살펴보자!

Controller

  • 브라우저의 요청을 전담하여 처리
  • Service를 호출

Service

  • 비지니스 로직을 수행
  • 데이터베이스에 접근하는 DAO를 이용해서 결과값을 받아옴

DAO

  • 데이터베이스에 접속하여 비즈니스 로직 실행에 필요한 쿼리를 호출

DB

  • DB에서 알맞은 쿼리를 실행하고 결과값을 반환

이제 실제 동작을 살펴보자!

DTO

데이터를 주고 받을때 사용하는 객체인 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 로 접속하게 되면 이 어노테이션을 가진 메소드로 매핑이 됩니다.

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를 구현한 클래스를 만들어 보자.

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

다음으로 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 파일에서 중요한 것은

  • namespace
  • id
  • resultType 입니다.

의미는 다음과 같습니다.

  • namespace
    : Mapper의 전체 경로를 적습니다.
  • id
    : 매퍼 인터페이스와 XML파일을 매칭 시키기 위해서 매퍼 인터페이스의 메소드 명과 XML 파일의 id를 동일하게 작성해줘야 합니다.
  • resultType
    : SQL문을 실행하고 결과값을 어떤 형식으로 반환할지를 나타냅니다. 여기서는 BoardDto 객체로 반환합니다.

다시 위의 코드를 살펴보면, 매퍼 인터페이스의 메소드 명 과 XML의 id 가 같은 값인 것을 알 수 있습니다.

DAO

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

0개의 댓글