묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Practical Testing: 실용적인 테스트 가이드
lesson5-5 Order Entity의 registeredDateTime 컬럼
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요.질문Order Entity가 상속 받는 BaseEntity에 createdDateTime 컬럼이 있음에도 registerdDateTime 컬럼을 추가하는 이유는 무엇인가요? 외부결제API에서 제공하는 결제일시를 저장하기 위함인가요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
안녕하세요 선생님 질문 있습니다 !
이제 막 java, spring, mysql , 프론트 부분 기초적인 부분 공부를 끝마친 학생입니다.항상 테스트 코드의 중요성을 많은 커뮤니티에서 봐오고 강조하는 분들이 많아서언젠간 배워야겠다 싶은 찰나에 수강 결제를 미리 하게 되었습니다.혹시 선생님 수업을 듣기 전, 미리 좀 더 배워둬야 하거나알아둬야 하는 부분이 있을까요 ?
-
해결됨Practical Testing: 실용적인 테스트 가이드
빌더 사용에 대해 질문드립니다!
안녕하세요 선생님. 빌더를 사용하시는 것을 보고 흥미가 동해 질문남깁니다!선생님께서는 예제의 경우 대부분 생성자를 private으로 막아두고 빌더를 통해서만 객체를 생성하시는 것 같습니다.저는 필드 개수가 많아도 public 생성자로 열어두는 편인데, 그 이유는어떤 인자를 전달해야할지 인텔리제이의 힌트로 알아채기도 편하고필드가 null 일 수도 있는 경우 객체를 생성할 때 명시적으로 null 이 보이는게 낫다 라고 생각해서입니다. null을 명시적으로 인자로 전달하는 것이 불편하다면 텔레스코핑을 통해 생성자를 조금 더 만들어두기도 합니다 :)물론 빌더 패턴을 사용하면 이런 코드들이 전부(?) 사라지기는 하지만, 이 외에 빌더로 객체 생성을 강제하는 것에 대한 장점이 있는지 궁금합니다! 또, 선생님만의 빌더랑 생성자 선택 기준이 따로 있을까요? 마지막으로 실무에서도 자주 사용하시는지 궁금합니다. 좋은 강의 감사드립니다 :)
-
해결됨Practical Testing: 실용적인 테스트 가이드
통합, 인수 테스트 사전 데이터 세팅 질문
안녕하세요 강의 잘 보고 있습니다.테스트에 대해 파편화 된 지식을 학습자들이 원하는 내용으로 잘 만들어 낸 좋은 강의라고 생각합니다. 현재 저희 팀음 통합 테스트 및 인수 테스트를 할 때 미리 쿼리문을 작성해두고 이를 @SqlGroup과 @Sql을 활용하여 데이터를 삽입해주고 있습니다.이 경우 강의 내에서 말씀하신 것 처럼 스키마 변경이 생길때마다 모든 쿼리를 찾아 수정해야하는 번거로움이 있습니다. 하지만 매 케이스마다 세팅을 하기에는 연관된 5개~10개의 테이블에 대한 데이터 수십개를 매번 세팅해줘야 하는 것이 어렵게 느껴집니다.이때 repository를 계층을 넘어서까지 임포트 해서 사전 데이터 삽입을 해줘야 하는가 궁금하구요.또한 모든 객체에 Builder를 개방하면 그나마 할만하겠지만 아닌 경우 객체가 제공하는 제한적으로만 생성이 가능할텐데, 리플렉션이라도 써야하는건지 너무 걸리는 경우가 많습니다. 다소 두서 없고 여러 질문을 한번에 했지만 제가 어떤 어려움을 겪는지는 전달 되었으리라 생각합니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
setup 해야하는 데이터가 대용량인 경우 테스팅 가이드
안녕하세요. 우빈님양질의 강의 제공해주셔서 감사의 말씀드립니다. 강의를 듣던 도중 실무에서는 어떻게 해결을 할까? 🤔라는 궁금증이 생겨 질문 드립니다. 만약에 테스트 코드 작성시에 setup해야 할 데이터가 대용량이라면실무에서는 주로 어떤 방식으로 테스트 코드를 작성하여 해결하나요? 감사합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트 오류
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : example.cafekiosk.spring.domain.orderproduct.OrderProduct.product -> example.cafekiosk.spring.domain.product.Product; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : example.cafekiosk.spring.domain.orderproduct.OrderProduct.product -> example.cafekiosk.spring.domain.product.Product 스프링부트 2.7.12 인데 오류가 납니다.. 강사님 코드를 보니 OrderProduct Entity 쪽엔 cascade 가 설정이 안되어 있는데 설정을 하니 오류가 없어졌습니다..!
-
해결됨Practical Testing: 실용적인 테스트 가이드
마이바티스와 테스트 코드
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요.안녕하세요 강사님 강의 너무 잘 듣고있습니다. 회사에서 Mybatis로 개발 중인데 테스트 코드 작성에 어려움이 있어 질문 드립니다. JPA의 경우 CRUD가 기본적으로 구현되어 있지만, Mybatis의 경우 xml(또는 인터페이스)에 정의된 메서드를 사용하기 때문에 테스트 코드 작성이 어렵더군요.. 만약 Money 테이블이 있고, 해당 Repository에 Select 코드가 없는 경우 어떻게 검증을 해야 좋을까요? 테스트를 위해 xml이나 인터페이스에 새로운 코드를 작성하는 것은 좋은 방법이 아닌 것 같고, Jdbc Template를 이용해봤는데 이 경우에는 데이터가 롤백되지 않는 등의 문제가 있었습니다.( 아마 잘못 사용해서 그런 것 같기도 합니다..) Repository 부분을 Mock으로 Stub하여 테스트를 진행하는 것도 생각해 보았습니다. 이 경우에는 Repository 쿼리를 수정할 때마다 Service에 정의된 Stub도 그에 맞게 계속 수정해야 하는 문제가 있어서 이 방법도 적합하지 않다고 생각이 들었습니다..(이 케이스도 A,B 각각 모듈 단위의 테스트는 성공하나 결합하여 테스트할 때 실패하는 경우라고 볼 수 있을까요?) 회사가 테스트 코드를 작성하는 문화는 아니어서 물어볼 사람이 없어 질문 남깁니다.. 좋은 강의 감사하합니다. 앞으로도 좋은 강의 기대하겠습니다!!
-
해결됨Practical Testing: 실용적인 테스트 가이드
도메인 테스트 코드 작성을 해봤습니다.
도메인//Order 도메인 @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor public class Order { @Enumerated(EnumType.STRING) private OrderStatus status; @OneToMany(mappedBy = "order",cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); /* 주문 취소 */ public void cancel(){ this.setStatus(OrderStatus.CANCEL); /** 재고 원복 */ for (OrderItem orderItem : orderItems) { orderItem.cancel(); } } }//OrderItem public class OrderItem { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order; public void cancel() { getItem().addStock(count); // 재고수량을 늘려준다. } }//Item public class Item { private int stockQuantity; public void addStock(int quantity) { this.stockQuantity += quantity; } }불필요한 코드는 제거 했습니다. 테스트 코드@DisplayName("주문을 생성하고, 주문 취소시 주문 취소로 상태를 변경하고, 감소된 상품 재고를 수량을 추가한다.") @Test void cancelOrder(){ //given OrderItem orderItemMock1 = Mockito.mock(OrderItem.class); OrderItem orderItemMock2 = Mockito.mock(OrderItem.class); BDDMockito.doNothing().when(orderItemMock1).cancel(); BDDMockito.doNothing().when(orderItemMock2).cancel(); //OrderItem 가변인자는 내부에서 List로 보관 Order order = Order.createOrder(orderItemMock1,orderItemMock2); //when order.cancel(); //then assertThat(order.getStatus()).isEqualByComparingTo(OrderStatus.CANCEL); Mockito.verify(orderItemMock1,Mockito.times(1)).cancel(); Mockito.verify(orderItemMock2,Mockito.times(1)).cancel(); }Order 도메인의 cancel()을 테스트 코드를 작성해야한다고 할때cancel 호출로 변경된 상태(enum)와내부 List<OrderItem> 필드에 하나씩 취소 요청을 할때Mock으로 OrderItem 도메인을 만들고 호출을 했는지만 검사를 했습니다. Mock 객체를 만드니까 간단한 단위테스트 인데도 속도가 많이 느려지더라구요이런 경우에Order.cancle 로직에 대한 테스트이기 때문에 나머지는 Mock으로 처리관련된 OrderItem.cancle(),Item.addStock()은 별도 단위테스트로 검증했기때문에추가 검증이 필요없다.Order.cancle 로직에 대한 테스트이지만,OrderItem.cancle(),Item.addStock() 테스트 검증이 끝났다고 해도비즈니스 계층 통합테스트 느낌으로 given에서 데이터를 준비하고연관된 데이터를 전부 검증한다. 1번으로 할경우 테스트 목적은 한눈에 들어오지만2번으로 할경우 이 로직이 어디까지 관련이 되어있는지 테스트 코드로 알수 있을거같아서강사님이 말씀하신 테스트를 문서처럼 사용할 수 있는거같습니다. 고민을 해보니 Order.cancel()은 서비스 계층에서 호출을 할텐데1번으로 테스트를 하고, 서비스 계층에서 통합 테스트를 하는게 맞을까요?더 나은 방법이 있을까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
Persistence Layer(2) 강의 질문있습니다.
안녕하세요.Persistence Layer(2) 강의를 수강 중에 질문이 있습니다.먼저, 저는 h2 database 대신 mysql을 사용하기로 해서, 아래와 같이 application.yml 파일을 작성했습니다.그리고 build.gradle에 mysql import 부분 역시 등록하였습니다.spring: profiles: default: local datasource: url: jdbc:mysql://localhost:3306/testing?useSSL=false&characterEncoding=UTF-8 username: root password: [생략] driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: none sql: init: mode: always --- spring: config: activate: on-profile: local jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true defer-datasource-initialization: true # (2.5~) Hibernate 초기화 이후 data.sql 실행 # h2: # console: # enabled: true --- spring: config: activate: on-profile: test jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true sql: init: mode: never 그리고 ProductRepositoryTest를 실행한 결과, @SpringBootTest 어노테이션 상에서는 테스트가 정상적으로 작동이 되나, @DataJpaTest를 사용하면 아래와 같은 오류가 발생합니다.Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoConfigureTestDatabase.Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoConfigureTestDatabase. 제 생각에는, application.yml 파일 설정에서 제가 잘못 하고 있는 것 같은데요, 혹시 어느 부분을 제가 놓치고 있는지 알고 싶습니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
인증 관련 테스트 할 때 질문드립니다.
안녕하세요. 수업 내용과는 관련 없지만 테스트 코드를 짤 때 벽을 만나서 물어볼 곳이 마땅하지 않아 이 곳에 질문을 하게 됐습니다. 문제 있다면 바로 삭제하도록 하겠습니다.프로젝트를 진행하고 있는데 Spring Security를 적용해서 하고 있습니다. Service 쪽에서 Authentication 객체를 생성을 하고 JWT 를 만들어 줄 때 Authentication authentication = authenticationManagerBuilder.getObject().authenticate(new UsernamePasswordAuthenticationToken(username, password));이렇게 생성을 하고 있습니다. 그래서 테스트코드를 짤 때 @Mockprivate AuthenticationManagerBuilder authenticationManagerBuilder;이런 식으로 Mocking 해주고 Authentication authentication = mock(Authentication.class);given(authenticationManagerBuilder.getObject().authenticate(any())).willReturn(authentication);이런 식으로 Stubbing 해주고 있는데요.java.lang.NullPointerException: Cannot invoke "java.util.concurrent.atomic.AtomicBoolean.get()" because "this.building" is null이런 에러가 나타나고 있습니다. AuthenticationManagerBuilder를 좀 살펴보니 타고타고 가다보면 AbstractSecurityBuilder 라는 것을 상속하고 있더군요. AbstractSecurityBuilder를 보면 private AtomicBoolean building = new AtomicBoolean(); 이런 필드가 있습니다. 에러에서 나온 building이 이걸 말하는 것 같습니다.여기 나오는 building이 null 이어서 public final O getObject() { if (!this.building.get()) { throw new IllegalStateException("This object has not been built"); } return this.object;}여기서 if 조건문을 탈 때 this.building이 null이기 때문에 NPE가 발생하는 것 같습니다. AuthenticationManagerBuilder를 Mocking을 해서 이런 결과가 생기는것인가 하는 의심이 들고 있는 상황입니다. 혹시 이런 경우에는 어떤 식으로 Mocking을 하고 Stubbing을 해줘야 테스트가 통과될 지 궁금합니다.구글링해도 자료가 거의 없고 gpt도 계속 이상한 말을 반복해서..ㅠㅠ 어쩔 수 없이 여기에 질문 올려봅니다.도움 주시면 감사하겠습니다..!
-
미해결Practical Testing: 실용적인 테스트 가이드
섹션 7에서 완벽하게 제어하기 파트에서 질문이 있습니다!
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요.LocalDateTime. now(), 즉 현재 시간과 관련된 기능의 사용을 지양하자라고 말씀해주셨습니다!이 뜻이 현재시간과 관련된 요구사항이 넘어왔을 때 해당 요구사항을 현재시간과 관련 없이 다른 방법으로 풀어보자 라는 의미일까요?아니면 다른 기술적인 방법을 말씀하시는 걸까요~? 기술적인 방법이 있는 것이라면 어떤 방법이 있을지 궁금합니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
Cookie의 경우 RestDocs로 어떻게 해야할까요?
강의 너무 잘듣고 사이드 프로젝트에 적용하고 있는데 cookie의 경우 restdocs로 어떻게 추출해야되는지 모르겠습니다.. 공식 문서에서는 requestCookies() 가 나와있는데 현재 저의 프로젝트에서는 적용이 안되네요. 저는 SpringBoot 2.6.12 버전이며 java 17, management의 경우 1.0.14 버전입니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
Presentation Layer 테스트 (2) 질문있습니다.
Presentation Layer 테스트 (2) 58:57에모듈을 분리해도 사실은 서비스 계층에서 BeanValidation을 책임상 하지 않는데의존하고 있기때문에 의존성을 계속 추가해야 한다. 이렇게 말씀해주셨는데 컨트롤러에서 전부 검증을 책임지지 않고특수 형태 Validation은 서비스 레이어나 도매인 객체 생성할때 검증한다고 하셨는데검증 로직을 스프링 AOP,스프링 Assert 로 구현을하면서비스 계층이 스프링 프레임워크를 많이 의존하게 되는거 같아서요강사님은 어떤식으로 검증로직을 선호하시고, 선호하시는 이유도 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
서비스 계층의 테스트 범위에 대해서
//CommunityCommandService.java public void updateCommunity(Long communityId, String description, List<String> newTags) { Community community = communityRepository.findCommunityById(communityId); community.updateCommunity(description, newTags); }만약, 이런 코드가 있다고 하면Service는 데이터를 받고 Community 클래스에게 실제 데이터 변경을 위임합니다. //Community.java public void updateCommunity(String description, List<String> tags) { this.description = new Description(description); this.hashtags.updateTags(tags, this); } Service 클래스를 테스트할 때상태검증으로 테스트한다면,//CommunityCommandService.java @Test void 상태검증_테스트() { community = new Community("dummy Intro", List.of("dummy tag")); given(communityRepository.findById(any)).willReturn(community); communityCommandService.updateCommunity("new intro", List.of("new tag")); assertThat(community.getIntroduce).isEqualTo("new intro"); assertThat(community.getTags).containsExactly("new tag"); }이렇게 테스트하게 됩니다.사실 데이터의 변경 자체는 CommunityTest에서 테스트 하였습니다.//CommunityTest.java @Test void updateCommunity() { final Community community = TestCommunity.builder().build(); community.updateCommunity("커뮤니티 소개란 입니다.", List.of("태그1", "태그2")); assertThat(community.getHashtags()).extracting("tag").containsExactly("태그1", "태그2"); assertThat(community.getDescription()).isEqualTo("커뮤니티 소개란 입니다."); } 이렇게 되면 CommunityCommandService에서 내부 Community.updateCommunity를 중복적으로 검증하는게 아닌지 생각이 듭니다.객체지향 관점에서, Service는 Community에게 위임하여 상태를 변경시킵니다.실제 내부에 어떠한 변화가 발생했는지에 집중하는게 아니라, 객체에게 위임했는지 여부에 좀 더 초점을 맞춰야하는 걸까요? (verify를 통해서) 질문저는 사실 상태검증을 더 좋아합니다. 상태검증을 사용한다면 위와 같은 중복검증이 발생하게 되는걸까요? 객체지향의 관점에서 보면 사실 verify를 통해서 호출여부를 판단하는게 더 좋아보입니다. 다만, 상태검증을 위해서라면 위와 같이 중복적으로 검증하는 것을 피할 수 없는건가요?강사님의 경우, 상태검증을 할 때 위와같이 Community 로직을 다른 곳에서 테스트하였다고 해도, Service에서 다시 테스트하나요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
Persistence 계층 단위테스트를 어디까지 하는게 맞을까요?
@DisplayName("상품 번호 리스트로 상품목록을 조회하기") @Test void findAllByProductNumberIn(){ //given Product product1 = createProduct("001", 1000); Product product2 = createProduct("002", 3000); Product product3 = createProduct("003", 5000); productRepository.saveAll(List.of(product1, product2, product3)); //when List<Product> findProducts = productRepository.findAllByProductNumberIn(List.of("001", "003")); //then assertThat(findProducts).hasSize(2) .extracting("productNumber","price") .containsExactlyInAnyOrder( tuple("001",1000), tuple("003",5000) ); }1.데이터 계층은 유효한 상품 번호 리스트만 넘어왔다는 전제로만 테스트를 해도 충분한가요?유효하지 않은 상품번호는 검증 로직에서 걸러졌다고 생각하고 테스트를 한다고 생각하면 될까요? @DisplayName("미등록된 상품 번호 리스트로 상품목록을 조회하기") @Test void findAllByProductNumberIn(){ //given Product product1 = createProduct("001", 1000); Product product2 = createProduct("002", 3000); Product product3 = createProduct("003", 5000); productRepository.saveAll(List.of(product1, product2, product3)); //when List<Product> findProducts = productRepository.findAllByProductNumberIn(List.of("004", "005")); //then assertThat(findProducts).hasSize(0); } 2.JpaRepository가 제공하는 기본 save,findAll 등도개발자가 원하는 데이터가 올바르게 저장 되었는지, 조회가 되었는지 테스트도실무에서는 작성하시나요 ?아니면 이미 만들어진 코드이기 때문에 불필요한 테스트 코드라 생각해서넘어가는지 궁금합니다. @DisplayName("주문 생성시 상품 리스트에서 주문의 총 금액을 계산한다.") @Test void calculrateTotalPrice(){ //given List<Product> products = List.of( createProduct("001", 1000), createProduct("002", 2000) ); //when Order order = Order.create(products, LocalDateTime.now()); //then assertThat(order.getTotalPrice()).isEqualTo(3000); } private Product createProduct(String productNumber, int price) { return Product.builder() .type(HANDMADE) .productNumber(productNumber) .price(price) .sellingStatus(SELLING) .name("메뉴 이름") .build(); } @DisplayName("주문 생성시 주문 상태는 INIT 이다.") @Test void init(){ //given List<Product> products = List.of( createProduct("001", 1000), createProduct("002", 2000) ); //when Order order = Order.create(products, LocalDateTime.now()); //then assertThat(order.getOrderStatus()).isEqualByComparingTo(OrderStatus.INIT); } @DisplayName("주문 생성시 등록시간을 기록한다.") @Test void registeredDataTime(){ //given LocalDateTime registeredDateTime = LocalDateTime.now(); List<Product> products = List.of( createProduct("001", 1000), createProduct("002", 2000) ); //when Order order = Order.create(products, registeredDateTime); //then assertThat(order.getRegisteredDateTime()).isEqualTo(registeredDateTime); }Order.create 테스트 코드를 작성할때엔각각 필드 초기화를 단위테스트를 진행했는데, @DisplayName("주문번호 리스트를 받아 주문을 생성한다.") @Test void createOrder(){ LocalDateTime registeredDateTime = LocalDateTime.now(); Product product1 = createProduct(HANDMADE, "001", 1000); Product product2 = createProduct(HANDMADE, "002", 3000); Product product3 = createProduct(HANDMADE, "003", 5000); productRepository.saveAll(List.of(product1, product2, product3)); OrderCreateRequest request = OrderCreateRequest.builder() .productNumbers(List.of("001", "002")) .build(); OrderResponse orderResponse = orderService.createOrder(request, registeredDateTime); assertThat(orderResponse.getId()).isNotNull(); assertThat(orderResponse) .extracting("registeredDateTime","totalPrice") .contains(registeredDateTime,4000); assertThat(orderResponse.getProducts()).hasSize(2) .extracting("productNumber","price") .containsExactlyInAnyOrder( tuple("001",1000), tuple("002",3000) ); }createOrder 테스트 코드는 같이 검사를 했습니다.3.각 초기화를 해주는 정적 매서드를 테스트 코드로 작성을 했는데Order.create 테스트 코드는 필드마다 분리를 해서 테스트 코드를 작성하고,createOrder 테스트 코드는 같이 검사를 했습니다.또 강의에는 없지만 ProductResponse.of 정적 메서드로도 초기화를 했는데따로 분리해서 테스트 코드를 작성하지 않고OrderServiceTest의 createOrder()에서 같이 테스트 코드에 포함되었습니다.테스트 코드를 분리하는 경우와 같이 검사하는 경우를 나누는 기준이 있을까요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
강의를 다 듣고 몇가지 궁금점이 있어요
안녕하세요, 강의를 모두 들었고 정말 알차고 재밌게 다 들었습니다. 감사드립니다!복습을 하다보니 실무 관점에서 몇가지 궁금한 부분들이 있는데요!!1) JpaRepository 를 구현하는 구현체로 기본적인 CRUD 등 (ex. save(), saveAll() 등) 사용한다면, 이 부분도 별도 테스트를 작성하시나요? 전 이미 제공된 기본 메소드라 테스트 안해도 될 것 같다고 생각드는데 강사님은 실무에서 이부분도 하시는지 궁금합니다.2) update/delete를 하게되면 저는 보통 void로 리턴값 없이 HttpStatus.ok 코드 정도만 보내곤했는데요. ApiResponse<Void> 이렇게 해서 보내도 무관할지 아니면 처리된 id값 정도라도 응답데이터에 실어서 보내는게 좋은가요?3) 클라이언트에게 response하고 싶은 데이터가 API마다 다를 수 있는데 그럴때 서로 다른 Response DTO를 각자 만들어서 반환하시는 편인가요?? 제가 질문한 부분들은 할려면 다 할 수 있지만 좀 더 실무적인 관점에서의 방법이 궁금해서 여쭤봅니다! 감사합니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
Presentation Layer 테스트 (1) 관련 질문이 있습니다!
안녕하세요! PresentationLayer 테스트(1) 수강하며 문득 든 궁금증이 있어서 질문을 드립니다.강의 36:03 쯔음에서 Product가 하나도 저장되지 않은 상태를 테스트할 때, 새로운 Product의 최신 번호를 조회하게 되면 "001"이 되는 과정에서 ActiveProfile을 test로 해주지 않아 DB에 데이터가 임의로 들어가 있던 것 때문에 테스트 통과가 되지 않았는데요.그러면 그 전에 진행했던 createProduct 테스트의 given에서 Product를 하나 저장한다면 여기서도 ActiveProfile이 test이지 않았던 상태였기 때문에 저장한 데이터가 4번째 데이터가 되어야 하고 그랬다면 테스트 통과가 안 되어야 하는게 맞지 않았나..? 하는 갑작스러운 의문이 들었습니다.제가 놓치고 있는게 무엇일까요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
Spring REST Docs 관련 질문
안녕하세요 강사님, 우선 꿀팁 가득차있는 강의 너무너무 잘 들었습니다.Spring REST Docs 관련해서 질문이 있습니다. 강의에서는 이미 레이어별로 테스트 코드를 작성하였는데요. Spring REST Docs 적용하면서 별도의 ProductControllerDocsTest 클래스를 만들어 createProduct()의 동일한 테스트 코드가 문서를 위해 또 들어가는 것 같아 관리해야할 테스트 코드가 두배가 되는게 아닌가 궁금해서 질문드립니다! 실무에서는 이렇게 테스트 전용 테스트코드와 문서용 테스트 코드를 별도 분리하는지, 아니면 둘을 함께 포함하여 하나로 작성하는 방식인가요? ~ 감사합니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
양방향 매핑
안녕하세요~ 양방향 매핑을 사용하면 엔티티 간의 결합도를 높이기 때문에 가급적 단방향으로 만들면 좋다는 의견도 많은 것 같더라구요.심지어는 양방향 매핑을 만들어야 한다면 엔티티가 아니라 id 값을 넣어서 참조를 하는게 더 좋다는 의견도 있구요. 강의에서는 양방향 매핑을 사용하셨는데 실무에서도 자주 양방향 매핑으로 설계하시나요?사용하신다면 이러한 단점이 있지만 편의성이 더 크기 때문인가요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
강의자료
강의하시는 PPT 파일 다운로드 받을 수 있을까요..?