데이터베이스에는 단위테스트를 생성하고 데이터가 쌓이고 있었다. 여기에서 나는 트랜잭션이 문제가 있다고 생각을 하였다.
그러면 코드를 보면서 문제를 살펴보겠습니다.
@MybatisTest
@Transactional(value = "transactionManager")
@Import({DataSourceConfig.class, LadderDAO.class})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class LadderDAOTest
mysql, mariadb은 백업의 기능이 없다. 그래서 테스트를 진행하기 이전에 Copy table, Insert Into를 통하여 테스트 테이블을 만들고 개인적으로 수행한다. 그런데 이때 Copy table을 통해서 생성하면 MyiSam으로 생성이 되는 경우가 있어서 문제가 발생을 하였다.
CREATE TABLE new_table_name LIKE old_table_name;
INSERT INTO new_table_name SELECT * FROM old_table_name;
ALTER TABLE new_table_name ADD PRIMARY KEY (column_name);
혹시 MySQL에 대해서 궁금하면 이전에 정리한 내용을 보면 좋을거 같다.
https://velog.io/@geon_km/MySQL-8.0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98
show table status
where name = '테이블 이름';
다음 쿼리를 실행을 하면 스토리지 엔진을 확인할 수 있다. 그런데 궁금한 부분은 스토리지 엔진에 MyISAM과 InnoDB가 불규칙적으로 되어져 있었다.
이 문제는 처음에 설정의 문제라고 생각을 했지만 문제는 테이블별로 내가 저장소 엔진 설정을 하지 않았다는 점이었다.
@Test
public void testGameLeaderboard() throws Exception {
//given
final String gameCode = "game1";
final String eventCode = "event1";
final String roundCode = "round1";
final String trackCode = "track1";
final String carCode = "car1";
final String playerName = "Player1";
final String country = "Country1";
final String countryCode = "C1";
final String lapTime = "1:00.000";
final int totalLaps = 10;
final int totalTime = 600000;
LadderVO gameInfo = LadderVO.builder()
.game_code(gameCode)
.event_code(eventCode)
.round_code(roundCode)
.track_code(trackCode)
.car_code(carCode)
.nickname(playerName)
.country(country)
.country_code(countryCode)
.lap_time(lapTime)
.total_time(String.valueOf(totalTime))
.build();
//when
ladderDAO.insertLadderInfo(gameInfo);
List<LadderVO> leaderboard = ladderDAO.getLadder();
List<LadderVO> bestLeaderboard = ladderDAO.getBestLadder();
assertAll(
()->assertThat(leaderboard).extracting(LadderVO::getNickname)
.contains(playerName),
()-> assertThat(leaderboard).extracting(LadderVO::getGame_code)
.contains(gameCode),
()-> assertThat(leaderboard).extracting(LadderVO::getEvent_code)
.contains(eventCode),
()-> assertThat(leaderboard).extracting(LadderVO::getRound_code)
.contains(roundCode),
()-> assertThat(leaderboard).extracting(LadderVO::getTrack_code)
.contains(trackCode)
);
assertAll(
()->assertThat(bestLeaderboard).extracting(LadderVO::getNickname)
.contains(playerName),
()-> assertThat(bestLeaderboard).extracting(LadderVO::getGame_code)
.contains(gameCode),
()-> assertThat(bestLeaderboard).extracting(LadderVO::getEvent_code)
.contains(eventCode),
()-> assertThat(bestLeaderboard).extracting(LadderVO::getRound_code)
.contains(roundCode),
()-> assertThat(bestLeaderboard).extracting(LadderVO::getTrack_code)
.contains(trackCode)
);
}
@MybatisTest
를 통하여 순수한 mybatis의 테스트를 수행하기 위해 사용을 했다.dependencies {
testImplementation("org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.2")
}
@Repository
public class MemberDao {
private final SqlSession sqlSession;
public CityDao(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
public Member selectMemberById(long id) {
return this.sqlSession.selectOne("selectMemberById", id);
}
}
@MybatisTest
@Import(MemberDao.class)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class MemberDaoTest {
@Autowired
private MemberDao memberDao;
@Test
public void selectCityByIdTest() {
Member member = cityDao.selectMemberById(1);
assertThat(member.getName()).isEqualTo("김무건");
assertThat(member.getState()).isEqualTo("공부중");
assertThat(member.getCountry()).isEqualTo("한국");
}
}
https://jehuipark.github.io/note/transaction-do-not-work-issue
좋은 내용 잘 보고 갑니다!