영속성 컨텍스트에 엔티티가 남아있을 경우 @Test @Rollback(value = false) void 이메일로_아이디찾기_성공() { Member newMember = Member.createNewMember("abc", "abcd", "abcde", "abcde@naver.com"); em.persist(newMember); Member findByMember = memberService.findJoinIdByEmail("abcde@naver.com"); log.info("new Member = {}", System.identityHashCode(newMember)); log.info("findByMember = {}", System.identityHashCode(findByMember)); Ass..
Open Session In View : True Spring의 Open Session In View의 기본 설정값은 True다. 따라서 Open Session In View를 사용하는 것이다. 이것을 사용하게 되면 다음과 같은 현상이 발생한다. 영속성 컨텍스트는 클라이언트의 요청이 들어오면 생성된다. 트랜잭션은 @Transactional이 붙었을 때 실행된다. 즉, 영속성 컨텍스트와 트랜잭션의 라이프 사이클이 다르다는 것이다. 상세 동작은 다음과 같다. 클라이언트의 요청이 들어오면 서블릿 필터나, 스프링 인터셉터에서 영속성 컨텍스를 생성한다. 이 때 트랜잭션은 시작하지 않는다. 서비스 계층에서 @Transactional로 트랜잭션을 시작할 때 1번에서 미리 생성해둔 영속성 컨텍스트를 찾아와서 트랜잭션을..
이 글은 인프런의 김영한님의 강의를 듣고 복습하며 정리한 글입니다. 연관관계 복잡한 테이블 API 제작 JPA : JPA를 활용한 회원 관련 API 개발은 간단한 API 개발이었다. 왜냐하면 Member와 관련된 API를 만들기는 했으나, 단순하게 회원 저장했을 때 만들어지는 PK값, 그리고 회원의 이름 정도였기 때문이다. 또한, 회원 조회와 관련된 API는 회원 내부적으로 주문 정보를 가지고 있지 않았기 때문에 null로 표시되었기 때문이다. 이번에는 조금 다르다. 주문은 회원, 배송, 주문_아이템과 연관관계를 가지고 있다. 따라서 회원 API를 개발하는 것보다 복잡하다. 이런 저런 문제가 발생할 수 있다. 하나하나 알아보려고 한다. 알아두기 : Hibernate5Module @Bean Hibernat..
JPA가 DTO로 직접 접근 기본적으로 DTO로 직접 접근하기 위해서는 new 연산자를 사용해 DTO를 만들어서 반환해줘야한다. 따라서 반환 타입을 Dto.class로 하고, new 연산자로 DTO를 만들어주면 된다. 약간 뜬구름 잡는 거 같은데, 좀 더 상세하게 알아보자. 첫번째 방법, Root Alias를 넘기기 → 실패 public List findOrderDtos() { return em.createQuery("select new hellojpa.jpa.repository.order.simplequery.SimpleQueryDto(o)" + " from Order o" + " join o.member m" + " join o.delivery d", SimpleQueryDto.class) .getR..
이 포스팅은 인프런 김영한님의 JPA 강의를 듣고 복습하며 정리한 내용입니다. API 개발 어느 순간 앱을 개발해야 할 시점이 왔다고 가정하자. 이 시점에서는 기존에 웹을 개발하던 것처럼 View Template을 반환하는 것이 아닌 API 형식으로 데이터를 주고 받아야한다. 어플리케이션은 API 데이터를 받아, 클라이언트에서 필요한 것들을 구현해주기 때문이다. API 개발을 할 때 주의해야 할 사항 1. 엔티티를 파라메터로 받지 마라. 엔티티는 해당 API 뿐만 아니라 정말 다양한 곳에서 사용될 수 있다. 예를 들어 엔티티의 name이 userName으로 바뀌었다고 가정해보자. 이럴 경우, 어느 순간 특정 API 컨트롤러가 고장이 나는 경우가 발생할 수 있다. 따라서 DTO(Data Transfer O..