네트워크와 CS

[ProblemSolver] @Transactional(readOnly = true)는 왜 필요한가?

Sophie소피 2022. 10. 24. 01:22

회사에서 소스코드를 분석하고 에제코드를 작성해보면서

단순히 왜 쓰는지에 대해 이해도가 전혀없이 

@Transactional(readOnly = true) 을 주었다. 

 

트렌젝션 일어나는 insert, update, delete 에는 쓰기가 가능하도록

별도록 @Transaction 어노테이션을 메서드에 선언해야한다. 

 

Class Level에는 공통적으로 적용되는 읽기전용인

@Transacrtion (readOnly = true) 어노테이션을 선언만하고

실행을 시켜본 결과 당연히 되지않았다. 

 

그래놓고 왜  update가 왜 안될까 고민하고 있었다. 

아래와 같이 트렌젝션 일어나는 insert, update, delete 에는 쓰기가 가능하도록

 @Transactional 어노테이션을 달아줘야한다. 

 

@Service
@Transactional(readOnly = true)
class BoardServiceImpl(
    val boardRepository: BoardRepository,
    val em: EntityManager
) : BoardService {

    /**  작성글 리스트 조회   **/
    override fun boardList(pageable: Pageable): List<Board> {
        return boardRepository.boardList(pageable)
    }

    /**  작성글 상세 조회   **/
    override fun detailBoard(board_id: Long): BoardDTO {
        return boardRepository.detailBoard(board_id) ?: throw Exception("board 아이디 잘못 조회")
    }

    /**  작성글 작성   **/
    @Transactional
    override fun postBoard(dto: BoardRegisterRequestDTO): Long? {
        val board = Board(dto)
        em.persist(board)

        return board.id
    }

    /**  작성글 수정  **/
    @Transactional
    override fun editBoard(dto: BoardModifyRequestDTO): Boolean {
        val result = boardRepository.editBoard(dto)
        if (!result) throw Exception("존재하지 않는 게시판 요청")

        return result
    }

정신 똑바로차리고 제발 알고 쓰도록하자. 

저런 실수는 학원다니는 사람들도 하지않을 실수일것이다.