월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO의 위치에 관하여
Version 4 까지의 최적화를 하면서 Dto의 위치가 repository 까지 갔는데 DTO의 위치는 상황에 맞게 자유롭게 두는게 괜찮을까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
jpa 질문
update메서드 종료후, controller에서 다시 findOne으로 조회할 때 select 쿼리가 다시 안나가는 이유가 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요. DTO로 body에 데이터 넘길때 궁금한점이 있습니다!
영한님 안녕하세요. 좋은 강의해주셔서 실력이 나날이 늘어가고 있습니다. 다름이 아니라 성능 최적화 부분에서 궁금한 점이 있어서 질문드립니다.! 예를 들어 AddressBook이라는 주소록 엔티티가 존재한다고 가정했을 때, 상품 주문 시 프론트단에서 주소록 안에 있는 주소의 ID[PK] 값만 넘겨서 서버에서 select 쿼리문을 날려서 주소를 조회하는 방법과,아예 프론트에서 주소의 모든 세부내용을 함께 넘겨서 select 쿼리문을 날릴 필요 없게 구현하는 방법 중 현업에서는 어떤 식으로 사용하고 있는지 궁금합니다.성능만 생각하면 당연히 후자 방법이겠지만 서버로 넘겨줄 데이터가 많은 경우에는 조금 애매한 것 같아서요.질문 읽어주셔서 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
선생님 강의 보다보니깐.. 연관관계 편의 메서드 활용하신 부분이요!
활용1편처럼 컨트롤러에서 머스태치 써서 SSR할때는 직접 연관관계 편의 메서드 쓰셨던거같은데 2편처럼 api로 작성하거나 그 다음편인 spring-data-jpa에서 작성하신 컨트롤러 부분보면 그 메서드가 쓰인 부분없이 순수 repository에서 메서드만 만들어서 쓰시던데 restcontroller가 되면 사용할 필요가 없게되는건가요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원가입 시 비밀번호 입력에 대한 질문
안녕하세요 영한님 질문이 있습니다. 회원가입을 할 때 비밀번호를 입력하는 예제를 만들어 보려고 합니다. 회원가입 시에 비밀번호를 입력하고 비밀번호 확인을 입력하여 둘이 같으면 회원가입을 요청하도록 로직을 짜려고 하는데, 이 로직을 어느 계층에 넣어야 할지 고민이 됩니다. 비밀번호 확인이라는 칼럼을 멤버 클래스에 추가하지 않고 클라이언트에서 넘겨준 데이터를 확인만 하고 버리려고 하는데 그러면 MemberApiController에서 직접 처리를 해야하는 걸까요? 감사합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
batchSize 분할로 가져오는 현상
안녕하세요 영한님 hibernate batchSize 설정을 1000으로 잡고 100개를 조회하는 테스트를 진행해봤는데 한번에 100개를 가져오는게 아니라 50개 25 개 12.. 개 이런식으로 분할해서 가져오는데, 어떤걸 놓친걸까요? 다른 설정을해주어야 한번에 가져오는걸까요? select양이 적을 때는 한번에 가져오긴 했는데 개수를 늘리니까 분할해서 가져오네요,,
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
앞에 작성한 예제 코드 받을 수 있나요?
안녕하세요 좋은 강의 감사합니다. 저가 앞에 강의를 안듣고 바로 이 가의로 왔습니다. 하지만 entity 코드외에 다른 코드가 없어서 실습에 어려움을 겪고 있는데, service와 repository 예제 코드도 받을 수 있을까요??
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@DATA 롬복 어노테이션과 LAZY로딩과의 관계
안녕하세요. 강사님, LAZY로딩과 관련해서 성능최적화 공부중에 있는데요, 작업중 특이한 경우를 보게되서 질문을 드립니다. 어떠한 User라는 Entity가 있고, 해당 entity에는 다른 테이블들과 @ManyToOne, @oneToMany 관계를 가지고 있습니다. 당연히 로딩은 Fetch.LAZY로 설정해 두었구요. 이 상태에서 해당 entity를 조회하는 userRepository.findById() 의 코드를 실행시켰을때,user를 제외한 나머지에대해서도 조회쿼리가 발생하는 문제가 발생했습니다. (user 조회후 , A,B,C,D에 대해서 추가 쿼리가 발생) 이것저것 수정하다가 @Data를 @Getter@Setter로 변경후에 정상적으로 동작하는것을 확인했습니다. (user만 조회) 혹시 @Data어노테이션이 LAZY로딩에 영향을 주는게 있는지 궁금합니다.구글에서 검색해봣지만 만족스러운 내용을 찾지 못해서 질문드립니다. 해당 entity는 대략적으로 아래와 같습니다. @Entity @Getter @Setter @Table(name = "user") public class User{ //// 기타 컬럼 field @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "a_id") private A a; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "b_id") private B b; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "c_id") private C c; @OneToMany(mappedBy = "ds", fetch = FetchType.LAZY) private List<D> ds; }
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
동적쿼리 질문입니다
혹시 저렇게 객체로 받지말고 ...써서 String으로 받고 ...의 길이를 받아서 개수-1 사이만큼 "and"를 만들어주고 동적으로 변수+1을 변수명으로 만들어줘서하면 비슷한 노가다겠지만 조금 더 단순해지지 않을까요..? => 이럴바에 queryDSL을 쓸거같긴합니다만..아직 잘 몰라서.. 앞에 말한게 생각대로 구현이 가능한 코드일까요..?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
선생님 v6에서 groupingBy에 o객체를 참조 못합니다..ㅠㅠ
# OrderQueryDto @Datapublic class OrderQueryDto { private Long orderId; private String name; private LocalDateTime orderDate; private OrderStatus orderStatus; private Address address; private List<OrderItemQueryDto> orderItems; public OrderQueryDto(Long orderId, String name, LocalDateTime orderDate, OrderStatus orderStatus, Address address) { this.orderId = orderId; this.name = name; this.orderDate = orderDate; this.orderStatus = orderStatus; this.address = address; } public OrderQueryDto(Long orderId, String name, LocalDateTime orderDate, OrderStatus orderStatus, Address address, List<OrderItemQueryDto> orderItems) { this.orderId = orderId; this.name = name; this.orderDate = orderDate; this.orderStatus = orderStatus; this.address = address; this.orderItems = orderItems; }} # OrderFlatDto @Datapublic class OrderFlatDto { private Long orderId; private String name; private LocalDateTime orderDate; //주문시간 private Address address; private OrderStatus orderStatus; private String itemName;//상품 명 private int orderPrice; //주문 가격 private int count; //주문 수량 public OrderFlatDto(Long orderId, String name, LocalDateTime orderDate, OrderStatus orderStatus, Address address, String itemName, int orderPrice, int count) { this.orderId = orderId; this.name = name; this.orderDate = orderDate; this.orderStatus = orderStatus; this.address = address; this.itemName = itemName; this.orderPrice = orderPrice; this.count = count; }} # Tried to fix...
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
github 공유에 관해
강의를 들으면서 개인 github에 소스를 정리하면서 들으려고 하는데 혹시 github에 public 으로 레포지토리를 파서 올려도 되나요? 유료강의여서 여쭤봅니다!!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강사님 다대다 설정과 개인프로젝트 적용에 대해 질문있습니다
강좌에는 카테고리-상품에 N:M 다대다 관계로 해놓으셨는데요! 제가 30살인데 29살에 퇴사하고 혼자 JPA공부해서 학교다니던 친구와 백1프론트1을 맡아서 프로젝트를 만들고있는데.. 1:N, N:1은 좀 해결했는데 N:M에서 막히고있어요ㅠㅠ 약간 힌트라도 주실 수 있으신지 해서 여쭤봅니다. 질문이 너무 많아서 힘드시면 직접적으로 말씀하셔도괜찮습니다..! 만약에 이런 경우는 어떻게 하나요? (1) ~한다,~되다의 V 중간테이블 1.여러명의 회원은 여러개의 게시글을 찜목록에 추가할 수 있다. 1-1. 여러명의 회원은 여러개의 공고를 찜목록에 추가할 수 있다. 1-2. 여러명의 회원은 여러개의 기업을 찜목록에 추가할수있다. USER(회원)과 기업/공고/게시글 엔티티 사이에 중간테이블을 놓고 유저ID랑, 각각 필요한 기업/공고/게시글 아이디로 매핑해놓은 상태인데요 - 검은색 이렇게 하는게 맞는지 궁금합니다. (2) ~한다,~되다의 V 중간테이블 [회원]은 여러개의 [이력서]로 [공고]에 [지원]할 수 있다라고 해서 이력서와 공고의 N:M관계를 해소하고자 중간테이블을 만들고 지원한다라는 APPLY 엔티티를 따로 만들었는데, JPA에서도 이렇게 하면 되는건가요..? (3) 중간테이블 질문 DB상으로는 외래키가 PK가 되면서 한 테이블안에 PK가 없어도 된다는 식으로 들었는데, 검색을해보니 JPK는 PK가 있어야된다하더라구요!? 만약에 N:M관계 중간에 중간테이블을 만들면 보통은 외래키 2개가 들어가는데, JPA식으로 만들면 PK, FK, FK해서 총 3개가 만들어지는게 맞나요? (4) intelliJ에서 DB연결을 하고 data Diagram Visualization으로 매핑관계를 살펴보니 이렇게 나오는데.. intelliJ나 datagrip에서는 흔히 까마귀발이라고 하는 1:N, N:1 관계는 안보여주더라구요..! 그리고 mysql workbench reverse engineer모드로 erd를 그려봤는데..여기에서는 1:1관계도 1:N으로 나오는데...(분명히 유저와 멤버는 @OneToOne으로 양방향 매핑했는데도 이렇게 나옵니다. 혹시 DB를 설계하면서 잘 되었는지 erd로 뽑아보고싶은데, 아직 완벽하게 보여주는 건 없는건가요..?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
gropingBy 에 관하여입니다.
Set<Map.Entry<OrderQueryDto, List<OrderItemQueryDto>>> entries = flats.stream() .collect(groupingBy(o -> new OrderQueryDto(o.getOrderId(), o.getName(), o.getOrderDate(), o.getOrderStatus(), o.getAddress()), mapping(o -> new OrderItemQueryDto(o.getOrderId(), o.getItemName(), o.getOrderPrice(), o.getCount()), toList()))) .entrySet(); 여기서 OrderQueryDto 와 Map 의 키(groupingby 의 classifier)가 되는 것 같은데 아무리 구글링해봐도 객체인경우에는 @EqualsAndHashCode를 통해 여러 필드중 특정 필드를 지정해줘야한다? 이런말을 못 찾겠습니다... 질문도 좀 이상한것 같은데 제가 궁금한것은 어떤 키워드나 사이트를 참조해서 공부해야하는지 입니다... 찾아본 예시들도 다 그냥 일반적인 경우라 어떻게 equalshashcode를 알려줘야하는지 원천? 을 알고싶습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Result로 감싸주는것에 대하여 , OrderItemDto의 경우가 궁금합니다.
OrderDto 의 경우에 memberApiController에서 했던것 처럼 Result로 똑같이 감싸서 반환하는게 추후에 api 스펙을 확장하는데 유용함으로 해주는게 좋다고 배웠습니다. 이떄 OrderDto 안에있는 OrderItemDto도 마찬가지로 Result로 감싸주는것이 좋은 것인가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 영한님!! 강의랑 직접적인 관련은 없지만 질문드립니다..!
강의에는 @Repository에서 EntityManager em을 통해서 데이터를 다루던데 요즘 추세는 public interface 객체이름_Repository extends JpaRepository<객체, Long> { Optional<객체> 함수(인자);} 이렇게 하더라구요! 기본적으로 내장된 메서드를 이용하거나 필요한거를 추가로 만들어서 하던데.. 1. 이렇게 개발하는것의 장단점이 있는지? 2. 이 방식으로 만드신 강의가 있는지? 3. 추가로 JPA를 쓴다면 queryDSL이 필수라고 들었는데 queryDSL도 꼭들어야하는게 맞는지 3개 궁금합니다 ㅎㅎ 감사합니다! 그저 빛입니다 ㅠㅠ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OneToMany Many쪽의 페이지네이션 질문입니다
안녕하세요? 섹션 4 강의 컬렉션 조회 페이징을 보고 질문 드립니다. 주문 조회 V3.1에서 페이징을 위해 jpa.properties.hibernate.default_batch_fetch_size=100, @BatchSize를 사용하거나 또는 V5에서 Map, groupBy를 이용하여 DTO 직접 조회Order에 대하여 페이징이 가능하다는 것을 알았습니다. 그런데 만약 Order 페이징 + OrderItem 페이징(예를 들어 주문을 10건 중 비싼 아이템 2건만 조회하기)같은 경우에는 어떻게 적용이 가능한가요? public List<OrderQueryDto> findAllOpt(){ List<OrderQueryDto> result = findOrders(); // 기존의 ToOne 쿼리 List<Long> orderIds = result.stream() // in 쿼리를 위한 id 뽑기 .map(o -> o.getOrderId()) .collect(Collectors.toList()); List<OrderItemQueryDto> orderItems = findMap(orderIds); Map<Long, List<OrderItemQueryDto>> orderItemMap = orderItems.stream() .collect(Collectors.groupingBy(OrderItemQueryDto::getOrderId)); result.forEach(o -> o.setOrderItems(orderItemMap.get(o.getOrderId()))); return result; } public List<OrderItemQueryDto> findMap(List<Long> orderIds) { return em.createQuery( "select new queryDto(파라미터들)" + " from OrderItem oi" + " join oi.item i" + " where oi.order.id in :orderIds", OrderItemQueryDto.class) .setFirstResult(0) .setMaxResults(2) .setParameter("orderIds", orderIds) .getResultList(); ) } 이렇게 Limit를 걸었을 때 UserA 2건 뜨고 UserB는 null 이 뜨더군요. 다른 방법을 찾아본 결과 https://bottom-to-top.tistory.com/45 처럼 방향을 반대로 하여 ManyToOne으로 조회하는 방법도 있다는것을 알았습니다. 결국엔 Order 페이징 + OrderItem 페이징 까지 접목시키려면 ManyToOne으로 조회하는 방법밖에 없을까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
엔티티가 아닌 DTO로 변환을 할 때 컬렉션 조회를 할 경우 @JsonIgnore가 필요로 하는상태가 생겼습니다.
API 개발 고급 - 컬렉션 조회 최적화에서 주문 조회 V2: 엔티티를 DTO를 변환 수업에서 4:30 에 No properties문제가 발생하여 저도 getter를 넣었으나 다음과 같은 에러가 발생했습니다. 구글링 한 결과 해당 컬렉션이 지연 로딩으로 인해 프록시 객체를 serialize하기 때문에 나는 에러라고 합니다. 그래서 제가 조치한 것은 해당 에러가 발생하는 @OneToMany필드를 @JsonIgnore를 했습니다. 다행히 정상 작동은 했으나 김영한님의 강의에서도 그렇고 제가 개인적으로 하는 프로젝트에서도 단 한번도 Entity에 @JsonIgnore를 사용하지 않았습니다. 단순히 DTO에 getter를 사용했는데 작동이 잘 되었습니다. 어떻게 하면 Entity에 @JsonIgnore를 사용하지 않고 문제를 해결할 수 있을까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
하이버네이트 모듈과 @JsonIgnore를 굳이 함께 사용할 필요는 없는 걸까요?
하이버네이트 모듈을 사용해서 프록시상태인 객체에 대한 조회를 무시할 수 있다면.. member의 orders에 굳이 @JsonIgnore를 걸어주지 않아도 될 것이라고 생각됩니다.(굳이 order.member. orders에 접근해서 orders에까지 지연로딩을 활성화시킬 일은 없을테니) 그럼 굳이 @JsonIgnore 처리를 해주지 않고 orders : null로 전달되도록 해도 상관이 없나요? 아님 orders:null조차 안 뜨도록 @JsonIgnore도 함께 사용해주는게 좋을까요? 실무에선 어떤식으로 진행하는지 궁금합니다!
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
클라이언트단과 서버단의 DTO 공유방식
안녕하세요 영한님! 만약에 실무에서 리액트와 스프링을 이용해서 클라이언트단과 서버단으로 나눠서 운영한다고 가정한다면, 클라이언트단과 서버단은 물리적으로 분리되어 있고 API로 데이터 요청과 응답을 주고받을 것이라 생각합니다. 근데 여기서 API를 주고 받기 위해서 클라이언트와 서버의 API 스펙을 매핑 해야하는데 클라이언트단 따로, 서버단 따로 클래스를 만들어서 관리하는 방식은 유지보수 측면에서 좋지 않다고 생각이 듭니다. 실제 실무에서는 어떤 방식으로 처리하는지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의중 궁금한게 생겼습니다
API스펙에선 엔티티가 아니라 DTO로 바꿔서 보내라 이제 머리에 새겨졌습니다 하지만, API가 아닌, 일단 웹사이트를 만들때도 DTO로 바꿔야하나요? 만약 바꾼다고치면 바꿀때, packge를 이용해서 DTO packge를 만들고 그 안에서 다 해결해수있을까요? 강의 설명을 들어보면 뭔가 바꾸는게 더 좋을 코드 같긴한데 감이안오네요 아직 토이프로젝트도 못해본 학생이라 너무 궁금합니다! ++ 이번에 MVC강의가 나왔던데(이미구매는해놨습니다) 강의 순서를 쿼리dsl까지 다듣고 MVC강의를 듣는게 좋을지 아니면 활용2까지 마져끝내고 MVC강의를 들을지 고민됩니다! 현재( 스프링입문 -> 핵심원리기본편 -> http웹지식 -> 활용1 -> ORM기본편 -> 활용1순서로 들었고 현재는 활용2 듣는중입니다!)