inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

176만명의 커뮤니티!! 함께 토론해봐요.

일대다 패치 조인 사용 시, 뻥튀기가 되지 않는 문제

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 아래 처럼 print를 찍었을 때, 저는 id 1과 2가 두 개가 나오지 않습니다. 관련 코드는 아래 첨부하겠습니다. 강의대로 똑같이 했는데, 왜 1개씩만 나오는지 모르겠습니다.. distinct를 넣었을 때와 안넣었을때의 결과가 같습니다. DB에서는 4개로 나오는데 Postman이랑 콘솔에서는 2개로 난오네요.. [v3 적용 시] package jpabook.jpashop2.api; import jpabook.jpashop2.domain.Address; import jpabook.jpashop2.domain.Order; import jpabook.jpashop2.domain.OrderItem; import jpabook.jpashop2.domain.OrderStatus; import jpabook.jpashop2.repository.OrderRepository; import jpabook.jpashop2.repository.OrderSearch; import lom bok.Data; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; import java.ut il.List; import java.util.stream.Collector s; import stati c java.util.stream.Collectors. toList ; @RestController @RequiredArgsConstructor public class OrderApiController { private final OrderRepository orderRepository; @GetMapping("/api/v1/orders") public List<Order> ordersV1(){ List<Order> all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); // 프록시 객체 초기화 order.getDelivery().getAddress(); List<OrderItem> ord erItems = order.g etOrderItems(); orderItems.stream().forEach(o -> o.getItem().getName()); } return all; } @GetMapping("/api/v2/orders") public List<OrderDto> ordersV2(){ List<Order> orders = orderRepository.findAllByString(new OrderSearch() ); List<OrderDto> collect = orders.stream() .map(o -> new OrderDto(o)) .collect( toList ()); return collect; } @GetMapping("/api/v3/orders") public List<OrderDto> ordersV3(){ List<Order> orders = orderRepository.findAllWithItem(); for (Order order : orders) { System. out .println("order ref= " + order + " id=" + o rder.getId()); } List<OrderDto> collect = orders.stream() .map(o -> new OrderDto(o)) .collect( toList ()); return collect; } @Data static class OrderDto{ private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; // VO는 그대로 사용해도 되지만, (VO는 객체이기 때문에, 안에 값이 변하면 다른 객체로 판단) private List<OrderItemDto> orderItems; // 엔티티는 DTO로 다시 한번 래핑이 필요하다. 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( toList ()); } } @Data static class OrderItemDto { // OrderItem에서 필요한 값만 다시 추출 private String itemName; // 상품명 private int orderPrice; // 주문 가격 private int count; // 주문 수량 public OrderItemDto(OrderItem orderItem) { itemName = orderItem.getItem().getName(); orderPrice = orderItem.getOrderPrice(); count = orderItem.getCount(); } } } public List<Order> findAllWithItem() { return em.createQuery("select o from Order o" + " join fetch o.member m" + " join fet ch o.deliv ery d" + " join fetch o.orderItems oi" + " join fetch oi.item i", Order.class) .getResultList(); }

  • java
  • spring
  • spring-boot
  • jpa
rr8602 댓글 1 좋아요 3 조회수 1057

Jdbc 회원 리포지토리 구현에서 printStackTrace가 문제를 발생합니다

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 강의에는 이부분에 문제가 없는데, 코드 복붙하라고 하셔서 복붙했더니 저는 이렇게 뜨는데, 원인과 해결방법 있을까요

  • java
  • spring
  • mvc
  • spring-boot
gonieyoo 댓글 2 좋아요 0 조회수 461

어노테이션이나 글씨 쓸 때 밑에 자동으로 인식되는거 설정하려면 어떻게 하나요?

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

[질문 내용] 1. 위 내용처럼 .을 입력하면 관련된 내용이 밑에 쭉 뜨는데 이런거 뜨게 설정하려면 어떻게 할까요? 그리고 어노테이션 글씨(@Controller, @GetMapping) 색만 화면처럼 변경하고 싶은데 어떻게 하면 되나요? (윈도우기준) 저는 현재 위에 사진처럼 보입니다ㅠㅠ

  • java
  • spring
  • mvc
  • spring-boot
미래의개발자 댓글 2 좋아요 0 조회수 515

결과 쿼리 개수가 맞지 않아서 문의 드립니다.

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] [간단한 주문 조회 V3: 엔티티를 DTO로 변환 -패치 조인 최적화] 강의에서 5분 50초 쯤에 v2를 돌려봤을 때, 강사님은 쿼리가 5번 나오는데, 저는 계속 7번이 나오더라구요... order가 처음에 주문 2개를 만들어서 이미 영속성 상태라 그 다음에는 1차 캐시에서 가져오는 것으로 보여 쿼리는 생성이 안되어야 한다고 생각이 드는데, 왜 계속 order 쿼리가 2번 더 나오는 걸까요...? [Query] 2023-10-25T21:54:33.448+09:00 DEBUG 37176 --- [nio-8080-exec-3] org.hibernate.SQL : select o1_0.order_id, o1_0.deliver_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-10-25T21:54:33.449+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473449 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2 select o1_0.order_id,o1_0.deliver_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 select o1_0.order_id,o1_0.deliver_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 1000 rows only; 2023-10-25T21:54:33.450+09:00 DEBUG 37176 --- [nio-8080-exec-3] 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-10-25T21:54:33.451+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473451 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2 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=? 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=1; 2023-10-25T21:54:33.451+09:00 DEBUG 37176 --- [nio-8080-exec-3] 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-10-25T21:54:33.451+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473451 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2 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=? 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=1; 2023-10-25T21:54:33.452+09:00 DEBUG 37176 --- [nio-8080-exec-3] org.hibernate.SQL : select o1_0.order_id, o1_0.deliver_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 where o1_0.deliver_id=? 2023-10-25T21:54:33.452+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473452 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2 select o1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 where o1_0.deliver_id=? select o1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 where o1_0.deliver_id=1; 2023-10-25T21:54:33.453+09:00 DEBUG 37176 --- [nio-8080-exec-3] 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-10-25T21:54:33.453+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473453 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2 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=? 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=2; 2023-10-25T21:54:33.453+09:00 DEBUG 37176 --- [nio-8080-exec-3] 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-10-25T21:54:33.454+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473454 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2 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=? 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=2; 2023-10-25T21:54:33.454+09:00 DEBUG 37176 --- [nio-8080-exec-3] org.hibernate.SQL : select o1_0.order_id, o1_0.deliver_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 where o1_0.deliver_id=? 2023-10-25T21:54:33.454+09:00 INFO 37176 --- [nio-8080-exec-3] p6spy : #1698238473454 | took 0ms | statement | connection 11| url jdbc:h2:tcp://localhost/~/jpashop2 select o1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 where o1_0.deliver_id=? select o1_0.order_id,o1_0.deliver_id,o1_0.member_id,o1_0.order_date,o1_0.status from orders o1_0 where o1_0.deliver_id=2; [OrderSimpleApiController] package jpabook.jpashop2.api; import jpabook.jpashop2.Repository.OrderRepository; import jpabook.jpashop2.Repository.OrderSearch; import jpabook.jpashop2.domain.Address; import jpabook.jpashop2.domain.Order; import jpabook.jpashop2.domain.OrderStatus; import lomb ok.Data; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; import java.util .List; import ja va.util.stream.Collectors; /** * X To One (컬렉션 X) * Order * Order -> Member * Order -> Delivery */ @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepository orderRepository; @GetMapping("/api/v1/simple-orders") public List<Order> ordersV1(){ List<Order> all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); // Lazy 강제 초기화 order.getDelivery().getAddress(); // Lazy 강제 초기화 } return all; } @GetMapping("/api/v2/simple-orders") public List<SimpleOrderDto> ordersV2(){ // Order 2개 List<Order> orders = orderRepository.findAllByString(new Order Search()); List<SimpleOrderDto> result = orders.stream() .map(o -> new SimpleOrderDto(o)) // map : a -> b로 치환 .collect(Collectors. toList ()); return result; } @GetMapping("/api/v3/simple-orders") public List<SimpleOrderDto> ordersV3() { List<Order> orders = orderRepository.findAll WithMemberDel ivery(); List<SimpleOrderDto> result = orders.stream() .map(o -> new SimpleOrderDto(o)) .collect(Collectors. toList ()); return result; } @Data static class SimpleOrderDto{ // API 명세서 private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; public SimpleOrderDto(Order order) { orderId = order.getId(); name = order.getMember().getName(); orderDate = order.getOrderDate(); orderStatus = order.getStatus(); address = order.getDelivery().getAddress(); } } } [OrderRepository] ... public List<Order> findAllWithMemberDelivery() { return em.createQuery("select o from Order o" + " join fetch o.member m" + " join fet ch o.deliv ery d", Order.class) .getResultList(); }

  • java
  • spring
  • spring-boot
  • jpa
