강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

jhkweon74님의 프로필 이미지
jhkweon74

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

테스트 데이터 초기화시 @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에는 트랜잭션을 걸지 않습니다.

감사합니다.

 

jhkweon74님의 프로필 이미지
jhkweon74

작성한 질문수

질문하기