• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

@Transaction 처리 질문입니다.

20.05.17 03:37 작성 조회수 158

0

@Transaction 을 붙여서, 트랜잭션 처리를 언제 해야하는지 알 수 있을까요? 

검색해보니, 여러 쿼리를 하나의 단위로 실행해야할 때만 붙여서 처리하면 되는 것 같으나 일부 블로그에서는 모든 service의 메소드에 붙이라는 곳도 있는 거 같아서 헷갈립니다ㅠㅠ

따라서 read를 제외한 create, update, delete가 하나라도 있는 service layer의 메소드에 전부 붙여야하는지 궁금합니다. 다음은 update, delete 각자 하나의 쿼리만 수행하는 코드 예시입니다.

public boolean updateBoard(Board board, Long id) {
		Optional<Board> optionalBoard = boardRepository.findById(id);
		if (optionalBoard.isEmpty()) {
			return false;
		}

		Board existingBoard = optionalBoard.get();
		existingBoard.setTitle(board.getTitle());
		existingBoard.setContent(board.getContent());
		boardRepository.save(existingBoard);
		return true;
	}

	public boolean deleteBoard(Long id) {
		Optional<Board> optionalBoard = boardRepository.findById(id);
		if (optionalBoard.isEmpty()) {
			return false;
		}

		boardRepository.deleteById(id);
		return true;
	}

답변 1

답변을 작성해보세요.

1

뭐라고 정해져 있는 답같은게 있는게 아니라 필요한 지점에 필요한 트랜잭션 설정을 사용하시면 됩니다. 가령, 서비스에 있는 메소드에서 여러 Repository를 호출해서 어떤 작업을 하는데 그 모든 작업이 한 단위로 처리되어야 한다면 그 서비스 메소드를 @Transactional로 묶으면 되는거죠.

또는 어떤 서비스 계층에서 Repository를 사용해서 데이터를 조회만 한다면 @Transactional(readOnly="true")를 사용해서 write lock을 쓰지 않도록 해서 조금이나마 성능에 잇점을 꽤할 수도 있구요.

DB 트랜잭션에 대한 공부를 하시면 그런 결정을 하는데 좀 더 도움이 될겁니다.