rr8602 댓글 2 좋아요 0 조회수 667

스프링 spring get/post 보안 관련 문의 드립니다

미해결

토비의 스프링 부트 - 이해와 원리

스프링 spring 보안 관련 문의 드립니다 토비님 안녕하세요 ~ 여전히 공공기관 프로젝트에 참여 중 인데요 스프링 보안 관련 해서 문의 드립니다 현재 기 구축되어 있는 프로젝트 소스에서 고도화 및 신규 프로그램 개발 중입니다 그러던 중 공공기관 관리자 담당자가 보안 관련 지적을 하셨습니다 -.공무원 담당자 지적사항 내용 https://www.url.com?paramA= 파라미터a &paramB= 파라미터b => 현재 일반 조회는 스프링 겟 매핑 방식 으로 하고 있습니다 사이트를 사용하는 일반 유저가 브라우저 url 주소창에 파라미터만 수정해가면서 조회 하면 조회 결과가 달라져 나오는데 이거 보안상 문제 있는거 아니냐고 따져 지적을 합니다 기 구축되어 있는 소스에는 request 할때 따로 인코딩/디코딩이 되어 있지 않는데 토비님이 경험해오신 스프링 get/post 보안관련 지적 사항이 나오지 않을려면 저희 프로젝트에서 어떻게 전체 소스(js, java ) 에 어떤 보안 관련 기능을 추가 할 수 있을까요? 참고로 구글도 검색어에 '토비' 라고 치고 개발자 도구 열어서 payload 보면 한글 그대로 넘어가던데 이게 공무원 담당자가 보안 관련 지적 하는게 맞는 건지도 저는 모르겠습니다 한가하실 때 시간 나시면 조언 부탁 드립니다 감사합니다 수고하세요~ 김동희 드림 #토비 #토비의스프링 #spring #스프링 #보안 #get #post #parameter #파라미터 #문제

  • spring
  • spring-boot
  • spring-jdbc
