월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
순환 참조 문제 질문입니다.
Member 클래스의 orders 속성에 @JsonIgnore를 선언하지 않으면 Member와 Order는 양방향 관계이기 때문에 순환 참조 문제가 발생할 것 같은데 안 하더라구요. 이유가 orders에 값이 저장되어 있지 않기 때문이 맞을까요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
페이징 관련 질문입니다
offset, limit 이제 어플리케이션 쪽에서 받아서 페이징 조회를 하는데음수 값이 나올 때는 어떻게 처리를 하나요?영한님 강의에서는 음수는 안 넘어온다고 가정을 하신 것 같습니다그러면 페이징 관련 값 검증은 프론트 또는 백 쪽 어디가 더 맞는 걸까요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
여러 테이블 fetch join 질문 드립니다!
안녕하세요!Event와 Member의 N : N 관계를 중간 테이블(EventMEmber)을 만들어서 풀어낼때Event <-> EventMember <-> Member에서Event를 리스트로 조회하려고 하는데 이때 EventDto에 Member의 String name 필드를 리스트로 가져오려고 합니다. 1. @Query("select distinct e from Event e " + "join fetch e.eventMember a " + "join fetch a.member")Event에 중간 엔티티인 EventMember를 fetch join하고 별칭을 사용해서 EventMember의 member를 fetch join 했습니다.fetch join에서 별칭 사용을 권장하지 않고, 컬렉션을 fetch join을 하면 추후 페이징에 문제가 생길 것 같습니다. 2.@Query(value = "select e from EventMember e " + "join fetch e.member " + "join fetch e.event")List<EventMember> eventMembers = eventMemberRepository.findAllEventArtist(); Map<Event, List<String>> events = new HashMap<>(); for (EventMember eventMember : eventMembers) { if (!events.containsKey(eventMember.getEvent())) { events.put(eventMember.getEvent(), new ArrayList<>()); } events.get(eventMember.getEvent()) .add(eventMember.getMember().getName()); } 중간 엔티티인 EventMember로 Event와 Member를 fetch join으로 가져오고 자바 코드로 원하는 응답을 만들었습니다. 혹시 둘중 더 나은 방법이나 더 좋은 방법, 제가 잘못 알고 있는 부분이 있으면 말씀 부탁드리겠습니다 ㅠㅠ
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원 수정 API 강의 질문입니다.
회원 수정 시 MemberService 의update 메소드 파라미터를 Long id, String name 으로 받으셨는데파라미터를 따로 dto로 생성해주신 UpdateMemberRequest로 받아도 될 것 같다고 생각이 드는데 사용하면 안되는 이유가 따로 있는건가요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
ddl-auto : none 옵션
조회용 샘플 데이터를 입력하면서 application.yml 파일의 ddl-auto : none 옵션으로 바꾸어주면, 실행 시에 데이터가 더이상 쌓이지 않아야 하는 것이 맞는지 궁금합니다. 저는, 실행할 때 마다 InitDb의 데이터가 쌓여서 저장이 되는데, 이게 맞는 건지 잘 모르겠습니다. 제가 생각한 바로는, 최초에 create 옵션일 때 데이터를 넣어두고, 이후에 none으로 바꾸게 되면 더 이상 데이터가 입력되지 않는 것이라고 생각했는데 혹시 제 생각이 맞다면, none 옵션 시에 insert 쿼리가 안나가게 하는 방법이 있을까요?참고로 제 스프링부트 버전은 2.7.1입니다.h2 데이터베이스는 2.1.214가 설치되어있음을 확인했습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
조회용 필드 설정하는 방법?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. JPA 에서 Entity에 정의되지 않은 (테이블과 매핑되지 않은) 필드를 조회할 때, 어떻게 처리해야할 지 잘 모르겠습니다.@Transient 설정과는 좀 다른게, 해당 어노테이션은 메모리상에서 값을 보관하고, 비즈니스 로직에서 주로 사용한다고는 하지만저 같은 경우는 일단 DB 에서 조회를 해야하기 때문에요.. 해당 쿼리는 복잡해서 nativeQuery를 사용을 했고, 다른 테이블과 조인해서 가공한 필드입니다 (예를들어 postgresql의 array_agg, oracle의 list_agg 와 같은..) 가공한 필드 alias를 test 로 설정해서 조회했을 때, 이 조회한 Entity에 필드를 어떻게 설정해야 가져올 수 있는 지를 잘 모르겠습니다..ㅠ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
lazy -> 즉시로딩으로 바꿨을때 쿼리 이상하게 나가는 것
이부분에 대해 자세한 설명은 없으셨거든요근데 이부분도 쿼리가왜저렇게 나가는지 이해해볼 필요가 있는걸까요? 아니면 실무에선 저렇게 쓰지않을거기때문에 이해할필요가없을까요?간단한주문조회v2:엔티티를 dto로 변환 << 강의에서 나왔습니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@PostMapping으로 등록 시 파라미터 안에 List 질문입니다.
안녕하세요강의 완강 후 따로 프로젝트를 만들어 보던 중 궁금한 게 생겨서 질문 드립니다. PostMapping으로 등록할 때 CreateRequest라는 별도의 클래스를 만들어 주어서 파라미터로 받았는데 이 CreateRequest안에 List를 받아야 할 경우가 있다면 어떻게 해줘야 하는지 잘 모르겠습니다. Product 클래스 입니다.Module 클래스 입니다.하나의 Product에 여러 개의 Module이 들어갈 수 있기 때문에ProductModule 클래스를 만들어줬습니다.이러한 경우에서Product를 등록할 때아래와 같이 넘겨주고 싶으면CreateProductRequest 에서 List를 어떤식으로 받아줘야 하나요? 아래와 같이 해봤는데 잘 안되는 것 같아서요...
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
entity로 의존관계가 들어와야하는데 반대로 의존관계가 나가버린다
회원조회api 영상의 5:40초쯤 하신 말씀입니다.근데 이 말이 무슨말인지 잘 모르겠어요왜 의존관계가 나간다고 표현하시는 거죠?json으로 출력할때만 출력하지 않는것이 왜 의존관계가 나가는일인건가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
CQS
관련 질문에 대한 답변을 읽어봤는데도 이해가 가지 않아서 질문드립니다.커맨드와 쿼리를 분리해야한다는 CQS를 설명하신 말이었어요. 내부변경이 일어나는것은 커맨드, 명령어라고 부른다커맨드는 결과값을 그대로 반환하면안된다내부변경이 일어나지않는 것은 쿼리라고 부른다.쿼리는 결과값을 반환한다-> 1. 커맨드에서 결과값을 반환하면 안되는 이유가 뭘까요?update 메서드 안에서도 결국은 update하는것(커맨드)과 findOne(쿼리)하는 코드가 모두 들어가있는거잖아요? 근데 이게 왜 cqs를 지킨 사례인거죠?@Transactinalpublic vodi update(Long id, String name){ memberService.update(id,name); Member member = memberService.findOne(id); rreturn ~~~;}
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
memberUpdateDto가 필요한 이유
강의도중에 설명해주시긴 했는데 그래도 이해가 덜 가서 질문드립니다membersaveDto만있으면 memberupdatedto를 만들지 않아도돼요둘다 만들게 되면 코드의 중복이 발생하는것아닌가요?save와 update는 아예다른것이기때문에 중복이 발생해도 상관이 없는걸까요?아예다른것이라기엔 update에도 있고 save에도 있는 필드에 변화가 생겼을때 둘다 수정을 해주어야해요그럼 수정해야할 포인트가 늘어나는건데도 updateDto를 생성해주는게 맞는걸까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
10:35 메서드 추출
public void dbInit1(){ Member member = new Member(); member.setName("userA"); member.setAddress(new Address("서울","1","1111")); em.persist(member); Book book1 = new Book(); book1.setName("JPA1 BOOK"); book1.setPrice(10000); book1.setStockQuantity(100); em.persist(book1); Book book2 = new Book(); book2.setName("JPA BOOK2"); book2.setPrice(20000); book2.setStockQuantity(100); em.persist(book2); OrderItem orderItem1 = OrderItem.createOrderItem(book1, 10000, 1); OrderItem orderItem2 = OrderItem.createOrderItem(book2, 20000, 2); Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress()); Order order = Order.createOrder(member, delivery, orderItem1, orderItem2); em.persist(order); } public void dbInit2(){ Member member = new Member(); member.setName("userB"); member.setAddress(new Address("진주","2","1111")); em.persist(member); Book book1 = new Book(); book1.setName("JPA1 BOOK"); book1.setPrice(10000); book1.setStockQuantity(100); em.persist(book1); Book book2 = new Book(); book2.setName("JPA BOOK2"); book2.setPrice(20000); book2.setStockQuantity(100); em.persist(book2); OrderItem orderItem1 = OrderItem.createOrderItem(book1, 10000, 1); OrderItem orderItem2 = OrderItem.createOrderItem(book2, 20000, 2); Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress()); Order order = Order.createOrder(member, delivery, orderItem1, orderItem2); em.persist(order); } 이렇게 해줬는데도 메서드 추출부분에서 private static Member getMember() { Member member = new Member(); member.setName("userA"); member.setAddress(new Address("서울","1","1111")); return member; } 이렇게 작성됩니다.영한선생님처럼 인자가있는 메서드로 추출하려면 어떻게 해야하나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Batch Size를 통한 컬렉션 조회 뒷단에 대한 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]실제 현업을 하다보면 굉장히 깊은 뎁스의 쿼리를 사용하기도 하는데 앞단에서 컬렉션이 존재하면 뒷단에서는 fetch join을 적용하는게 불가능할까요??이번 강의에서도 OrderItem.Item 으로 접근할때 ManyToOne이라 fetch join 으로 가져오면 좋을듯한데 OrderItem이 컬렉션이라 1+1+1 로 총 3개의 쿼리가 나간게 쫌아쉬워서요.여기서는 깊이가 얕아서 괜찮지만 join이 깊어지면 join 갯수만큼 쿼리가 나갈테니까요...떠오르는건 쿼리를 2개로 분리해서 직접 in으로 조회해서 직접 각 Order에 set 해주는 방법이 있을꺼같은데 그럴려면 map도 써야하고 전체 for문이 돌아버려서 성능상 불이익이 있을꺼같네요...질문을 요약하자면, OrderItem.item을 fetch join으로 총 1+1 2개의 쿼리가 나가도록은 못하나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
11:30 만약 for문이였으면?
@GetMapping("/api/v1/members") public Result membersV2(){ List<Member> members = memberService.findMembers(); List<MemberDto> collect = members.stream() .map(m -> new MemberDto(m.getName())) .collect(Collectors.toList()); return new Result(collect); } 이게 foreach문이면 어떤식으로 흘러갈까요? @GetMapping("/api/v1/members") public Result membersV3(){ List<Member> members = memberService.findMembers(); for(Member member : members){ new MemberDto(member.getName()); } } 미완성 코드이긴한데 이 다음부터 어떻게 만들지를 모르겠습니다 ^^...
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
실무에서 sequence 생성시 궁금한점
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 강의를 듣고 실무에 적용하던 중 궁금한 점이 있어 문의를 드리게 되었습니다.id를 생성하는데 있어서 sequence 전략이 좋아보여 사용하려는데 보통 sequence는 schema 별로 하나만 만들어서 테이블에서 공통적으로 사용하나요? 아니면 schema의 table당 하나씩 만들어서 사용하나요?사용하는 DB는 MariaDB입니다.감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
java.lang.NoClassDefFoundError: javax/persistence/Transient 에러
안녕하세요! 아래 코드 추가 후에 api를 요청하면 java.lang.NoClassDefFoundError: javax/persistence/Transient 에러가 뜨더라고요.@Bean Hibernate5Module hibernate5Module() { return new Hibernate5Module(); }그래서 뭐가 문제인지 확인해봤는데요.아마도 버전 이슈인 것으로 생각이 되어서 질문을 드립니다.저는 지금 spring boot 3버전으로 실습을 따라가고 있고, 확인해보니까 spring boot 3버전에는 hibernate 6이 쓰이고 있더라고요...jackson-datatype-hibernate 라이브러리는 아직은 hibernate 5까지만 지원하는 것 같은데... 혹시 jackson-datatype-hibernate 를 대체할 수 있으면서 spring boot 3 에서 돌아가는 라이브러리가 있을까요???아니면 라이브러리를 사용하지 않고, hibernate5module의 역할을 구현할 수 있을까요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Spring boot 말고 Spring 에서 OSIV는 어떻게되나요?
안녕하세요! 강사님 좋은강의 감사합니다.OSIV를 공부하다가 여러가지 참고문서를 보고있는데,문서에 기본적으로 OSIV는 Spring Boot 애플리케이션에서 활성화됩니다 라고 적혀있더라구요그렇다면 스프링부트가 아닌 스프링 환경에서는 반대로 기본으로 OSIV가 false 인건가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
데이터 뻥튀기와 관련하여 질문이 있습니다.
join을 해서 가지고 오면 이렇게 데이터가 중복이 되면서 2개로 뻥튀기가 된다고 설명을 해주셨는데요.윗줄과 아랫줄이 완전히 동일한 것은 아닌데 이것을 왜 중복으로 보고 뻥튀기라 하는지 이해가 잘 가지 않습니다!제가 나름 이해하기로는 예를 들어 위에 예시로 든 Order가 OrderA 라고 했을 때, 지금 찾고 싶은건 OrderA 라는 Order 하나인데 그 안에 OrderItem이 각각 서로 다른게 2개 들어있어서 OrderA-Boo1 , OrderA-Book2 이렇게 OrderA가 두 개가 조회돼서 뻥튀기라고 보는걸까요? 그런데 이러면 완전히 중복은 아닌거 같기도 하고..어떻게 이해하는 것이 좋을지 궁금합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@JsonIgnore 사용과 관련하여 질문드립니다.
안녕하세요! @JsonIgnore 사용과 관련하여 궁금한 것이 있습니다.API 결과를 반환할 때 엔티티를 바로 노출하지 않는 이유가 API 스펙의 안정화 및 순환참조 에러에 따른 Stackoverflow 에러를 방지하기 위함이라고 배웠는데요.그런데 강의를 보면 domain에서 Delivery의 Order 와 Member의 Orders와 OrderItem의 Order에 여전히 @JsonIgnore를 사용하고 있네요.DTO로 반환하는 경우와 별개로 늘 @JsonIgnore는 사용을 해줘야 하는 것인가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬렉션 둘 이상에 페치 조인
안녕하세요.강의 마지막에 컬렉션 페치 조인을 둘 이상 사용하지 말라고 하셨는데, 관련하여 질문드립니다.말씀하신 상황이 제가 생각한 항목 중 어떤것이 맞을까요?1 : N : NTeam(1) : Member(N) : Order(N)1 : N / 1 : NPost(1) : Comment(N) Post(1) : Attachment(N)감사합니다.