묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결3. 웹개발 코스 [Enterprise Architecture(EA) X 전자정부프레임워크]
강사님이 올려주신 강의를 보려는데
강사님이 올려주신 강의로 불러와서 보려는데, 계속 이게 뜨네요.. 어떻게 해야 해결이 될까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강의에서 HttpServletRequest 과 HttpServletResponse객체 관련 질문있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의에서HttpServletRequestHttpServletResponse요청 마다 해당 객체가 생성이 된다고 했는데 1) hashcode로 찍었을때의 메모리 번지수가 달라야하는데 같은 값이 나옵니다 왜 그런가요?2)또 1번의 연장선에서 해당 부분에 대해서 쓰레드가 한개가 사용이 될때에는 객체가 공유되지만 ex)Clinet1)Request-> /hello Reponse (해당 요청이 끝난뒤)HttpServletRequest -> hashcode(113)HttpServletResponse -> hashcode(114)Client2) Reuqest -> /hello Response HttpServletRequest -> hashcode(113)HttpServletResponse -> hashcode(114)이런식으로 한개의 쓰레드가 사용이 될때에는 HttpServletRequest가 같은 hashcode 를 가지지만 Clinet1)Request-> /hello Reponse (해당 요청 처리중)HttpServletRequest -> hashcode(113)HttpServletResponse -> hashcode(114)Client2) Reuqest -> /hello Response HttpServletRequest -> hashcode(115)HttpServletResponse -> hashcode(116)이런식으로 다르게 나오던데 그이유가 뭔지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
메서드 설정시 어떤부분은 static어 어떤부분은 static없이 하는데 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]1분31초에 addUsers에서는 private void로 일반 메서드를 생성했는데 이전에 HelloBean 메서드를 컴포넌트에 등록하기 위해 정의내릴때는 static으로 설정하는데 두개의 차이가 궁금합니다.
-
미해결스프링 부트 - 핵심 원리와 활용
오타 수정
외부설정과 프로필 2 pdf 파일 17 page에서 max-conneciton -> max-connection 오타 수정 필요해 보입니다 :)
-
미해결실전! 스프링 데이터 JPA
연관관계 설정에 대해서 질문이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]예제 도메인 모델과 동작확인 강의에서 8:55분에 보면 연관 관계를 위해서 changeTeam이라는 메소드를 생성하시는데 해당 코드에서 team.getMembers().add(this)라는 코드가 있는데 해당 코드가 없어도 동작에 아무 이상이 없고 또한 Member에서 getMembers를 출력해보거나 DB를 보아도 달라진게 하나도 없는데 해당 라인의 코드를 적는 이유를 모르겠습니다. 만약 이유가 있다면 확인할만한 방법이 뭐가 있을까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
온라인 결제 시스템에서 중복 결제 방지 방법은 어떻게 구현하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아마 조금은요)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. "PRG Post/Redirect/Get" 강의를 듣던 중 궁금한 것이 있어 질문을 드립니다.온라인 쇼핑몰의 백엔드 시스템을 개발하는 과정에서 한 가지 중요한 문제에 대해 의견을 구하고 싶습니다. 상황은 다음과 같습니다:고객이 장바구니에 있는 물품을 구매하는 과정에서, 서버로의 결제 요청은 성공적으로 처리되었으나, 네트워크 문제나 기타 이유로 인해 결제 성공 응답을 받지 못하는 경우가 있습니다. 이로 인해 고객은 결제가 실패한 것으로 오해하고 같은 결제를 다시 시도할 수 있습니다. 이는 원치 않는 중복 결제로 이어질 수 있는데, 이러한 상황을 효과적으로 방지하고 관리할 수 있는 방법이 있을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@InitBinder과 validator 에 대한 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요 InitBinder 할시 위와 같은 결과를 얻는데요순서를 조정하는 방법은 없습니까? 제가 구현하고 싶은건 "숫자를 입력해주세요" 만 나타나게 하고 싶고 이전 코드에서는 코드의 순서를 간단하게 조정해주는 정도로 구현이 가능했는데 InitBinder를 쓸 경우 어떻게 해야 제가 원하는대로 구현할 수 있는지 궁금합니다. 글로벌하게 validator를 구현하고 또 하나 컨트롤러에서 validator를 구현했다고 가정했을때 두개 다 했을시 에러가 발생합니까? 아니면 컨트롤러 validator가 우선권을 가집니까? 아니면 두개 다 검증됩니까?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
비관적 락 적용을 해도 동시성 테스트 시 실패합니다...
StockRepositorypublic interface StockRepository extends JpaRepository<Stock, Long> { @Lock(value = LockModeType.PESSIMISTIC_WRITE) @Query("select s from Stock s where s.id = :id") Stock findByIdWithPessimisticLock(@Param("id") Long id); }StockService@Service @RequiredArgsConstructor public class StockService { private final StockRepository stockRepository; @Transactional public Long decrease(Long id, Long quantity) { Stock stock = stockRepository.findByIdWithPessimisticLock(id); stock.decrease(quantity); stockRepository.saveAndFlush(stock); return stock.getQuantity(); } }StockServiceTest@SpringBootTest class PessimisticLockStockServiceTest { @Autowired private StockService service; @Autowired private StockRepository stockRepository; @BeforeEach public void before() { stockRepository.saveAndFlush(new Stock(1L, 100L)); } @AfterEach public void after() { stockRepository.deleteAll(); } @Test @DisplayName("비관적 락을 사용해 재고 감소 동시성 요청이 완료된다.") void decrease() throws InterruptedException { // given int threadCnt = 100; ExecutorService executorService = Executors.newFixedThreadPool(32); CountDownLatch latch = new CountDownLatch(threadCnt); // when for (int i = 0; i < threadCnt; i++) { executorService.submit(() -> { try { service.decrease(1L, 1L); } finally { latch.countDown(); } }); } latch.await(); // then Stock stock = stockRepository.findById(1L).orElseThrow(); assertThat(stock.getQuantity()).isZero(); } }해당 테스트를 돌리면 실패하고 순차적으로 재고가 감소되지 않고 수정 손실이 발생합니다. 아무리 찾아봐도 코드는 제대로 짠 것 같은데 무엇이 잘못 되었을까요??
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
제가 작성한 강의 노트 링크를 블로그 등에 올려도 되나요?
공유해도 된다고는 알고는 있는데제가 이후의 유료 강의들은 메모 작성할 때 이미지도 거의 첨부 안 하고, pdf에 없는 내용만 소량 작성했는데,무료 강의 들을 땐 처음이라 그런지 의욕이 너무 앞서서 이미지도 많이 첨부하고 좀 자세히 작성했었거든요.https://www.inflearn.com/notes/49423 분량이 좀 많은데 공유하지 않는 게 나을까요? 위처럼 링크만 올리려고 합니다. 인프런 고객센터에 문의하는 게 나을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
logback mdc 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 마지막에 Logback MDC에 관한 내용이 나와서 적용을 해보았는데요. 설정 방법이 다양하고, 확인이 필요하여 여쭤봅니다. MDC구글링해보니 어플리케이션 요청에서 처음 만나는 filter에 설정해주는 것이 좋다하여 LogFilter doFilter 메소드 try-catch문에 아래와 같이 적용해주었구요.@Override public void doFilter(중략) { ..중략 try { log.info("REQUEST [{}][{}]", uuid, requestURI); MDC.put("requestId", uuid); //추가 chain.doFilter(request, response); MDC.clear();//추가 } catch (Exception e) { throw e; } finally { log.info("RESPONSE [{}][{}]", uuid, requestURI); } } log pattern 설정로그 패턴 설정이 logback-spring.xml, base.xml, properties 등 가이드가 여럿 있었지만,resources 밑에 logback-spring.xml 생성했습니다.<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%d{yyyy.MM.dd HH:mm:ss.SSS}] - [%-5level] - [%X{requestId}] - [%logger{5}] - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="consoleAppender"/> </root> </configuration> items/add 호출하여 error log 출력localhost:8080/items/add 호출하여 공백으로 save 시 로그 패턴 설정해준 위치에 uuid 찍히는 것 확인됐습니다. [2023.12.17 00:51:15.335] - [INFO ] - [] - [h.l.w.f.LogFilter] - REQUEST [b67de768-0ef9-49cb-a4f6-65d9d5983b6f][/items/add] [2023.12.17 00:51:15.434] - [INFO ] - [b67de768-0ef9-49cb-a4f6-65d9d5983b6f] - [h.l.w.i.ItemController] - errors=org.springframework.validation.BeanPropertyBindingResult: 3 errors Field error in object 'item' on field 'price': rejected value [null]; codes [NotNull.item.price,NotNull.price,NotNull.java.lang.Integer,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [item.price,price]; arguments []; default message [price]]; default message [must not be null] Field error in object 'item' on field 'itemName': rejected value []; codes [NotBlank.item.itemName,NotBlank.itemName,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [item.itemName,itemName]; arguments []; default message [itemName]]; default message [must not be blank] Field error in object 'item' on field 'quantity': rejected value [null]; codes [NotNull.item.quantity,NotNull.quantity,NotNull.java.lang.Integer,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [item.quantity,quantity]; arguments []; default message [quantity]]; default message [must not be null] [2023.12.17 00:51:15.441] - [INFO ] - [] - [h.l.w.f.LogFilter] - RESPONSE [b67de768-0ef9-49cb-a4f6-65d9d5983b6f][/items/add] 질문위와 같은 설정 중 보완할 부분이 있을까요.?logback-spring.xml, base.xml, application.properties 중 어떤 방식을 주로 실무에서 많이 사용하나요? 환경에 따라 다를까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
java.lang.IllegalArgumentException: null
먼저 대출 기능 만들기 강의를 듣다가 문제를 2개 발견하였습니다. 유저 등록부터 'java.lang.IllegalArgumentException: null' 가 생깁니다.... 진짜 전에 잘 되던 것이 갑자기 왜 안되는지 막막합니다....그리고 대출 기능도 'java.lang.IllegalArgumentException: null' 가 생깁니다....이건 혹시 유저 부분에서 등록이 안되는 부분 때문에 생기는 오류인건지...부탁드립니다.. 똑같이 대출 기능 만들기 부분에서 생기는 건데, 위의 오류 문제를 해결하려고 형변환을 없애다 보니 아래와 같이 빨간줄이 나옵니다.. 왜 이러는 걸까요...ㅠㅠ구글 링크로 파일 업로드 했으니, 혹시나 참고해서 말씀하실 부분 있으시면 말씀 부탁드립니다.https://drive.google.com/file/d/1X9s-VjcAeBurdxOYrIOzwa0yZNNoue54/view?usp=sharinghttps://drive.google.com/drive/folders/1vB-XwaSlIKfY2Diq66g6JnQ8vyKVWQvn?usp=sharing
-
미해결스프링 핵심 원리 - 기본편
coreapplication 실행시 로그
coreapplication 실행시 콘솔창에 이렇게 debug 로그들이 많이 뜨는데 강의 영상 1:26 처럼 INFO 로그들만 나오게 하려면 어떻게 해야 하나요?
-
미해결스프링 핵심 원리 - 기본편
@Autowired 필드 명, @Qualifier, @Primary 강의중인데요
@Component //@RequiredArgsConstructor public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = rateDiscountPolicy; } 2:50초 쯤에서 DiscountPolicy 의 변수를 rateDicountPolicy 로 변경을 하는 내용이 나오거든요 그리고 테스트를 돌리는데 성공하시더라구요 그런데 저는 여기서 아래에러가 발생해서요 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [C:\Users\kkk\Downloads\core\out\production\classes\hello\core\order\OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy매칭이 안된것 같은데 어떻게 해야 할지 문의 드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
시퀀스 생성이 안되는거같아요
테스트 코드를 실행시키면 org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement [Sequence "MEMBER_SEQ" not found; SQL statement:select next value for member_seq [90036-224]] [select next value for member_seq]; SQL [select next value for member_seq]오류가 발생합니다.H2 에서 직접 CREATE SEQUENCE 쿼리로 직접 생성하고 나니까 테스트가 동작하네요 .. ddl-auto: create 확인했고 띄어쓰기 두칸 아닌것도 확인 했는데요 ,, 왜 안되는거죠?
-
미해결스프링 핵심 원리 - 기본편
policyMap과 policies에 계속 null 값이 들어갑니다.
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. public class AllBeanTest { @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); DiscountService discountService = ac.getBean(DiscountService.class); Member member = new Member(1L, "userA", Grade.VIP); int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy"); assertThat(discountService).isInstanceOf((DiscountService.class)); assertThat(discountPrice).isEqualTo(1000); } static class DiscountService { private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); } public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); return discountPolicy.discount(member, price); } } }@Component public class FixDiscountPolicy implements DiscountPolicy { private int discountFixAmount = 1000; @Override public int discount(Member member, int price) { if (member.getGrade() == Grade.VIP) { return discountFixAmount; } else { return 0; } } }@Component public class RateDiscountPolicy implements DiscountPolicy { private int discountPercent = 10; @Override public int discount(Member member, int price) { if (member.getGrade() == Grade.VIP) { return price * discountPercent / 100; } else { return 0; } } }public interface DiscountPolicy { /** * * @return 할인 대상 금액 */ int discount(Member member, int price); }@Configuration @ComponentScan( basePackages = "spring.springCoreBasic.member", excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) public class AutoAppConfig { }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
jakarta.persistence가 import 되지 않습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]제목 그대로 import가 되지 않습니다. import문을 지우고 나서 자동 임포트를 하려고 @Entity를 직접 타이핑 하여 해봐도 cannot resolve symbol이라는 메시지만 나오는데 어떡해야 할까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Request의 getLocale()
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]Request 객체의 getLocale()은 Accept-Language에서의 가장 높은 우선순위를 뽑는다고 이해했습니다. getLocale()의 정확한 의미가 궁금합니다.클라이언트가 보낸 요청 메시지의 Accept-Language에 써진 언어인 동시에, 서버에서 지원하는 언어들 중 가장 우선순위 높은 걸 뽑는 건가요?아니면 서버에서 지원을 하는 언어든 아니든, 요청 메시지의 Accept-Language에서 가장 우선순위가 높게 설정된 것을 선택하는 건가요? +) getLocale() 같은 건 스프링 공식 문서 가면 자세한 설명을 볼 수 있을까요? 자바 공식 문서랑 다르게 메서드 설명 찾기가 어렵네요..
-
해결됨실전! 스프링 데이터 JPA
@RepositoryDefinition 실무에서 사용하나요?
JpaRepository나 PageRepository 등불필요한 쿼리도 자동으로 만들어주더라구요 그래서 해당 레포지토리에서 직접 정의한 메소드 말고는 막고 생성하고 싶지 않다면 어떤 방법을 사용하시나요? 디버깅하다보니 Repository.class 인터페이스와 어노테이션인 RepositoryDefinition.class를 필터로 스캔하는 걸 확인했습니다. RepositoryDefinition를 사용하는 것보다 직접 정의해서 사용할 생각이면 Repository.class만 상속해서 사용하시나요 ?
-
미해결예제로 배우는 스프링 입문 (개정판)
클론 받은 내용과 수업내용이
지금 수업이랑 깃에서 받은 내용이 조금 다른 것 같은데, 맞죠? 1번 문제 풀려니까 내용이 달라서요.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
v5의 쿼리 횟수에 대 질문이 있습니다.
public List<OrderQueryDto> findAllByDto_optimization() { List<OrderQueryDto> result = findOrders(); List<Long> orderIds = result.stream() .map(o -> o.getOrderId()) .collect(Collectors.toList()); 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(); //최적화(Lambda사용) Map<Long, List<OrderItemQueryDto>> orderItemMap = orderItems.stream() .collect(Collectors.groupingBy(orderItemQueryDto -> orderItemQueryDto.getOrderId())); result.forEach(o -> o.setOrderItems(orderItemMap.get(o.getOrderId()))); return result; } 여기서 map을 사용하는 코드가 있는 경우에는 쿼리를 한 번 날리고 map으로 가져와서 값을 세팅하기 때문에 쿼리가 총 2번 나가는 거고 그 부분이 없으면 어떤 방식으로 쿼리가 나가는 건가요?