인프런 커뮤니티 질문&답변
테스트 데이터 초기화시 @Transactional 문제 발생 원인에 대해 알고 싶습니다.
작성
·
187
0
package com.project.springproject;
import com.project.springproject.dto.MemberDto;
import com.project.springproject.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
@Component
@RequiredArgsConstructor
public class TestDataInit {
private final InitService initService;
@PostConstruct
public void init() {
initService.initMember();
}
@Component
@Transactional
@RequiredArgsConstructor
static class InitService {
private final MemberRepository memberRepository;
public void initMember() {
MemberDto memberDto = new MemberDto();
memberDto.setLoginId("test");
memberDto.setPassword("1234");
memberDto.setName("테스터");
memberDto.setAddress("서울");
memberRepository.save(memberDto.toEntity());
}
}
}
package com.project.springproject.repository;
import com.project.springproject.domain.Member;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;
@Repository
public class MemberRepository {
@PersistenceContext
private EntityManager em;
public void save(Member member){
em.persist(member);
}
public Member findById(Long id){
return em.find(Member.class, id);
}
public List<Member> findAll(){
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
public List<Member> findByLoginId(String loginId){
return em.createQuery("select m from Member m where m.loginId = :loginId", Member.class)
.setParameter("loginId", loginId)
.getResultList();
}
}
위 코드에서 initMember()를 public으로 실행 시 문제가 되지 않는데 private로 설정 시 다음과 같은 오류가 발생합니다.
이에 대한 오류가 왜 발생하는지 이해가 되지 않아 질문 올립니다.
답변 1
0
김영한
지식공유자
안녕하세요. jhkweon74님
JPA에서 모든 데이터 변경에는 트랜잭션이 필요합니다.
스프링은 트랜잭션에서 private에는 트랜잭션을 걸지 않습니다.
감사합니다.





