묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 전파 활용1,2 강의 내용 중 질문
강의록에 첨부해주신 그림을 보면 MemberRepository는 con1를 사용하고, LogRepository는 con2를 사용하는데 이게 각각 MemberRepository는 트랜잭션B를 사용하고 LogRepository는 트랜잭션C를 사용한다고 해서 다른 커넥션을 사용하게 되는거죠?? MemberRepository는 con1를 사용하고 커밋하고 난 후에 커넥션 풀에 con1이 반납되고 그 후에 LogRepository가 트랜잭션을 시작하게 되면 con1을 사용하게 되는건 아닌가요?? 이럴때는 서로가 다른 트랜잭션B,C로 구분이 안되어있을때만 이렇게 되는건가요..??
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
토큰의 id값 검증
해결했습니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
Classicist VS. Mockist
우빈님. 안녕하세요! 질문이 있어서 남겨드립니다.제가 테스트할때는 repository부분의 쿼리메서드나 jpql로 작성한 코드들은 따로 테스트를 하지 않고 QueryDSL같은 외부 라이브러리를 사용할때만 단위 테스트를 진행합니다. 그리고 비즈니스 레이어에 대해서는 위의 repository를 mocking하여 사용하고 컨트롤러 부분에서 통합테스트를 진행합니다.해당 부분에서 우빈님과 하는 방식이 다른것 같습니다. 우빈님은 비즈니스 레이어에서 통합테스트를 진행하고 Presentation 레이어에서 mocking을 이용한다고 하셨는데 혹시 제가 하는 방식에서 조언을 주실 수 있으실지 잘못된 방향성으로 가고 있는지에 대해 여쭤보고 싶습니다. 또한 우빈님께서 그렇게 진행하시는 이유에 대해 듣고 싶습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Test에서 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 코드는 다음과 같이 작성했는데 다음과 같은 문제가 발생합니다. 코드를 여러번 수정하고 계속 확인하는데 고쳐지지가 않아서 질문드립니다![질문 내용]여기에 질문 내용을 남겨주세요.
-
해결됨Practical Testing: 실용적인 테스트 가이드
테스트 코드에 대해 질문 있습니다.
private String createNextProductNumber() { String latestProductNumber = productRepository.findLatestProductNumber(); if (latestProductNumber == null) { return "001"; } int latestProductNumberInt = Integer.parseInt(latestProductNumber); int nextProductNumberInt = latestProductNumberInt + 1; return String.format("%03d", nextProductNumberInt); } Integer.parseInt(latestProductNumber); 이 부분 처럼 값을 숫자로 바꿀때 latestProductNumber가 숫자인지 아닌지에 대한 검증은 안해도 되는건지 궁금합니다. public OrderResponse createOrder(OrderCreateRequest request, LocalDateTime registeredDateTime) { List<String> productNumbers = request.getProductNumbers(); List<Product> products = findProductsBy(productNumbers); deductStockQuantities(products); Order order = Order.create(products, registeredDateTime); Order savedOrder = orderRepository.save(order); return OrderResponse.of(savedOrder); } ... private static List<String> extractStockProductNumbers(List<Product> products) { return products.stream() .filter(product -> ProductType.containsStockType(product.getType())) .map(Product::getProductNumber) .collect(Collectors.toList()); } private Map<String, Stock> createStockMapBy(List<String> stockProductNumbers) { List<Stock> stocks = stockRepository.findAllByProductNumberIn(stockProductNumbers); return stocks.stream() .collect(Collectors.toMap(Stock::getProductNumber, s -> s)); } private static Map<String, Long> createCountingMapBy(List<String> stockProductNumbers) { return stockProductNumbers.stream() .collect(Collectors.groupingBy(p -> p, Collectors.counting())); } 위 상황처럼 createOrder()메서드가 아래 private 메서드를 모두 호출 하므로 createOrder() 메서드만 테스트하고 나머지 메서드는 테스트를 안 해도 되는건가요?질문의 요지는 private이냐 아니야가 아니라 특정 메서드에서 다른 메서드를 모두 호출한다면 특정 메서드만 테스트를 해도 되는지 아니면 각각의 메서드도 테스트를 해야하는지 궁금합니다.
-
미해결실전! Querydsl
실무에서 Dto 객체에 대한 @Data
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니요3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]@Data는 getter, setter, toString, EqaulsAndHashcode등을 포함한 어노테이션으로 알고 있습니다.Dto는 전달 객체이기 때문에 Setter를 쓰셔도 된다고 하셨는데 그렇다면 @Data 어노테이션을 실무에서 사용 해도 무방하나요?혹은 Dto 객체에는 @Getter, @Setter 정도로만 사용하나요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
배포까지 완료했는데 index.html 접속이 안됩니다
어디서 잘못된걸까요?ㅜㅜ
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Kafka 통신 클라이언트 응답 질문
서비스 로직이 실행될때 Kafka 통해 이벤트를 발행하는 순간 클라이언트 응답이 성공으로 나가는데만약 이 이벤트를 처리하는 컨슈머쪽에서 실패한다고하면 클라이언트 응답은 이미 성공으로 보내졌는데실패했다는걸 어떻게 알리나요? 보상트랜잭션을 발행해서 데이터를 되돌리는건 이해가 되지만 클라이언트 응답에 대해서는 어떻게 해야될지 궁굼합니다 Ex) 주문후 재고감소 이벤트를 발행하는 순간 클라이언트 응답은 성공으로감하지만 재고감소하는 서비스에서 실패를 한다고하면?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
AOP Self Invocation 해결방법..?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.이 영상에서 나온것처럼 최상단 서비스에서만 @Transactional 걸어주면(예전 영상에서 나온 한 클래스 내부의 2개의 트랜잭션처리[AOP Proxy때문에 this로 인한 Self Invocation]이 일어나는 경우)를 해결할 수 있을까요?레포지토리 내부에서 트랜잭션을 걸지 않고 엔티티매니저로 CRUD하는 작업을 여러개 작성해놓으면 memberRepository 내부에서 내부 메서드를 호출해도 둘 다 트랜잭션 처리가 될까요?
-
해결됨코드로 배우는 React with 스프링부트 API서버
spring boot 3.3.2도 호환되나요?
spring boot 3.3.2도 호환되나요?
-
미해결Practical Testing: 실용적인 테스트 가이드
Mock 반환값 질문
프론트랑 협업 하실 때, 서비스 로직을 먼저 만드는게 아닌 반환값을 먼저 준다고 하셨는데(?) 예를 들어 어떻게 주시는지 궁금합니다. 하드코딩으로 그냥 데이터를 임의로 입력해주시는건지 예시를 보여주시면 감사하겠습니다 !컨트롤러, 서비스, 레포지토리에서 어떤식으로 진행되는지 궁금합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 및 커넥션 관련 질문 드립니다.
안녕하세요. 앞서 db1강의에서 트랜잭션 관련 내용을 바탕으로 커넥션 관련해서 제가 이해하는 바가 맞는지 질문드립니다..! 트랜잭션을 시작하고 JdbcTemplate.update() 등등이 호출되면, 먼저 데이터베이스에 접근할 수 있는 커넥션을 얻는다.이때 내부적으로 DataSourceUtils.getConnection()을 호출해서 트랜잭션 동기화 매니저에서 관리하는 커넥션을 가져오거나, 새로운 커넥션을 생성(등록된 dataSource로 부터 커넥션을 생성)한다. 그리고 나서 SQL 쿼리를 실행한다. 이때 커넥션을 통해 데이터베이스와 통신한다.즉, JdbcTemplate을 통해 update 작업을 수행할 때, 커넥션을 사용하여 데이터베이스에 접근하여 SQL 쿼리를 실행하고, 그 결과로 데이터베이스의 내용이 업데이트된다.트랜잭션을 시작하지않고 JdbcTemplate.update() 등등이 호출되면, 이때도 먼저 데이터베이스에 접근할 수 있는 커넥션을 얻는다.이때 내부적으로 DataSourceUtils.getConnection()을 호출해서 트랜잭션 동기화 매니저에서 관리하는 커넥션을 가져오거나, 새로운 커넥션을 생성(등록된 dataSource로 부터 커넥션을 생성)한다. 그리고나서 SQL쿼리를 실행한다. 이때 커넥션을 통해 데이터베이스와 통신한다.마찬가지로, 커넥션을 사용하여 데이터베이스에 접근하여 SQL 쿼리를 실행하고, 그 결과로 데이터베이스의 내용이 업데이트된다.트랜잭션을 사용하지 않고 JdbcTemplate.update()를 호출하면, 커넥션은 기본적으로 자동 커밋 모드로 동작하여, 쿼리가 실행된 후 즉시 데이터베이스에 반영된다.트랜잭션이 있든 없든 JdbcTemplate은 항상 커넥션을 사용하여 데이터베이스에 접근하고, 쿼리를 실행하여 그 결과로 데이터베이스의 내용을 수정하거나 조회하는 작업을 수행한다. 트랜잭션 및 커넥션 관련해서 이렇게 이해하면서 정리해보았는데, 이렇게 이해하면 될까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 전이와 고아 객체는 부모쪽에 걸어줘야하나요?
다 부모쪽에 걸던데 자식쪽과 같이 걸거나 자식쪽에만 걸면 안되나요? 그리고 부모라는게 Many와 One 중에 One 인 곳이 부모라보면 될까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
SQL 설치 관련
https에서 sql release까지 잘 다운로드 받았는 것 같은데 sudo yum install mysql-community-server를 하니까 이런 에러 메세지가 뜹니다...ㅠ
-
미해결Spring Boot를 활용하여 채팅 플랫폼 만들어보기
./gradlew clean build 하면 오류가 생깁니다.
FAILURE: Build failed with an exception.* What went wrong:A problem occurred configuring root project 'demo'.> Could not resolve all artifacts for configuration ':classpath'. > Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.3.4. Required by: root project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.3.4 > Dependency requires at least JVM runtime version 17. This build uses a Java 11 JVM.* Try:> Run this build using a Java 17 or newer JVM.> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.> Get more help at https://help.gradle.org.Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.For more on this, please refer to https://docs.gradle.org/8.10.2/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.BUILD FAILED in 2s 이런식으로 자바를 17로 올려주라고 하는데, 어떻게 수정해야 할까요?ㅠㅠ 구글에 검색해봐도 vscode 쪽에서 설정하는 방법이 자세하지 않아서요..ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
간단한 주문 조회 V4 : JPA에서 DTO로 바로 조회에 대한 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]해당 강의에서 5:35초를 보시게 되면, 원래는 fetch join이 아닌 join이지만 public List<OrderSimpleQueryDto> findOrderDtos() { return em.createQuery( "select new jpabook.jpashop.repository.OrderSimpleQueryDto(o) " + " from Order o" + " join fetch o.member m" + " join fetch o.delivery d", OrderSimpleQueryDto.class ).getResultList(); }fetch join을 하게 되면 v3메서드와 동일한 결과가 나옴과 동시에 쿼리문도 동일하게 1개가 출력된 것을 확인하였습니다. 여기서 드는 의문점은' fetch join은 select절에 entity가 아닌 DTO를 명시하게 되면 안된다' 즉, 'fetch join은 select절에 entity만을 명시해야 한다' 라고 질문 글을 찾아보며 알게되었습니다. 하지만 결과는 예상과 다르게 잘 작동하여 의문이 들게 되었습니다.
-
해결됨실전! Querydsl
컨트롤러의 파라미터로 Pageable 인터페이스 사용할 때
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]포스트맨을 통해서 요청을 보낼 때 url파라미터를 통해 page와size를 설정하였는데요, 이는 MemberSearchCondition 말고 Pageable 또한 앞에 @ModelAttribute가 생략된 형태로 동작한다고 생각하면 될까요?실제 웹 사이트에서 페이징 처리된 부분의 버튼 같은 걸 누를 때 해당 파라미터들을 넣어주는 방식으로 동작할 것 같은데 맞을까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
DTO -> 엔티티, 엔티티 -> DTO 과정에서의 빌더 패턴과 정적 팩토리 메서드 사용에 대해 질문 있습니다.
DTO -> 엔티티, 엔티티 -> DTO 과정에서의 빌더 패턴과 정적 팩토리 사용에 대해 아래와 같이 정리를 했는데 제가 정리한 방식이 타당한 방식인지 궁금합니다. DTO -> 엔티티엔티티의 생성자에 빌더 패턴을 적용합니다.외부에서 엔티티를 생성하려면 빌더 패턴을 사용하여 엔티티를 생성합니다. 예를들어 서비스 레이어에서 엔티티의 빌더 패턴을 사용하여 DTO를 엔티티로 변환하는 작업을 가집니다.엔티티쪽에서 DTO를 엔티티로 변환하는 정적 팩토리 메서드를 가지지 않는 이유 변화가 심한 DTO에 엔티티가 의존하는 것은 좋지 않다고 생각했습니다. 그래서 객체 생성에 빌더 패턴만 적용했습니다. 엔티티 -> DTODTO쪽에서 생성자에 빌더 패턴을 적용합니다.또한 엔티티 -> DTO로 변환하는 정적 팩토리 메서드를 만드는데 이때 DTO 객체 생성은 DTO쪽에서 정의한 빌더 패턴을 적용합니다.DTO는 엔티티에 의존해도 아무 문제가 없다고 생각합니다. 그래서 빌더 패턴도 사용하고 정적 팩토리 메서드도 사용하여 DTO 객체를 생성했습니다.이 둘을 같이 사용할 경우 빌더 패턴과 정적 팩토리 메서드 장점 모두 사용할 수 있다고 생각하여 2가지 모두 사용하여 DTO 객체를 생성하도록 했습니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
Service dto를 만드는 대신 도메인 객체를 생성하는 전략은 별로인가요?
안녕하세요. PresentationLayer 테스트(2) 마지막 부분에 service layer용 dto를 생성하여 서비스를 presentation layer와 분리하는 것을 확인했습니다.그렇다면 presentation Dto -> service Dto -> domain으로 변경이 이루어질 것 같은데요..혹시 컨트롤러에서 바로 도메인 객체로 바꿔서 presantatio Dto -> domain 구조로 바꾸는 것은 좋지 않은 아키텍처일까요 ???
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
제대로 이해했는지 확인하고싶습니다.
가장 처음에 했던 트랜잭션은 각각의 리포지터리에서 @Transactional을 걸어줘서 별도로 커밋, 롤백 되게끔 만들었습니다. 이후, 마지막에는 LogRepository에 @Transactional(propagation = Propagation.REQUIRES_NEW)를 사용해서 트랜잭션 동기화 매니저에서 다른 커넥션을 가져와서 별도로 커밋, 롤백 되게끔 만들었습니다. 여기서 궁금한 점은 처음과 마지막의 트랜잭션의 구성은 다르지만 결과값은 똑같은 게 맞을까요? 다른 점이 있다면 혹시 무엇인지 알려주시면 감사하겠습니다.