Spring 15 (23.04.26)

Jane·2023년 4월 26일
0

IT 수업 정리

목록 보기
113/124

1. 트랜잭션 코딩

  • 깃허브 내의 트랜잭션.md, 트랜잭션 이미지 참조

1-1. 트랜잭션 함수 만들기

  • User를 insert를 넣은 후 권한까지 넣어야한다. 2개가 정상적인 동작이 되어야 실행 한다 (트랜잭션의 단위)

UserService.java

package edu.global.ex.service;

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

import edu.global.ex.mapper.UserMapper;
import edu.global.ex.vo.UserVO;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class UserService {

   @Autowired
   private UserMapper userMapper;
   
   public void addUser(UserVO user) {
      log.info("addUser()..");

      userMapper.insertUser(user);
      userMapper.insertAuthorities(user);

   }
   
}

  • Restful 방식으로 ID와 PW를 입력받는다.

LoginController.java

	@GetMapping("/addUser/{id}/{pw}")
	public String addUser(@PathVariable String id, @PathVariable String pw) throws Exception{
		System.out.println(id + " : " + pw);
		return "redirect:/";
	}
  • localhost:8282/kim6/kim6
  • localhost:8282/kim7/kim7
  • localhost:8282/kim8/kim8

[Console]
kim6 : kim6
kim7 : kim7
kim8 : kim8


LoginController.java

	@Autowired
	private PasswordEncoder encoder;
	
	@Autowired
	private UserService userService;
	
	@GetMapping("/addUser/{id}/{pw}")
	public String addUser(@PathVariable String id, @PathVariable String pw) throws Exception {
		System.out.println(id + " : " + pw);

		UserVO user = new UserVO();
		user.setEnabled(1);
		user.setUsername(id);
		user.setPassword(encoder.encode(pw.toString().trim()));

		System.out.println(user);

		userService.addUser(user);

		return "redirect:/";
	}
  • localhost:8282/addUser/kim6/kim6 입력
    (Developer에 kim6가 있고, ROLE_USER인지 확인)

  • localhost:8282/addUser/kim7/kim7 입력
    (Developer에 kim7가 있고, ROLE_USER인지 확인)

  • kim8/kim8, kim9/kim9 등등 테스트...

1-2. 트랜잭션 테스트

UserService.java

	public void addUser2(UserVO user) {
		log.info("addUser()..");

		userMapper.insertUser(user);
		user = null; // 에러 유도
		userMapper.insertAuthorities(user);

	}
  • LoginController 의 addUser를 addUser2으로 바꾼다.

  • SQL 구문으로 kim6 / kim6 삭제 후 커밋

delete from authorities where username = 'kim6';
delete from users where username = 'kim6';
  • localhost:8282/addUser/kim6/kim6 진입하면 에러 출력
  • USERS 테이블에는 kim6가 있지만, AUTHORITIES 테이블에는 kim6가 없다.
  • 확인했으면 다시 delete 구문 실행하고 커밋

1-3. @Transactional 사용하기

UserService.java

	@Transactional
	public void addUser3(UserVO user) {
		log.info("addUser()..");

		userMapper.insertUser(user);
		user = null; // 에러 유도
		userMapper.insertAuthorities(user);

	}
  • LoginController 의 addUser를 addUser3으로 바꾼다.

  • USERS, AUTHORITIES 다 지우고 실행해본다.
    (트랜잭션이 있어서 users에도 authorities에도 내용이 들어가지 않는다.)

1-4. Checked Exception / Unchecked Exception 롤백 시도하기

UserService.java

   @Transactional
   public void addUser4(UserVO user) throws Exception {
      log.info("addUser()..");

      userMapper.insertUser(user);
      userMapper.insertAuthorities(user);

      throw new Exception("Exception (Checked Exception)");
   }
  • LoginController 의 addUser를 addUser4로 바꾼다.
  • localhost:8282/addUser/kim6/kim6 하면 테이블 2개에 모두 들어가 있다. (롤백이 되지 않았다.)
  • Checked Exception은 롤백이 되지 않는다.

UserService.java

	@Transactional
	public void addUser5(UserVO user) throws Exception {
		log.info("addUser()..");

		userMapper.insertUser(user); 
		userMapper.insertAuthorities(user);

		throw new RuntimeException("Exception (Unchecked Exception)");
	}
  • LoginController의 addUser를 addUser5로 바꾼다.
  • Runtime Exception은 Unchecked Exception이다.
  • kim6/kim6 접속하면 생성이 되지 않았다. (Unchecked Exception이 실행되어 롤백이 적용되었다.)

  • Checked Exception 도 롤백을 걸려면?

UserService.java

	@Transactional(rollbackFor = Exception.class)
	public void addUser6(UserVO user) throws Exception {
		log.info("addUser()..");

		userMapper.insertUser(user); 
		userMapper.insertAuthorities(user);

		throw new Exception("Exception (Checked Exception)");
	}
  • Checked Exception 잡혀도 내용은 추가가 안된다.
profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글