월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
일대다 관계에서의 컬렉션 fetch join과 페이징에 대한 질문
안녕하세요. 일대다 관계에서의 컬렉션 fetch join과 관련된 강의를 듣다가 궁금한 점이 생겨 질문 드립니다.강의자료에서 컬렉션 페치 조인을 사용하면 페이징이 불가능한데, 그 이유는 하이버네이트가 경고 로그를 남기면서 모든 데이터를 DB에서 읽어오고, 메모리에서 페이징 해버리기 때문이라고 나와있습니다.(강의에서는 outofmemory 장애로 이어질수 있다고 하셨구요)"컬렉션 페치조인을 사용하면, 일대다의 관계에서 다에 해당하는 데이터를 기준으로 DB의 데이터가 반환되기 때문에, 일에 해당하는 데이터를 기준으로 페이징할 수가 없다." 라는 점은 이해를 했습니다.그런데 컬렉션 페치조인에서 페이징을 사용하던 하용하지 않던, DB에 요청하여 반환받게 되는 데이터(row)의 개수는 동일한 것 아닌가요?결국 이 뻥튀기된 모든 데이터를 중복되지 않게 걸러주는 역할은 JPA가 하는 것이고, 페이징이 필요하다면 걸러진 데이터를 가지고 단순히 반환되는 데이터의 갯수만 정하면 될 것 같은데, 왜 outofmemory 장애가 발생하는지 모르겠습니다.예를들어, 컬렉션 페치조인으로 DB에서 반환된 row의 갯수가 10000개라고 했을 때, JPA는 10000개의 모든 row를 확인하면서 중복된 엔티티가 만들어지지 않도록 걸러낼 것이고, 이는 페이징이 없더라도 수행되는 동작일 것이라고 생각합니다.앞의 제 생각이 맞다면, 걸러진 데이터를 기준으로 페이징을 하면 되지않나요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
415 오류가 자꾸 발생합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] Postman에서 send를 해도 아래와같은 오류가 발생하며 실행되지 않습니다. Headers에서 Context-Type이 분명 application/json인데 뭐가 문제일까요 x-www-form-urlencoded로 변경하고 Context-Type도 이와 같이 변경한 후에 @RequestBody를 지우면 데이터가 잘 들어오는 것을 확인할 수 있었습니다. 2023-03-29 19:41:13.746 WARN 13008 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported]2023-03-29 19:41:13.780 WARN 13008 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]아래는 제 코드와 헤더입니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬럼명 앞에 테이블명 붙이는 방법
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]테이블 명이 member이고 컬럼명이 name이면 테이블이 생성될때 컬럼명이 member_name으로 모든 컬럼 앞에 테이블명이 자동으로 생성되는 어노테이션을 들었던 기억이 있는데 어떤 어노테이션이었는지 기억이 잘 안납니다.. 도와주실 수 있을까요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
distinct를 적용하지 않았을 때의 결과 관련
강의를 중간에 distinct를 적용하지 않으면 포스트맨에서 결과가 중복되게 나오고, 쿼리도 inner join으로 되어야 하는데 이상합니다ㅜ코드가 모두 동일한데, 콘솔에 찍어봐도 4건이 아닌 2건 밖에 조회가 되지 않고 결과도 2건으로 나옵니다..또한, 강의에서는 inner join이 나가는데 제 코드는 join이 나갑니다..뭐가 문제일까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Dto
위강의에 MemberDto에 만약 address필드까지 추가해야한다면 MemberDto 리스트를 만들때List<MemberDto> collect = findMembers.stream() .map(m -> new MemberDto(m.getName(),m.getAddress())) .collect(Collectors.toList()); 위와 같이 해준다면 MemberDto에서의 address와 findMembers에서의 address가 같은 주소값을 참조하고 있어 상황에 따라 뜻하지 않는 에러가 발생할 수 있다고 생각하는데 MemberDto에서 address 객체를 아예 새로 만드는 것이 더 좋을까요?? 현업에서는 어떻게 사용하는지 궁금합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
쿼리가 강의보다 더 나오고 있습니다.
"/api/v2/simple-orders " 이 url로 호출했을 때,(1) order테이블에서 가져오는 쿼리 1번 => (2개의 데이터)(2) member 쿼리 1번 * 2(3) delivery 쿼리 1번 * 2해서 총 5번이 나오는 걸로 알고 있습니다. 근데 현재 로그에서 총 쿼리가 7번이 나가고 있습니다. 코드를 따라쳐보면서 했는데도 왜 다르게 나가는지 원인을 짐작하기가 힘듭니다. 현재 제 쿼리는 (1) order 테이블에서 가져오는 쿼리 1번(2) member 쿼리 1번(3) delivery 쿼리 1번(4) delivery id 조건절로 order 찾는 쿼리 1번(2)~(4)번 한 번 더 반복이렇게 해서 총 7번 쿼리가 나가게 됩니다. 쿼리만 보고 어떤 부분때문에 더 나가게 됐는지 짐작할 수 있을까요? 엔티티 간의 연관관계 매핑은 강의를 보면서 했기 때문에 제가 중간에 놓쳤나 생각이 들기도 하네요ㅜ 원인을 짐작하기가 어렵습니다. select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id fetch first ? rows only 2023-03-23T19:03:54.387+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL : select m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name from member m1_0 where m1_0.member_id=? 2023-03-23T19:03:54.390+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL : select d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status from delivery d1_0 where d1_0.delivery_id=? 2023-03-23T19:03:54.393+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 where o1_0.delivery_id=? 2023-03-23T19:03:54.395+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL : select m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name from member m1_0 where m1_0.member_id=? 2023-03-23T19:03:54.396+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL : select d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status from delivery d1_0 where d1_0.delivery_id=? 2023-03-23T19:03:54.397+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 where o1_0.delivery_id=?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
다대일 관계에서 일을 기준으로 페이징을 하려면 어떻게 해야하나요?
일대다 컬렉션 페치조인과 페이징은 기본적으로 양방향을 전제하고, 일을 기준으로 페이징을 하기 때문에 Batch Size 를 이용하는 것은 이해했습니다. Q. 그렇다면 컬렉션이 생기지 않는 다대일 단방향 매핑 구조에서 일 을 기준으로 페이징하려면 어떻게 해야할지 궁금합니다. 예를 들어 게시글(1) : 댓글 (N) 이고 댓글 -> 게시글 방향으로 다대일 단방향 매핑이라면, 게시글을 기준으로 페이징하고 싶을 때 어떻게 하면 될까요? 항상 영한님과 서포터님들께 감사드립니닷!!🙇♂️
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
properties와 yaml 질문
application.properties로 하면 오류가 뜨고 application.yaml로 하면 문제가 해결이 됩니다.. 뭐가 문제인지 모르겠습니다. spring.output.ansi.enabled=always # DB 설정 spring.datasource.url=jdbc:h2:tcp://localhost/~/capstone spring.datasource.username=sa spring.datasource.password= spring.datasource.driver-class-name=org.h2.Driver # JPA 관련 spring.jpa.hibernate.ddl-auto=create-drop #애플리케이션을 시작할 때 데이터베이스를 초기화하고 다시 테이블 생성 # ddl-auto=none로 하면 데이터 보존 spring.jpa.properties.hibernate.format_sql=true #실행되는 query를 보여준다. # JPA Log -> SQL 로거를 통해 출력, 바인딩 되는 파라미터 확인 2가지 가능하도록 logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE # JPA Log #spring.jpa.show-sql=true system.out은 안되야 하므로 이건 X 위가 application.properties이고 logging: level: org: hibernate: SQL: DEBUG type: descriptor: sql: BasicBinder: TRACE spring: datasource: driver-class-name: org.h2.Driver password: url: jdbc:h2:tcp://localhost/~/capstone username: sa jpa: hibernate: ddl-auto: create-drop #??????? ??? ? ??????? ????? ?? ??? ??' properties: hibernate: format_sql: true #???? query? ????.' output: ansi: enabled: always위가 application.yaml로 실행했을 때 입니다. 어째서 yaml로 해야만 실행되는지 모르겠습니다. 모든 설정은 같은거 같은데 혹시 부트 3.0이라 그런 것인지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
generated 안에 Q 모델들이 생성이 되지 않습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.말 그대로 generated 까지는 생성되지만 그 안에 Q 모델들이 생성되지 않습니다.버전에 맞게 여러 라이브러리를 적용해보고, generated 디렉토리를 소스로 인식하게도 해봤지만 아직 해결되지 않았습니다. 어떻게 하면 좋을까요?아래는 제 build.gradle 입니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
jpa 1:n 조인
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)[질문 내용]일대다 관계의 테이블에서 조인을 하면 데이터가 뻥튀기 되는건 당연한건데 이걸 자바 객체 입장에선 리스트로 어차피 한번에 다 들고있으니까 뻥튀기가 될 필요가 없다고 생각하면 될까요 ? (그래서 distinct를 사용하고 )
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Dto 생성에 관하여
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Dto 관련하여 질문이 있습니다. A라는 도메인 안에서만 생각해볼때, 프론트측에서 api별로 필요로하는 데이터에 딱 맞게 여러 응답 dto를 생성하는것이 좋은지 아니면 하나의 응답 dto를 생성해서 프론트 측에서 필요로하는 data를 뽑아 사용하게 하는 것이 좋은지 궁금합니다.전자는 필요로하는 데이터를 프론트측에 전달해줘서 가독성? 측면에서 좋은 것 같지만 다수의 DTO가 생성되어 유지보수 측면에서 단점이 있을것 같습니다. 후자는 하나의 DTO를 사용하므로 유지보수 측면에서 좋아보이는데 dummy 데이터나 null 값을 return 해주는 단점이 있을것 같은데 실무에서는 어떻게 dto를 생성하고 관리하는지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OSIV 관련하여 질문드립니다!
User user = userQueryService.findById(userId); postService.createPost(user)OSIV를 끈채로 특정 유저가 게시글을 작성하는 로직을 Command와 Query를 분리하여 위와 같이 컨트롤러에 작성하고자 합니다.OSIV가 꺼져있기에 user는 준영속상태로, createPost 트랜잭션 안에서 user를 변경하지 않고 post 생성에만 사용한다면 위와 같이 사용하는게 맞는지 궁금합니다!만약 createPost에서 user를 변경하는 상황이 발생한다면, 예외가 발생하는지도 궁금합니다!
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OSIV false로 설정할 때
궁금증이 생겨 한가지 질문할게요.만약 Service 계층에서 validate(), update()라는 메소드가 있을 때 두 메소드 모두 로직 시작부분에 엔티티를 조회한다고 하면 두 메소드에서 모두 select 쿼리가 나갑니다. OSIV 설정을 true로 하면 Controller 영역까지 트랜잭션이 유지 되기 때문에 컨트롤러 안에 xxxService.validate();xxxService.update();이렇게 해도 같은 트랜잭션 안에 있었기 때문에 select 쿼리는 한번만 나갑니다. 하지만 OSIV 설정을 false로 하면 Controller 영역까지 트랜잭션이 유지 되지 않기 때문에 위와 같이 작성하면 select 쿼리가 두번 나갑니다. 이를 해결하기 위해 두가지 메소드를 하나로 합쳐 Controller 영역에서 사용할 수 있습니다.xxxService.updateSet();하지만 이때는 입력 받아야 하는 인자 수가 많을 경우 3, 4개 넘게 받는 경우가 생겨 질문드립니다...쿼리 성능으로는 합치는게 맞지만 구조적으로 이러한 설계가 맞는지 궁금합니다. 감사합니다~!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Spring Boot 3.X distinct 관련
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화Spring Boot 3.2버전에서 실습 중에, distinct 옵션을 사용하지 않고도 distinct 옵션을 넣은 것처럼 Row가 2줄 출력됩니다. 이것저것 코드를 확인하다가 Spring Boot를 2.x 버전으로 내린 후에 다시 확인해보았는데, 그제서야 강의에 나오는 것처럼 중복 데이터 4개가 나옵니다. 혹시 이것 관련해서 jpa에서 업데이트가 된 것인지요..? 검색 능력이랑 문서 능력 찾아보는 능력이 딸려, 한참 찾아보다 여기에 질문합니다 ㅜㅜ 실례가 안된다면 이러한 내용을 어떻게 찾는지도 알게 될 수 있다면 좋을거 같습니다!
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
조회시 count 쿼리에 대하여
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 제가 영한님 강의를 보고 혼자 간단한 프로젝트를 진행해보고 있는데, Order 조회시 OrderItem과 같은 List의 갯수를 알고 싶어 count 쿼리를 사용하려고 합니다.이때, 1. JPA에서 DTO 직접 조회가 아닌 fetch join 하여 엔티티로 조회한 이후에 count 값 (갯수)를 얻을 수 있을까요??그리고 2. 컬렉션 페치조인은 1개만 가능하다 하였는데, 예를 들어 Order에 OrderItem 과 List가 하나더 추가 되었을 때, 각 리스트의 count 갯수를 알고싶으면 DTO직접 조회에서 count 쿼리를 사용하는게 맞을까요?항상 강의 잘 듣고있습니다. 감사합니다
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Postman 406, 404 에러
첫번째 PostMapping 으로 했을때 값 등록은 잘되는데 406 에러가 나옵니다.두번째 update 할때는 값도 변경안되고 404 에러가 납니다..
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의 문서 오타 제보 드립니다.
안녕하세요 강사님강의 문서 오타 제보 드립니다.P23api/v1/orders 처럼List<Order> orders = orderRepository.findAllByString(new OrderSearch());이 되어야 할 것 같습니다.감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
batch_size entity 1개일 때 이상현상
좋은 강의 항상 잘 보고 있습니다!다름이 아니라 batchSize 적용 시, 상위 엔티티가 1개만 조회된 경우 in 쿼리가 이상하게 발생하는 현상에 대한 원인을 찾지 못하여 도움을 구하고자 질문드립니다.아래 사진과 같이 OneToMany관계를 잡았을 때, batchsize를 적용한 뒤 4번 사진처럼 코드를 작성하고 실행하면 5번처럼 in query가 발생합니다.그런데 6번 사진처럼 2개 이상의 entity가 영속성 컨텍스트에 존재하는 경우에는 정상적으로 작동하는데 혹시 무엇이 문제일까요..? 자문자답 죄송합니다!해결되어서 지울까 하였지만, 혹시 저같은 분들이 있을 까 해서 남기겠습니다!https://ttl-blog.tistory.com/1202
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
offset 과 limit 값을 서버쪽으로 보내는 방식
안녕하세요강의에서는 페이징에 필요한 offset과 limit 값을 @RequestParam을 통해서 넘겨주는 것을 보았습니다. 그런데, 저는 현재 @RequestBody OrderSearchDto를 파라미터로 받아와 내부 필드인 멤버명이나 주문 상태를 검색조건으로 활용하고 있었습니다.이런 경우에는 그냥 @RequestParam을 사용하지 않고, DTO에 offset과 limit 필드를 추가해서 검색과 페이징에 필요한 데이터를 OrderSearchDto 안에 한번에 받는것은 어떤지 궁금합니다.보통 실무에서는 페이징에 필요한 값은 @RequestParam으로 받는 편인가요? 아니면 저의 발상처럼 OrderSearchDto 같은 DTO를 통해 @RequestBody로 받기도 하나요? 일반적인 관점에서 best practice가 따로 있는지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
querydsl gradle 추가후 더블클릭하여 실행할때 오류
오후 2:05:03: 실행 중 'compileQuerydsl'...> Task :initQuerydslSourcesDir> Task :compileQuerydsl FAILEDDeprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.See https://docs.gradle.org/7.6/userguide/command_line_interface.html#sec:command_line_warnings2 actionable tasks: 2 executedFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':compileQuerydsl'.> com/mysema/codegen/model/Type* Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.* Get more help at https://help.gradle.orgBUILD FAILED in 5s오후 2:05:09: 실행이 완료되었습니다 'compileQuerydsl'.제목 그대로 그래들에 추가하여 강사님처럼 더블클릭후 실행하면은 에러 로그가 찍힙니다.... 이유 알려주세요..