30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 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 코드입니다해결 부탁드립니다
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Postman 기술 질문입니다,(스프링 시큐리티)
안녕하세요 강사님강의 감사하게 잘 듣고 있습니다.다름이 아니라 제가 연습 중인 프로젝트에 Spring-Security, Auditing, Envers를 적용해 보고 있습니다.당연히 데이터를 등록, 수정, 삭제 시 DB에 현재 로그인 중인 사용자 정보가 담기게 되는데 postman에서 그냥 테스트를 하게 되면 오류가 나더라고요,1) 이러한 부분을 해결하기 위해 postman에서 따로 설정을 해줄 수 있는 부분이 있는지도 궁금합니다.(이와 비슷한 관련 강의가 있는지도 궁금합니다!)2) 강의 내용을 보면 DTO 클래스를 ApiController에 작성하셨는데 실무에서는 domain 패키지에 따로 따로 생성해주나요? (그렇게 되면 Create, Update, Delete 너무 많아지는 것 같아서요)
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA 프로그래밍 13장 웹 애플리케이션과 영속성 관리
ORM 표준 JPA 프로그래밍 강의를 먼저 보고 이 강의를 듣고 있습니다. OSIV에 관해 더 깊이 알고 싶으면 13장 웹 애플리케이션과 영속성 관리를 봐라고 하시는데 자바 ORM 표준 JPA 프로그래밍 - 기본편 여기 어떤 강의에 있는건가요 이강의를 결제해서 미리 봤는데도 어딨는지 잘 모르겠습니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Dto 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요 DTO 관련해서 질문이 있습니다. Entity를 Controller에서 사용하면 안되어 값을 받을 때 DTO로 받고 이를 Entity로 다시 변환 후 서비스로 값을 넘기더라구요.우리가 저장을 한다고 할 때, 넘어오는 값이 id, pw, name, email, address 등등 해서 많은 값이 넘어오면 이를 DB에 저장을 해줘야 하잖아요. 그러면 DTO를 Entity와 똑같은 필드를 가진 객체로 만들어 사용하는 건가요?그리고 회원가입도 간편가입, 홈페이지 가입 등 반환되는 값이 다르다고 하셨는데 이런 경우는 하나의 DTO에 모든 필드들을 다 집어넣고 로직마다 필요한 값을 빼서 쓰는 게 나은지 아니면 각각의 로직별로 DTO를 다 만드는 게 나은지 알고 싶습니다. 감사합니다2 질문 ex홈페이지 가입 필요 필드(name, age, date)간편가입 (id, pw)이럴 때 하나의 DTO에 5개 필드를 모두 넣은 DTO를 사용하는게 좋은지, 아니면 홈페이지용, 간편용 DTO를 두개 만드는게 나은지에 대한 질문입니다
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OSIV 질문
osiv를 끄면 지연로딩을 모두 트랜젝션 안에서 처리해야한다고 배웠습니다.그 말은 즉슨 osiv를 키면 지연로딩은 트렌젝션안에서 처리 안해도 된다라는 말입니다.osiv를 키면 컨트롤러에서는 @Transactional이 없다라는 가정하에findById로 엔티티를 조회하면 그 엔티티는 준영속 상태입니다.osiv가 켜있는 상태(전 범위에서 영속성 컨텍스트가 생존되어 잇는 상태)의 준 영속상태에서는 트렌젝션이 없어도 프록시의 초기화가 일어난다는 말씀입니다.저는 지연로딩일시에 영속성 컨텍스트에서 조회해서 없으면 프록시를 넣어주고초기화가 되면 jpql이 실행이 되면서 실제 엔티티를 넣어준다고 배웠습니다.[질문]그러면 jpql은 영속성 컨텍스트만 생존이 된 상태라면 트렌젝션이 없어도 실행이 되는건지 궁금하고 이유가 궁금합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Dto안에 변환로직
저희가 배운 order클래스안에 필드는 저렇습니다.그리고 수업 시간에 배운 orderDto의 필드는 저렇습니다.수업시간에 배운 dto안에는 order안에 있는 필드중 필요한 부분만 그대로 가져왔습니다.그래서 변환하는 로직도 order에 필드를 그대로 넣습니다.하지만 저런식으로 날짜를 바꿔서 dto를 만든다던가이렇게 order에는 없지만 order와 관련된 필드를 추가하는 것이 괜찮은 가요??(대신에 order필드를 이용하여 orderDto에 필드값을 넣습니다.)(참고로 이건 진짜 임의로 예를 들기 위해 추가한겁니다.) [결론]OrderDto에 필드에 order테이블의 필드값을 그대로 넣는 것이 아니라 바꿔도 되나요??(예를 들면 시간 포멧을 바꾼다.)OrderDto안에 order에는 없는 필드지만 관련된 필드를 생성해도 되나요??(대신에 order안의 필드값을 이용합니다.)
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
PutMapping 405 error 관련 질문드립니다
[POST]로 객체 생성까지는 완료 되었습니다그런데, update api 요청을 하지 405 에러가 발생합니다(이유가 무엇일까요? ㅜㅜ){ "timestamp": "2022-10-20T16:10:13.182+00:00", "status": 405, "error": "Method Not Allowed", "trace": "org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:253)\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:442)\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:383)\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:125)\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:67)\n\tat org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:498)\n\tat org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1265)\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1047)\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964)\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:681)\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:764)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n\tat java.base/java.lang.Thread.run(Thread.java:833)\n", "message": "Request method 'POST' not supported", "path": "/api/v2/members/1" } MemberService @Transactional public void update(Long id, String name) { Member member = memberRepository.findOne(id); member.setName(name); } MemberApiController @PutMapping("/api/v2/members/{id}") public UpdateMemberResponse updateMemberV2(@PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request) { memberService.update(id, request.getName()); Member findMember = memberService.findOne(id); return new UpdateMemberResponse(findMember.getId(), findMember.getName()); } @Data @AllArgsConstructor static class UpdateMemberRequest { private String name; } @Data @AllArgsConstructor class UpdateMemberResponse { private Long id; private String name; } 에러 화면
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
EAGER와 LAZY 질문
JPA를 사용할때 path에서 EAGER을 사용하는 경우는 거의 없나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
ddl-auto : none 문의 입니다.
application.yml에서 ddl-auto : none으로 하였는데 스프링 재시작했을 경우 DB가 Drop되어 초기화 됩니다. .. 어떻게 해야하나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
포스트맨 실행시 trace 부분을 변경할 수 있나요??
안녕하세요. 11:21 분쯤 보면 trace 부분을 볼 수 있는데,설정으로 단순한정보만 나올 수 있도록 변경이 가능한가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
다대다 관계와 관련해서
안녕하세요 강의 수강 후 게시판을 만들다가 궁금한 점이 생겨 질문을 남깁니다. 게시글과 해시태그를 M:N 관계로 등록하면서 강사님이 category-item을 설명하시면서 하신 것처럼 ManyToMany로 등록을 했습니다.게시글을 작성하면서 해시태그를 작성하고 싶은데 service단에서 어떻게 작성해야 하는지 궁금합니다. (연관관계의 주인은 게시글입니다.) 현재 등록하려는 해시태그가 해시태그 테이블에 없으면 해시태그 테이블에 해당 해시태그를 저장하고, article 테이블에서도 hashtag를 등록해주었습니다. (article Entity에서 addHashtag 메서드를 만들어서)이 경우 db 조회시 중개테이블에도 값이 잘 들어가있는데 postman으로 조회시 해시태그의 article이 빈 리스트로 나옵니다. 어떻게 해야 하나요??
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
PostMapping시에 Dto -> Entity에 관해
안녕하세요.강의에서는 entity를 dto로 전환하는 것을 controller에서 진행하고 있는데 service 계층이 있다면 https://www.inflearn.com/questions/139564 을 참고하여 진행하라고 하셨습니다. 그러면 service 계층에서 변환이 일어난다고 가정할 때, PostMapping으로 controller에 들어온 Dto를 service 계층으로 그대로 넘겨주는 것이 약간 의아합니다.service 계층에도 dto가 들어오면 controller에서도, service에서도 dto에 접근이 가능하니 (같은 동작을 하여 한 곳에서 모든 것을 수행할 수 있음)controller와 service의 역할이 애매해지는 것 같습니다. @PostMapping public ResponseEntity saveItem(@RequestBody ItemSaveDto dto) { itemService.save(dto); // 이 한 줄만 사용하는 것이 불편합니다. }단순히 controller는 api 통신을 위한 레이어라고 생각해야 할까요?RestController는 웹에서 전달받은 dto를 그저 service에 전달하는 역할인가요?(service에서 Dto -> Entity로 전환한다면 controller에서는 어떤 작업을 수행하는지 잘 모르겠습니다.)
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
연관관계의 주인
갑자기 연관관계의 주인 개념이 너무 헷갈립니다.양방향 연관관계에서 "연관관계의 주인을 지정해라"라고 하면,주인이 아닌 쪽에 mappedby 를 작성했을 때'연관관계의 주인이 정해졌다.' 라고 보는 건가요?