주아아빠 댓글 1 좋아요 0 조회수 622

강의와 동일하게 index.html을 넣었는데, localhost:8080 에서 html을 못띄워요

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. hello html 이 떠야 정상인거같은데, 서버는 켜져있는거같은데, html을 못찾네요. spring boot version 은 2.7.17 로 했습니다. (java 11 적용하기위해 마지막 남은 2.x 여서)

  • java
  • spring
  • mvc
  • spring-boot
댓글 1 좋아요 0 조회수 1003

알림 아이콘redirect 인경우

미해결

스프링과 JPA 기반 웹 애플리케이션 개발

안녕하세요 redirect 의 경우를 제외시켜주셨는데 이게 가능한 이유가 redirect 는 A -> B 로 리다이렉트 한다고 가정하면 A에 담긴 모델을 B한테 그대로 가져가서 가능하다고 이해했는데 맞을까요 ?

  • java
  • spring
  • spring-boot
  • jpa
  • thymeleaf
댓글 1 좋아요 0 조회수 280

그레이들 빌드 실패..

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

Execution failed for task ':JpashopApplication.main()'. > Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1 * 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.org . Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. For more on this, please refer to https://docs.gradle.org/8.3/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. BUILD FAILED in 5s 3 actionable tasks: 1 executed, 2 up-to-date 4강 듣고있는데 롬복, 어노테이션 설정까지 똑같이 따라 햇는데.. 왜 안되는 걸까요

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
todrkrwndgg 댓글 1 좋아요 0 조회수 590

