월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
onetomany 관계인 엔티티의 속성을 필터링에 사용하는것에 대해서
안녕하세요 강사님 강사님의 강의 잘듣고있습니다. 강사님의 강의를 듣고 프로젝트 진행중 고민인 부분이 있어 질문남깁니다!전체는 아니지 대략적인 erd 부분입니다.게시물에 달려있는 태그, 게시물 제목 등으로 필터링 하는 상황입니다. 또한 "게시물" 엔티티와 "게시물_태그" 엔티티가 양방향으로 되어있습니다.궁금한점이 게시물에 있는 태그를 조건으로 필터링할때 아래 두방식중 어떠한 방식이 적합합니까? 아니면 더좋은 방법이 있으시다면 어떤것이 있는지 여쭈어봐도 되나요?!게시물 테이블에 태그를 제외한 나머지 조건으로 필터링한 후 결과 게시물들의 "게시물_태그" 프록시 객체를 초기화하면서 태그 조건에 만족하는 게시물을 필터링하는 방법"게시물_태그" 테이블에서 태그조건을 가진 게시물들을 먼저 찾은후(찾은후 group등을 이용) 나머지 조건사용해서 필터링하기읽어주셔서 감사합니다!!!
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
12분09초
return new Result(collect);Result<T> 리절트에 <>안해주고 위에처럼 그냥 써도 상관없나요?어느 블로그에서 "간혹가다 책에서 Object형을 암시적으로 받는다고 적혀있는 경우가 있는데 단언컨데 Object형을 받지 않습니다."라고 나와있는데 굳이 이렇게 코드를 짠 이유가 뭘까요??
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA LOCK 구현 질문 드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 강사님 동시간대 몇시 몇분 몇초대 대에 동일한 json 메세지 api 호출 받는경우이중으로 오더번호가 채번되는 문제가 있습니다(해당 오더요청 json 메세지에는 오더마스터 + 오더디테일 항목으로 구성이 되어 있고 오더요청 list 가 배열로 수백, 천건이 넘어 갈수 가 있습니다 )동시간대 몇시 몇분 몇초대 대에같은 오더 요청 json 메세지 받고 여러 쓰레드 처리시 락을 걸고 처리하면서 같은 요청 메세지는 발라 주어야 합니다강사님 책중에 낙관적락, 비관적락 부분을 참고해서프로그램에 반영해서 테스트해보니 많이 헤멨는데요결국은 jpa 비관적 락 + db 트리거 동시 적용해서 해결했는데요 1.비지니스 로직이나 업무요건에 따라 다르겠지만 강사님이 이라면 이런 케이스에는 어떤식으로 처리하실까요? 비관적락, 낙관적락? 2.강사님이 경험하신 사례에 jpa 락(낙관,비관) + db 트리거 를 같이 사용하신 적도 있나요? (제가 구현한 방법이 최선인가 의문의 들어서 질문 드립니다 )
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA 여러 테이블 Join
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요? 강의 수강 잘 하고 있습니다.원하는 내용 : 총 3개의 테이블에서의 JOIN 쿼리를 사용해야하는데, JPA 에서도 이부분이 가능한지 문의드립니다. 쿼리 : select ufile.UPLOAD_DATE, ufile.ORIGIN_FILE_NAME, ufile.STATUS, ufile.DESC, ufile.AVAILABLE_COUNT, ufile.DOWN_COUNT, master.FID, DATEADD('DAY', ?, ufile.UPLOAD_DATE ) AS validDatefrom UPLOAD_FILE ufileleft join UPLOAD_INFO info on ufile.UPLOAD_INFO_ID = info.IDleft join FILE_MASTER master on ufile.FID = master.FID where info.USERID = ? and ufile.UPLOAD_DATE > DATEADD('DAY',-?, CURRENT_DATE) JPA 로 테이블은 각각 객체로 만들었습니다.모든 테이블의 관계를 생성한 것은 아니지만 위 쿼리의 테이블은 관계 명시를 해놨습니다.? 에 해당 하는 것은 하나는 입력값, 다른 하나는 특정 테이블의 값을 가져오는 것이서 호출 시점에 동적으로 변경됩니다. JPA 에서 JOIN 하는 부분에 대한 예제가 있을까요?인프런 이외 구글링을 해도 정확히 원하는 내용이 없어 문의드립니다. 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의와 관련하여 궁금한게있습니다~!
엔티티로 직접 요청을 처리하지말고 별도의 dto를 만들어서 요청을 처리하는게 좋다고말씀해주셨는데! 실무의 경우 api별로 dto를 만들때 내부클래스로 선언해서 사용할까요? 아님 패키지에 따로 dto를 만들어서사용할까요!!그리고 추가적으로 혹시 선생님 spring mvc강좌 restapi관련된 강좌가있을까요!?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강제초기화 후, hibernate5Module 미주입시 오류에 대해
@SpringBootApplication public class JpashopApplication { public static void main(String[] args) { SpringApplication.run(JpashopApplication.class, args); } //@Bean // Hibernate5Module hibernate5Module() { // Hibernate5Module hibernate5Module = new Hibernate5Module(); // return hibernate5Module; // } }hibernate5Module을 의존성 추가하지 않고강제초기화를 해보았는데 오류가 나더라구요.강제 초기화를 했고 sql문은 나갔을텐데 오류가 나는게 의아하더라구요.@GetMapping("/api/v1/simple-orders") public List<Order> ordersV1() { List<Order> all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName();//강제 초기화 order.getDelivery().getAddress(); } return all; }디버깅을 해보았는데Member와 Delivery의 sql이 나가고return에서 오류가 나더라구요.order->프록시->영속성컨택스트로 이어지고강제초기화를 해서 Member와 Delivery는 영속성 컨택스트에 담겼지만return에서 Order의 Member와 Delivery에는 프록시값이 가리키는 영속성컨택스트가 아닌, 프록시까지만 json으로 변환하기때문에 오류가 난다고 생각하는게 맞는 걸까요?그리고 그 프록시를 영속성컨택스트로 바꿔서 변환해주는게 hibernate5Module의 역할이라고 보면 될까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
주문 조회 v2에서 에러가 발생 & 궁금한 점이 있습니다
안녕하세요.주문 조회 V2("api/v2/orders")에서 코드를 작성하고 포스트맨을 실행시켰는데 에러가 발생합니다.datatype jackson hibernate5 모듈은 설치하지 않았습니다.@Entity @Table(name = "orders") // 관례 @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDate; // 주문 시간 @Enumerated(EnumType.STRING) private OrderStatus status; // 주문 상태 [ORDER, CANCEL] } @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class OrderItem { @Id @GeneratedValue @Column(name = "order_item_id") private Long id; @JsonIgnore @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; @JsonIgnore @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order; private int OrderPrice; // 주문 가격 private int count; // 주문 수량 } @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "dtype") @Getter @Setter public class Item { @Id @GeneratedValue @Column(name = "item_id") private Long id; private String name; private int price; private int stockQuantity; @ManyToMany(mappedBy = "items") private List<Category> categories = new ArrayList<>(); } @RestController @RequiredArgsConstructor public class OrderApiController { private final OrderRepository orderRepository; @GetMapping("/api/v2/orders") public List<OrderDto> orderV2() { List<Order> orders = orderRepository.findAllByString(new OrderSearch()); List<OrderDto> collect = orders.stream() .map(o -> new OrderDto(o)) .collect(Collectors.toList()); return collect; } @Data static class OrderDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; private List<OrderItem> orderItems; public OrderDto(Order order) { orderId = order.getId(); name = order.getMember().getName(); orderDate = order.getOrderDate(); orderStatus = order.getStatus(); address = order.getDelivery().getAddress(); // order.getOrderItems().stream().forEach(o -> o.getItem().getName()); // 프록시 초기화 orderItems = order.getOrderItems(); } } } 포스트맨 실행시, 결과가 아래처럼 출력됩니다.[ { "orderId": 4, "name": "userA", "orderDate": "2022-09-19T19:28:18.294267", "orderStatus": "ORDER", "address": { "city": "서울", "street": "1", "zipcode": "1111" }, "orderItems": [ { "id": 6, "count": 1, "orderPrice": 10000, "totalPrice": 10000 }, { "id": 7, "count": 2, "orderPrice": 20000, "totalPrice": 40000 } ] }, { "orderId": 11, "name": "userB", "orderDate": "2022-09-19T19:28:18.333162", "orderStatus": "ORDER", "address": { "city": "부산", "street": "2", "zipcode": "2222" }, "orderItems": [ { "id": 13, "count": 3, "orderPrice": 20000, "totalPrice": 60000 }, { "id": 14, "count": 4, "orderPrice": 40000, "totalPrice": 160000 } ] } order.getOrderItems().stream().forEach(o -> o.getItem().getName());를 프록시를 초기화시키는 부분이라고 이해했는데, 해당 부분을 주석처리하거나 안하거나 결과가 똑같이 출력됩니다. 이유를 모르겠는데, 어디선가 프록시가 초기화가 된걸까요..?orderItem 값 자체가 아니라 프록시 객체를 초기화하는게 맞..죠..ㅠㅠ?!그리고 강의와 다르게 item에 대한 정보가 출력되지 않는데, 혹시 datatype jackson hibernate5 모듈을 설치하지 않았기 때문에 발생하는 문제인가요? ('간단한 주문 조회 V2'에서는 강의와 똑같이 출력되었어서 문제가 뭔지 모르겠습니다.) 또, OrderItem.item에 @JsonIgnore을 추가하지 않을 때 아래와 같은 에러가 발생하는데, 지연 로딩에 의한 에러가 맞나요? (OrderItem과 Item 엔티티가 양방향 매핑이 아닌데.. '간단한 주문조회 V1' 강의에서 양방향 매핑에서 발생했던 에러 메세지와 비슷해보여서 질문드리게 되었습니다.)지연 로딩이 맞다면, order.getOrderItems().stream().forEach(o -> o.getItem().getName());에서 o.getItem().getName()에 의해 item에 대한 쿼리를 날리게 되어 이 부분이 해결되지 않나 싶은데 제가 틀리게 이해한건가요ㅠㅠ?com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->jpabook.jpashop.API.OrderApiController$OrderDto["orderItems"]->org.hibernate.collection.internal.PersistentBag[0]->jpabook.jpashop.Domain.OrderItem["item"]->jpabook.jpashop.Domain.Item.Item$HibernateProxy$Hp0g9cdN["hibernateLazyInitializer"])at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.13.3.jar:2.13.3]에러를 해결할 수 있는 방법도 궁금합니다. OrderDto에서 items를 따로 추가해 order.getOrderItems().getItem()들을 출력해보려고 했는데 방법이 틀린건가요? (위에 forEach문을 보면 해당 방법을 통한 접근이 가능한 것 같아서 시도해봤습니다..!)
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
BatchSize 조회 관련건
안녕하세요. 먼저 항상 좋은 강의 감사드립니다.realworld라는 프로젝트를 JPA로 구현하는 도중에 궁금한 점이 생겨서 질문 드립니다.@OneToMany List<ArticleTagEntity> articleTagsArticleEntity는 위의 ArticleTagEntity를 갖고 있습니다. (Lazy 설정 되어있습니다.) 저는 application.yml에 default_batch_fetch_size를 500으로 설정해놓고... ArticleEntity 조회 로직 ... List<ArticleTagEntity> articleTagList = articleEntity.getArticleTags(); articleTagList.forEach(articleTag -> ....);다음 부분에서 WHERE IN 절 쿼리가 나가는데요, ArticleEntity 조회 로직에서 조회된 ArticleEntity의 개수는 총 12개입니다. 그렇다면 batch_size를 500으로 설정해놨으니 WHERE IN 절에서 article_id가 12개가 모두 바인딩되서 나가는 것을 기대했는데 실제로는 그렇지 않고 10개 나간뒤 반복문을 돌다가 2개가 다시 나가는 쿼리가 발생했습니다.Hibernate: select articletag0_.article_id as article_4_1_1_, articletag0_.uid as uid1_1_1_, articletag0_.uid as uid1_1_0_, articletag0_.created_at as created_2_1_0_, articletag0_.updated_at as updated_3_1_0_, articletag0_.article_id as article_4_1_0_, articletag0_.tag_id as tag_id5_1_0_ from article_tag articletag0_ where articletag0_.article_id in ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) .... .... ... for문을 쭉 돌다가... Hibernate: select articletag0_.article_id as article_4_1_1_, articletag0_.uid as uid1_1_1_, articletag0_.uid as uid1_1_0_, articletag0_.created_at as created_2_1_0_, articletag0_.updated_at as updated_3_1_0_, articletag0_.article_id as article_4_1_0_, articletag0_.tag_id as tag_id5_1_0_ from article_tag articletag0_ where articletag0_.article_id in ( ?, ? )구글링을 해보니 batch_size를 큰 값으로 설정했어도 반드시 그 사이즈로 WHERE IN절에 데이터가 바인딩 되는 것이 아니라 하이버네이트 내부적으로 조정할 수도 있다고 하는데 해당 말이 맞는건지, 제가 무언가를 잘못한건지 궁금합니다. TRACE 로그를 확인해봤는데 ArticleEntity 조회 로직에서2022-09-17 22:38:32.511 TRACE 8458 --- [ Test worker] org.hibernate.type.CollectionType : Created collection wrapper: [springboot.domain.entity.ArticleEntity.articleTagEntities#88] .......................................... .......................................... 2022-09-17 22:38:32.515 TRACE 8458 --- [ Test worker] org.hibernate.type.CollectionType : Created collection wrapper: [springboot.domain.entity.ArticleEntity.articleTagEntities#1]이러한 로그가 총 12개 찍혔는걸로 봐서는 조회 시점에 프록시 객체는 모두 정상적으로 만들어 진 것으로 보입니다. 이전 질문을 찾아보니 요분과 테이블 구조는 거의 같다고 보시면 될 것 같습니다. (https://www.inflearn.com/questions/591443) 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
생성된 클래스들을 인식하지 못하고 있는것 같아서 질문 드립니다
(사진)
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OrderQueryRepository를 따로 만드는 이유
controller가 repository를 참조하게 되어서라고 하셨는데 ㅌ제가 배경지식이 없어 ㅠㅠ잘 이해가 가지 않습니다.. 조금더 구체적으로 설명 가능할까요?왜 controller가 repository를 참조하게 되는지 이해가 되지 않습니다.OrderQueryRepository를 따로 떼어내면 1번의 문제가 왜 해결되는지요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
V1, V2 실행 시 OrderItem 차이
안녕하세요.이전 강의에서 만든 v1 API와 이번 강의에서 만든 v2 API를 각각 호출해보면, 실행된 쿼리에 차이가 있는데요~v1에서는 order_items 테이블을 N번(2번) 조회하고, v2에서는 조회하지 않습니다. 이 차이가 왜 발생하는지 궁금합니다.Order의 List<OrderItem> @OneToMany 매핑 시 cascade 설정을 해두었고, v1은 Order 조회 및 lazy loading 강제 초기화 이후에 orders가 그대로 응답으로 나가는 과정에서 order_items 테이블이 조회된 걸까요?그렇다면 v2는 응답으로 사용하는 SimpleOrderDto를 생성할 때 order.orderItems를 불러오지 않기 때문에 order_items의 데이터가 필요하지 않아서 조회 쿼리가 발생하지 않은 거라고 보면 될까요? 코드는 아래와 같습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
5분50초 postman으로 GetMapping 하는 부분 에러뜹니다.
찾아봐도 답이 안보여서 해결방법 부탁드립니다. 리턴타입을 String으로 두고 테스트해보면 잘 나오는데findAllByString과 findAll 메서드만 안되는거 보니 메서드의 문제 같습니다.해당 메서드로 [실전! 스프링 부트와 JPA 활용] 1탄에서 만든 view탭은 잘 띄워지는데 여기서는 왜 에러가 날까요감사합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요.. 이때까지 강의 듣다 고민이 있어 질문드려봅니다..
안녕하세요, 지금까지 jpa 강의를 들으면서 api 개발 고급 파트에 오니 나중에 뒤에 가면 갈수록 직접 api를 만들어 봐야, 언제 이걸 쓰는지 직접 상황을 맞닥뜨려봐야 진짜 공부가 되고 체득이 될것 같이 느껴집니다.제가 정확히 잘 몰라서 그런데 api를 실무에서 사용하는것이 다른 프론트나 어플 또는 다른 프로젝트(같은 프로젝트 안에서라도) 끼리 api를 통해서 데이터를 주고 받는 용도로 사용되는 것으로 알고있습니다.그런데 개인적으로 학습하고 만들어 보는데 있어서, api를 적극 활용할 수 있는 프로젝트나 다른 방법이 어떤게 있을지 궁금합니다. 답변자님은 api 학습을 어떻게 하셨는지.. 어떤 방법이 효과적이였는지 궁금합니다.또한 api를 현재 내보내는 방식을 강의에서 다루고 있는데, 다른 외부 api를 가져와 사용하는 방법에 대해서는 어떻게 사용하며 어떤 것을 학습해야 하는지 궁금합니다.조금 과한 질문일수도 있으나, 다소 막막해서 여쭤봅니다..항상 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
dto에 대해 질문하고 싶습니다
스프링 부트로 RestAPI를 개발하고 있습니다.한가지 질문하고 싶은게 있습니다.리퀘스트로 받을 수 있는 값은 정해져 있지만 json에는 변경되는 값만 들어있습니다.json의 null을 별도의 값으로 간주하고 있어서null일 경우의 처리와 값이 존재하지 않을 경우(undefined) 처리가 분리되어 있습니다. 이런 경우에 깔끔하게 해결할 수 있는 방법이 있을까요?? 예를 들어서 아래와 같은 리퀘스트를 받는 경우에class StudentDto { String name; (필수값) String age; String hobby;} JSON은 다음의 3 경우가 있습니다.{ "name": "hong gil-dong", "age": 20, "hobby": "도둑질"}위 경우 모든 값이 들어오기 때문에 그냥 세이브나 업데이트를 하면 됩니다.{ "name": "hong gil-dong", "age": 20}위 경우 hobby 필드가 없기 때문에 hobby는 db의 값을 그대로 유지합니다.{ "name": "hong gil-dong", "age": 20, "hobby": null}위 경우 모든 필드를 세이브나 업데이트 합니다. (hobby는 null을 넣음)문제는 이때 undefined일 경우 처리하는 로직과, null 일 경우 처리하는 로직이 분리되어 있습니다.현재 사용하고 있는 방법은 setter는 값이 있을 경우(null도 해당)에만 움직인다는 점을 이용해서class StudentDto { String name; String age; String hobby; boolean hasName; boolean hasAge; boolean hasHobby; public void setHasHobby() { this.hobby = hobby; this.hasHobby = true; }} 이런식으로 리퀘스트 오브젝트 내에 세터를 둔 다음if (studentRequest.getHasHobby()) { ... }이렇게 조건으로 체크하고 있습니다... 안좋은 처리인 줄은 알지만 이렇게 만들어져 있어서 어쩔 수 없네요... 이런 경우 깔끔한 해결 방법이 있을까요? dto 대신 Map<String, Object> 를 사용하면 비슷하게 처리가 될 것 같은데문제가 있을 것 같아서 dto나 라이브러리 등으로 해결할 수 있는지 알고 싶습니다감사합니다
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Transactional 질문드립니다!
중복된 질문일 수도 있지만..궁금해서 질문드려봅니다. orderService가 아닌 orderRepository에서 findAllByString을 호출하는 이유가 궁금합니다.entity manager는 transaction 안에서만 호출이 되는 것으로 알고 있고, @Transactional이 tx.begin과 tx.commit을 대신하는 역할로 알고 있는데, 정리하자면Transactional이 붙어있지 않은 orderRepository에서 entity manager를 통해서 값을 조회해 오는것이 오류가 발생하지 않는 이유가 궁금합니다.transactional 없이 쿼리가 되더라도 왜 orderService가 아닌 orderRepository를 사용하는지 이유 또한 궁금합니다. 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
generated 에 Q파일들이 생성이 안 됩니다.
안녕하세요!. 열심히 JPA 로드맵 강의를 듣고 있습니다.다름아니라 제 스프링부트 버전이 2.7.3 이라서 그런건지강의자료에 있는 build.gradle 내용을 작성했는데 generated 안에 Q파일들이 생성이 안 됩니다. 강의화면과는 다르게오류라기 보다는 --warning이 나오긴 하더라구요. 이 것의 원인이 뭘까요??일단 제 실습 프로젝트 압축파일 구글 드라이브 링크 공유합니다.https://drive.google.com/file/d/1uSzjHha55_pzcUx-l32Y46KTOR3T8vVs/view?usp=sharing
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
defined in @EnableJpaRepositories 오류
안녕하세요 강사님!강사님의 스프링과 jpa 강의를 듣고 프로젝트를 만드는 중인 학생입니다. 다름이 아니라 따로 좋아요 기능을 추가해서 학습한 내용을 바탕으로 제작 중인데 Error creating bean with name 'likeApiController' defined in file [/Users/gimnayeon/Desktop/GreenProject/GrinGreen/out/production/classes/com/grin/GrinGreen/api/LikeApiController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'likeService' defined in file [/Users/gimnayeon/Desktop/GreenProject/GrinGreen/out/production/classes/com/grin/GrinGreen/service/LikeService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'likeRepository' defined in com.grin.GrinGreen.repository.LikeRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.Optional com.grin.GrinGreen.repository.LikeRepository.findBybusiness(com.grin.GrinGreen.domain.Member,com.grin.GrinGreen.domain.Business)! Reason: Failed to create query for method public abstract java.util.Optional com.grin.GrinGreen.repository.LikeRepository.findBybusiness(com.grin.GrinGreen.domain.Member,com.grin.GrinGreen.domain.Business)! At least 2 parameter(s) provided but only 1 parameter(s) present in query.; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.Optional com.grin.GrinGreen.repository.LikeRepository.findBybusiness(com.grin.GrinGreen.domain.Member,com.grin.GrinGreen.domain.Business)! At least 2 parameter(s) provided but only 1 parameter(s) present in query. 라는 오류가 뜹니다. LikeRepository@Transactional(readOnly = true) public interface LikeRepository extends JpaRepository<Like, Long> { Optional<Integer> countBybusiness(Business business); Optional<Like> findBybusiness(Member member, Business business); }business entity@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "mail") private Member member; @OneToMany(mappedBy = "business", cascade = CascadeType.ALL) Set<Like> likes = new HashSet<>();member entity@OneToMany(mappedBy = "member", cascade = CascadeType.ALL) private List<Business> business = new ArrayList<>(); @OneToMany(mappedBy = "member", cascade = CascadeType.ALL) Set<Like> likes = new HashSet<>();like entity@Id @GeneratedValue @Column(name = "like_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) private Member member; @ManyToOne(fetch = FetchType.LAZY) private Business business; public Like(Business business, Member member) { this.business = business; this.member = member; } 처음에는 jparepository에서 findBy 이후 대문자를 쓴 게 문제였나 싶어 수정을 했지만 아니었고파라미터의 Id처럼 대문자로 쓰여진 게 문제인가 봤지만 해당 사항이 없었습니다..아무리 강의를 돌려봐도 감이 안 잡히는 데 어디 부분의 문제일까요?ㅠㅠ파라메터 값이 2개인데 1개만 받아졌다는 오류인 것도 같습니다....
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
5:05초 경 orderItems 에 null이 아닌 정상값이 조회가 됩니다.
제가 실습하면서 작성한 코드는 아래와 같은데 강의를 보면 oderItems에 null 이 나와야하는데 왜 제 포스트맨에서는 orderItems에 값이 정상적으로출력되는지 궁금합니다. 제가 혹시 어떤 부분을 놓치고 있을까요? @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(Collectors.toList()); return collect; } @Getter static class OrderDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; private List<OrderItem> 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(); } } 제 포스트맨 실행화면 결과입니다. 혹시몰라서 제 코드도 zip파일로 구글드라이브 공유합니다.https://drive.google.com/file/d/1_VSaP1n75vimxDH5dLF58GTtvvnJgu60/view?usp=sharing
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO 질문
안녕하세요 강의를 듣고 혼자서 프로젝트를 작성해보다가 궁금한 점이 생겨서 글을 남기게 되었습니다. controller 에서 @RequestBody XXXDto 로 json 데이터를 넘겨받고 validation 처리를 하여 제약을 주었습니다. 그리고 이 데이터를 service 계층의 메서드 호출할때 넘기려 하는데 XXXDto 에 데이터 종류가 많아서 메서드에 하나하나 나눠서 넣기보다는 Dto 형태로 전달하려 합니다. 하지만 전에 영한님께서 controller 계층에서 service 계층에 접근하는 형태는 되지만 반대의 경우는 의존성적 측면 등 이유로 안된다고 하셨던게 기억이 나서 service 계층(패키지)에 YYYDTO 를 새로 만들고 controller 에서 XXXDto 를 YYYDto 로 변환하고 service 계층 메서드에 인자로 넘겨주는 형태로 작성했습니다. 이렇게 작성하는게 맞을까요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
v3에서 Order은 영속상태인가&트랜잭션
orderV3 메서드를 보면 orderRepository.findAllWithItem(); 은 List<Order>를 반환합니다. 이때 Order은 영속상태인가요?1번과 연관된 질문입니다.만약 Order이 영속상태라면 트랜젝션은 어느시점에 열린건가요? orderV3 메서드나 OrderApiController 클래스 모두 @Transactional 이 보이지 않습니다. 만약 생략 되었다면 어느 경우에 @Transactional 이 생략되어도 트랜젝션이 열리는 것인지 궁금합니다.2번 질문의 경우 JPA책의 578쪽을 보면 '스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다' 라 적혀 있는데 트랜잭션이 없다면 영속성 컨텍스트가 열릴 수 있는지 궁금했습니다.