30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
현재 상황에서 OrderItem에 대한 조회가 왜 일어나는 지 잘 모르겠습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네3. 질문 잘하기 메뉴얼을 읽어보셨나요?네[질문 내용] 안녕하세요 영한 선생님!! 강의 잘 보던 중 의문이 생겨 질문이 드립니다. /api/v3.1/orders를 만드는 과정에서 (batch size 적용) batch size 적용 후 OrderItem에 대해 쿼리가 나가는 시점(Lazy가 적용이 되는 것인지)을 명확하게 모르겠어서 도메인을 DTO로 변환하지 않고 직접 도메인을 반환하도록 약간의 수정을 해봤는데요! api 코드입니다. @GetMapping("/api/v3.1/orders") public List<Order> ordersV3_page( @RequestParam(value="offset", defaultValue = "0") int offset, @RequestParam(value="limit", defaultValue = "100") int limit ) { List<Order> orders = orderRepository.findAllWithMemberDelivery(offset, limit);// List<OrderDto> collect = orders.stream()// .map(o -> new OrderDto(o))// .collect(Collectors.toList()); return orders; } Repository 코드입니다. public List<Order> findAllWithMemberDelivery(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();} /api/v3.1/orders 조회 쿼리입니다. 조회 response입니다. [ { "id": 4, "member": { "id": 1, "name": "userA", "address": { "city": "서울", "street": "1", "zipcode": "1111" } }, "orderItems": null, "delivery": { "id": 5, "address": { "city": "서울", "street": "1", "zipcode": "1111" }, "status": null }, "orderDate": "2022-01-19T20:14:36.130898", "status": "ORDER", "totalPrice": 30000 }, { "id": 11, "member": { "id": 8, "name": "userB", "address": { "city": "진주", "street": "2", "zipcode": "2211" } }, "orderItems": [ { "id": 13, "item": null, "orderPrice": 20000, "count": 2, "totalPrice": 40000 }, { "id": 14, "item": null, "orderPrice": 80000, "count": 4, "totalPrice": 320000 } ], "delivery": { "id": 12, "address": { "city": "진주", "street": "2", "zipcode": "2211" }, "status": null }, "orderDate": "2022-01-19T20:14:36.161899", "status": "ORDER", "totalPrice": 360000 } ] 그럼 의문 사항인데요, 도메인을 직접적으로 반환하는 과정에서 1. OrderItem에 직접적으로 접근하지 않았고, Order entity에 정의된 OrderItem은 Lazy Loading인데 왜 OrderItem에 대한 조회 쿼리가 발생했는지 잘 모르겠습니다. 2. OrderItem에 대한 조회 쿼리가 발생했음에도 불구하고 왜 Order Id 11은 OrderItem이 조회가 되고 Order Id 4에 대한 OrderItem은 여전히 Null로 조회되는지 잘 모르겠습니다. 소스 코드 링크입니다. (문제 상황이 도출되도록 수정이 되어있습니다.) https://drive.google.com/file/d/1cLs3su4q1R2iIJPAe3K9pral-SqhMKk9/view?usp=sharing 포스트맨을 통해 /api/v3.1/orders 를 실행했을 때 일어나는 현상입니다. 답변주시면 감사하겠습니다!!! 강의 내용이 너무 도움이 되고 있습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
ManyToOne에서 @BatchSize가 동작하지 않습니다 ㅠㅠ
안녕하세요. 항상 좋은 강의, 답변 주셔서 감사합니다. 이번에 여쭤보고 싶은 것은 @BatchSize가 동작하지 않는 부분에 대해서입니다. <Order의 OrderItems> BatchSize 100 설정 @BatchSize(size = 100)@OneToMany(mappedBy = "order", fetch = FetchType.LAZY, cascade = CascadeType.ALL) // order가 만들어지면 orderItem이 만들어지기 때문에 영속성 전이한다.private List<OrderItem> orderItems = new ArrayList<>(); <OrderItems의 Item> BatchSize100 설정 @BatchSize(size = 100)@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "item_id")private Item item; 위와 같이 설정을 했는데, 실제로 배치가 적용되는 것은 아래 쿼리를 확인하시면 아시겠지만 OrderItems에만 적용이 됩니다. item는 배치 사이즈가 적용이 되지 않아 총 4번이 나가게 되고, OrderItem은 배치 사이즈가 적용되어 1번의 쿼리만 나갑니다. 다른 엔티티에도 적용해보니 정황상 ManyToOne, OneToOne 관계에서 배치 사이즈가 안 먹는거 같은데.. 혹시 item 같은 ManyToOne에는 어떻게 배치 사이즈를 적용하는지 알려주시면 감사하겠습니다 참고 :글로벌 배치 사이즈는 잘 먹습니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
jpql 페치조인
안녕하세요 영한님 감사합니다 첫번째 : new 명령어를 사용해서 JPQL의 결과를 DTO로 즉시 반환하면 SELECT 절에서 원하는 데이터를 직접 선택하므로 네트워크 용량을 최적화 할수 있다고 해주셨는데 뒤로 돌아가서 JPQL 페치조인도 마찬가지로 원하는 데이터를 직접 선택해 보고싶어서 이런식으로는 못하나요 ? 테스틀 해봤는데 에러가 나서 질문드립니다. ======================================== 두번쨰 : 18:40 설명은 xToOne 관계에선 페치조인이 필요 없다고 이해 하면 되는거죠 ???
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
In 사용한 최적화 질문이 있습니다.
안녕하세요! 항상 좋은 답변 주셔서 감사합니다. 이번에 여쭤보고 싶은 것은 In 사용한 최적화 쿼리 관련 질문입니다. In을 사용하는 것이 BatchSize로 LazyLoading을 불러올 때와 흡사한 컨셉을 적용해서 가져오는 것이라고 저는 이해를 하고 있는데요! List<OrderItemQueryDto> orderItems = em.createQuery( "select new jpabook.jpashop.repository.order.query.OrderItemQueryDto(oi.order.id, i.name, oi.orderPrice, oi.count)" + " from OrderItem oi" + " join oi.item i" + " where oi.order.id in :orderIds", OrderItemQueryDto.class) .setParameter("orderIds", orderIds) .getResultList(); 그런데 이렇게 In절로 넣는 PK값이 여러개면 관련이 없지만, 수천만개가 된다면... 한번에 불러오기가 좀 힘들 것 같다는 생각이 듭니다. 이럴 때는 보통 어떻게 최적화가 이루어지는지 여쭈어 보고 싶습니다. 제 머리로는 BatchSize가 대신해주는 일을 사람이 해야한다고 생각하기 때문에 List를 100개 단위로 슬라이싱 해서 각각 불러와주고, 이 리스트들을 합쳐야하지 않나 싶은데... 어떻게 대응을 해야할지 궁금합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
영속성 컨텍스트와 DB 커넥션 관련 질문 드립니다!
안녕하세요. 항상 좋은 답변 주셔서 감사합니다. 영속성 컨텍스트와 DB 커넥션 관련 문의 드리고 싶은 것이 있어 글을 적습니다. 영한님께서 강의 중간에 영속성 컨텍스트가 계속 연결되면 DB 커넥션이 마른다고 말씀을 해주셨습니다. 그러시면서 OPEN SESSION IN VIEW의 단점이 될 수 있다고도 말씀을 해주셨습니다. 저는 지금까지 트랜잭션을 타는 순간만 DB와 커넥션을 가진다고 생각을 했었는데, 영속성 컨텍스트가 유지되는 순간이 이미 DB와 계속 연결이 이어지고 있는 상황으로 이해를 하면 될까요? 항상 좋은 답변 감사드립니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
이후 커리큘럼에 대해 조언 주시면 감사하겠습니다!
안녕하세요 영한님. 항상 좋은 답변 주셔서 감사합니다. 영한님 강의를 듣기 시작한지도 2개월이 넘은 것 같습니다 그동안 회사 다니면서 커리어 전환하겠답시고 끙끙 거리면서 노력해왔는데, 영한님 강의 덕분에 어렵지만 그나마 쉽게 잘 진행하고 있는 것 같습니다. 먼저 감사 인사드리고 싶습니다. 제가 영한님의 강의를 노베이스에서 다음과 같이 들어왔습니다. 1. 스프링 기본편 1편 2. 스프링 MVC 1편 3. 스프링 MVC 2편 4. HTTP 5. JPA 기본 6. JPA 1편 7. JPA 2편 그리고 너무 배우는게 재밌어서, 영한님 강의를 모두 수강을 해두었는데.. 회사를 다니면서 공부를 하다보니.. 모든 강의를 수강할 수가 없는 상황입니다(IT 쪽이 아닙니다) 모든 것을 완벽하게 들으면 좋겠습니다만... 영한님께 배운 내용을 실제로 구현해보는 것도 중요한 일이라고 생각(백문이 불여일타라고 하셨죠!)해서, 어느정도 슬슬 강의를 마무리 하고 프로젝트 등을 준비해보고자 합니다. 현업에 가게 되면, 그 때는 못 들었던 강의를 다 들어보고 싶습니다. 앞으로 남은 강의가 스프링 2편, 스프링 DATA JPA, QUERY DSL 정도가 남아 있습니다. 스프링 2편은 개인적으로는 꼭 들은 후에 프로젝트를 진행하고자 하는데요... 영한님께서 보시기에 스프링 DATA JPA와 QUERY DSL은 꼭 필요하다고 생각하시는지... 혹은 어떤 강의의 어떤 부분까지는 들어도 괜찮다고 생각하시는지에 대한 조언을 부탁 드릴 수 있을까요? 강의는 구매를 다 해둔 상황입니다. 강의와 관련된 질문은 아니라, 시간이 허락되신다면 가볍게라도 답변 달아주시면 앞으로 제 진로에 정말 큰 도움이 될 것 같습니다. 항상 도움 주셔서 감사합니다 좋은 하루 되세요!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
BatchSIze 동작과 관련해서 궁금한 점이 있습니다!
안녕하세요. 항상 좋은 강의, 답변 주셔서 감사합니다 BatchSize 동작과 관련해서 궁금한 부분이 있어서 글을 적습니다. @BatchSize(size = 100)@GetMapping("/api/v3.1/orders")public List<OrderDto> ordersV3_page( @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "100") int limit){ List<Order> orders = orderRepository.findAllWithMemberDelivery(offset, limit); return orders.stream() .map(order -> new OrderDto(order)) .collect(Collectors.toList());} 위 코드에서 BatchSize로 OrderItems와 Item을 불러올 때, where절에 in으로 PK가 나가는 것으로 알고 있습니다. 예를 들어 1.Order → OrderItems 지연 로딩 시, Order PK 값들이 In 절로 들어갑니다. 2. OrderItems → Item 지연 로딩 시, OrderItems PK 값들이 In 절로 들어갑니다. 궁금한 부분은 다음과 같습니다. 1. OrderItems → Item으로 갈 때, OrderItems의 PK를 넘겨서 값을 가져오는데, 이 때 쿼리를 내보내는 시점에 JPA가 어떤 PK를 넘기는 것인지 궁금합니다. 위의 코드만 본다면, 영속성 컨텍스트에서 관리하고 있는 모든 PK를 보내는 것이 아닌, stream에서 강제 로딩을 하는 PK 값들만 JPA가 보내는 것으로 이해할 수 있을 것 같습니다. 그런데 Stream은 순차적으로 접근하니, 순차적으로 접근하면 접근할 때 마다 쿼리가 나가야하는데 이를 BatchSize를 100으로 설정했기 때문에 Stream으로 활성화(?)된 PK 값들이 한방에 나간다고 이해하고 있습니다 이 때, BatchSize를 100으로 설정한다면 Stream을 돌 때 마다 DB에서 불러와야할 PK값이 영속성 컨텍스트 내의 쓰기지연 저장소에 차곡차곡 쌓여있는 것으로 이해를 하면 될까요? 그래서 Stream을 다 돌고 나면 쌓인 PK 값들에 대해 Select + where + in 절로 한번에 join 쿼리를 보내주는 것으로 이해를 하면 될까요? 만약 Stream을 다 돌렸는데 영속성 컨텍스트 내의 쓰기 지연 저장소에 필요한 PK가 200개가 쌓였다고 하면 100개를 먼저 Flush 해주고, 다시 한번 100개를 Flush 해줘서 값을 불러온다고 이해를 하면 될까요? BatchSize가 실제로 어떻게 동작하는지는 잘 나와있지 않아, 궁금하여 글을 적게 되었습니다. 항상 좋은 답변 주셔서 너무 감사합니다. 좋은 하루, 주말 되세요!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OrderItems까지 같이 조회되는 이유가 궁금합니다!
안녕하세요 항상 좋은 답변 남겨주셔서 감사합니다 OrderItems까지 같이 조회되는 이유가 궁금해서 글을 적게 되었습니다. @GetMapping("/api/v1/simple-orders")public List<Order> ordersV1() { List<Order> orders = orderService.findOrders(new OrderSearch()); orders.forEach(order -> { order.getMember().getName(); order.getDelivery().getStatus(); }); return orders;} V1 컨트롤러는 다음과 같습니다. @Entity@Getter@Setter@NoArgsConstructor@AllArgsConstructor@Table(name = "orders")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", fetch = FetchType.LAZY, cascade = CascadeType.ALL) // order가 만들어지면 orderItem이 만들어지기 때문에 영속성 전이한다. private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) private Delivery delivery; private LocalDateTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; ORDER는 다음과 같습니다. @Entity@Getter@Setterpublic class OrderItem { @Id @GeneratedValue @Column(name = "orderitem_id") private Long id; @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; ORDER_ITEM은 다음과 같습니다. 여기서 V1 컨트롤러를 통해서 쿼리를 날리면, 뒤늦게 Lazy Loading을 통해서 Order_Item들이 프록시 초기화가 되는 것처럼 나갑니다. 그런데 실제로는 프록시가 초기화도 되어있지 않습니다. 정리하면 이렇습니다 1. Order_Items는 Lazy Loading 설정이 되어있고, 프록시 객체를 강제 초기화 하는 과정도 없습니다. 그런데 왜 select 쿼리가 나가게 되는 것인지 알려주실 수 있으실까요? 2. orderItem에 대한 select 쿼리가 나갔음에도 불구하고 실제 응답에 있는 값은 null입니다. 이 경우는 어떻게 이해를 해야할까요? 항상 좋은 답변 주셔서 감사합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Transactional이 생략되는 이유가 궁금합니다
안녕하세요. 항상 좋은 답변 해주셔서 감사합니다. 이번에는 @Transactional이 생략되는 이유가 궁금해서 글을 적게 되었습니다. @GetMapping("/api/v4/simple-orders")public List<SimplerOrderQueryDto> ordersV4() { return orderSimpleQueryRepository.findOrderDtos(); } @Repository@RequiredArgsConstructorpublic class OrderSimpleQueryRepository { private final EntityManager em; public List<SimplerOrderQueryDto> findOrderDtos() { return em.createQuery( "select new jpabook.jpashop.repository.order.simplequery.SimplerOrderQueryDto(o.id, m.name, o.orderDate, o.status, d.address) from Order o" + " join o.member m" + " join o.delivery d", SimplerOrderQueryDto.class ).getResultList(); }} V4 컨트롤러를 개발할 때 궁금한 내용입니다. em.createQuery를 만들어서 dto를 바로 조회해오는 내용입니다. 제가 궁금한 부분은 @Transactional이 없어도 정상동작하는 부분입니다. 위 코드 상에는 어디에도 tx.begin() / tx.commit()이 되어있는 부분이 없는 것으로 보입니다. 따라서 트랜잭션 상태가 아니기 때문에 JPA가 DB 커넥션을 얻지 못한 상황으로 보이는데, DB에서 값을 읽어오고 있습니다. 혹시 어떤 조화로 이렇게... 트랜잭션 없이 값을 불러오는것인지.. 그리고 영속화가 되고 있는것인지를.. 알려주실 수 있으실까요? 감사합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
1:n fetch join 별칭 질문 드립니다!
가급적이면 별칭을 주지 않는게 좋다고 알고있는데 별칭을 줘도 되나요?!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
페이징 질문
안녕하세요 영한님. 21:05 봐주시면 값을 하나 끊고 나머지 3개를 가져오면 이라고 말씀하신 부분입니다. 처음 하나를 끊고 나머지 3개를 가져오면 왜 문제가 되는지가 햇갈립니다... Order_id가 4인값 을 두개를 (파랑색줄) 보시면 다른 컬럼 값 들도 존재하기때문에 두( Order_id 가 각각 4인 결과값) 값은 별개로 봐야 하는게 아닌가 해서 햇갈립니다
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
데이터 중복 과 뻥튀기 질문
안녕하세요 영한님 햇갈리는게 있어서 질문좀 드리겠습니다.. 7:10 보시면 쿼리를 실행하시는데 ORDERS 테이블 2개 -> 4개 로 뻥튀기가 되신다고 하셨습니다. 이 그림에서 ORDER_ID 가 4번 인 값만 보겠습니다. Order_Item 테이블에는 Order_ID 가 4인 값이 2개가 있습니다. 그래서 Orders 테이블과 Order_item 테이블을 order_id 가 4인 값을 조인하면 데이터가 2개가 나옵니다 (Orders 테이블 1->2 뻥튀기) 그런데 이걸 중복 이라고 보고 (9:21) distinct를 하시는데 이걸 중복-뻥튀기 라고 봐야하나요 ?? 이 부분이 햇갈립니다 왜나하면 그림에서 보듯이 (Order_id 가 4인경우만생각) order_item_id 값이 하나는 6 다른 하나는 7 등 다른 값이 존재 하는데 말입니다.. 그러므로 디비에서는 distinct 가 불가능합니다(서로 다른 컬럼 값 존재) 그런데 JPA는 ID 값만 같으면 다른 컬럼이 존재해도 그냥 같다고 생각해서 distinct를 해버리면 문제가 생기는게 아닌가요 ? 아래 그림에서 보듯이 컬럼 값이 다른데 JPA이게 distinct 가 되는지... 이해가안갑니다
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
QueryDsl compile이 EC2 인스턴스에서 되지 않습니다..
안녕하세요 QueryDsl 실습 중 에러를 해결하지 못해서 질문 드립니다. QueryDsl 을 사용하던 SpringBoot 프로젝트를 배포하고자 AWS EC2 인스턴스에서 해당 프로젝트 git clone하고 실행을 하려고 하는데 다음과 같은 오류가 납니다. 인텔리제이에서 프로젝트를 실행할 때에는 generated\querydsl 위치에 Qclass 파일들이 잘 컴파일 되었었는데 외부 인스턴스에서 실행시 해당 폴더를 찾을 수 없다고 뜨는데 이유를 모르겠네요 ㅠㅠ 아래는 제가 build.grade에서 작성한 queryDsl 관련 설정입니다. plugins { id 'org.springframework.boot' version '2.5.6' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'com.querydsl:querydsl-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' compile "com.mysema.querydsl:querydsl-jpa:3.6.3" compile "com.mysema.querydsl:querydsl-apt:3.6.3:jpa" implementation 'junit:junit:4.13.1' implementation 'org.projectlombok:lombok:1.18.18' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2:1.4.199' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation('org.slf4j:jcl-over-slf4j') implementation('ch.qos.logback:logback-classic') } test { useJUnitPlatform() } //def querydslDir = 'src/main/generated' def querydslDir = "$buildDir/generated/querydsl" // (3) querydsl { // (4) library = "com.querydsl:querydsl-apt" jpa = true querydslSourcesDir = querydslDir } sourceSets { // (5) main.java.srcDirs querydslDir } configurations { // (6) querydsl.extendsFrom compileClasspath } compileQuerydsl { // (7) options.annotationProcessorPath = configurations.querydsl } compileQuerydsl.doFirst { if(file(querydslDir).exists() ) delete(file(querydslDir)) }
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
이중 컬렉션(?)은 한 번에 조회가 불가능 할까요?
안녕하세요 영한님! 토이 프로젝트를 진행하면서 문제가 생겼는데, 해결이 안되어서 질문드리러 왔습니다😭 현재 인스타그램 클론 코딩을 하고 있는데요, 게시물을 업로드할 때, 이미지를 여러 장 추가할 수 있고, 각각 이미지에 다른 유저를 여러 명 태그를 할 수 있게 되어 있습니다. 구조를 보면, 게시물 안에 이미지 리스트가 있고, 각각 이미지 안에 태그 리스트가 존재하게 됩니다. ✅Q1. 이러한 상황에서 게시물 목록을 조회하려 할 때, 이미지와 태그도 한 번에 담아서 조회하는 방법이 있을까요? queryFactory .selectFrom(post) .leftJoin(post.postImages, postImage).fetchJoin().distinct() .leftJoin(postImage.postImageTags, postImageTag).fetchJoin().distinct() .orderBy(post.id.desc()) .limit(11) .fetch(); 위의 사진과 같이 조회하면 cannot simultaneously fetch multiple bags 예외가 나오더라구요ㅠㅠ ✅Q2. 만약 위와 같이 한 번에 조회하는 게 불가능하다면, 다른 좋은 방법이 있는지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Controller URL
안녕하세요. 강의 자료를 보면 각 함수마다 @~Mapping(/api/v2/users/...) public ResponseDTO service(RequestDTO) 형식으로 만드셨는데, 실무에서도 각 함수에 path전체를 맵핑해야 하나요? 아래처럼 공통 path부분을 상단에서 묶어서 쓰면 안되는걸까요? RequestMapping(/api/v2) public UserController(){ @~Mapping(/users/...) public ResponseDTO service(RequestDTO) }
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬렉션 페치조인 질문
페이징을 사용하지 않는다는 조건하에 distinct 설정을 해주면, 둘 이상의 컬렉션에서도 페치조인을 사용할 수 있는건가요? 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의에서는 둘 이상의 컬렉션일때는 무조건 사용하면 안된다고 하셨던거 같아서요! -> N * M 으로 뻥튀기 되는 문제로인해
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Transactional에 관한 질문입니다.
Repository에는 @Transactional이 없는데 api컨트롤러 쪽에서Repository를 호출해서 사용하면 영속상태를 거치지 않고 사용되는 거라고 생각하면 될까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO내의 참조클래스
안녕하세요검색을 해보았지만 검색어를 잘 설정하지 못한탓인가..만족스러운 답을 찾지못하여 결국 질문드립니다.등록 API에 관한 질문인데요 @Datastatic class CreateMemberRequest { @NotEmpty private String name; private Address address;} api를 이용하여 회원등록시 city, street, zipcode필드를 예전에 만들어두었던 Address클래스를 이용해서 DTO를 작성후 그것을 json으로부터 매핑받을수있는가에 대한 질문입니다. 또한 만약 가능할시 이 같은 작성 방법이 옳은가에대한 질문입니다. "name":"kakao", "address":{ "city":"pangyo", "street":"seongnam-gil", "zipcode":"333-1111" } 이렇게 보내면 들어갈줄 알았는데 안들어가네요..
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Entity, Dto 변환
안녕하세요, 김영한 강사님. 강의 중 한가지 궁금한점이 있어 질문드립니다! Entity에서 Dto로 변환할 때, BeanUtils를 사용하면 Entity 변경이 있을 때 컴파일 시점에서 에러 체크가 불가할것같아 @Builder를 사용하였는데요. @Builder를 사용하는것은 좋은 방법이 아닌가요? 강의와 같이 생성자를 통해 변환하는것이 최선인지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 영한님 질문이있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 아니요2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요 강의잘보고있습니다 다름이 아니라 제가 취업준비하려는 회사가 jsp를 사용하는데 jpa활용2편 까지의 기능을 타임리프 대신 jsp로 적용하여 구현할수있는지 궁금합니다 구현하려면 코드수정이 컨트롤러 에서도 일어나야하는지 궁금합니다!