내용정리 화면은 어디서 볼수있나요?

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

화면에서 보여주시는 내용정리된 노트?는 어디서 볼수있나요?

  • java
  • spring
  • mvc
  • spring-boot
박예슬 댓글 0 좋아요 0 조회수 743

더티채킹 이후 save 호출시 문제가 있을까요?

해결됨

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하세요! 회사에서 mysql, Spring Data JPA를 사용하고있습니다. 레거시 코드를 볼때마다 트랜잭션안에서 엔티티 속성값을 변경한 다음, 추가로 save 메서드를 호출해서 변경된 엔티티를 저장해주더라고요. 이러한 방식이 문제가 될 이유라면 뭐가있을지 궁금합니다!

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
고산하 댓글 2 좋아요 0 조회수 399

getName의 name이 null 로 나오는 이유

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

메인 화면에서 회원 등록을 하면 name의 값이 null로 되면서 회원 목록에 등록이 되지 않습니다. 디버깅 모드를 해도 name = null이라는 결과만 확인할 수 있었고 어디서 틀렸는지를 알 수가 없었습니다. 왜 입력한 값이 null로 넘어갔을까요? https://drive.google.com/file/d/1aBZCTKQmP1D1DU2osyB14phEpqfS9bpX/view?usp=sharing 코드 첨부된 드라이브 링크입니다 ㅠㅠ

  • java
  • spring
  • mvc
  • spring-boot
djin0123 댓글 2 좋아요 0 조회수 489

BeanCreationException 에러

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 스프링부트 버전 3.x 이상이고 Junit5를 사용해서 build.gradle에 useJUnitPlatform() 추가하고 테스트에서 @RunWith 대신 @ExtendWith를 사용했습니다. 그리고 나머지는 자료 그대로 따라했는데 실행시켜보면 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: jakarta/xml/bind/JAXBException 이런 에러가 뜨네요. 뭐가 문제일까요..?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
김현우 댓글 2 좋아요 0 조회수 678

21:59에 lazy 초기화 오류

해결됨

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 21:59초에 영상 내용을 따라 Lazy 초기화 후에 포스트맨을 검색해보았는데 출력이 되지 않고 오류가 떠서 질문드립니다.. 오류를 보아하니 무한루프가 돌아가는것 같은 느낌도 듭니다.. 오류내용 java.lang.IllegalStateException: Cannot call sendError() after the response has been committed 2023-10-24 12:44:32.150 ERROR 46125 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> jpabook.jpashop.domain.Delivery ["order"]->jpabook.jpashop.domain.Order["delivery"]-> initDb package jpabook.jpashop; import jpabook.jpashop.domain.*; import jpabook.jpashop.domain.Item.Book; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import javax.persistence.EntityManager; @Component @RequiredArgsConstructor public class InitDb { private final InitService initService; @PostConstruct public void init() { initService.dbInit1(); initService.dbInit2(); } @Component @Transactional @RequiredArgsConstructor static class InitService { private final EntityManager em; public void dbInit1() { Member member = createMember("userA", "서울", "1", "1111"); em.persist(member); Book book1 = createBook("JPA1 BOOK", 10000, 100); em.persist(book1); Book book2 = createBook("JPA2 BOOK", 20000, 100); em.persist(book2); OrderItem orderItem1 = OrderItem.createOrderItem(book1, 10000, 1); OrderItem orderItem2 = OrderItem.createOrderItem(book2, 20000, 2); Order order = Order.createOrder(member, createDelivery(member), orderItem1, orderItem2); em.persist(order); } public void dbInit2() { Member member = createMember("userB", "진주", "2", "2222"); em.persist(member); Book book1 = createBook("SPRING1 BOOK", 20000, 200); em.persist(book1); Book book2 = createBook("SPRING2 BOOK", 40000, 300); em.persist(book2); Delivery delivery = createDelivery(member); OrderItem orderItem1 = OrderItem.createOrderItem(book1, 20000, 3); OrderItem orderItem2 = OrderItem.createOrderItem(book2, 40000, 4); Order order = Order.createOrder(member, delivery, orderItem1, orderItem2); em.persist(order); } private Member createMember(String name, String city, String street, String zipcode) { Member member = new Member(); member.setName(name); member.setAddress(new Address(city, street, zipcode)); return member; } private Book createBook(String name, int price, int stockQuantity) { Book book = new Book(); book.setName(name); book.setPrice(price); book.setStockQuantity(stockQuantity); return book; } private Delivery createDelivery(Member member) { Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress()); return delivery; } } } OrderSimpleApiController package jpabook.jpashop.api; import jpabook.jpashop.domain.Order; import jpabook.jpashop.repository.OrderRepository; import jpabook.jpashop.repository.OrderSearch; import lombok.RequiredArgsConstructor; import org.aspectj.weaver.ast.Or; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * XToOne * Order * Order -> Member * Order -> Delivery */ @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepository orderRepository; @GetMapping("/api/v1/simple-orders") public List<Order> ordersV1(){ List<Order> all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); //Lazy 강제 초기화 order.getDelivery().getAddress(); //Lazy 강제 초기화 } return all; } } JpashopApplication package jpabook.jpashop; import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class JpashopApplication { public static void main(String[] args) { SpringApplication.run(JpashopApplication.class, args); } @Bean Hibernate5Module hibernate5Module(){ Hibernate5Module hibernate5Module = new Hibernate5Module(); return hibernate5Module; } } 코드도 같이 올렸습니다.. 무엇이 다른건지 잘 모르겠습니다..

  • java
  • spring
  • spring-boot
  • jpa
