๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[Error Handling]

[MySQL] @Transactional์„ ๋ถ™์ธ ๋ฉ”์„œ๋“œ๊ฐ€ ๋กค๋ฐฑ๋˜์ง€ ์•Š์„ ๋•Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

by ํŒกํŽ‘ํ 2023. 10. 19.
728x90

๐Ÿšจ Error :

๐Ÿ’ก ์ผ๋ฐ˜์ ์œผ๋กœ @Transactional ์• ๋„ˆํ…Œ์ด์…˜์„ ๋ถ™์ธ ๋ฉ”์„œ๋“œ ๋‚ด์— ๋กœ์ง ์ˆ˜ํ–‰ ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กค๋ฐฑ์ด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๋ถ„๋ช… @Transactional ์• ๋„ˆํ…Œ์ด์…˜์„ ๋ถ™์˜€๋Š”๋ฐ UnCheckedException์ด ๋ฐœ์ƒํ•ด๋„ ๋กค๋ฐฑ์ด ๋˜์ง€ ์•Š์•˜๋‹ค.
  • ์ธํ„ฐ๋„ท์— ๊ฒ€์ƒ‰ํ•ด ๋ณด๋ฉด ๋Œ€๋ถ€๋ถ„์ด CheckedException์ด ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ ๋กค๋ฐฑ์ด ๋˜์ง€ ์•Š์•„ ํ—ค๋งธ๋‹ค๋Š” ๊ธ€์ด์—ˆ๋‹ค.
  • ์Šคํ”„๋ง์˜ @Transactional์€ ๊ธฐ๋ณธ์ ์œผ๋กœ CheckedException์„ ๋กค๋ฐฑ์ด ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
    • ์ด๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @Transactional(rollbackFor = Error.class)๊ณผ ๊ฐ™์ด rollback์ด ์ ์šฉ๋  Exception์„ ์ปค์Šคํ…€ํ•˜๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

๋ฌธ์ œ๋Š” ๋‚˜์˜ ๊ฒฝ์šฐ์—๋Š” RuntimeException๋„ ๋กค๋ฐฑ์ด ๋˜์ง€ ์•Š์•˜๋‹ค!

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

 

@Service
@RequiredArgsConstructor
public class Service {

    private final ScoutListRepository scoutListRepository;

    public Dto.Response post(Dto.Post post) {
        Player addedPlayer = Player.addPlayer(post.getName(), post.getAge(), post.getTeam(), post.getOverall());

        Player savedPlayer = scoutListRepository.save(addedPlayer);

        return Dto.Response
                .builder()
                .name(savedPlayer.getName())
                .scoutStatus("interested")
                .team(savedPlayer.getTeam())
                .overall(savedPlayer.getOverall())
                .build();
    }
}
  • http ์š”์ฒญ ๋ฐ”๋””๋กœ ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ db์— ๋„ฃ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์ด๋‹ค.

 

  • postman์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์•˜๋‹ค.

 

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๊นŒ์ง€ ์ž˜ ๋œ๋‹ค.

 

@Service
@RequiredArgsConstructor
public class Service {

    private final ScoutListRepository scoutListRepository;

    @Transactional // ํŠธ๋žœ์žญ์…˜ ์• ๋„ˆํ…Œ์ด์…˜ ์ถ”๊ฐ€
    public Dto.Response post(Dto.Post post) {
        Player addedPlayer = Player.addPlayer(post.getName(), post.getAge(), post.getTeam(), post.getOverall());

        Player savedPlayer = scoutListRepository.save(addedPlayer);

        throw new RuntimeException(); // ๊ณ ์˜์ ์œผ๋กœ UnCheckedException ์—๋Ÿฌ ๋ฐœ์ƒ
        
    }
}
  • ์ด์ œ ๊ณ ์˜์ ์œผ๋กœ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ์ด ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด ๋ณด์ž.
  • ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.

 

  • ์ •์ƒ์ ์œผ๋กœ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

  • ๋กค๋ฐฑ์ด ๋˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋“ค์–ด์žˆ๋‹ค.


