7. SpringBoot 게시판 만들기-3

컨트롤러 영역

컨트롤러는 클라이언트의 요청을 받아서 해당 요청을 수행하는데 필요한 비즈니스 로직을 호출하고 그 결과를 포함하여 응답을 해 주는 디스패처(Dispatcher) 역할을 수행한다.

컨트롤러는 다음의 과정을 거쳐서 구현한다.

  1. 컨트롤러 클래스에 @Controller 어노테이션을 적용한다.
  2. @RequestMapping 어노테이션을 이용하여 요청에 대한 주소를 지정한다.
  3. 요청에 필요한 비즈니스 로직을 호출한다.
  4. 실행된 비즈니스 로직의 결과를 뷰로 리턴한다.

일단 먼저 board.controller 패키지를 생성한다. 그 안에 BoardController 클래스를 생성한다.

BoardController 클래스를 생성

BoardController 클래스에 다음 내용을 작성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.ckbs.MariaDbTest.board.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.ckbs.MariaDbTest.board.dto.BoardDto;
import com.ckbs.MariaDbTest.board.service.BoardService;

@Controller //①
public class BoardController {

@Autowired
private BoardService boardService; //②

@RequestMapping("/board/openBoardList.do") //③
public ModelAndView openBoardList() throws Exception{
ModelAndView mv = new ModelAndView("/board/boardList"); //④

List<BoardDto> list = boardService.selectBoardList(); //⑤
mv.addObject("list", list); //⑥

return mv;
}
}

@Controller 어노테이션을 붙여줌으로서 해당 클래스가 컨트롤러로 동작하게 된다.

boardService는 비즈니스로직을 처리하는 서비스 빈을 연결한다. 이는 아래 서비스 영역에서 다시 설명한다.

@RequestMapping("/board/openBoardList.do")은 어노테이션의 값으로 주소를 지정한다. 여기서는 웹브라우저에서 /board/openBoardList.do라는 주소를 호출하면 스프링 디스패처는 호출된 주소와 @RequestMapping 어노테이션의 값이 동일한 메서드를 찾아서 실행한다.

ModelAndView는 호출된 요청의 결과를 보여줄 뷰를 지정한다. 여기서는 /board/boardList로 지정했는데 이는 templates 폴더 아래있는 /board/boardList.html을 의미한다. Thymeleaf와 같은 템플릿을 사용할 경우 스프링 부트의 자동 설정 기능으로 .html과 같은 접미사를 생략할 수 있다.

List<BoardDto> list에서는 게시글 목록을 조회한다. “게시글 목록을 조회한다.”는 비즈니스 로직을 수행하기 위해서 BoardService 클래스의 selectBoardList 메서드를 호출한다. 게시글 목록을 저장하기 위해서 List 인터페이스를 사용했다.

⑥ 실행된 비즈니스 로직의 결과 값을 뷰에 list라는 이름으로 저장한다. 이 부분은 추후 뷰 영역 설명에서 다시 확인해보자.

서비스 영역

서비스 영역은 일반적으로 두 개의 파일로 구성된다. Service 인터페이스와 ServiceImpl 클래스이다. 이와 같이 인터페이스를 실제로 구현하는 클래스와 인터페이스로 분리할 경우 여러가지 장점이 있다.

  • 느슨한 결함(loose coupling)을 유지하여 각 기능 간의 의존관계를 최소화 한다.
  • 의존 관계의 최소화로 인해 기능의 변화에도 최소한의 수정으로 개발할 수 있는 유연함을 가진다.
  • 모듈화를 통해 어디서든 사용할 수 있도록 하여 재사용성을 높인다.
  • 스프링의 IoC/DI(Inversion of Control / Dependency Injection) 기능을 이용한 빈 관리 기능을 사용할 수 있다.

board.service 패키지를 생성한다. 그 안에 BoardService 인터페이스와 BoardServiceImpl 클래스를 생성한다.

BoardService 인터페이스와 BoardServiceImpl 클래스를 생성

BoardService 인터페이스에 다음 내용을 작성한다.

1
2
3
4
5
6
7
8
9
10
package com.ckbs.MariaDbTest.board.service;

import java.util.List;
import com.ckbs.MariaDbTest.board.dto.BoardDto;

public interface BoardService {

List<BoardDto> selectBoardList() throws Exception;

}

BoardService 인터페이스에는 비즈니스 로직을 수행하기 위한 메서드를 정의한다.

BoardServiceImpl에 다음 내용을 작성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.ckbs.MariaDbTest.board.service;

import com.ckbs.MariaDbTest.board.dto.BoardDto;
import com.ckbs.MariaDbTest.board.mapper.BoardMapper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service //①
public class BoardServiceImpl implements BoardService {

@Autowired
private BoardMapper boardMapper; //②

@Override
public List<BoardDto> selectBoardList() throws Exception {
return boardMapper.selectBoardList(); //③
}
}

BoardServiceImpl 클래스에는 BoardService 인터페이스를 사용하여 실제 기능을 구현한다.

@Service는 비즈니스 로직을 처리하는 서비스 클래스를 나타내는 어노테이션이다.

② 데이터 베이스에 접근하는 DAO bean을 선언한다.

③ 사용자 요청을 처리하기 위한 비즈니스 로직을 구현한다. 여기서는 데이터를 조회하도록 BoardMapper 클래스의 selectBoardList메서드를 호출한다.

공유하기