한창훈 댓글 1 좋아요 0 조회수 477

Environment#getProperty() 호출 시 application.properties의 요소보다 systemEnvironment의 요소를 우선적으로 읽는 문제

미해결

스프링 부트 - 핵심 원리와 활용

[문제 상황] Environment 스프링 빈 객체 env가 있습니다. env.getProperty("username"); 호출 시 "admin"이 출력됩니다. 이는 application.properties 에서 지정하지 않은 값입니다. 디버그 모드로 찾아본 결과 Environment 객체가 application.properties 파일보다 systemEnvironment에 저장된 값을 더 우선적으로 가져오는 것 같습니다. - 아래 사진 참고 application.properties 파일 url=local.db.com username=local_user password=local_pw #--- spring.config.activate.on-profile=dev url=dev.db.com username=dev_user password=dev_pw #--- spring.config.activate.on-profile=prod url=prod.db.com username=prod_user password=prod_pw Environment#getProperty("username"); 실행 결과 [질문] systemEnvironment는 어디에 저장된 값인가요. systemEnvironment보다 application.properties 가 더 좁은 범위니까 더 우선순위가 높아야 되는 거 아닌가요? systemEnvironment가 우선적으로 읽힌 원인(원리)이(가) 궁금합니다. 어떻게 해야 application.properties 파일의 값을 제대로 읽을 수 있나요.

  • spring
  • spring-boot
  • environment
  • systemenvironment
오종화 댓글 2 좋아요 0 조회수 1033

@Rollback(value = false)을 설정해야 sql문이 로깅되나요?

