열심히 끝까지

디바이스 융합 자바(Java) day95 - Spring Boot[트랜잭션] 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day95 - Spring Boot[트랜잭션]

노유림 2022. 10. 28. 15:53

스프링 웹 MVC 
프론트 컨트롤러(디스페쳐 서블릿)

>> 쓰다보면 디스페쳐 서블릿에 대한 호출을 진행 중인 것을 확인 가능
     > 프론트 컨트롤러 자동 지원
       > MODEL -> VIEW


> 서비스단에 대해 띄어볼 것
    - 서비스단
         : 하나의 서비스는 여러개의 DAO를 가질 수 있고
          이렇게 여러 개의 DAO는 한 요청에 전부 수행되어야할 때가 있음
           > N개의 수행되는 요청이 한꺼번에 처리되어야 함
               >> 트랜젝션이랑도 엮어서 사용 가능

 

Service로 변환 작업

BoardService.java---------------

package com.ryo.springboot;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;

public class BoardService implements IBoardDAO{
	
	@Autowired
	IBoardDAO boardDAO;
	@Autowired
	IMemberDAO memberDAO;
	
	@Autowired
	PlatformTransactionManager txManager;
	
	@Autowired
	TransactionDefinition txdefinition;

	@Override
	public List<BoardDTO> selectAll(BoardDTO dto) {
		// TODO Auto-generated method stub
		return boardDAO.selectAll(dto);
	}

	@Override
	public BoardDTO selectOne(BoardDTO dto) {
		// TODO Auto-generated method stub
		return boardDAO.selectOne(dto);
	}

	@Override
	public int insert(BoardDTO dto) { // service 객체의 하나의 메서드()를 1 트랜잭션(단위)로 생각함
		TransactionStatus txStatus = txManager.getTransaction(txdefinition);
		try {
		boardDAO.insert(dto); // dao1.메서드();
		if(dto.getWriter().equals("timo")) {
			throw new Exception();  // 일부러 에러를 발생시킴
		}
		}catch(Exception e) {
			txManager.rollback(txStatus);
			return 0;
		}
		txManager.commit(txStatus);
		return 1; // 현재의 코드: 에러발생시 dao1.메서드()만 적용이 되어버림
	}

	@Override
	public int delete(BoardDTO dto) {
		// TODO Auto-generated method stub
		return boardDAO.delete(dto);
	}

}

IBoardService.interface--------

package com.ryo.springboot;

import java.util.List;

public interface IBoardDAO {
	List<BoardDTO> selectAll(BoardDTO dto);
	BoardDTO selectOne(BoardDTO dto);
	int insert(BoardDTO dto);
	int delete(BoardDTO dto);
}

TestController.java--------------

package com.ryo.springboot;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
public class TestController {
	@Autowired
	private MemberDAO memberDAO;
	/*
	@Autowired
	private BoardDAO boardDAO;
	*/
	
	@Autowired
	private IBoardService boardService;
	
	@RequestMapping("/")
	public @ResponseBody String root() {
		return "Jdbc Template 실습 실습";
	}
	
	@RequestMapping(value="/memberList", method=RequestMethod.GET) // get post 방식하게 되면
	public String memberList(Model model) {
		model.addAttribute("datas",memberDAO.selectAll());
		return "memberList";
	}
	
	@RequestMapping("/boardList")
	public String boardList(Model model) {
		model.addAttribute("datas", boardService.selectAll(null));
		return "boardList";
	}
	
	@RequestMapping("/board")
	public String board(BoardDTO dto, Model model) {
		model.addAttribute("data", boardService.selectOne(dto));
		return "board";
	}
	
	@RequestMapping(value="/boardInsert", method=RequestMethod.GET)
	public String boardInsertin(BoardDTO dto) {
		return "boardInsert";
	}
	
	@RequestMapping(value = "/boardInsert", method = RequestMethod.POST)
	public String boardInsert(BoardDTO dto) {
		boardService.insert(dto);
		return "redirect:boardList";
	}
	
	@RequestMapping("/boardDelete")
	public String boardDelete(BoardDTO dto) {
		boardService.delete(dto);
		return "redirect:boardList";
	}
}