본문 바로가기

JPA9

[JPA] 엔티티 설계시 주의사항 본 내용은 김영한님의 실전 스프링 부트 JPA 활용 강의를 수강하며 정리한 내용입니다. 가급적 Setter를 지양해라 Setter가 모두 열려있으면, 변경 포인트가 너무 많아져서 유지 보수가 어렵다. 모든 연관관계는 지연로딩(LAZY)으로 설정해라(중요) 즉시로딩(Eager)의 경우 N+1 문제가 발생 할 수 있다. 어떤 SQL이 실행될지 추적하기 어렵다. 실무에서 모든 연관관계는 지연로딩(LAZY)로 설정해야 한다. 함께 조회해서 가져오고 싶은 경우 fetch join 또는 엔티티 그래프 기능을 사용해야한다. xxxToOne어노테이션은 기본값이 Eager이기 때문에 LAZY로 바꿔줘야한다. 컬렉션은 필드에서 초기화 하자. 필드에서 바로 초기화 하는것이 안전하다. null에 대해 안전하다. 하이버네이트에.. 2020. 4. 30.
[JPA] auto-increment 테스트 실패 원인 및 해결 기존에 각각 메소드 단위로 단위 테스트를 마치고 PR을 하여 Merge 되었던 소스가 있었다. 근데 이거 전체로 돌리니까 ID 값이 삭제가 안되었는데 ?? 응??? 다음날 바로 전체 테스트 케이스를 돌려보았더니 테스트가 깨졌다. 뭐지 merge..? 원인 분석 @After 어노테이션을 사용해 각 메소드를 테스트 할 때 마다 usersRepository.deleteAll() 하도록 설정을 해놓은 상태였다. delete 쿼리는 매 테스트 마다 잘 수행이 되었지만, 우리의 auto-increment Id님 께서는 1,2,3 순차적으로 증가를 하고계셨다. ㅎㅎ 이동욱님 블로그에서도 비슷한 사례로 Entity의 Id 칼럼의 GeneratedValue 전략을 GenerationType.IDENTITY 로 지정해 해.. 2020. 3. 3.
[JPA] Entity의 LifeCycle 백기선님의 Spring Data JPA 강좌를 참고하여 정리한 내용입니다. Entity의 상태 Entity의 상태에는 크게 4가지가 있다. Transient Persistent Detached Removed 각각의 상태 변화에 대해 알아보자 Transient : JPA가 모르는 상태 (단순 객체 생성) Account account = new Account(); account.setUsername("seokhun"); account.setTitle("JPA"); Persistent : JPA가 관리중인 상태 (1차 캐시, Dirty Checking, Write Behind) Session session = entityManager.unwrap(Session.class); session.save(accoun.. 2020. 3. 3.