해결됨

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] @Test @Transactional @Rollback(value = false) public void testMember() throws Exception { //given System.out.println("given"); Member member = new Member(); member.setUsername("memberA"); //when System.out.println("when"); Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); //then System.out.println("then"); Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); Assertions.assertThat(findMember).isEqualTo(member); } 위의 코드에서 @Rollback(value = false) 없이 돌렸을때, given when 2023-10-23T22:09:28.313+09:00 DEBUG 13164 --- [ main] org.hibernate.SQL : select next value for member_seq then @Rollback(value = false) 을 넣고 돌렸을 때, given when 2023-10-23T22:10:13.319+09:00 DEBUG 18292 --- [ main] org.hibernate.SQL : select next value for member_seq then 2023-10-23T22:10:13.456+09:00 DEBUG 18292 --- [ main] org.hibernate.SQL : insert into member (username,id) values (?,?) 위와 같이 출력됩니다. 이 현상에 대해 제가 생각하는 원인은 다음과 같습니다. 트랜잭션이 커밋될 때 (특정 상황 제외), 영속성 컨텍스트의 sql문들이 DB로 전송되므로, @Rollback(value = false) 없는 상태에선 저장된 sql문들이 전달되지 않고 메모리에서 삭제되는 것으로 추론하고 있습니다. 저의 생각이 맞는지 궁금합니다.

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
최성민 댓글 1 좋아요 1 조회수 457

Spring Initializr 스프링 버전

해결됨

쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS

강의에서 Spring Boot 3.0.6 버전 선택하라고 하시는데 지금 Spring Initializr 사이트에 3.0.6 버전이 없네요. 어떤 걸 선택하면 될까요?

  • spring
  • git
  • docker
  • spring-boot
  • jpa
  • github
alice 댓글 1 좋아요 0 조회수 306

catalina.out 로그 파일이 생성되지 않습니다.

미해결

스프링 부트 - 핵심 원리와 활용

war 빌드와 배포 강의를 따라 catalina.out 로그 파일을 확인하려고 하는데 해당 파일이 없습니다. 어떻게 확인할 수 있을까요?

  • spring
  • spring-boot
  • prometheus
fkdldjs 댓글 1 좋아요 0 조회수 1547

전역 에러 처리 메시지 관리

미해결

생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의에 보면 enum에 TEST라고 하시고 에러메시지를 정적으로 입력하셨는데 , 메시지properties로 따로 관리하는 방법은 없을까요? TEST(HttpStatus.INTERNAL_SERVER_ERROR,"001",messageSource.getMessage("001")), 001 = "business Exception test" 돌아가는 코드는 아니지만 이런식으로 답변 주시면 감사하겠습니다

  • spring-boot
  • jpa
  • web-api
vnfthr 댓글 2 좋아요 0 조회수 659

category item 관련 질문

해결됨

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 다대다 연관관계가 안좋다해서 중간 엔티티로 categoryitem을 만들어서 해보고있는데 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: Shop.ShopingMall.domain.Category.category_item in Shop.ShopingMall.domain.CategoryItem.categories 이러한 오류가 떴습니다.. 해결방법이 뭘까요?? 코드는 다음과 같습니다 package Shop.ShopingMall.domain; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Category { @Id @GeneratedValue @Column(name = "category_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "category_item_id") private CategoryItem categoryItem; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parent_id") private Category parent; @OneToMany(mappedBy = "parent") private List<Category> child = new ArrayList<>(); } package Shop.ShopingMall.domain; import Shop.ShopingMall.domain.Item.Item; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class CategoryItem { @Id @GeneratedValue @Column(name = "category_item_id") private Long id; @OneToMany(mappedBy = "category_item") private List<Category> categories = new ArrayList<>(); @OneToMany(mappedBy = "category_item") private List<Item> items = new ArrayList<>(); } package Shop.ShopingMall.domain.Item; import Shop.ShopingMall.domain.CategoryItem; import lombok.Getter; import lombok.Setter; import javax.persistence.*; @Entity @Getter @Setter public class Item { @Id @GeneratedValue @Column(name = "item_id") private Long id; private String name; private int price; private int stockQuantity; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "category_item_id") private CategoryItem categoryItem; }

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
한창훈 댓글 1 좋아요 0 조회수 437

일대일 관계에서의 연관관계의 주인

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 연관관계의 주인을 외래키에 두라고 하신말씀은 알겠습니다.그것이 일대다 인경우는 자동차와 바퀴의 예를 들면서 말씀해주셔서 알겠는데 1대1관계의 경우 어느쪽이 외래키라고 할수 있는걸까요? 오더와 딜리버리의 경우에 오더가 관계의 주인이 되었는데 왜? 라고 물으면 잘 모르겠습니다 만약에 예를들어 유저와 유저정보간의 관계가 있다면 그경우의 연관관계의 주인은 어떤것일까요? 기준을 좀만 더 정확하게 알려주셨으면 좋겠습니다...

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
한창훈 댓글 1 좋아요 0 조회수 448

인기 태그

인프런 TOP Writers

주간 인기글