묻고 답해요
121만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Practical Testing: 실용적인 테스트 가이드
재고 차감 시도 다른 접근법
안녕하세요. 좋은 강의 오늘도 감사히 잘 들었습니다.강사님께서 HashSet 자료구조를 이용하여 중복을 제거하는 방법을 선택하셨지만 전 다른 방법으로 접근해 보았습니다.상품별 counting 한 결과인 productCountingMap 을 이용해보았는데요. 이미 해당 객체는 productNumber 가 중복이 걸러진 상태로 key 값으로 잡혀있고 quantity 가 value 에 정의되어 있어서 이를 그대로 활용해 보았습니다. //상품별 counting Map<String, Long> productCountingMap = createCountingMapBy(stockProductNumbers); //재고 차감 시도 productCountingMap.forEach((key,value)->{ Stock stock = stockMap.get(key); int quantity = value.intValue(); if(stock.isQuantityLessThan(quantity)){ throw new IllegalArgumentException("재고가 부족한 상품이 있습니다."); } stock.deductQuantity(quantity); });감사합니다
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
n+1질문입니다!
안녕하세요 강의 잘듣고 있는 수강생입니다.헥사고날 아키텍처를 이번 토이프로젝트에 적용하면서강의에서 알려주신대로 설계를 이렇게 유연하게 변경하면n+1문제도 해결 할 수 있다고하셨는데예를들면MemberRepository impl에서 멤버 아답터만 주입받고있는상황에서 팀 엔티티랑 연관관계가있는 상황에서N+1 문제를 해결하려면MemberRepository impl 에서 memberRepository말고TeamRepository도 주입받아서 한번에 다 불러와서 도메인 엔티티에 저장해야하나요? 아니면 서비스 계층에서 각각 레파지토리에서 불러온다음MemberRepository에서 넘겨준다음 도메인 모델을 리턴할때 넣어줘야 하나요 n+1문제를 서비스계층에서 결합할지 레포지토리 계층에서 결합할지 궁금해서 질문드립니다.
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
res.status(201) 부분에서 typeerror가 발생합니다
에러메시지: TypeError: Cannot read properties of undefined (reading 'status')res.status(200); 해당 코드에서 발생하는 에러인데 강사님이 코드돌리실때는 해당 에러가 발생하지 않는데 제 pc에서는 왜 에러가 발생하는지 잘 모르겠습니다...코드는 강의에서 입력하신 그대로 따라서 했습니다
-
미해결Practical Testing: 실용적인 테스트 가이드
서비스단 Transactional에 대해 질문 드립니다
안녕하세요!서비스 클래스 상단에 @Transactional(readOnly = true) 옵션을 두는 경우에 대해 질문이 있습니다.만약 Transactional을 적용하고 싶지 않은 메서드가 있으면 어떻게 하는 것이 좋을까요? 저의 경우 외부 api 요청을 보내고 응답을 반환하는 메서드에 Transactional을 적용하지 않으려고 합니다(CQRS에 대해 말씀해주신 부분을 듣고 애초에 외부 API 호출하는 기능이 분리 되어야 하나 싶기도 드네요 ㅠㅠ) @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class SpotService { private final MapApiClient mapApiClient;
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
따라하며 배우는 TDD 개발 [2023.11 업데이트] 강의 질문
따라하며 배우는 TDD 개발 [2023.11 업데이트]2023.11 업데이트라고 되어 있는데, 이게 업데이트 반영 된건가요?
-
미해결Practical Testing: 실용적인 테스트 가이드
BaseEntity 가 있음에도 불구하고 registeredDateTime 을 사용하는 이유가 무엇일까요?
안녕하세요.덕분에 좋은 강의 정말 잘 듣고 있습니다.강의를 수강하던 도중에 궁금한 부분이 생겨 이렇게 질문을 남깁니다.BaseEntity(@CreateDate) 로 인해서 객체가 생성되는 시점을 알 수 있음에도 불구하고 registeredDateTime 이라는 필드값을 정의한 이유가 궁금합니다.테스트코드를 통해 한층 더 검증하기 쉽게 하려는 용도로 사용하시는 걸까요?감사합니다
-
미해결따라하며 배우는 리액트 A-Z
체크박스 클릭 구현 함수에 대해서 질문드립니다.
input checkbox 에서onChange={() => this.handleCompleChange(data.id)}함수를 실행하게끔하는데 () => 는 왜들어가는걸까요? 예를들어 같은 방식의 함수중에 onChange={this.handleChange} 함수의경우엔 () => 가 없더라구요. 구현 부분은 똑같이 함수이름 = (파라미터) => {} 로 구현되어 있습니다.
-
미해결따라하며 배우는 리액트 A-Z
영화 나열을 위한 Row 컴포넌트 생성하기
8분 47초 까지 따라했는데, 오류가 뜹니다.import React, { useEffect } from 'react' import axios from '../api/axios' export default function Row({ isLargeLow, title, id, fetchUrl }) { useEffect (() => { fetchMovieData(); }, []); const fetchMovieData = async () => { const request = await axios.get(fetchUrl); console.log('request', request); }; return ( <div> </div> ) } 터미널에서는 아래와 같은 오류가 뜨고,WARNING in ./src/components/Banner.css (./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[5].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[5].use[2]!./node_modules/source-map-loader/dist/cjs.js!./src/components/Banner.css) Module Warning (from ./node_modules/postcss-loader/dist/cjs.js): Warning (75:5) autoprefixer: start value has mixed support, consider using flex-start instead WARNING in [eslint] src/components/Row.js Line 7:8: React Hook useEffect has a missing dependency: 'fetchMovieData'. Either include it or remove the dependency array react-hooks/exhaustive-deps webpack compiled with 2 warnings 아래는 크롬에서 뜨는 오류입니다.Uncaught runtime errors: × ERROR Cannot read properties of undefined (reading 'fetchNetflixOriginals') TypeError: Cannot read properties of undefined (reading 'fetchNetflixOriginals') at App (http://localhost:3000/static/js/bundle.js:46:61) at renderWithHooks (http://localhost:3000/static/js/bundle.js:20698:22) at mountIndeterminateComponent (http://localhost:3000/static/js/bundle.js:23984:17) at beginWork (http://localhost:3000/static/js/bundle.js:25280:20) at HTMLUnknownElement.callCallback (http://localhost:3000/static/js/bundle.js:10290:18) at Object.invokeGuardedCallbackDev (http://localhost:3000/static/js/bundle.js:10334:20) at invokeGuardedCallback (http://localhost:3000/static/js/bundle.js:10391:35) at beginWork$1 (http://localhost:3000/static/js/bundle.js:30265:11) at performUnitOfWork (http://localhost:3000/static/js/bundle.js:29512:16) at workLoopSync (http://localhost:3000/static/js/bundle.js:29435:9) ERROR Cannot read properties of undefined (reading 'fetchNetflixOriginals') TypeError: Cannot read properties of undefined (reading 'fetchNetflixOriginals') at App (http://localhost:3000/static/js/bundle.js:46:61) at renderWithHooks (http://localhost:3000/static/js/bundle.js:20698:22) at mountIndeterminateComponent (http://localhost:3000/static/js/bundle.js:23984:17) at beginWork (http://localhost:3000/static/js/bundle.js:25280:20) at HTMLUnknownElement.callCallback (http://localhost:3000/static/js/bundle.js:10290:18) at Object.invokeGuardedCallbackDev (http://localhost:3000/static/js/bundle.js:10334:20) at invokeGuardedCallback (http://localhost:3000/static/js/bundle.js:10391:35) at beginWork$1 (http://localhost:3000/static/js/bundle.js:30265:11) at performUnitOfWork (http://localhost:3000/static/js/bundle.js:29512:16) at workLoopSync (http://localhost:3000/static/js/bundle.js:29435:9) ERROR Cannot read properties of undefined (reading 'fetchNetflixOriginals') TypeError: Cannot read properties of undefined (reading 'fetchNetflixOriginals') at App (http://localhost:3000/static/js/bundle.js:46:61) at renderWithHooks (http://localhost:3000/static/js/bundle.js:20698:22) at mountIndeterminateComponent (http://localhost:3000/static/js/bundle.js:23984:17) at beginWork (http://localhost:3000/static/js/bundle.js:25280:20) at beginWork$1 (http://localhost:3000/static/js/bundle.js:30243:18) at performUnitOfWork (http://localhost:3000/static/js/bundle.js:29512:16) at workLoopSync (http://localhost:3000/static/js/bundle.js:29435:9) at renderRootSync (http://localhost:3000/static/js/bundle.js:29408:11) at recoverFromConcurrentError (http://localhost:3000/static/js/bundle.js:28900:24) at performConcurrentWorkOnRoot (http://localhost:3000/static/js/bundle.js:28812:26)
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
통합테스트와 단위 테스트
강사님은 통합테스트랑 단위테스트 둘다 빡시게 하시는 편이신가요? 아니면 강약 조절 하시나요? 어느 쪽에 좀더 중요도를 두시는지도 궁금합니다.
-
미해결따라하며 배우는 리액트 A-Z
모달 창 외부 클릭 시 모달 닫게 만드는 Custom Hooks 생성 이 강의 오타부분
모달 창 외부 클릭 시 모달 닫게 만드는 Custom Hooks 생성 이 강의에서 useOnClickOutside custom hooks부분에서 event listener해제하는 부분이 addEventListener로 잘못되어 있내요
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
의존성 및 설계? 부분 질문드립니다.
상품 주문 API 개발POJO로 상품 주문 구현하기 강의에서OrderService 구현 시 OrderPort를 주입받고,OrderAdapter에서 ProductRepository를 이용하여 Product를 Read해오는데,OrderService에서 ProductPort를 주입받은후,productPort.getProduct(productId)로 Product를 Read해온 후에 Order를 Create하는 방식은 문제가 있는 방식인지 궁금합니다.또 강사님이 구현하신 코드와 설계 부분에서 어떤 차이가 있을지 궁금해서 질문드립니다.
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
테스트 더블
덕분에 테스트에 대해 흥미를 가지고 공부중에 있습니다.테스트 공부하면서 한가지 궁금한 점이 있습니다. 혹시, Mock, Stub, Fake 등 상황에 따라 구분해서 사용하고 계신가요?
-
미해결Practical Testing: 실용적인 테스트 가이드
Spring Security 적용 시 controller @WebMvcTest
안녕하세요 강사님 좋은 강의를 듣고 공부하면서 실무에 적용시키고 있는 중에 두 가지 문제를 만났는데 구글링으로 해결점이 보이지 않아서 강의 내용과 관련 없지만 힌트라도 얻고자 글을 남기게 되었습니다Spring boot 3.x 이상 버전이고, Spring security가 적용된 프로젝트입니다첫 번째 문제는 controller 레이어에서 @WebMvcTest를 적용 시에 검증하고자 하는 controller와 주입받은 빈 객체 이외의 뜬금없는 객체 주입 error가 발생하고 있습니다@V1RestController @RequiredArgsConstructor public class CommonController { private final CommonService commonService; private static final Logger log = LoggerFactory.getLogger(CommonController.class); @GetMapping("/term") public ResponseEntity<TermResDto> getTerm(@RequestParam("account_id") Long id) { return ResponseEntity.ok(commonService.getTerm(id)); } @GetMapping("/message") public ResponseEntity<List<UserMessageResDto>> getUserMessageList(@RequestParam("user_id") Long userId) { return ResponseEntity.ok(commonService.getUserMessageList(userId)); } @GetMapping("/notice") public ResponseEntity<List<UserNoticeResDto>> getUserNoticeList(@RequestParam("user_id") Long userId) { return ResponseEntity.ok(commonService.getNoticeList(userId)); } }class CommonControllerTest extends ControllerTestSupport { @DisplayName("현재 학기 정보를 가져온다") @Test void getCurrentTermInfo() throws Exception { // given String termName = "2023년도 2학기"; LocalDateTime startAt = LocalDateTime.of(2023, 9, 1, 00, 00); LocalDateTime endAt = LocalDateTime.of(2023, 12, 15, 23, 59); TermResDto res = TermResDto.builder() .id(1L) .name(termName) .startAt(startAt) .endAt(endAt) .build(); given(commonService.getTerm(1L)).willReturn(res); // when & then mockMvc.perform( get("/api/v1/term") ) .andDo(print()) .andExpect(status().isOk()) .andExpect(jsonPath("$.code").value("200")) .andExpect(jsonPath("$.status").value("OK")) .andExpect(jsonPath("$.message").value("OK")) .andExpect(jsonPath("$.data").isArray()); } }@WebMvcTest(CommonController.class) @ActiveProfiles("test") public abstract class ControllerTestSupport { @Autowired protected MockMvc mockMvc; @Autowired protected ObjectMapper objectMapper; @MockBean protected CommonService commonService; }순서대로 controller, controllertest, controllertestsupport 클래스 입니다 java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@2ca54da9 testClass = kr.lineedu.cha.domain.common.controller.CommonControllerTest, locations = [], classes = [kr.lineedu.cha.BaseApplication], contextInitializerClasses = [], activeProfiles = ["test"], propertySourceLocations = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@3012646b, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@416bfba7, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2aa749... at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authController' defined in file [/Users/luca/Desktop/prod/cha-backend/out/production/classes/kr/lineedu/cha/auth/AuthController.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'kr.lineedu.cha.auth.AuthService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'kr.lineedu.cha.auth.AuthService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1824) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1383) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:888) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ... 97 more에러 내용에 보면 전혀 관계가 없는 AuthService에 대한 bean error가 뜨고 있어서 질문드립니다두 번째는 외부 api와 통신해서 구현되는 로직을 openfeign으로 사용하고 있습니다. BDDMockito로 feign client를 stub해서 테스트를 짜던 중 검증이 부족할 것 같다는 생각에 wiremock을 이용해서 테스트를 진행하려 하는데 best practice를 찾지 못하고 있습니다. 혹시 이에 대한 좋은 자료나 실무에서 사용하는 테스트 케이스가 있을지 궁금해서 질문드립니다
-
미해결따라하며 배우는 리액트 A-Z
create-react-app 관련
npx create-react-app 이렇게 만들면 src폴더 없이 만들어지더라구요 그래서 그냥 npx 없이 만드니까 정상적으로 잘 만들어지는데 npx가 있는거와 없는거의 차이점이 뭔지 궁금합니다
-
미해결따라하며 배우는 리액트 A-Z
css를 불러오지 않아도 클래스 이름을 부여하여 스타일이 가능한가요?
useParams를 이용한 영화 상세 페이지 구현 파트8분 45초에서 css 파일을 불러오지 않고도modal__poster-img 클래스 이름을 부여하자 스타일이 반영되는 것을 확인할 수 있었습니다왜 이렇게 되는 걸까요?
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
복사 단축키
안녕하세요 ! 도메인과 영속성 객체 구분하기 수업에서 1분 34초에서 UserEntity 에 있는 행을 복사하는데 이 때 나오는 단축키가 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
생성과 수정 API 응답, 그리고 그 응답 Dto를 어떻게 구성할 것인가에 대한고민
안녕하십니까 강사님.저는 이제 5개월차가 된 신입? 백엔드 개발자 입니다.다름이 아니라 , 생성과 수정 API에 대한 응답으로 어떤 정보까지 넘기는것이 적합할지에 대해 고민을 하던 도중 강사님의 생각을 여쭤보고 싶어 질문을 드리게 되었습니다. Q1. 강사님 께서는 생성, 조회 , 수정, 삭제 API의 응답을 각각 어떻게 보내시는지 여쭤보고 싶습니다. 가장 먼저 조회의 경우는 말 그대로 path의 Entity 및 관련된 Entity 정보를 조합하여 응답 DTO로 변환하여 보내고 있습니다. 그런데 나머지 Write Operation에 대한 응답을 어디까지 보내야 하냐가 이슈 입니다.예를들면 엔티티의 생성의 경우 엔티티의 응답 DTO를 보내면 - 프론트에서 별도의 조회 API 호출 없이 바로 프론트가 화면에 뿌려줄 수 있으니깐 저는 생성의 경우에도 조회와 마찬가지로 Entity의 정보를 조합하여 응답 DTO로 변환하여 보내고 있었습니다. 그런데 이러한 부분이 Command Query Sperate 원칙에 어긋나는것 같아, 강사님께서는 혹시 생성한 Entity의 Key만 보내시는지, 아니면 Entity의 정보를 DTO로 변환하여 보내시는지 궁금합니다. 만약 정보를 다 보내신다면 이후에 별도로 조회API를 호출해야 하고 그 또한 비용일텐데 이러한 부분은 어떻게 하시는지 여쭤보고 싶습니다. 이제 수정 API인데요,제가 다룬 비즈니스 로직의 경우 수정 비즈니스 로직이 다양하고 , 각 비즈니스 로직의 경우 다뤄지는 Entity의 종류가 다른 경우였습니다. (중심 Entity는 동일하지만, 연관된 Entity를 누구까지 건드리냐의 차이) 그래서 응답으로 보내기 모호한 점이 첫 번째 이유이고,애초에 수정 후에 프론트 화면에서 그 엔티티의 정보를 보여줄 필요가 없어서 라는 두번째 이유에 의해서 에초에 엔티티의 Id값도 보내지 않고 있었는데요,이 수정 API의 응답을 성렬님은 어떻게 진행하지는지 그 이유가 궁금합니다. 마지막으로 삭제의 경우는 정말, 프론트에게 보낼 응답이 없어도 되는 경우 라고 생각했는데요,팀장님의 의견은 만약에 나중에 삭제한 Entity를 복구하는 요구사항이 추가되는것을 고려하여Id 정도는 넘기자는 의견을 내어주셨습니다.마찬가지로 삭제의 경우도 어떤식으로 수행하시는지 그 이유가 궁금합니다. Q2. 마지막으로 Entity의 ResponseDto의 필드를 어떤식으로 구성하시는지 궁금합니다 예를들면 저의 경우는 API는 프론트와 서버 간의 스펙이라고 생각하고, Entity의 단건조회의 경우는 단건 조회용 ResponseDto를, 전체조회의 경우는 전체 조회용 SummaryResponseDto를 별도로 만들어서 사용하고 있었습니다.(이런식으로 각 상황별 ResponseDto를 별도로 정의하고, 그 안에 관련된 Entity들의 필드를 직접 풀어넣는 방법) 저희 팀장님 께서는 프론트쪽도 일을 해오시다가 , 백엔드쪽 분야로 전향하신 케이스 인데요,그렇다 보니 어떻게 해야 프론트의 생산성이 올라가는지를 고려하시는 분 이셨고,팀장님의 생각은 서버에서 넘겨주는 응답에 일관성이 있어야 그 응답을 사용하는 프론트 측도 학습이 되고 놓치는 부분 없이 생산성이 올라간다는 의견이셨습니다. 그래서 Entity별로 당장 사용하지 않더라도 가능한 모든 필드를 담은 ResponseDto를 하나만 만들고,해당 ResponseEntity의 조합으로 각 API별 응답 Dto를 만들어서 사용하면 ,프론트 측 에서는 일관성 있는 응답값을 사용할 수 있다는 의견이셨습니다.물론 이 방법이 네트워크 패킷의 양을 쓸데없이 증가시킨다는 것을 알고 계시면서도,생산성에 큰 영향을 미치는 부분이라고 생각하셨습니다. 예를들어 다음과 같이 각 Entity의 응답 Dto의 조합별로 API의 ResponseDto를 만들 수 있습니다.ResponseDto{ UserDto{ id : 1, name : “aaa” … // User엔티티의 거의 모든 필드 } ItemDto{ id : 2, name : “bbb”, … // Item엔티티의 거의 모든 필드 }} 저는 이러한 부분에 대해 생각해 본 적이 없이,그냥 제가 “해당 API를 호출하는 화면에서 필요한 정보들만을 담아 |(혹은 여러 화면에서 쓰인다면 여러개를 고려) ResponseDto를 각각 만들어서” 넘겼는데요 강사님께서는 이러한 ResponseDto를 구성하는 부분에 있어서상황별로 필드를 재구성 하여 ResponseDto를 정의하여 사용하시는 편 인지아니면 생산성을 고려하여 각 Entity별 Dto를 만들고, 이들을 조합하여 ReponseDto를 정의하시는 편 이신지 혹은 다른 규칙이 있으신지 궁금합니다. 물론 그렇다고 , 팀장님의 의견에서 전체조회시 사용하는 DTO와 단건조회시 사용하는 DTO가 동일하더라도,전체조회 후 단건조회를 기존 Front가 가지고 있는 값을 그대로 쓰지 말고.,단건 조회용 API를 다시 호출하자 입니다!그저 핵심은 프론트가 다루는 ResponseDto의 일관성을 위해서 입니다 (결론은 생산성을 위해) 항상 좋은 강의,그리고 무엇보다도 강상님의 의견과 고민을 강의에 녹여주셔서정말 감사할 따름입니다. 덕분에 함께 고민하고 많이 배우는거 같습니다. 긴 글 읽어주셔서 감사합니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
프레젠테이션 레이어 테스트 코드 작성시 코틀린 non-nullable
안녕하세요. 강의 잘 보고 있습니다. 요청 객체를 테스트(ex. 신규상품을 등록할때 타입은 필수 값이다.) 할 때에 코틀린을 사용하는 경우 productType은 non-nullable 입니다. data class ProductCreateRequest( @field:NotNull(message = "상품 타입을 선택해주세요.") val type: ProductType, @field:NotNull(message = "판매 상태를 선택해주세요.") val sellingStatus: ProductSellingStatus, @field:NotBlank(message = "상품명을 입력해주세요.") val name: String, @field:Positive(message = "상품 가격을 입력해주세요.") val price: Int, ) 이런 경우 enum 타입은 bean Validation에서 NotNull이나 NotBlank에 대한 테스트는 불가능한 상태인데요. 이렇게되면 테스트 가능한 것들만 하는게 맞는건가요?
-
미해결Practical Testing: 실용적인 테스트 가이드
안녕하세요 강사님 컨트롤러 테스트 질문입니다!
좋은 강의를 찍어주셔서 너무 감사합니다.덕분에 테스트에 접근하는 방법을 터득할 수 있었습니다!컨트롤러 테스트는 Validation 역할이 핵심이라고 이해했는데,@Valid 어노테이션을 부착한 DTO 검증만 강의를 통해 배웠습니다. 궁금한게 있습니다.시큐리티를 적용했을 때 저는 컨트롤러 메서드 매개변수에 Authentication을 이용해서 SecurityContext 값을 사용하는데,이러한 SecurityContext도 검증을 해야 되는지,PathVariable에 대한 검증도 필요한가요?Param값 검증도 필요한지 궁금합니다.페이징했을 때 페이징 결과도 검증을 해야 될까요?Validation 영역이 아니라고 판단되어지는데, 강사님의 의견이 궁금합니다! 감사합니다.
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
리뷰반영 강의에서 shortcut ctrl + esc 는 어떻게 설정하나요?
이 화면에서 단축키 ctrl + esc 만 누르면 시작 화면이 자꾸 떠서 단축키 등록이 안돼요..