๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐‘†๐‘ข๐‘›๐‘ โ„Ž๐‘–๐‘›๐‘’ ๐‘Ž๐‘“๐‘ก๐‘’๐‘Ÿ ๐‘Ÿ๐‘Ž๐‘–๐‘›โœง

[Spring] Jpa๋ฅผ ์ด์šฉํ•œ ์กฐํšŒ์ˆ˜ ์ฆ๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ณธ๋ฌธ

๐—ฃ๐—ฟ๐—ผ๐—ด๐—ฟ๐—ฎ๐—บ๐—บ๐—ถ๐—ป๐—ด๐Ÿ’ป/๐’๐ฉ๐ซ๐ข๐ง๐ 

[Spring] Jpa๋ฅผ ์ด์šฉํ•œ ์กฐํšŒ์ˆ˜ ์ฆ๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„

๐ŸคRyusun๐Ÿค 2023. 1. 27. 02:32

ํ”„๋กœ์ ํŠธ์—์„œ Jpa๋ฅผ ํ™œ์šฉํ•ด์„œ ์กฐํšŒ์ˆ˜ ์ฆ๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

BoardController

/**
 * ์กฐํšŒ์ˆ˜ ์ฆ๊ฐ€
 */
@ApiOperation(value = "์กฐํšŒ์ˆ˜ ์ฆ๊ฐ€", notes = "์กฐํšŒ์ˆ˜๋ฅผ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.")
@GetMapping("/board/hit/{id}")
public int updateHit(@PathVariable("id") final Long id) {
    return boardService.updateHit(id);
}

BoardService

/**
 * ์กฐํšŒ์ˆ˜ ์ฆ๊ฐ€ํ•˜๊ธฐ
 */
@Transactional
public int updateHit(Long id) {
    Board board = boardRepository.findById(id).orElseThrow(IllegalArgumentException::new);
    return boardRepository.updateHit(board.getId());
}

BoardRepository

Test์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์—๋Ÿฌ๊ฐ€ ๊ณ„์† ๋‚ฌ๋˜ ๋ถ€๋ถ„์ด repository์˜€์Šต๋‹ˆ๋‹ค. 

 

์ˆ˜์ • ์ „

public interface BoardRepository extends JpaRepository<Board, Long> {
    
    @Modifying
    @Query("update Board set hit = :hit + 1 where id = :id")
    int updateHit(@Param("id") Long id );
}

 

์˜ค๋ฅ˜ 1. org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query

ํ•ด๊ฒฐ๋ฒ•@Transactional ์€ service์— ์จ์„œ repository์—๋Š” ์•ˆ ์จ๋„ ๋˜๋Š” ์ค„ ์•Œ์•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ์ฝ”๋“œ์—์„œ๋Š” rollback์„ ์œ„ํ•ด @Transactional์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.  ๋‹จ์ˆœํžˆ JpaRepository์˜ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋ผ๋ฉด @DataJpaTest๋ฅผ ์ด์šฉํ•˜๋ฉด @Transactional์˜ rollback ๊ธฐ๋Šฅ์„ ๋Œ€์‹ ํ•ฉ๋‹ˆ๋‹ค.

 

  • ๊ฐ„๋‹จํ•˜๊ฒŒ @Transactional์„ ์„ค๋ช…ํ•˜๋ฉด @Transactional์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‚ญ์ œ๋ฅผ ํ•˜๋Š” ๋„์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์‹œ ๋กค๋ฐฑ๋˜๋„๋ก ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.

 

์˜ค๋ฅ˜ 2. org.springframework.dao.InvalidDataAccessResourceUsageException: Named parameter not bound : hit; ~

jpa update๋ฌธ์„ ์—ฌ๋Ÿฌ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด์„œ ์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•ด ๋ณด์•˜์ง€๋งŒ test ์ฝ”๋“œ์—์„œ  ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋ฒ• :  hit ์•ž์˜ : ๋•Œ๋ฌธ์— jpa๊ฐ€ param๋กœ ์ƒ๊ฐํ•ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ  : ์„ ์ง€์šฐ๊ณ  ์‹คํ–‰ํ•˜์˜€๋”๋‹ˆ ์˜ค๋ฅ˜ ์—†์ด ์ž˜ ์ž‘๋™ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

์ˆ˜์ • ํ›„

public interface BoardRepository extends JpaRepository<Board, Long> {

    @Transactional
    @Modifying
    @Query("update Board set hit = hit + 1 where id = :id")
    int updateHit(@Param("id") Long id );
}

 

 

ํ…Œ์ŠคํŠธ ํ†ต๊ณผ

 

 

[์ฐธ๊ณ ]

https://tecoble.techcourse.co.kr/post/2020-08-31-jpa-transaction-test/