월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@BatchSize의 조회 대상 우선순위(?)
[질문 내용]안녕하세요 강의 너무 잘 듣고 있습니다.@BatchSize에 관해서 의문점이 생겨서 질문을 드리게 되었습니다. @BatchSize를 사용하면 특정 Entity에서 조회 쿼리가 필요한 필드를 초기화 할 때, 1차 캐시로부터 같은 종류의 Entity id값을 @BatchSize에 지정한 size값만큼 가져와 IN에 넣어서 필요한 데이터를 함께 조회하고 초기화하는 것으로 이해했습니다.근데, 이 때 단순히 1차 캐시에서 랜덤으로 id값을 가져와서 IN에 넣으면 원하지 않는 Entity에 초기화가 잘못 이뤄질 수 있지 않을까 하는 의문이 있었지만, 당연하게도 이런 부분에 대해서는 알아서 최적화를 해 둔 것 같았습니다. 예를 들면 JPQL의 결과로 조회된 Entity컬렉션 내부에서 하나를 집어 Entity 필드를 지연 로딩 초기화할 경우 같은 컬렉션 내부의 Entity들이 우선순위를 갖고 함께 초기화되는 것 같았습니다.하지만 이것이 정확히 어떤 원리로 동작하는 지는 알 수가 없었습니다..ㅠㅠ JPQL로 조회한 컬렉션에 대해서 따로 영속성 컨텍스트가 참조하고 있다거나 하는 식으로 동작하는 것일까요? 이런 원리를 모르다 보니 @BatchSize가 IN에 넣을 Entity를 결정하는 우선순위를 알 수가 없었습니다.@BatchSize의 size값이 JPQL로 조회한 컬렉션의 size보다 클 때에는 1차 캐시에서 부족한 만큼의 Entity id를 더 끌어와서 IN에 추가하는데, 이 때 함께 초기화될 Entity가 어떤 Entity일 지 예측이 안 됩니다. 이런 것들도 우선순위가 따로 존재하나요? 크게 중요한 내용은 아닌 것 같은데, 그냥 같은 컬렉션에 있는 Entity들이 IN의 우선순위가 된다고 이해하고 사용하는 정도면 문제가 없을 지 궁금합니다..!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
FetchType.Lazy
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의에서 orderItems=order.getOrderItems(); 이부분에서 orderItems가 왜 값이 비어있는지 궁금합니다.Lazy타입은 호출 시 쿼리가 나간다고 들었는데 그러면 쿼리가 나간 후 OrderItem에 있는 Lazy타입인 값들을 제외하고는 다른것들은 값이 나와야하는거 아닌가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
identity 전략
이게 가끔씩 jpa 아이디 자동 생성 전략을 사용하다 보면ddl-auto를 update로 해논 상태에서 기본키를 자동 생성해서 집어넣다보면가끔씩 저렇게 아이디가 훌쩍 뛰어버리더라고요 2에서 33으로 또 다시 하면 괜찮을 때도 많고 이게 단순히 로컬환경에서 발생할 수 있는 에러인지 궁금합니다.저도 가끔씩 여러 상황에서 저렇게 되는 거라 추가적인 코드는 없는 점 죄송합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
포폴 데이터모델링, jpa설계하다가 질문 !!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요?? 김영한님 JPA강의 덕에 포폴 순항하고 있습니다. 항상 좋은 강의 감사한 마음을 가지고 있습니다. 파이팅하세요 !!궁금한점을.... 간단하게 설명하려고 노력하겠습니다 !!예를들어서 블로그 포스팅 domain을 아래와 같이 만들었습니다...id: ~~~~content: ~~~~tags: ~~~ (일대다 관계)comments: ~~~(일대다 관계)그런데 !!! 여기서 궁금한점 !!제 생각으로는...아 그냥 편하게 포스팅한번에 끌고와서(tags, comments) 응답해주고 싶은뎅...그런데 영한님께서는 이 강의에서 일대다 관계를 두번이상하면 안된다고 하셔서...ㄷㄷ;;;;그래서, 오랜 고민끝에 포스팅 (id,content,tags)를 응답해주고 comments는 다대일 방법으로 응답을 해줬거든요??.... (이게 옳은방법일까...ㄷㄷ;;)그러니까 요청을 두번 보내는거에요..포스팅 한번... 포스팅에 연관관계있는 comments 한번..저의 이러한 판단과 설계과 괜찮은 걸까요??질문드리고 싶습니다 !! (잘 이해하셨을라나...ㄷㄷ;ㅠㅠ)
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
V4 에서 DTO로 조회시 즉시 로딩이 되는 건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]V4 에서는 fetch join을 사용하지 않으셨는데 조회 쿼리는 한번만 나가는 것을 확인했습니다. dto로 조회를 하면 Lazy로딩으로 세팅해도 즉시 로딩으로 나간다고 이해하면 될까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
default_batch_fetch_size, @BatchSize 가 동작하지 않습니다.
강의 내용 중 N+1, 페이징 등의 복합적인 문제를 해결하기 위해 BatchSize 기능을 이용하는데 해당 기능이 동작하질 않아 질문을 드립니다. 스프링부트 설정 파일에 설정한 값은 아래와 같습니다.# application.yml spring: jpa: hibernate: ddl-auto: create properties: hibernate: default_batch_fetch_size: 30 jdbc: batch_size: 100 강의 예시대로라면 아래와 같이 orderItem을 조회할 때에 IN 조건이 발생되어 총 두 번의 쿼리가 나가야 하지만, 실제로는 IN 조건이 생성되지 않고 BatchSize 설정 전과 같이 여전히 N+1 문제가 해결되지 않는 모습입니다.2022-11-15 05:11:32.146 INFO 19268 --- [io-49445-exec-5] p6spy : 2022-11-15T05:11:32.146352400 / time:0ms / select order0_.order_id as order_id1_10_0_, member1_.member_id as member_i1_6_1_, delivery2_.delivery_id as delivery1_4_2_, order0_.delivery_id as delivery4_10_0_, order0_.member_id as member_i5_10_0_, order0_.order_date as order_da2_10_0_, order0_.status as status3_10_0_, member1_.add_time as add_time2_6_1_, member1_.city as city3_6_1_, member1_.street as street4_6_1_, member1_.zipcode as zipcode5_6_1_, member1_.description as descript6_6_1_, member1_.name as name7_6_1_, delivery2_.city as city2_4_2_, delivery2_.street as street3_4_2_, delivery2_.zipcode as zipcode4_4_2_ from orders order0_ inner join member member1_ on order0_.member_id=member1_.member_id inner join delivery delivery2_ on order0_.delivery_id=delivery2_.delivery_id limit 50 offset 1 2022-11-15 05:11:32.147 INFO 19268 --- [io-49445-exec-5] p6spy : 2022-11-15T05:11:32.147842300 / time:0ms / select orderitems0_.order_id as order_id5_9_1_, orderitems0_.order_item_id as order_it1_9_1_, orderitems0_.order_item_id as order_it1_9_0_, orderitems0_.count as count2_9_0_, orderitems0_.item_id as item_id4_9_0_, orderitems0_.order_id as order_id5_9_0_, orderitems0_.order_price as order_pr3_9_0_ from order_item orderitems0_ where orderitems0_.order_id=11 2022-11-15 05:11:32.148 INFO 19268 --- [io-49445-exec-5] p6spy : 2022-11-15T05:11:32.148833600 / time:0ms / select item0_.item_id as item_id2_5_0_, item0_.name as name3_5_0_, item0_.price as price4_5_0_, item0_.stock_quantity as stock_qu5_5_0_, item0_1_.author as author1_0_0_, item0_1_.isbn as isbn2_0_0_, item0_2_.actor as actor1_7_0_, item0_2_.director as director2_7_0_, item0_3_.artist as artist1_8_0_, item0_3_.etc as etc2_8_0_, item0_.dtype as dtype1_5_0_ from item item0_ left outer join book item0_1_ on item0_.item_id=item0_1_.item_id left outer join movie item0_2_ on item0_.item_id=item0_2_.item_id left outer join music item0_3_ on item0_.item_id=item0_3_.item_id where item0_.item_id=9 2022-11-15 05:11:32.149 INFO 19268 --- [io-49445-exec-5] p6spy : 2022-11-15T05:11:32.149825900 / time:0ms / select item0_.item_id as item_id2_5_0_, item0_.name as name3_5_0_, item0_.price as price4_5_0_, item0_.stock_quantity as stock_qu5_5_0_, item0_1_.author as author1_0_0_, item0_1_.isbn as isbn2_0_0_, item0_2_.actor as actor1_7_0_, item0_2_.director as director2_7_0_, item0_3_.artist as artist1_8_0_, item0_3_.etc as etc2_8_0_, item0_.dtype as dtype1_5_0_ from item item0_ left outer join book item0_1_ on item0_.item_id=item0_1_.item_id left outer join movie item0_2_ on item0_.item_id=item0_2_.item_id left outer join music item0_3_ on item0_.item_id=item0_3_.item_id where item0_.item_id=10 엔티티 클래스의 컬렉션 필드에 @BatchSize를 직접 입력해보았지만 결과는 같았습니다. 커뮤니티 질문 중 @Transactional 설정으로 인한 flush 발생 여부에 따라 동작이 상이할 수 있다는 내용을 보고 @Transactional(readonly = true) 설정도 해보았지만 결과는 같았습니다. 전체 프로그램 소스코드 다운로드) https://drive.google.com/file/d/1Q0XQFEBGpAVi0xYhEZgr8qME4rebI39q/view?usp=share_link
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 JPA 조회에서 Lock관련 질문 드립니다.
H2 혹은 Mysql DB를 기준으로(Mysql의 기본 트랜잭션 격리 레벨일때) 트랜잭션이 걸린 메서드 에서 JPA에서 제공하는 findById()메서드를 통해 엔티티를 조회한다면, 별도의 락 모드를 걸지 않아도 조회시 S Lock은 걸리지 않나요? 동시성 문제를 해결하다 질문 납겨봅니다.또 한 트랜잭션 내 에서 조회 이후 update쿼리를 발생 시키면 SLock을 걸고 조회 -> XLock을 걸고 update이렇게 발생되는걸까요...?답변 주시면 감사하겠습니다. (__)
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬렉션타입이라는게...정확히 뭔가요?
컬렉션타입이 었었다 라고 하시는데혹시 컬렉션타입이라는게 @Embeded 와 관련되어 Address 이런 클래스를 일컫는말인가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원 수정 API만들떄 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]수업중에 수정관련 API는 변경 감지를 통한 변경이라고 설명을 해주셨고 Entity는 getter외 나머지는 잘 쓰지 않는다는 말씀을 해주셨습니다. 수업중에는 setter를 통한 변경을 하였는데 실무에서는 어떤 방식으로 하는지 궁금해서 질문 올립니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
엔티티의 필드가 많을 때 업데이트 방법?
API 개발 기본 - 회원 수정 API해당 강의 시리즈를 들으며 전 강의부터 생겼던 궁금한 사항에 대해 질문을 드립니다. 예제의 경우는 최대한 간단하게 간소화시킨 엔티티를 예시로 들었지만, 필드가 많은 엔티티의 경우에는 어떤 방식으로 업데이트를 하는지 감이 잡히질 않네요. // java @RequestMapping(value = "/v1/edit/{memberId}", method = RequestMethod.PUT) public EditMemberResponse editMemberV1(@PathVariable Long memberId, @RequestBody @Valid EditMemberRequest request) { memberService.update(memberId, request.getName()); ... return new EditMemberResponse(member); }강의 내용 중 위와 같이 업데이트 파라미터에 DTO 필드를 받아 업데이트 하도록 서비스를 작성하셨는데, 단순히 이름만 있는 엔티티 클래스가 아닌 필드가 굉장히 많은 엔티티의 경우에는 어떤식으로 업데이트 처리하는 것이 효율적일지 궁금해서 질문을 드립니다. @Entity public class Temp { @Id @GeneratedValue private Long id; private String field01; private String field02; // ...무수히 많은 필드들 private String field66; private String field67; } 예를들어, 위와 같은 Temp 클래스의 경우를 업데이트 하기 위해 앞서 설명한 방식으로 업데이트 기능을 서비스계층에 구현한다면 아래와 같이 실질적으로 사용이 불가능할정도로 가독성과 생산성이 떨어졌습니다.// java tempService.update( editTempRequest.getField01(), editTempRequest.getField02(), editTempRequest.getField03(), editTempRequest.getField04(), ..., editTempRequest.getField67() ); 아래와 같이 서비스 계층에 EditTempRequest DTO 계층 클래스를 직접 넘기는 방법도 생각을 해보았습니다만, 서비스 계층에서 DTO 클래스를 이용하기 위해 컨트롤러 계층에서 이너 클래스로 선언된 DTO를 별도의 public 클래스로 선언해주어야 되므로 별도의 자바 파일과 패키지를 구성하게 되어 불필요한 복잡도가 증가하는 문제가 발생했습니다. 또한, 단순히 요청, 응답을 위해 데이터를 담는 목적으로 사용되어야 하는 DTO 클래스의 역할과 책임이 확장되는 문제도 생겼습니다.// java import com.wahhahaha.controller.dto.editTempRequest; ... tempService.update( editTempRequest ); 클라이언트 측에서 수정 API를 호출하기 전에 조회 API를 우선 호출하여 각 필드 정보를 가진 상태로 전체 필드를 이용한다면 merge 업데이트로 쉽게 해결이 가능하겠다라는 생각을 해보긴 했지만 merge는 가급적 이용하지 않는 편이 좋다는 전 강의 내용이 있어 혼란스럽네요.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
fetch join 쿼리에서 limit와 offset
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요 영한님 지금 페이징 한계 돌파 강의를 듣기 전이고,강의자료를 보니 예상과 좀? 비슷하게 limit와 offset를 받아서 처리하는 방식인데혹시 distinct처럼 order by에 프론트엔드에서 쏴주는 인자를 받아 offset, limit 쿼리를 직접 사용하여 db에 쿼리 동작이 이뤄지는 방식은 사용이 안될까요?안된다면 효율성이나 동작 원리에 대해 궁금합니다...!
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원등록api 강의에서 @Data의 의미와 쓰는이유는 뭔가요?
[질문 내용]회원등록api 강의에서 @Data의 의미와 쓰는이유는 뭔가요?그 클래스를 따로 만들지 않고 memberController안에다가 이너 클래스로 만들어서 저렇게 하시는 이유가 뭘까요 ?ㅠㅠ저라면 dto 클래스를 컨트롤러 외부에 만들어서 했을거 같은데.... 그 의미를 이해하고싶습니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
프록시 객체 getReferenceById() 에 관하여
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]선생님 언제나 좋은 강의 올려주셔서 감사합니다.JPA 강의를 전부 듣고 실무에 적용을 하려는 데 궁금한게 몇가지 있어서 문의 드립니다.entity를 저장할 때 fk로 전달받은 값을 저장하기 위해 fk로 findById()를 날려 entity를 가져온 뒤 그 객체를 저장하려는 객체에 넣어주고 save를 했습니다.필요한 값은 fk 하나고 이 fk 하나를 저장하기 위해 select쿼리가 날아가는게저는 성능에 좋아보이지 않아 getReferenceById() 에 fk 를 넣고 프록시 객체를 넣어서 저장하니 정상적으로 값이 들어가는 것을 보았습니다. 쿼리도 불필요한 select 쿼리가 나가지도 않고요실제로 이렇게 사용해도 괜찮을까요?코드 첨부 합니다.전달하는 dto 입니다.public class ReservationDto { private Long restaurantId; private String reservationDate; private String reservationStatus; } service 코드 입니다.Restaurant restaurant = restaurantRepository.findById(reservationDto.getRestaurantId()) .orElseGet(() -> Restaurant.builder().restaurantId(-1L).build());위에서 나온 entity를 가지고 값을 저장합니다.if (restaurant.getRestaurantId() == -1L) { return -1L; } else { Reservation savedReservation = reservationRepository.save( Reservation.builder() .restaurantReservation(restaurant) .reservationDate(reservationDto.getReservationDate()) .reservationStatus(reservationDto.getReservationStatus()) .build() );reservation entity 입니다.public class Reservation { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="reservation_id") private Long reservationId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "restaurant_id") private Restaurant restaurantReservation; private String reservationDate; private String reservationStatus; } 어차피 fk 를 클라이언트 측에서 dto 로 전달을 해주는데 findById()의 이점은 orElseGet을 통해 null 값일 경우 처리를 편리하게 해줄 수 있다는게 저는 장점으로 보입니다.하지만 그것을 제외 한다면Restaurant restaurant = restaurantRepository.getReferenceById(reservationDto.getRestaurantId());이렇게 프록시 객체를 가져와 fk만 저장하는 것이 select 쿼리가 날아가지 않아 성능의 이점이 보이는데 이렇게 사용해도 상관이 없을까요??
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
bean 생성 에러입니다
안녕하세요 수업 항상 잘 듣구 있습니다.다름이 아니라,강사님과 코드가 동일한데 이런 문제가 계속 발생해서 문의드려요ㅠㅠ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
findById의 최적화
findByAll처럼 컬렉션을 반환하는 쿼리는 fetchJoin을 사용하면 된다고 배웠습니다.그러면 findById처럼 하나의 객체를 가져올 때는 최저화가 어떻게 하는 지 궁금합니다.하나의 객체를 가져와도 lazy로딩이 되어있음으로 프록시 객체가 들어있어서findById로 가져온 객체가 다른 곳에서 사용될 시에 계속 쿼리가 날라가는데 이 부분도 최적화가 가능한지 궁금합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강사님 스프링 데이터 JPA에 대해 질문있습니다.
안녕하세요 강사님 항상 강의 잘 보고 복습하고 있습니다.다름이 아니고 책 463p중에 find() VS JPQL이라는 목차가 있습니다.그리고 이번 회차에서 설명하진 스프링 데이터 JPA를 듣고, 궁금한점이 생겨서 질문드립니다.책 545p중 '스프링 데이터 JPA는 메소드이름을 분석해서 JPQL 생성하고 실행한다' 라고 하셨으니 그럼 JpaRepository를 상속받은 Repository에 만든 모든 메소드는 먼저 영속성컨텍스트를 확인하지 않고 DB의 sql를 보낸 뒤 결과값을 영속성컨텍스트에 존재하는지 비교하는게 맞나요?스프링데이터 JPA의 사용을 적극 권장한다는 문구도 책에 있어서, 그렇다면 강사님은 따로 em을 필드선언후 find하는 경우는 없으신가요? 있다면 em하고 Repository도 동시에 필드생성해서 사용하는 상황은 어떤경우일까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
변경 감지가 일어나는 시점에 대하여 궁금한 점이 있습니다.
안녕하세요, 언제나 질 좋은 강의 잘 듣고 있습니다. JPA 영속성 컨텍스트에서 변경 감지가 일어나는 시점에 대해서 궁금한 점이 있습니다.영한님께서 강의 10분 45초 즈음에, "트랜잭션이 커밋되는 시점에 JPA가 변경 감지를 실행한다." 라고 언급을 해주셨습니다. 제가 의문이 드는 지점은,영속성 컨텍스트 안에서의 변경 감지영속성 컨텍스트 flush트랜잭션 커밋이 3개가 발생하는 시점입니다. flush가 발생하면, 영속성 컨텍스트의 쓰기 지연 sql 저장소의 쿼리문들이 비워지고, db에 전송된다. 이 때 1차 캐시는 비워지지 않고, 트랜잭션이 커밋되는 시점에서 db에 전송된 쿼리문들이 커밋됨과 동시에 1차 캐시의 스냅샷과 현재 엔티티 상태와의 변경 감지가 일어난다. ---> 이것이 현재 제가 기본적으로 알고 있는 지식입니다. 제 질문은 다음과 같습니다.그런데, 변경 감지라는 것이 결국 update 쿼리문을 날리기 위함인데, 저는 flush 이전에 변경 감지가 발생하여 쓰기 지연 sql 저장소에 update 쿼리문이 저장되는 것이 순서에 맞지 않나? 라는 생각이 듭니다.또한 커밋되는 순간 변경 감지가 일어난다면, 트랜잭션 종료 바로 직전에 update 쿼리문이 날라가는 것이 맞을까요? 즉, (커밋으로 인한 flush가 아닌) 임의의 flush 호출 상황에서는 변경 감지로 인한 쿼리문이 전송되지 않는 것인가요? 질문 이외에도, 제 이해에 틀린 점이 있다면 알려주시면 감사하겠습니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
setFirstResult 와 setMaxResults 적용 안되는 문제
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]orderRepository 파일의 findAllWithItem 함수를 통해 데이터를 불러 올때 setFirstResult 과 setMaxResults 를 통해 페이징을 하기로 코드에 설정하였습니다.하지만 실제로 api(/api/v3.1/orders?offset=1&limit=10)를 호출해보면 jpa를 통해 만들어지는 쿼리에 offset 및 limit 이 적용되지 않고 날라갑니다. 어떤 문제가 있는지 찾아보았으나 찾지 못하여 질문 올립니다.OrderRepository.javapackage jpabook.jpashop.repository; import jpabook.jpashop.api.OrderSimpleApiController; import jpabook.jpashop.domain.Order; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import java.util.List; @Repository @RequiredArgsConstructor public class OrderRepository { private final EntityManager em; public void save(Order order) { em.persist(order); } public Order findOne(Long id) { return em.find(Order.class, id); } public List<Order> findAll(OrderSearch orderSearch) { return em.createQuery("select o from Order o join o.member m" + " where o.status = :status" + " and m.name like :name", Order.class) .setParameter("status", orderSearch.getOrderStatus()) .setParameter("name", orderSearch.getMemberName()) .setFirstResult(0) .setMaxResults(1000) .getResultList(); } public List<Order> findAllWithMemberDelivery() { return em.createQuery( "select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d", Order.class ).getResultList(); } public List<Order> findAllWithItem() { return em.createQuery( "select distinct o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi" + " join fetch oi.item i", Order.class ).getResultList(); } public List<Order> findAllWithItem(int offset, int limit) { return em.createQuery( "select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d", Order.class) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); } } OrderApiController.javapackage jpabook.jpashop.api; import ch.qos.logback.classic.sift.AppenderFactoryUsingJoran; import jpabook.jpashop.domain.Address; import jpabook.jpashop.domain.Order; import jpabook.jpashop.domain.OrderItem; import jpabook.jpashop.domain.OrderStatus; import jpabook.jpashop.repository.OrderRepository; import jpabook.jpashop.repository.OrderSearch; import lombok.Data; import lombok.RequiredArgsConstructor; import org.hibernate.cache.spi.support.AbstractCachedDomainDataAccess; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; @RestController @RequiredArgsConstructor public class OrderApiController { private final OrderRepository orderRepository; @GetMapping("/api/v1/orders") public List<Order> ordersv1() { List<Order> all = orderRepository.findAll(new OrderSearch()); for (Order order : all) { order.getMember().getName(); order.getDelivery().getAddress(); List<OrderItem> orderItems = order.getOrderItems(); orderItems.stream().forEach(o-> o.getItem().getName()); } return all; } @GetMapping("/api/v2/orders") public List<OrderDto> ordersv2() { List<Order> orders = orderRepository.findAll(new OrderSearch()); List<OrderDto> result = orders.stream() .map(o -> new OrderDto(o)) .collect(Collectors.toList()); return result; } @GetMapping("/api/v3/orders") public List<OrderDto> ordersV3( @RequestParam(value = "offset", defaultValue = "0") int offset, @RequestParam(value = "limit", defaultValue = "100") int limit ) { List<Order> orders=orderRepository.findAllWithItem(offset, limit ); List<OrderDto> result = orders.stream() .map(o -> new OrderDto(o)) .collect(Collectors.toList()); return result; } @GetMapping("/api/v3.1/orders") public List<OrderDto> ordersV3_page() { List<Order> orders=orderRepository.findAllWithMemberDelivery(); List<OrderDto> result = orders.stream() .map(o -> new OrderDto(o)) .collect(Collectors.toList()); return result; } @Data static class OrderDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; private List<OrderItemDto> orderItems; public OrderDto(Order order) { orderId =order.getId(); name= order.getMember().getName(); orderDate = order.getOrderDate(); orderStatus = order.getStatus(); address=order.getDelivery().getAddress(); orderItems=order.getOrderItems().stream().map(orderItem -> new OrderItemDto(orderItem)).collect(Collectors.toList()); } } @Data static class OrderItemDto { private String itemName; private int orderPrice; private int count; public OrderItemDto(OrderItem orderItem) { itemName = orderItem.getItem().getName(); orderPrice=orderItem.getOrderPrice(); count=orderItem.getCount(); } } } api 호출시 터미널에 뜨는 메시지 select order0_.order_id as order_id1_6_0_, member1_.member_id as member_i1_4_1_, delivery2_.delivery_id as delivery1_2_2_, order0_.delivery_id as delivery4_6_0_, order0_.member_id as member_i5_6_0_, order0_.order_date as order_da2_6_0_, order0_.status as status3_6_0_, member1_.city as city2_4_1_, member1_.street as street3_4_1_, member1_.zipcode as zipcode4_4_1_, member1_.name as name5_4_1_, delivery2_.city as city2_2_2_, delivery2_.street as street3_2_2_, delivery2_.zipcode as zipcode4_2_2_, delivery2_.status as status5_2_2_ from orders order0_ inner join member member1_ on order0_.member_id=member1_.member_id inner join delivery delivery2_ on order0_.delivery_id=delivery2_.delivery_id Hibernate: select order0_.order_id as order_id1_6_0_, member1_.member_id as member_i1_4_1_, delivery2_.delivery_id as delivery1_2_2_, order0_.delivery_id as delivery4_6_0_, order0_.member_id as member_i5_6_0_, order0_.order_date as order_da2_6_0_, order0_.status as status3_6_0_, member1_.city as city2_4_1_, member1_.street as street3_4_1_, member1_.zipcode as zipcode4_4_1_, member1_.name as name5_4_1_, delivery2_.city as city2_2_2_, delivery2_.street as street3_2_2_, delivery2_.zipcode as zipcode4_2_2_, delivery2_.status as status5_2_2_ from orders order0_ inner join member member1_ on order0_.member_id=member1_.member_id inner join delivery delivery2_ on order0_.delivery_id=delivery2_.delivery_id 2022-11-02 16:18:50.294 INFO 31332 --- [nio-8080-exec-1] p6spy : #1667373530294 | took 0ms | statement | connection 6| url jdbc:h2:tcp://localhost/~/jpashop select order0_.order_id as order_id1_6_0_, member1_.member_id as member_i1_4_1_, delivery2_.delivery_id as delivery1_2_2_, order0_.delivery_id as delivery4_6_0_, order0_.member_id as member_i5_6_0_, order0_.order_date as order_da2_6_0_, order0_.status as status3_6_0_, member1_.city as city2_4_1_, member1_.street as street3_4_1_, member1_.zipcode as zipcode4_4_1_, member1_.name as name5_4_1_, delivery2_.city as city2_2_2_, delivery2_.street as street3_2_2_, delivery2_.zipcode as zipcode4_2_2_, delivery2_.status as status5_2_2_ from orders order0_ inner join member member1_ on order0_.member_id=member1_.member_id inner join delivery delivery2_ on order0_.delivery_id=delivery2_.delivery_id select order0_.order_id as order_id1_6_0_, member1_.member_id as member_i1_4_1_, delivery2_.delivery_id as delivery1_2_2_, order0_.delivery_id as delivery4_6_0_, order0_.member_id as member_i5_6_0_, order0_.order_date as order_da2_6_0_, order0_.status as status3_6_0_, member1_.city as city2_4_1_, member1_.street as street3_4_1_, member1_.zipcode as zipcode4_4_1_, member1_.name as name5_4_1_, delivery2_.city as city2_2_2_, delivery2_.street as street3_2_2_, delivery2_.zipcode as zipcode4_2_2_, delivery2_.status as status5_2_2_ from orders order0_ inner join member member1_ on order0_.member_id=member1_.member_id inner join delivery delivery2_ on order0_.delivery_id=delivery2_.delivery_id; 2022-11-02 16:18:50.296 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_id1_6_0_] : [BIGINT]) - [4] 2022-11-02 16:18:50.296 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([member_i1_4_1_] : [BIGINT]) - [1] 2022-11-02 16:18:50.297 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([delivery1_2_2_] : [BIGINT]) - [5] 2022-11-02 16:18:50.298 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([delivery4_6_0_] : [BIGINT]) - [5] 2022-11-02 16:18:50.298 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([member_i5_6_0_] : [BIGINT]) - [1] 2022-11-02 16:18:50.299 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_da2_6_0_] : [TIMESTAMP]) - [2022-11-02T16:18:45.107619] 2022-11-02 16:18:50.299 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([status3_6_0_] : [VARCHAR]) - [ORDER] 2022-11-02 16:18:50.299 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([city2_4_1_] : [VARCHAR]) - [seoul] 2022-11-02 16:18:50.299 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([street3_4_1_] : [VARCHAR]) - [1] 2022-11-02 16:18:50.299 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([zipcode4_4_1_] : [VARCHAR]) - [111] 2022-11-02 16:18:50.299 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name5_4_1_] : [VARCHAR]) - [userA] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([city2_2_2_] : [VARCHAR]) - [seoul] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([street3_2_2_] : [VARCHAR]) - [1] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([zipcode4_2_2_] : [VARCHAR]) - [111] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([status5_2_2_] : [VARCHAR]) - [null] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_id1_6_0_] : [BIGINT]) - [11] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([member_i1_4_1_] : [BIGINT]) - [8] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([delivery1_2_2_] : [BIGINT]) - [12] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([delivery4_6_0_] : [BIGINT]) - [12] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([member_i5_6_0_] : [BIGINT]) - [8] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_da2_6_0_] : [TIMESTAMP]) - [2022-11-02T16:18:45.142303] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([status3_6_0_] : [VARCHAR]) - [ORDER] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([city2_4_1_] : [VARCHAR]) - [tokyo] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([street3_4_1_] : [VARCHAR]) - [1] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([zipcode4_4_1_] : [VARCHAR]) - [111] 2022-11-02 16:18:50.300 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name5_4_1_] : [VARCHAR]) - [userB] 2022-11-02 16:18:50.301 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([city2_2_2_] : [VARCHAR]) - [tokyo] 2022-11-02 16:18:50.301 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([street3_2_2_] : [VARCHAR]) - [1] 2022-11-02 16:18:50.301 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([zipcode4_2_2_] : [VARCHAR]) - [111] 2022-11-02 16:18:50.301 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([status5_2_2_] : [VARCHAR]) - [null] 2022-11-02 16:18:50.306 TRACE 31332 --- [nio-8080-exec-1] org.hibernate.type.CollectionType : Created collection wrapper: [jpabook.jpashop.domain.Order.orderItems#4] 2022-11-02 16:18:50.307 TRACE 31332 --- [nio-8080-exec-1] org.hibernate.type.CollectionType : Created collection wrapper: [jpabook.jpashop.domain.Member.orders#1] 2022-11-02 16:18:50.307 TRACE 31332 --- [nio-8080-exec-1] org.hibernate.type.CollectionType : Created collection wrapper: [jpabook.jpashop.domain.Order.orderItems#11] 2022-11-02 16:18:50.307 TRACE 31332 --- [nio-8080-exec-1] org.hibernate.type.CollectionType : Created collection wrapper: [jpabook.jpashop.domain.Member.orders#8] 2022-11-02 16:18:50.310 DEBUG 31332 --- [nio-8080-exec-1] org.hibernate.SQL : select orderitems0_.order_id as order_id5_5_0_, orderitems0_.order_item_id as order_it1_5_0_, orderitems0_.order_item_id as order_it1_5_1_, orderitems0_.count as count2_5_1_, orderitems0_.item_id as item_id4_5_1_, orderitems0_.order_id as order_id5_5_1_, orderitems0_.order_price as order_pr3_5_1_ from order_item orderitems0_ where orderitems0_.order_id=? Hibernate: select orderitems0_.order_id as order_id5_5_0_, orderitems0_.order_item_id as order_it1_5_0_, orderitems0_.order_item_id as order_it1_5_1_, orderitems0_.count as count2_5_1_, orderitems0_.item_id as item_id4_5_1_, orderitems0_.order_id as order_id5_5_1_, orderitems0_.order_price as order_pr3_5_1_ from order_item orderitems0_ where orderitems0_.order_id=? 2022-11-02 16:18:50.311 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [4] 2022-11-02 16:18:50.312 INFO 31332 --- [nio-8080-exec-1] p6spy : #1667373530312 | took 0ms | statement | connection 6| url jdbc:h2:tcp://localhost/~/jpashop select orderitems0_.order_id as order_id5_5_0_, orderitems0_.order_item_id as order_it1_5_0_, orderitems0_.order_item_id as order_it1_5_1_, orderitems0_.count as count2_5_1_, orderitems0_.item_id as item_id4_5_1_, orderitems0_.order_id as order_id5_5_1_, orderitems0_.order_price as order_pr3_5_1_ from order_item orderitems0_ where orderitems0_.order_id=? select orderitems0_.order_id as order_id5_5_0_, orderitems0_.order_item_id as order_it1_5_0_, orderitems0_.order_item_id as order_it1_5_1_, orderitems0_.count as count2_5_1_, orderitems0_.item_id as item_id4_5_1_, orderitems0_.order_id as order_id5_5_1_, orderitems0_.order_price as order_pr3_5_1_ from order_item orderitems0_ where orderitems0_.order_id=4; 2022-11-02 16:18:50.315 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_it1_5_1_] : [BIGINT]) - [6] 2022-11-02 16:18:50.316 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([count2_5_1_] : [INTEGER]) - [1] 2022-11-02 16:18:50.316 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([item_id4_5_1_] : [BIGINT]) - [3] 2022-11-02 16:18:50.316 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_id5_5_1_] : [BIGINT]) - [4] 2022-11-02 16:18:50.316 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_pr3_5_1_] : [INTEGER]) - [10000] 2022-11-02 16:18:50.317 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_id5_5_0_] : [BIGINT]) - [4] 2022-11-02 16:18:50.317 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_it1_5_0_] : [BIGINT]) - [6] 2022-11-02 16:18:50.319 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_it1_5_1_] : [BIGINT]) - [7] 2022-11-02 16:18:50.319 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([count2_5_1_] : [INTEGER]) - [2] 2022-11-02 16:18:50.319 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([item_id4_5_1_] : [BIGINT]) - [3] 2022-11-02 16:18:50.319 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_id5_5_1_] : [BIGINT]) - [4] 2022-11-02 16:18:50.319 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_pr3_5_1_] : [INTEGER]) - [10000] 2022-11-02 16:18:50.319 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_id5_5_0_] : [BIGINT]) - [4] 2022-11-02 16:18:50.320 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_it1_5_0_] : [BIGINT]) - [7] 2022-11-02 16:18:50.324 DEBUG 31332 --- [nio-8080-exec-1] org.hibernate.SQL : select item0_.item_id as item_id2_3_0_, item0_.name as name3_3_0_, item0_.price as price4_3_0_, item0_.stock_quantity as stock_qu5_3_0_, item0_.artist as artist6_3_0_, item0_.etc as etc7_3_0_, item0_.author as author8_3_0_, item0_.isbn as isbn9_3_0_, item0_.actor as actor10_3_0_, item0_.director as directo11_3_0_, item0_.dtype as dtype1_3_0_ from item item0_ where item0_.item_id=? Hibernate: select item0_.item_id as item_id2_3_0_, item0_.name as name3_3_0_, item0_.price as price4_3_0_, item0_.stock_quantity as stock_qu5_3_0_, item0_.artist as artist6_3_0_, item0_.etc as etc7_3_0_, item0_.author as author8_3_0_, item0_.isbn as isbn9_3_0_, item0_.actor as actor10_3_0_, item0_.director as directo11_3_0_, item0_.dtype as dtype1_3_0_ from item item0_ where item0_.item_id=? 2022-11-02 16:18:50.325 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [3] 2022-11-02 16:18:50.325 INFO 31332 --- [nio-8080-exec-1] p6spy : #1667373530325 | took 0ms | statement | connection 6| url jdbc:h2:tcp://localhost/~/jpashop select item0_.item_id as item_id2_3_0_, item0_.name as name3_3_0_, item0_.price as price4_3_0_, item0_.stock_quantity as stock_qu5_3_0_, item0_.artist as artist6_3_0_, item0_.etc as etc7_3_0_, item0_.author as author8_3_0_, item0_.isbn as isbn9_3_0_, item0_.actor as actor10_3_0_, item0_.director as directo11_3_0_, item0_.dtype as dtype1_3_0_ from item item0_ where item0_.item_id=? select item0_.item_id as item_id2_3_0_, item0_.name as name3_3_0_, item0_.price as price4_3_0_, item0_.stock_quantity as stock_qu5_3_0_, item0_.artist as artist6_3_0_, item0_.etc as etc7_3_0_, item0_.author as author8_3_0_, item0_.isbn as isbn9_3_0_, item0_.actor as actor10_3_0_, item0_.director as directo11_3_0_, item0_.dtype as dtype1_3_0_ from item item0_ where item0_.item_id=3; 2022-11-02 16:18:50.326 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([dtype1_3_0_] : [VARCHAR]) - [B] 2022-11-02 16:18:50.326 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name3_3_0_] : [VARCHAR]) - [jap2 book] 2022-11-02 16:18:50.326 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([price4_3_0_] : [INTEGER]) - [10000] 2022-11-02 16:18:50.326 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([stock_qu5_3_0_] : [INTEGER]) - [97] 2022-11-02 16:18:50.326 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([author8_3_0_] : [VARCHAR]) - [null] 2022-11-02 16:18:50.326 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([isbn9_3_0_] : [VARCHAR]) - [null] 2022-11-02 16:18:50.326 TRACE 31332 --- [nio-8080-exec-1] org.hibernate.type.CollectionType : Created collection wrapper: [jpabook.jpashop.domain.item.Item.categories#3] 2022-11-02 16:18:50.327 DEBUG 31332 --- [nio-8080-exec-1] org.hibernate.SQL : select orderitems0_.order_id as order_id5_5_0_, orderitems0_.order_item_id as order_it1_5_0_, orderitems0_.order_item_id as order_it1_5_1_, orderitems0_.count as count2_5_1_, orderitems0_.item_id as item_id4_5_1_, orderitems0_.order_id as order_id5_5_1_, orderitems0_.order_price as order_pr3_5_1_ from order_item orderitems0_ where orderitems0_.order_id=? Hibernate: select orderitems0_.order_id as order_id5_5_0_, orderitems0_.order_item_id as order_it1_5_0_, orderitems0_.order_item_id as order_it1_5_1_, orderitems0_.count as count2_5_1_, orderitems0_.item_id as item_id4_5_1_, orderitems0_.order_id as order_id5_5_1_, orderitems0_.order_price as order_pr3_5_1_ from order_item orderitems0_ where orderitems0_.order_id=? 2022-11-02 16:18:50.327 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [11] 2022-11-02 16:18:50.327 INFO 31332 --- [nio-8080-exec-1] p6spy : #1667373530327 | took 0ms | statement | connection 6| url jdbc:h2:tcp://localhost/~/jpashop select orderitems0_.order_id as order_id5_5_0_, orderitems0_.order_item_id as order_it1_5_0_, orderitems0_.order_item_id as order_it1_5_1_, orderitems0_.count as count2_5_1_, orderitems0_.item_id as item_id4_5_1_, orderitems0_.order_id as order_id5_5_1_, orderitems0_.order_price as order_pr3_5_1_ from order_item orderitems0_ where orderitems0_.order_id=? select orderitems0_.order_id as order_id5_5_0_, orderitems0_.order_item_id as order_it1_5_0_, orderitems0_.order_item_id as order_it1_5_1_, orderitems0_.count as count2_5_1_, orderitems0_.item_id as item_id4_5_1_, orderitems0_.order_id as order_id5_5_1_, orderitems0_.order_price as order_pr3_5_1_ from order_item orderitems0_ where orderitems0_.order_id=11; 2022-11-02 16:18:50.328 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_it1_5_1_] : [BIGINT]) - [13] 2022-11-02 16:18:50.328 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([count2_5_1_] : [INTEGER]) - [2] 2022-11-02 16:18:50.328 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([item_id4_5_1_] : [BIGINT]) - [10] 2022-11-02 16:18:50.328 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_id5_5_1_] : [BIGINT]) - [11] 2022-11-02 16:18:50.328 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_pr3_5_1_] : [INTEGER]) - [20000] 2022-11-02 16:18:50.328 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_id5_5_0_] : [BIGINT]) - [11] 2022-11-02 16:18:50.328 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_it1_5_0_] : [BIGINT]) - [13] 2022-11-02 16:18:50.328 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_it1_5_1_] : [BIGINT]) - [14] 2022-11-02 16:18:50.328 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([count2_5_1_] : [INTEGER]) - [3] 2022-11-02 16:18:50.328 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([item_id4_5_1_] : [BIGINT]) - [10] 2022-11-02 16:18:50.328 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_id5_5_1_] : [BIGINT]) - [11] 2022-11-02 16:18:50.329 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_pr3_5_1_] : [INTEGER]) - [30000] 2022-11-02 16:18:50.329 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_id5_5_0_] : [BIGINT]) - [11] 2022-11-02 16:18:50.329 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([order_it1_5_0_] : [BIGINT]) - [14] 2022-11-02 16:18:50.329 DEBUG 31332 --- [nio-8080-exec-1] org.hibernate.SQL : select item0_.item_id as item_id2_3_0_, item0_.name as name3_3_0_, item0_.price as price4_3_0_, item0_.stock_quantity as stock_qu5_3_0_, item0_.artist as artist6_3_0_, item0_.etc as etc7_3_0_, item0_.author as author8_3_0_, item0_.isbn as isbn9_3_0_, item0_.actor as actor10_3_0_, item0_.director as directo11_3_0_, item0_.dtype as dtype1_3_0_ from item item0_ where item0_.item_id=? Hibernate: select item0_.item_id as item_id2_3_0_, item0_.name as name3_3_0_, item0_.price as price4_3_0_, item0_.stock_quantity as stock_qu5_3_0_, item0_.artist as artist6_3_0_, item0_.etc as etc7_3_0_, item0_.author as author8_3_0_, item0_.isbn as isbn9_3_0_, item0_.actor as actor10_3_0_, item0_.director as directo11_3_0_, item0_.dtype as dtype1_3_0_ from item item0_ where item0_.item_id=? 2022-11-02 16:18:50.330 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [10] 2022-11-02 16:18:50.330 INFO 31332 --- [nio-8080-exec-1] p6spy : #1667373530330 | took 0ms | statement | connection 6| url jdbc:h2:tcp://localhost/~/jpashop select item0_.item_id as item_id2_3_0_, item0_.name as name3_3_0_, item0_.price as price4_3_0_, item0_.stock_quantity as stock_qu5_3_0_, item0_.artist as artist6_3_0_, item0_.etc as etc7_3_0_, item0_.author as author8_3_0_, item0_.isbn as isbn9_3_0_, item0_.actor as actor10_3_0_, item0_.director as directo11_3_0_, item0_.dtype as dtype1_3_0_ from item item0_ where item0_.item_id=? select item0_.item_id as item_id2_3_0_, item0_.name as name3_3_0_, item0_.price as price4_3_0_, item0_.stock_quantity as stock_qu5_3_0_, item0_.artist as artist6_3_0_, item0_.etc as etc7_3_0_, item0_.author as author8_3_0_, item0_.isbn as isbn9_3_0_, item0_.actor as actor10_3_0_, item0_.director as directo11_3_0_, item0_.dtype as dtype1_3_0_ from item item0_ where item0_.item_id=10; 2022-11-02 16:18:50.330 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([dtype1_3_0_] : [VARCHAR]) - [B] 2022-11-02 16:18:50.331 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name3_3_0_] : [VARCHAR]) - [spring2 book] 2022-11-02 16:18:50.331 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([price4_3_0_] : [INTEGER]) - [10000] 2022-11-02 16:18:50.331 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([stock_qu5_3_0_] : [INTEGER]) - [95] 2022-11-02 16:18:50.331 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([author8_3_0_] : [VARCHAR]) - [null] 2022-11-02 16:18:50.331 TRACE 31332 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([isbn9_3_0_] : [VARCHAR]) - [null] 2022-11-02 16:18:50.331 TRACE 31332 --- [nio-8080-exec-1] org.hibernate.type.CollectionType : Created collection wrapper: [jpabook.jpashop.domain.item.Item.categories#10]
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
값 타입은 db에 어떻게 저장되는가
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서 address 라는 값 타입이 delivery 라는 entity의 콜럼중 하나라고 표시되어 있습니다. 하지만 h2 db에 들어가보면 address 라는 컬럼을 찾아볼수 없습니다.address는 어디에 저장되어 있는것인가요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
h2 테이블 생성이 안됩니다
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 강의 잘 수강하고 있습니다.h2 디비를 사용하고 있는데,전에는 잘 되다가 갑자기 테이블이 생성이 되지 않습니다.18:44:52.704 [Thread-0] DEBUG org.springframework.boot.devtools.restart.classloader.RestartClassLoader - Created RestartClassLoader org.springframework.boot.devtools.restart.classloader.RestartClassLoader@29beb06e . ____ _ /\\ / ___'_ __ (_)_ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.4)2022-11-01 18:44:53.018 INFO 37580 --- [ restartedMain] jpabook.jpashop.JpashopApplication : Starting JpashopApplication using Java 17.0.4.1 on itaehwis-MacBook-Pro.local with PID 37580 (/Users/taehwi/Desktop/멋사/Recruit_Page/jpashop/build/classes/java/main started by taehwi in /Users/taehwi/Desktop/멋사/Recruit_Page/jpashop)2022-11-01 18:44:53.024 INFO 37580 --- [ restartedMain] jpabook.jpashop.JpashopApplication : No active profile set, falling back to 1 default profile: "default"2022-11-01 18:44:53.078 INFO 37580 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable2022-11-01 18:44:53.078 INFO 37580 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'2022-11-01 18:44:53.979 INFO 37580 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.2022-11-01 18:44:53.993 INFO 37580 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 6 ms. Found 0 JPA repository interfaces.2022-11-01 18:44:54.368 INFO 37580 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)2022-11-01 18:44:54.374 INFO 37580 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat]2022-11-01 18:44:54.374 INFO 37580 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.65]2022-11-01 18:44:54.421 INFO 37580 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2022-11-01 18:44:54.421 INFO 37580 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1342 ms2022-11-01 18:44:54.478 INFO 37580 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...2022-11-01 18:44:54.557 INFO 37580 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.2022-11-01 18:44:54.564 INFO 37580 --- [ restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:tcp://localhost/~/jpashop'2022-11-01 18:44:54.659 INFO 37580 --- [ restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]2022-11-01 18:44:54.697 INFO 37580 --- [ restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.6.11.Final2022-11-01 18:44:54.810 INFO 37580 --- [ restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}2022-11-01 18:44:54.881 INFO 37580 --- [ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect2022-11-01 18:44:55.349 INFO 37580 --- [ restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]2022-11-01 18:44:55.355 INFO 37580 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'2022-11-01 18:44:55.425 WARN 37580 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning2022-11-01 18:44:55.520 INFO 37580 --- [ restartedMain] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html]2022-11-01 18:44:55.652 INFO 37580 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 357292022-11-01 18:44:55.677 INFO 37580 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''2022-11-01 18:44:55.686 INFO 37580 --- [ restartedMain] jpabook.jpashop.JpashopApplication : Started JpashopApplication in 2.965 seconds (JVM running for 3.588) 이렇게 오류 없이 스프링이 돌아가는데, h2 화면에 들어가보면이런식으로 테이블이 하나도 생성이 안됩니다. 제 application.yml 코드입니다해결 부탁드립니다