묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! Querydsl
EntityManagerFactory를 활용한 페치조인 예제 에러(해결법있음 - 이유모름)
환경 조인 - 페치 조인 강의를 듣던 중이 부분 예제를 따라 하다가 보니java.lang.illegalstateexception: specified field type [interface jakarta.persistence.entitymanagerfactory] is incompatible with resource type [jakarta.persistence.entitymanager]이라는 exception이 발생했습니다.강의에서 새로운 프로젝트를 생성하거나 파일을 생성하지 않았으므로 상단에@PersistenceContext EntityManager em; 가 있고 추가적으로@PersistenceContext EntityManagerFactory emf;를 넣어주고 테스트 코드에서emf.getPersistenceUnitUtil().isLoaded(findMember.getTeam());를 실행하였습니다. 일단 entitymanagerfactory는 yml에 있는 설정을 바탕으로 1개가 생성되고 해당 factory에서 요청에 의해 entitymanager를 생성해서 제공하는 형태라는 글을 발견하여 추가적인 의존성 주입에서 2개의 factory 생성되는 이슈가 발생해서가 아닌가 추측을 하고 우선적으로는 사용중인 em에서 factory를 가져올 수 있길래 이렇게 접근했는데em.getEntityManagerFactory().getPersistenceUnitUtil().isLoaded(findMember.getTeam());정상작동은 하긴 하지만 강사님의 경우 추가적인 entitymanagerfactory 주입에도 테스트코드가 돌아갔으므로 정확한 동작 이유를 잘 모르겠어서 혹시 확실한 이유를 알 수 있을까 하여 문의합니다.바탕
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티매니저와 영속성컨텍스트에 관해서
여러 질문 답변을 찾아보고 내용을 종합해서 이해해본 결과 엔티티매니저와 영속성컨텍스트에 관해서 제가 현재 이해하고 있는게 맞는지 확인 부탁드립니다 .. 엔티티 매니저 1. 언제 생성되나 엔티티 매니저의 빈 스코프는 request로 설정되어 있다. 스프링이 처음 의존성을 주입하는 단계에서 엔티티 매니저를 의존하는 다른 빈들은 실제 엔티티 매니저가 아닌 가짜 엔티티 매니저(프록시)를 주입 받는다. 고객의 요청이 오고 엔티티 매니저가 관련 로직을 실행해야 하는 시점에 가짜 엔티티 매니저는 해당 트랜잭션과 관련된 실제 엔티티 매니저를 호출해준다. 여러 빈들이 엔티티매니저에 의존하고 있을 때 같은 고객의 요청 안에서는 모두 같은 엔티티매니저를 반환받는다. 2. 몇 개가 생성되나 고객이 요청할 때마다 생성되고 요청이 끝나면 사라진다.고객의 요청이 동시에 100명이 오면 100개 10000명이 오면 10000개가 생성된다. 3. 영속성 컨텍스트와의 관계 엔티티 매니저가 트랜잭션을 실행하면 영속성 컨텍스트가 생성되고 트랜잭션이 종료되면 영속성 컨텍스트가 사라진다. 4. 궁금한 점 같은 트랜잭션이면 서비스, 리포지토리에서 사용하는 EntityManager가 모두 같은 영속성 컨텍스트에 접근하게 되기 때문에 스프링 환경에서는 엔티티매니저와 영속성 컨텍스트의 관계가 N:1이 될 수 있다고 설명해주셨는데요.답변 링크 같은 트랜잭션이면 같은 고객의 요청 안에서 이루어지고 있고 그렇다면 서비스, 리포지토리에서 사용하는 엔티티매니저는 모두 동일한 엔티티매니저이기 때문에 1:1 관계가 아닌가요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 관련 persist 전에 쿼리가 날아가는 경우
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 안녕하세요. 섹션 3 영속성 관리 부분을 들으며 궁금한 점이 생겼습니다. EntityManager를 이용해 엔티티를 em.persist(entity) 했을 때 영속화만 시키고, DB로는 쿼리가 안 날아가는 것으로 들었습니다. 테스트 환경이 잘못된 것인지 Spring boot 환경에서는 다른건지 궁금해서 질문 남깁니다. 저의 테스트 코드를 첨부합니다. 커밋하기 전 em.persist(studio);를 했을 때 Insert 쿼리가 나갑니다 ㅠㅠ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; @SpringBootTest public class NewTest { @Autowired EntityManagerFactory emf; @Test public void test() { EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); Hello hello = Hello.builder() .name("hello") .build(); System.out.println(">>>>>>>"); em.persist(hello); System.out.println(">>>>>>>"); System.out.println(">>>>>>> Commit"); tx.commit(); System.out.println(">>>>>>>"); em.close(); } }
-
미해결실전! Querydsl
EntityManager Thread safe관련 문의드립니다.
안녕하세요 김영한 강사님 강의듣다 처음 질문올립니다~~! EntityManager의 Thread-Safe관련 문의드립니다. 영한님 책 83Page에서 엔티티 매니저는 스레드간 공유하거나 재사용하면 안된다 라고 설명이 되어있는데 이게 스레드 안전하지 않다라는 내용과는 다른건가요? 전 그부분보고 지금까지 엔티티매니저는 스레드안전하지 않아서 멀티 스레드에서 사용하려면 동기화를 해줘야한다고 생각했었는데 이번 강의(순수JPA리포지토리와 Querydsl)에서 스레드 안전하다고 말씀하셔서, 궁금합니다! 아니면 본래 엔티티매니저는 스레드안전하지 않지만 스프링에서 스레드 안전하게 사용하도록 처리해주고 있는건가요?(강의에서 스프링이 Proxy를 사용한다고 말씀해주시긴 해서 혹시 이거랑 관련있는지 궁금합니다) 항상 좋은강의 너무 잘 듣고있습니다. 감사합니다~~!
-
미해결실전! Querydsl
EntityManager thread-safe 문제
안녕하세요 영한님 !! EntityManager 생성시에, final로 주입받으시거나 @PersistenceContext를 사용해서 주입받으시거나 둘 중에 하나로 코드를 작성하시는 것을 보았는데요!! 제가 알기로는 Entitymanager의 thread-safe하지 않은 문제를 해결하기위해서 @PersistenceContext를 사용하여 프록시 객체로 감싸서 생성함으로써 thread-safe하지 않은 문제를 해결해준다고 알고있었는데요, 그렇다면 final로 주입시에는 프록시 객체로 감싸서 주입받는게 아닌, 진짜 bean을 주입 받기 때문에 thread-safe하지 않다고 봐야할까요?? 감사합니다!! :)
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 1차 캐시가 비워지는 시점은 언제인가요?
안녕하세요, 영속성 컨텍스트 1차 캐시에 대한 질문이 있습니다. 새로운 트랜잭션이 시작되는 시점에서도 1차 캐시가 유지되는 건가요? 만약 맞다면 1차 캐시가 비워지는 시점이 언제인가요? 강의를 보면 영속성 컨텍스트 1차 캐시는 flush 시점(커밋 시점) 이후에도 내용을 유지한다고 합니다. 그렇다면 새로운 트랜잭션이 시작되는 시점에서도 1차 캐시가 유지되는 건지가 궁금하구요. 궁금한 이유는,새로운 트랜잭션이 시작되었는데도 이전 트랜잭션 시점의 데이터가 담긴 1차 캐시를 계속 바라보면 문제가 될 수 있을 것 같아서요. 답변해주시면 감사하겠습니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Bean 등록시 EntityManager 오류 질문드립니다.
안녕하세요. 핵심원리를 듣고 이번 강의를 들으면서 배운 것을 적용하려고 시도해보았습니다. Service interface와 Repository interface를 생성하여, componentscan을 사용하여 빈을 등록하려고 했습니다. 기존 service와 repository를 Impl로 바꾸어 @Component 어노테이션을 붙여 의존관계를 자동 주입하려고 했습니다. ``` @Component@Transactionalpublic class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository; @Autowired public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } ``` @Componentpublic class MemoryMemberMemberRepository implements MemberRepository { @PersistenceContext private final EntityManager em; @Autowired public MemoryMemberMemberRepository(EntityManager em) { this.em = em; }@Configuration @ComponentScan( excludeFilters = @ComponentScan.Filter(classes=Configuration.class))public class AppConfig {} @Testpublic void 회원가입() throws Exception{ //given AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); 해당 코드를 테스트를 시도하였지만 No qualifying bean of type 'javax.persistence.EntityManager' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 이라는 오류가 발생하였습니다. 개념이 많이 부족하여 질문을 제대로 했는지도 정확하지않고, 해당 오류가 왜 나는지 잘 모르겠습니다 ㅠㅠ