RestController 클래스 생성 후 테스트용 데이터를 초기화하는 아래 코드를 추가했다.
@PostConstruct
public void initData() {
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
for (int i = 0; i < 100; i++) {
Team selectedTeam = i % 2 == 0 ? teamA : teamB;
em.persist(new Member("member" + i, selectedTeam, i));
}
}
그리고 맞이한 에러 메시지...
Caused by: javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
그래서 찾아본 결과 아래와 같은 해결방법을 찾았다.
https://sorjfkrh5078.tistory.com/311
내가 적용한 방법은 4번째. 다른 스프링 빈을 호출해서 사용하는 방법.
아래와 같은 InitMemberService를 추가하고,
@Component
public class InitMemberService {
@PersistenceContext
EntityManager em;
@Transactional
public void init() {
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
em.persist(teamA);
em.persist(teamB);
for (int i = 0; i < 100; i++) {
Team selectedTeam = i % 2 == 0 ? teamA : teamB;
em.persist(new Member("member" + i, selectedTeam, i));
}
}
}
RestController 클래스에서 주입받고 실행하니 정상적으로 처리됐다.
@RestController
public class MemberController {
@Autowired
private InitMemberService initMemberService;
@PostConstruct
public void initData() {
initMemberService.init();
}
참조