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