본문 바로가기

DevelopmentTools/jpa5

[JPA] deleteAll과 deleteAllInBatch의 차이 UserController.java @DeleteMapping("/carts") @ResponseStatus(NO_CONTENT) public KurlyResponse removeProduct( @AuthenticationPrincipal User user, @RequestBody RemoveCart.Request removeProductList ) { userService.removeProductList(removeProductList, user.getId()); return KurlyResponse.noData(); } UserService.java @Transactional public void removeProductList(RemoveCart.Request removeProductList, Lo.. 2023. 10. 19.
[JPA] JPA가 기본 생성자가 필요한 이유 (feat. final) 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. 1️⃣ JPA에서 기본 생성자를 필요로 하는 이유 JPA에서 Entity는 반드시 public 또는 protected인 기본 생성자를 가져야 한다 이것이 가능한 이유는 JPA가 자바에서 제공하는 리플렉션 API를 활용하여 동적으로 객체를 생성하기 때문이다 만약, 기본 생성자가 없거나 private인 경우 리플렉션 API는 객체를 생성할 수 없게된다. 리플렉션 API란 구체적인 클래스 타입을 몰라도 클래스 이름으로 메서드, 타입, 변수등 클래스의 모든 정보에 접근할 수 있도록 해주는 API이다. 리플렉션을 활용하여 런타임 시점에 동적으로 클래스 객체를 생성할 수 있는데 이때 객체를 생성하기 .. 2023. 10. 12.
[JPA] CASCADE.ALL로 인한 버그 발생 및 해결법 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. 문제 상황 상품에 대한 review를 작성하는 api 기능 테스트를 진행하던 와중이었다. (/products/review, 사진의 서비스 메서드 호출) 아래와 같은 에러가 발생하였고 이를 해결했던 과정을 기록하고자 한다. 2023-09-21T17:55:12.524+09:00 WARN 81332 --- [nio-8080-exec-7] c.d.k.g.e.GlobalExceptionHandler : UnexpectedException Occurs : detached entity passed to persist: com.devcourse.kurlymurly.module.user.domain.Use.. 2023. 9. 25.
[JPA] N+1 문제 해결을 위한 Fetch Join 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. 🩶 N+1 문제란? 최대한 연관관계가 없이 Long타입으로 id만 받아서 프로젝트를 진행하던 와중..! 결국 review와 product, user의 연관 관계가 필요한 상황이 발생하게 되었다. 그래서 N:1 연관 관계를 맺었는데..! 연관 관계를 맺는 동시에 N+1문제가 발생하였다 N+1문제란, 1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것이다. 원치않는 쿼리가 실행된다면 시스템의 성능이 저하될 수 있다. Q. Lazy(지연로딩)옵션을 걸어줘서 괜찮은 거 아닌가요? A. 하위 엔티티로 작업을 하게 되면 추가적인 조회가 어차피 발생하기 때문에 결국 N+1문제가.. 2023. 9. 21.
[jpa] hibernate 자동 생성되는 sql 확인하기 jpa: properties: hibernate: show_sql: true format_sql: true show_sql: hibernate가 만들어내는 sql문을 출력 format_ sql: 출력되는 sql문을 예쁘게 출력하기 위한 속성 초기 데이터로 스키마 적용하는 방법 sql: init: mode: always # always, never, embedded sql-init-mode: 을 설정해주면 각각 root class path 위치의 schema.sql 과 data.sql에서 SQL을 로드한다. default로 SQL database initialization은 embedded in-memory database를 사용할 때만 수행된다. 유형에 관계 없이 SQL database를 항상 초기화하려.. 2023. 9. 4.