๐Ÿค“ ์›์ธ :

  • ์ด ๋ฌธ์ œ๋ฅผ ์žฅ๊ธฐ๊ฐ„ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋Š”๋ฐ ์˜ค๋Š˜ ๋์žฅ์„ ๋‚ด๋ฒ„๋ฆฌ์ž๋ผ๋Š” ๋งˆ์Œ์œผ๋กœ ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ ํ•ด๊ฒฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ์ผ๋‹จ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๋ณ€์ˆ˜๋ฅผ ์ „๋ถ€ ์ œ์™ธํ•˜์—ฌ ํ…Œ์ŠคํŠธํ–ˆ์Œ์—๋„ ๋กค๋ฐฑ์ด ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์ ์—์„œ ์ฝ”๋“œ ์ƒ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Œ์„ ํ™•์‹ ํ–ˆ๋‹ค.
  • ์•„๋งˆ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž์ฒด๊ฐ€ ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋“ ๊ฐ€ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ํ•ด๋‹น ํ…Œ์ด๋ธ”์„ SQL ๋ฌธ์œผ๋กœ ์ถ”์ถœํ•ด ๋ณด์•˜๋‹ค.

 

  • ENGINE=MYISAM์ด ์ฐธ ๋‚ฏ์„ค์—ˆ๋‹ค.
  • ๋ณดํ†ต์€ InnoDB์˜€๋Š”๋ฐ ์ €๊ฑด ๋ญ์ง€..? ํ•˜๋ฉฐ ๊ฒ€์ƒ‰ํ•ด ๋ณธ ๊ฒฐ๊ณผ ์—ฌ๋Ÿฌ ๋ธ”๋กœ๊ทธ์—์„œ MYISAM์€ ์†๋„๋Š” ๋น ๋ฅด๋‚˜, ํŠธ๋žœ์žญ์…˜์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉฐ MySQL ๋ฒ„์ „ 5.5 ์ด์ƒ๋ถ€ํ„ฐ๋Š” Default ์—”์ง„์ด InnoDB๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•„๋ƒˆ๋‹ค.


๐Ÿš’ ํ•ด๊ฒฐ :

  • ๋‚˜๋Š” ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์—์„œ mysql ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋Œ๋ฆฌ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ 5.7 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์—๋„ ํ…Œ์ด๋ธ”์ด MyISAM์ด์—ˆ๋‹ค.
  • ์ด์ƒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์—”์ง„์„ ์‚ดํŽด๋ณด๋‹ˆ InnoDB๊ฐ€ Default๊ฐ€ ๋งž์•˜๋‹ค.
  • ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ddl-auto๋ฅผ create๋กœ ๋Œ๋ฆฌ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๊ฑด ์Šคํ”„๋ง์ด๋‹ค.
  • ๊ทธ๋ž˜์„œ application.yml์„ ์‚ดํŽด๋ณด์•˜๋‹ค.

 

  • ์•„.. MySQL5Dialect๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 5.5๊ฐ€ ์•„๋‹ˆ๋ผ์„œ MyISAM์œผ๋กœ ํ…Œ์ด๋ธ”์ด ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ ๊ฐ™์•˜๋‹ค.
    • MySQL57Dialect๊ฐ€ ์žˆ์Œ์œผ๋กœ 5๋Š” ๊ทธ๋ƒฅ 5.0์„ ์˜๋ฏธํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ๊ฐ€ ์‹ถ๋‹ค.

 

  • MySQL5Dialect๋ฅผ MySQL5InnoDBDialect๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ InnoDB๋ฅผ ์—”์ง„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, 5.5 ์ด์ƒ์˜ dialect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐ๋  ๊ฒƒ ๊ฐ™์•˜๋‹ค.
    • ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ ๋“ฑ์˜ ์ด์œ ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด 8๋กœ ์˜ฌ๋ฆฌ์ž. 8์ด ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ด๋ฉฐ ์ข‹๋‹ค.

 

  • dialect๋ฅผ ๋ฐ”๊พธ๋‹ˆ ddl auto create๋กœ ์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ” ์—”์ง„์ด InnoDB๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.
  • ์ด์ œ postman์œผ๋กœ ๊ณ ์˜์ ์ธ RuntimeException์„ ๋ฐœ์ƒ์‹œ์ผœ ๋กค๋ฐฑ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์ž.

 

์ •์ƒ์ ์œผ๋กœ ๋กค๋ฐฑ์ด ๋˜์—ˆ๋‹ค!


๐Ÿค” ์˜๋ฌธ์  :

์—†์Œ!

728x90