묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Practical Testing: 실용적인 테스트 가이드
이런 경우는 어떻게 테스트 해야할까요?
지금 토스페이먼트 결제를 연동하고있는데 토스에서 결제 요청-인증을 하면 토스에서 주소에 파라미터로 paymentKey을 주는데 이 paymentKey을 가지고 백엔드에서 토스의 api에 결제 승인 요청을 해야합니다.그런데 서비스 단에서는 컨트롤러에서 파라미터을 통해 paymentKey을 알 수 있지 서비스단의 테스트 코드 작성 시는 paymentKey을 알 수 가 없는데 이런 경우는 테스트 코드를 어떻게 작성해야할까요? 추가적으로 외부 api 에서 paymentkey을 파라미터로 주는 컨트롤러는 어떻게 테스트해야할까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트 given 중 연관 관계 / 참조키
안녕하세요. 강의 잘 들었습니다 ! 강의 수강 후 제가 진행했던 프로젝트에서 테스트 코드를 작성해보고 있는데 엔티티들의 연관 관계에 대해서 궁금한게 생겨서 질문 드립니다. 강의에서 Order의 create를 테스트하기 위해 Product를 먼저 생성 후 DB에 저장하는 것과 비슷하게,커뮤니티의 게시글이라면, 게시글(Board)과 작성자(User)는 엔티티에서 연관 관계가 설정되어 있고 Board 테이블에는 User의 PK가 참조키로 설정해야할 때, given에서 User 엔티티도 DB에 save 후 저장된 User를 Board가 참조하도록 테스트 코드를 작성하는게 맞을까요 ? 제가 궁금한 것은, 실제 서비스라면 엔티티들은 수많은 연관 관계가 있을텐데한 엔티티의 비즈니스 로직 등을 테스트하기 위해, 그 엔티티와 연관 관계에 있는 다른 엔티티들을 모두 given 절에서 생성하고 DB에 저장해야 하는지 궁금합니다.감사합니다 !
-
미해결Practical Testing: 실용적인 테스트 가이드
LocalDateTime.now() 를 검증하는 테스트에 관하여
안녕하세요.LocalDateTime.now() 를 이용하여 테스트 하는 걸 지양하자라는 강사님 강의 중에 제가 겪었던 경험에 대해 질문이 있습니다.현재 개인적인 프로젝트에서 테스트 코드를 작성하고 있습니다.회원가입을 할때 가입한 시점을 저장하기 위해 LocalDateTime 을 파라미터로 받고 있는데요, 이 로직을 검증하기 위해 테스트 코드를 작성하였습니다.그러나 아래와 같은 에러가 발생하더라구요org.opentest4j.AssertionFailedError: expected: 2024-01-03T21:25:11.333406800 (java.time.LocalDateTime) but was: 2024-01-03T21:25:11.333407 (java.time.LocalDateTime) when comparing values using 'ChronoLocalDateTime.timeLineOrder()' Expected :2024-01-03T21:25:11.333406800 (java.time.LocalDateTime) Actual :2024-01-03T21:25:11.333407 (java.time.LocalDateTime)대략 에러 메세지를 확인해보니 LocalDateTime.now 로 생성한 값과 저장한 뒤에 조회한 시간의 오차가 발생하여 테스트가 실행하는 것 이었습니다.해서 LocalDateTime.now 가 아닌 임의의 시점을 지정해주어서 문제를 해결할 수 있었는데혹시 비슷한 경험을 하신적이 있으신지?있으시다면 제가 말한 방법대로 테스트 코드를 작성하는게 적절한지? 가 궁금합니다!감사합니다!!
-
미해결견고한 JS 소프트웨어 만들기
모듈간끼리 연관성있는 것들에 대해 어떻게 설계를 해야 할까요?
우선 이번 강의를 통해 기존의 DOM을 단순조작하는 코딩에서 벗어날 수 있는 생각을 갖게 되어 너무 감사드립니다. 무엇보다도 짜임새 있는 설계와 유지 보수가 가능할 수 있는 코드를 만들수 있을 것 같아 이번 강의를 통해 많은 생각을 할 수 있게 되어 감사합니다.강의 들으면서 한 가지 질문이 생겼는데요 만약에 모듈 간 영향력이 있는 경우는 어떻게 설계를 가져야 할까요? 예를 들어 ClickCount의 예제에서 확장해서 + - 버튼을 클릭하면 옆에 특정 모듈에서 총 클릭 수를 보여주는 totalClickCount와 totalClcikCountView 를 만들어 사용한다고 한다면 어떻게 설계해야 할까요?대부분의 실생활 로직들이 모듈간의 서로 영향력을 주고 받는 일이 비일비재한 이런부분 에서 어떻게 설계해야 하는지 질문 드립니다.
-
해결됨Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
UUID, Random 등 자주 사용하는 의존성의 경우
UUID, Random 등 자주 사용하는 의존성의 경우, 강의에서 설명해주신 방식으로 공통으로 사용하는 유틸성 Holder 인터페이스를 만들어놓고 프로젝트에서 함께 사용하는 방식으로 개발하나요? 자주 사용되는 클래스들이다 보니 여러 곳에서 필요할 것 같은데(한 곳에서 Holder 인터페이스를 만들어두면 될 것 같은데) 실제로는 어떻게 사용하시는지 궁금해서 여쭙습니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
테스트 환경 통합을 위해 커스텀 어노테이션 도입에 관하여
안녕하세요. 테스트 환경 통합 강의를 보다가 궁금한 점이 생겨서 질문하게 되었습니다!강사님께서는 테스트 환경 통합을 위하여 테스트 클래스에서 테스트 환경 추상 클래스(IntegrationTestSupport, ControllerTestSupport)를 상속하는 방식을 사용하셨습니다.ControllerTest에서는 MockMvc, ObjectMapper, @MockBean 처리할 Service들을 protected 필드로 넘겨줄 필요가 있어서 추상 클래스를 사용하는 방식에 대해 되게 좋다고 생각했는데요!Service와 Repository 테스트의 경우에는 그런 공통된 필드들이 필요하지 않기 때문에 추상 클래스가 아닌 커스텀 어노테이션을 생성하여 구성하여도 되지 않을까? 싶어서 질문드리게 되었습니다! @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @ActiveProfiles("test") @SpringBootTest public @interface IntegrationServiceTest { } @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @ActiveProfiles("test") @Transactional @SpringBootTest public @interface RepositoryTest { } 제가 생각한 코드는 위와 같습니다!제가 생각했을 때의 어노테이션으로 테스트 환경을 관리하였을 때의 장점은 자바에서는 다중 상속이 안되기 때문에 조금 더 유연하다고 생각했습니다!강사님께서는 커스텀 어노테이션을 사용하여서 테스트 환경을 통합하는 방식에 대하여 어떻게 생각하시는지 궁금합니다!(강의 너무 유익하게 잘 듣고 있습니다! 새해 복 많이 받으시구 내년에도 화이팅입니다ㅎㅎ)
-
미해결Practical Testing: 실용적인 테스트 가이드
git 주소
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요. 강의관련 소스받을 수 있는 git 주소가 있을까요?? 감사합니다.
-
미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
장고 개발 준비.
안녕하세요 강사님, 섹션 4 장고 개발 준비에서 .idea파일을 ignore에 적으라고 하셨는데, 제 맥북에는 .idea파일이 없는데 그럼 그냥 무시하고 진행하면 되는 걸까요? (이전단계는 강사님이 하신대로 똑같이 따라 했습니다.)
-
미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
Mac
Mac으로 강의를 수강하고 있는데 강의를 끝까지 수강하는데 문제가 있을까요? 그리고 맥에서는 cmder이 실행이 안되는것 같습니다. 이 부분을 어떻게 해야 좋을까요? 감사합니다!
-
해결됨Practical Testing: 실용적인 테스트 가이드
긴 작업일 경우 트랜잭션을 걸지 말아도 된다는 점이 이해가 잘 안갑니다.
안녕하세요. 테스트 코드를 수강하고 있는 학생입니다. 긴 작업일 경우 트랜잭션을 걸지 말라고 하셨는데. 조회용 트랜잭션이 Repository 단에서 걸린다는 말씀을 하셨는데 Repository의 조회 로직이 수행될 때 트랜잭션이 걸리는 건가요? 뭔가 잘못 이해한거 같기도 해서 질문합니다. 그리고 @RequiredArgsConstructor @Service public class MailService { private final MailSendClient mailSendClient; private final MailSendHistoryRepository mailSendHistoryRepository; public boolean sendMail(String fromEmail, String toEmail, String subject, String content) { boolean result = mailSendClient.sendEmail(fromEmail, toEmail, subject, content); if (result) { mailSendHistoryRepository.save(MailSendHistory.builder() .fromEmail(fromEmail) .toEmail(toEmail) .subject(subject) .content(content) .build() ); return true; } return false; } } 여기서는 Transaction을 걸어줘야 하는게 맞는거 같아서.이 부분도 궁금합니다. 요약저는 서비스 Layer에서 Transaction을 걸어 db작업에서 문제가 발생했을 경우 rollback 되어야 한다고 생각했습니다.강의에서 긴 작업들이 실제로 트랜잭션에 참여하지 않아도 되는데 -> OrderStatisticsService에서는 CUD작업이 아니니깐 Transaction을 안 걸어도 된다.?MailService에서는 Transaction을 걸어줘야 하는게 아닌가요? (Create 작업 수행)조회용 트랜잭션이 Repository 단에서 걸린다.? 뭔지 잘 모르겠습니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
mockMVC CRUD작업
controller테스트를 할때 mockMVC를 사용하면 DB에 CRUD 작업은 수행되지 않나요?디버깅을 해보면 각 Layer별로 동작이 수행되는거 같은데 DB접근하여 데이터를 가져오는 부분에서는 null이 계속 나오네요(MyBatis 사용중).또 만약 실제 프로덕션 controller처럼 모든 동작이 수행된다면 왜 "하위 Layer를 모두 mocking처리" 라고 표현하시는지 궁금합니다.
-
미해결견고한 JS 소프트웨어 만들기
dry 패턴
do it repeat yourself (x)don't repeat yourself (0)아닌가여?
-
해결됨Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
TDD 통과 했지만, 실제 웹에서 작동하지 않습니다.
안녕하세요,Test코드는 통과했지만 실제 웹에서 다음과 같은 에러를 만났습니다.django.db.utils.IntegrityError: UNIQUE constraint failed: blog_tag.slug... tag, is_tag_created = Tag.objects.get_or_create(name=t) ...웹에서는 위와 같은 라인에서 에러가 발생한다고 합니다.하지만 어느 부분을 어떻게 고쳐야 할지 모르겠어서 질문 남겨봅니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
[섹션5: Spring & JPA 기반 테스트] 에서 진행한 테스트는 단위테스트인가요? 통합테스트인가요?
안녕하세요. 현재 섹션 5까지 수강을 하고 헷갈리는 것이 있어 질문 남기게 되었습니다. 섹션 5에서 3개의 레이어에 대한 테스트를 진행하는 데 이 테스트들은 단위 테스트인지 통합 테스트인지 헷갈립니다. @SpringBootTest 어노테이션을 사용하는 것으로 봐서는 스프링 빈을 전부 로드하는 통합테스트 같기도 하면서, @WebMvcTest 어노테이션을 사용하는 것을 봤을 때는 다른 레이어와 독립적인 테스트를 진행하는 것 같아 단위테스트 같은 것 같다고 생각했습니다. 이번 섹션에서 진행한 테스트는 어떤 종류의 테스트인가요? 만약 단위(혹은 통합)테스트라면 다른 종류에 있는 테스트는 어떻게 진행해야 하는지, 아니면 이 테스트만으로 충분하지 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
data가 isArray() = ture인 이유
ProductControllerTest에서@DisplayName("판매 상품을 조회한다.") @Test void getSellingProducts() throws Exception { // given List<ProductResponse> result = List.of(); when(productService.getSellingProducts()).thenReturn(result); // when // then mockMvc.perform( get("/api/v1/products/selling") ) .andDo(print()) .andExpect(status().isOk()) .andExpect(jsonPath("$.code").value("200")) .andExpect(jsonPath("$.status").value("OK")) .andExpect(jsonPath("$.message").value("OK")) .andExpect(jsonPath("$.data").isArray()); }data의 타입이 List인데 isArray()로 확인되는 이유는 JSON으로 변경될 때 List타입을 Array타입으로 자동으로 변경해서 그런건가요?
-
미해결Practical Testing: 실용적인 테스트 가이드
안녕하세요 강사님 관련 질문은 아닌데 테스트 때문에 진도를 못 나가서 질문 하나 올립니다!!
Redis 테스트는 어떻게 진행해야 되는지 모르겠습니다.. embedded Redis 를 사용해야 되는지,테스트 컨테이너를 사용해야 되는지 어떤 방법으로 진행해야 되는지 가르쳐주실 수 있나요?
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트를 위한 테스트쿼리 작성시 궁금증
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 현재 자바 백엔드 개발자입니다. 현재 마이바티스로 테스트 코드를 짜려고하는데 검증할 쿼리는 어떤 테이블의 특정 버전의 가장 높은 버전을 가져오는 쿼리로 그 특정버전으로 정렬을 시키고 top(1)을 사용해서 가져오게하는 쿼리로 짜놓은 상태입니다. 그러면 이걸 테스트를 하려고하면 셀렉트 쿼리를 하나 더짜서 그 특정버전에 max()를 사용해서 값으로 가져온 후 검증을 하는 방법이 떠오르는데요 그러면 이런 또하나의 쿼리가 생기는데 또하나의 쿼리가 잘 못 된다면 그 테스트의 경우가 잘못되는것을 말하는데 이런 상황에서 어떻게 하셨는지 궁금합니다
-
미해결Practical Testing: 실용적인 테스트 가이드
teardown 시 @AfterEach 주의
혹시나 저와 같은 이슈를 만나셨을 분이 있으실까봐 글을 남깁니다.강의 36:36 에서 강사님께서 teardown 을 정의해주실 때 @AfterEach 를 사용해서 매 테스트가 종료될때마다 db 를 깔끔하게 지워주도록 정의해주셨습니다.해당 클래스( ProductServiceTest.class) 에서 실행할 때는 문제가 되지 않고 정상적으로 작동을 합니다.그러나 다른 테스트(ex, OrderServiceTest.class) 에서는 @BeforeEach 를 사용해서 teardown 을 구현했는데 이 때문에 간극이 생겨 전체 테스트 를 돌렸을때 ProductServiceTest.class 에서 에러 가 발생합니다.따라서 @BeforeEach 로 변경하여서 해결할 수 있었습니다.
-
해결됨따라하며 배우는 리액트 A-Z
이벤트리스너 함수를 지정할 때, 화살표 함수와 그냥 함수의 차이
안녕하세요. 현재 섹션 3 수강 중인 수강생입니다. todo App을 만들고 있는데, X 버튼 구현하는 부분에서 onClick 이벤트 발생 시 작동하는 함수를 삽입해주는 부분인데요.onClick => {handleClick(data.id)}이렇게 입력하니 웹페이지가 제대로 동작하지 않고, 아래처럼 화살표 함수로 바꿔주니 정상적으로 동작합니다.<button onClick={() => handleClick(data.id)}> x </button>찾아보니 함수명으로 넣어주는 경우는 렌더링 시 함수가 바로 실행되고 click 이벤트 발생 시엔 함수의 반환값이 중괄호 안에 들어간다고 하고, 화살표 함수로 넣어줄 경우 의도한대로 click이벤트 발생 시에 함수가 실행된다는 걸 알게됐는데요, 이런 부분은 리액트 동작 원리 상 이렇게 되는거니 그냥 받아들이면 될까요? 아니면 제가 js 문법에 대해 이해가 부족해서 이해가 안가는 걸까요...?추가적으로, 그렇다면 리액트에서 이벤트리스너 함수를 넣을 때는 무조건 화살표 함수로 넣는게 맞는건가요?
-
미해결따라하며 배우는 리액트 A-Z
vscode 쓰실때 자동완성 문의드립니다
안녕하세요~ 터미널에서 auto suggestion 처럼 코드 제안하는 회색 글씨가 보이던데 어떻게 하셨는지 알 수 있을까요?