학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? ( 예 /아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? ( 예 /아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? ( 예 /아니오) [질문 내용] 여기에 질문 내용을 윈도우에서 실행했는데 이런식으로 나옵니다. ㅠㅠ 왜이런건가요?
Optioanl<Member> findById(Long id)와 @Query("select m from Member m where m.id = :id) Optional<Member> findByid(@Param("id") Long id) 가장 위의 코드는 spring data jpa를 이용해서 작성했기 때문에 em.flush()가 호출될 때 바로 일어나지않고 아래의 코드는 jpql로 작성했기 때문에 로직 호출 시에 바로 em.flush()가 발생하는 거 맞나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 말 그대로 입니다. 영한님은 하루에 자바 강의를 찍을 때 평균적으로 하루에 시간을 얼마나 투자하시나요? ('어레이 리스트 에서 링크드리스트로 변환 할때 이런 것은 얼마나 생각을 해야지 나오지?(11:30~40)'라는 생각이 들어서 질문을 합니다.)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] fetchOne()은 결과 값이 없을 경우 null을 반환 하는데 왜 Optional<Member>로 반환 하지 않나요? fetchOne()은 member가 없을 경우 null 반환 합니다. 결과 값을 Optional.ofnullable()로 감싸서 반환 후 서비스 계층에서 null 이면 안될 경우 RutTimeException을 상속한 커스텀 Exception을 발생 시키고 advice에서 처리 하는게 맞나요?
안녕하세요 강의 잘 보고 있습니다. 파사드 패턴에 대해 질문이 있습니다. 얄코님이 올려주신 예시에선 다음과 같이 두 상황이 나온다고 이해했습니다. 다양한 서브 시스템을 파사드 클래스로 조합해 하나의 새로운 로직을 만듦. 여러 서브 시스템을 생성시키고 세부 로직을 파사드 클래스에 위임. 1번의 경우는 일종의 추상화로 이해하였으며, 2번의 경우 서브 시스템에 대한 의존성 주입을 파사드 클래스에 위임 및 세부적인 로직을 캡슐화하는데 의의를 두었다고 이해했습니다. 만약 의존성 주입은 자동으로 이루어지는 3-layer 아키텍쳐에서 파사드 패턴을 도입할 경우 이미 service 레이어에서 내부 로직에 대해 캡슐화가 되었으므로 다양한 서브시스템을 파사드 클래스로 조합하는 것(ex. 1번)에만 집중하면 될까요?
아래 질문에서 ( https://www.inflearn.com/community/questions/939280/spring-batch-%ED%86%B5%ED%95%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%8B%9C-transactional-%EC%82%AC%EC%9A%A9-%EC%96%B4%EB%A0%A4%EC%9B%80-%EC%A7%88%EB%AC%B8%EC%9D%B4%EC%9A%A5?srsltid=AfmBOorgNyXxuBBsgtD-dGYQq1p884s2u8Wg1u75xaynYq2EooXmmnnM) 즉, 스프링 배치 통합 테스트를 작성하는 경우, 현 강의에서 다루고 있는 테스트 작성법과는 다른 접근이 필요한 것이죠. (배치 수행 시 chunk 단위로 여러 번 트랜잭션이 수행될테니까요) 답변을 달아주셨는데요, 테스트 클래스에 @Transactional 붙이면, 하나의 테스트 메서드 내 스프링 배치의 작업도 일괄 롤백될테니까, 결국엔 테스트 간에 오류를 안일으키지 않나요..?
OrderRepository에서 startDateTime, endDateTime, orderStatus를 파라미터로 받아 List<Order>를 반환하는 findOrdersBy 쿼리메소드를 테스트하려고합니다. OrderRepositoryTest 내부에서 해당 테스트를 작성하던 중 given절에서 Product 객체를 생성하는 과정을 생략하고 Order 객체를 생성할때 비어있는 리스트를 이용하여 생성하도록 하였습니다. @ActiveProfiles("test") @SpringBootTest class OrderRepositoryTest { @Autowired private OrderRepository orderRepository; @DisplayName("원하는 기간과 원하는 주문상태의 주문들을 조회한다.") @Test void findOrdersBy() { // given LocalDate registeredTime = LocalDate.of(2024, 10, 24); Order order1 = Order.builder() .products(List.of()) .orderStatus(PAYMENT_COMPLETED) .registeredDateTime(registeredTime.atStartOfDay()) .build(); Order order2 = Order.builder() .products(List.of()) .orderStatus(PAYMENT_COMPLETED) .registeredDateTime(registeredTime.plusDays(1).atStartOfDay()) .build(); orderRepository.saveAll(List.of(order1, order2)); // when List<Order> orders = orderRepository.findOrdersBy( registeredTime.atStartOfDay(), registeredTime.plusDays(1).atStartOfDay(), PAYMENT_COMPLETED); // then assertThat(orders).hasSize(1) .extracting("orderStatus", "registeredDateTime") .contains( tuple(PAYMENT_COMPLETED, registeredTime.atStartOfDay()) ); } 이는 테스트하려는 목적이 Order 객체 내부에 적절한 List<OrderProduct> 값을 가지고 있는지를 검증하려는 것이 아니고 findOrdersBy 쿼리메소드가 적절한 Order객체를 가져오는지를 테스트하는 것이라고 생각하였습니다. 위와 같이 실제 객체를 생성하는 것 대신 비어있는 리스트 값을 활용하는 것도 괜찮은지 궁금합니다.
// stubbing when(mailSendClient.sendEmail(any(String.class), any(String.class), any(String.class), any(String.class))) .thenReturn(true); 안녕하세요. 어떤 기능을 요청해서 어떤 결과를 반환하니 행위검증용도의 목킹이 아닌가요? 강의에서는 스터빙이라고 설명하고 있는데, 상태검증보단 행위검증인거같아서요
이전에 공부할 때 엔티티매니저에서 트랜잭션을 가져야 로직이 수행된다는 것을 알고 있었습니다. 그런데 이전에 JPA활용2편에 @Transactional을 따로 붙혀주지 않았는데 로직이 실행된걸로 기억하는데 @Service나 @Repository에 의해서 자동으로 트랜잭션이 걸리는 건가요?
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요! 먼저 유사한 질문이 있었는지 검색해 보세요. 서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요 선생님 강의중 하나 궁금증이 생겼습니다. 제가 알기로 Jpa Repository 인터페이스를 생성할 때 @Repository 어노테이션을 사용하지 않아도 최상위 구현체인 Repository 클래스를 구현받고 있기 때문에스프링 컨테이너에서 빈을 주입해준다? 라고 알고있는데 @Repository public interface ProductRepository extends JpaRepository<Product, Long> { 어노테이션을 없애고 테스트를 돌려봐도 문제없이 돌아갔고 위 어노테이션을 없이 인터페이스를 사용해도 문제없이 실행이 잘 됩니다. 혹시 선생님이 @Repository 어노테이션을 생성해서 개발하시는 이유가 따로 있으신지 궁금합니다.
자바, jvm, jdk 그리고 jre 강의에서 kotlinc 명령어로 .kt 파일을 컴파일하시는걸 봤는데요, 코틀린 컴파일러는 jdk에 포함되어 있는 것이 아니고 따로 설치해야 하는게 맞을까요? jre는 java의 실행환경을 제공하고, jdk는 개발 도구 키트를 제공해서 java를 컴파일하는 javac 등의 명령어? 툴?은 jdk에 포함되어 있다고 강의 교안에 적혀있는데 그럼 코틀린의 컴파일러는 추가적으로 설치가 필요한지, 아니면 뭔가 방법이 있는지 궁금합니다. 우선 컴파일하면 바이트 코드가 되기 때문에 런타임에 필요한 라이브러리만 포함하여 패키징하면 jre에서 실행할 수 있다는 것은 이해했습니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 직접 구현하는 배열 리스트1- 시작의 MyArrayListV1 구현문제를 예외 처리하고 싶은데 아무리 해도 안돼는데 해결책좀 try { list.add("f"); System.out.println(list); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("배열의 범위를 벗어났습니다"); System.out.println("예외 발생 위치: " + e.getMessage()); e.printStackTrace(System.out); } 그리고 아래 MyArrayListV1에 이렇게 작성하면 되긴 돼는데 저는 유지보수를 위해서 try~catch를 하고 싶거든요. 그래서이렇게 질문 남겨요 public void add(Object e) { if (size >= elementData.length) { // 배열이 가득 찼는지 체크 throw new ArrayIndexOutOfBoundsException("용량을 초과했습니다. 현재 크기: " + size + ", 최대 용량: " + elementData.length); } elementData[size] = e; size++; }
public class OrderApiController { @GetMapping("/api/v1/orders") public List<Order> orderV1() { List<Order> all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); order.getDelivery().getAddress(); List<OrderItem> orderItems = order.getOrderItems(); orderItems.forEach(o -> o.getItem().getName()); } return all; } } public class OrderRepository{ public List<Order> findAllByString(OrderSearch orderSearch) { String jpql = "select o from Order o join o.member m"; boolean isFirstCondition = true; //주문 상태 검색 if (orderSearch.getOrderStatus() != null) { if (isFirstCondition) { jpql += " where"; isFirstCondition = false; } else { jpql += " and"; } jpql += " o.status = :status"; } ... 트랜잭션을 따로 붙히지 않았는데 상관없는건가요? List<Order> all = orderRepository.findAllByString(new OrderSearch()); 이 때 연관관계매핑되어 있는 객체들은 지연로딩에 의해 프록시로 존재하고 for (Order order : all) { order.getMember().getName(); order.getDelivery().getAddress(); List<OrderItem> orderItems = order.getOrderItems(); orderItems.forEach(o -> o.getItem().getName()); } 이 때 강제호출 되어서 쿼리가 나가는 게 맞나요? orderRepository.findAllByString에서 repository에서 작업이 마쳐서 트랜잭션이 커밋되어서 영속성 컨텍스트에는 아무값이 없을 거 같은데 컨트롤러에서 리턴하기 전까지 하나의 트랜잭션 안에서 작동이 이뤄지는 건가요? 트랜잭션이 언제 시작하고 언제 종료되는 지 궁금합니다
[질문 내용] 코드에서 private static Map<Long, Member> store = new HashMap<>(); 부분이 있는데요.. 중간에 코딩시에 HashMap 부분에 빨간줄이 그어져있어서 뭔가 문제지 했는데 나중에 코드를 보니까 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Optional; 처음 작성시엔 위의 코드로 import 가 되어있었는데 동영상 후반에 보니까 아래 코드로 변경되어져 있었습니다. import java.util.*; 위 import 부분을 강의영상에서 변경된 부분을 못찾았는데 어떠한 이유로 그렇게 변경된건지 알고 싶습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 이전 질문 내역에서 하이버네이트6 최적화 문제라는 답변을 봤는데.. 아직 패치가 안된건지 2024 년에도 총 7번 쿼리날아가네요. 디버깅 해보니 address = order.getDelivery().getAddress(); // LAZY 초기화 이 부분에서 select d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status from delivery d1_0 where d1_0.delivery_id=? 2024-10-22T14:07:35.134+09:00 DEBUG 6578 --- [nio-8080-exec-1] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 where o1_0.delivery_id=? 이렇게 두번 쿼리가 실행되네요.. 그래서 List<Order> all = orderRepository.findAllByString(new OrderSearch()); 여기서 쿼리 한번 name = order.getMember().getName(); // LAZY 초기화 여기서 쿼리 한번 address = order.getDelivery().getAddress(); // LAZY 초기화 여기서 쿼리 두번 주문 리스트가 2개 있으므로 1 + 2 * (1 + 2) = 7 번 실행됩니다. 궁금한 점은 select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 where o1_0.delivery_id=? 이 쿼리는 왜 추가적으로 실행되는지 모르겠습니다.
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요! 먼저 유사한 질문이 있었는지 검색해 보세요. 서로 예의를 지키며 존중하는 문화를 만들어가요. 현재 Presentation Layer 테스트에서 create할때에는 httpstatus만 확인하는데 보통 Presentation Layer 테스트의 경우 상태값만 확인하고 실제로 db에 저장되어 있는지 확인하지는 않을까요? 만약 확인한다면 통합테스트가 필요할 것 같은데 약간 다른 결의 질문이지만 통합테스트시에 spring Security 인증을 포함해서 해야할까요 아니면 제외하고 해야할까요? 만약 제외하고 해야한다면 통합테스트시 spring Security를어떻게 제외해야 하는지도 여쭤보고 싶습니다
수동으로 빌드하면 잘 실행되는데 인텔리제이의 빌드 기능을 사용하면 첨부한 사진처럼 찾을 수 없다고 뜹니다. 소스 경로와 컴파일 경로 설정 해주었고, configurations도 확인해봤는데 뭐가 문제인지 모르겠습니다. 아예 삭제하고 다시 프로젝트를 만들어도 계속 같은 에러가 발생하는데 뭐가 문제인걸까요??
Team과 Member가 1:N일때 Member 객체에서 Team을 참조할 일이 없고 Team 객체에서 Member를 참조해야 하는 경우 이번 강의처럼 일대다 단방향으로 짜게 되는데요 그렇게되면 Team 객체에서 다른 Member 테이블의 FK를 관리하므로 영한님께서 추천해주시지 않았습니다 그러면 그냥 Member와 Team이 양방향 관계를 갖고, FK를 보유한 Member가 연관관계의 주인이 되는게 나을까요? 두개의 장단점을 잘 모르겠네요