Controller에서 DAO를 직접 사용하지 않고 Service를 통해서 처리되도록 하겠습니다.
그럼 Service에 대해 알아보겠습니다.
Service
Spring(스프링)에서 Service의 역할은 전달받은 데이터들을 연산하거나 로직에 따라 처리하고 DAO를 사용하여 데이터를 처리합니다. 즉 Service는 비즈니스 로직을 처리하는 부분으로 생각하시면 됩니다. 또한, Service에서는 다른 비즈니스 로직을 처리하는 Service나 Component를 사용하여 처리할 수 있습니다.
Service에서는 비즈니스 로직과 DAO를 사용하여 처리하기 때문에 Controller에서 DAO를 직접 사용하지 않고 Service를 사용하여 처리하면 됩니다.
추가로, Service Implements(구현체) 클래스의 메서드에 @Transactional Annotation(어노테이션)을 붙여주면 트랜잭션 처리를 할 수 있습니다. 트랜잭션에 대해서 다음에 더 자세히 알아보겠습니다.
Maven Spring Project에 Service - Board Interface 추가하기
1. Java Resource > src/main/java에 com.home.study.test1.board 패키지에 service 패키지를 생성합니다.
2. com.home.study.test1.board.service 패키지에 IBoardService Interface(인터페이스)를 생성합니다. (IBoardService.java)
- DAO (Board Interface, Implement)을 사용하여 INT_BOARD_TB(게시판) Table에서 검색 조건으로 데이터(게시물)를 조회(select)하여 리스트(List<Board>)를 리턴하는 selectBoardList 메서드를 선언합니다. (Interface(인터페이스)의 메서드는 "public abstract"으로 선언되어야 합니다. 생략할 수 있습니다.)
package com.home.study.test1.board.service;
import java.util.List;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
public interface IBoardService {
List<Board> selectBoardList(BoardSearch boardSearch);
}
Maven Spring Project에 Service - Board Implement 추가하기
1. Java Resource > src/main/java에 com.home.study.test1.board.service 패키지에 impl 패키지를 생성합니다.
2. com.home.study.test1.board.service.impl 패키지에 BoardDaoImpl 클래스를 생성합니다. (BoardDaoImpl.java)
- BoardServiceImpl 클래스에 IBoardService Interface(인터페이스)가 구현(implements)되도록 class에 implements로 IBoardService를 입력합니다.
- BoardServiceImpl 클래스에서 IBoardService Interface(인터페이스)의 selectBoardList 메서드를 구현합니다. Interface(인터페이스)를 구현한 클래스(Class)의 메서드 위에 @Override를 붙여줍니다. (이클립스에서는 마우스를 BoardServiceImpl 클래스 위로 이동합니다. 콘텍스트 메뉴에서 "Add unimplemented methods"(구현되지 않은 메서드 추가)를 클릭하면 자동으로 메서드를 생성해 줍니다.)
package com.home.study.test1.board.service.impl;
import java.util.List;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
import com.home.study.test1.board.service.IBoardService;
public class BoardServiceImpl implements IBoardService {
@Override
public List<Board> selectBoardList(BoardSearch boardSearch) {
// TODO Auto-generated method stub
return null;
}
}
3. BoardServiceImpl 클래스에서 DAO를 사용하기 위해 IBoardDao Interface(인터페이스)를 선언하고 의존성 주입(Dependency Injection)을 위해서 @Autowired Annotation(어노테이션)를 변수 위에 붙여줍니다.
4. selectBoardList 메서드에서 boardDao의 selectBoardListCount 메서드를 사용하여 검색 조건에 맞는 데이터(게시물) 수를 조회(select) 하고 데이터(게시물) 수가 0보다 크면 boardDao의 selectBoardList 메서드를 사용하여 검색 조건에 맞는 데이터(게시물)를 조회(select)하여 조회된 결과 리스트(List)를 넣어 리턴하게 합니다.
5. BoardServiceImpl 클래스가 다른 Service 클래스나 Controller 클래스에서 의존성 주입(Dependency Injection)이 되기 위해서는 DispatcherServlet에서 <component-scan>하여 자동으로 Bean으로 생성되어야 합니다. 그래서 BoardServiceImpl 클래스 위에 @Service Annotation(어노테이션)를 붙여줍니다. (<component-scan>은 base-package에 설정된 네임스페이스 이하의 모든 클래스를 스캔하여 클래스에 @Component, @Controller, @service, @Repository와 같은 Annotation(어노테이션)이 있으면 자동으로 Bean으로 생성해 줍니다.) 참고로, @Service Annotation(어노테이션)는 @Component Annotation(어노테이션)를 특별하게 처리하기 위해 만든 겁니다.
package com.home.study.test1.board.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
import com.home.study.test1.board.service.IBoardService;
@Service
public class BoardServiceImpl implements IBoardService {
@Autowired
IBoardDao boardDao;
@Override
public List<Board> selectBoardList(BoardSearch boardSearch) {
List<Board> boardList = null;
int count = boardDao.selectBoardListCount(boardSearch);
if (count > 0) {
boardList = boardDao.selectBoardList(boardSearch);
}
return boardList;
}
}
Maven Spring Project의 Controller에 Service 주입하기
1. Java Resource > src/main/java > com.home.study.test1.main.controller에서 MainController 클래스를 오픈합니다. (MainController.java)
2. IBoardDao Interface(인터페이스) 변수를 삭제합니다.
3. IBoardService Interface(인터페이스)를 선언하고 의존성 주입(Dependency Injection)을 위해서 @Autowired Annotation(어노테이션)를 변수 위에 붙여줍니다.
4. mainIndex 메서드에서 boardService의 selectBoardList 메서드를 사용하여 데이터(게시물)를 조회(select)하고 Model의 boardList 속성으로 조회된 결과 리스트(List)를 넣어줍니다.
package com.home.study.test1.main.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
import com.home.study.test1.board.service.IBoardService;
@Controller
public class MainController {
@Autowired
IBoardService boardService;
@RequestMapping("/index")
public String mainIndex(HttpServletRequest request, HttpServletResponse response, ModelMap model) {
BoardSearch boardSearch = new BoardSearch();
boardSearch.setSearchType("subject");
boardSearch.setSearchCondition("like");
boardSearch.setSearchKeyword("테스트 제목 1");
List<Board> boardList = boardService.selectBoardList(boardSearch);
model.addAttribute("boardList", boardList);
return "main/main";
}
@RequestMapping("/default")
public String defaultIndex(HttpServletRequest request, HttpServletResponse response, ModelMap model) {
List<String> memberIDList = new ArrayList<String>();
memberIDList.add("testid1");
memberIDList.add("testid2");
memberIDList.add("testid3");
memberIDList.add("testid4");
memberIDList.add("testid5");
model.addAttribute("memberList", memberIDList);
return "main/main";
}
}
Maven Spring Project를 실행하여 웹 브라우저로 확인하기
1. "Servers"탭에서 "Tomcat9"를 선택하고 "start"버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.
2. 웹 브라우저에서 "http://localhost:9000/index.do"를 입력합니다.
'Spring > Maven Project' 카테고리의 다른 글
Spring에 Data Binding(바인딩) - @RequestParam, Auto Binding (0) | 2022.11.20 |
---|---|
Spring에 Data 전달 - GET, POST, HttpServletRequest getParameter (0) | 2022.11.06 |
Spring에 Mapper XML - Search 공통 처리, DAO - 카운트 기능 추가 (0) | 2022.10.23 |
Spring에 DAO - Search Model 추가, Mapper XML - WHERE 적용 (0) | 2022.10.15 |
Spring에 DAO - Interface, Implement 추가 (0) | 2022.10.03 |