Spring 썸네일형 리스트형 스프링 JPA 쿼리가 두번 발생하는 경우 해결하기 1. 상황 테스트 코드 로그를 보면 같은 쿼리가 두번 나타나는 현상 발생 2. 해결 방법 - 로그에서 value값 확인을 위해 추가한 기존 설정 - 기존 org.hibernate.SQL을 show_sql 로 변경 - 쿼리가 한 번만 찍히는 것을 확인 // 3. 원인 더보기 스프링 JPA, 로그에서 쿼리 값(파라미터) 보기 기존 로그를 보면 value가 '?' 로 보임 properties에 간단한 설정이면 value를 볼 수 있음 logging.level.org.hibernate.SQL = debug logging.level.org.hibernate.type.descriptor.sql = trace 설정 후 로그를 확인해보면 아래와 같이 value를 확인할 수 있음 더보기 AssertJ 1. AssertJ JUnit에서 제공하는 assert() 메소드의 부족한 표현력을 충족시켜줌 타입별로 다양한 검증 메소드를 제공하여 테스트 코드를 더욱 쉽게 작성할 수 있게 도와줌 JUnit assert() 와 AssertJ 비교 id가 "a"를 포함하고 있는 지 여부 검사 // JUnit assert()사용 코드 assertTrue(id.contains("a")); // 단언 실패 메시지, 실패 이유를 알 수 없음 org.opentest4j.AssertionFailedError: expected: but was: // AssertJ 사용 코드, id가 "a" 를 포함하는 지 여부를 검사한다는 것을 직관적으로 확인할 수 있음 assertThat(id).contains("a"); // 단언 실패 메시지,.. 더보기 TDD, 대역을 이용한 테스트 1. 대역 test double는 대역을 뜻함 실제 기능을 구현하지 않고 단순한 구현으로 실제 구현을 대체 2. 대역의 종류 대역 설명 스텁(Stub) 구현을 단순한 것으로 대체 테스트에 맞게 단순 동작 기능 수행 가짜(Fake) 제품에 적합하지 않지만 실제 동작하는 구현 제공 스파이(Spy) 호출된 내역 기록 기록한 내용은 테스트 결과 검증 시 사용 스텁이기도 함 모의(Mock) 기대한대로 상호작용하는지 행위를 검증 기대한대로 동작하지 않을 시 Exception 발생할 수 있음 스텁이자 스파이 상위 타입 인터페이스를 만들고, 그 인터페이스를 상속받아서 구현 1) 스텁(Stub) - 실제 기능 구현을 하지 않고 단순 동작 기능을 수행하는 Stub 대역 /** * CardNumberValidator(실제 .. 더보기 TDD, 테스트 코드의 구성 1. 상황 찾기 어떤 상황이 실행 결과에 영향을 줄 수 있는지 찾기 위한 노력 필요 다양한 예외 상황을 찾아내고 이를 코드에 반영해야 기능이 비정상적으로 동작하는 것을 막을 수 있음 2. 테스트 코드의 구성 요소 기능은 상황에 따라 달라 지기 때문에 상황(given), 실행(when) 결과 확인(then) 세 가지 요소로 테스트를 구성할 수 있음 JUnit에서 상황을 설정하는 방법은 테스트할 대상에 따라 달라짐 1) 각 테스트 메서드마다 객체를 생성해서 상황 설정 public class BaseballGameTest { @Test void exactMatch() { // given BaseballGame game = new BaseballGame("456"); // when Score score = ga.. 더보기 TDD 테스트 주도 개발, 기능 명세와 설계 1. 기능 명세 1) 다양한 형태의 요구사항 문서를 이용해서 기능 명세를 구체화함(입력과 결과를 도출) 2) 기능을 크게 입력과 결과 두 가지로 나눈다 - 입력: 보통 메소드의 파라미터로 전달 받음 - 결과: 여러 형식으로 정의, 리턴 값으로 보내주거나 Exeption 결과를 보내줄 수 있음 기능 명세 구체화를 돕는 TDD 개발자는 스토리보드나 와이어프레임 같은 형태로 요구사항을 전달 받지만 이런 문서는 개발자가 기능을 구현하기에 생략된 내용이 많음 테스트 코드를 작성하기 위해서는 파라미터, 결과값을 정해야하므로 기능을 입력과 결과로 도출 해야함 ex. 선불 1만원 지불 시 한달 이용 가능한 서비스의 만료일 구하기 Q. 4월 30일에 1만원 지불 시 5월 30일이 아닌 31일이 만료일이 맞는지? Q. 1.. 더보기 TDD 테스트 코드 작성 방법 1. 순서 정하기 1) 쉬운 경우에서 어려운 경우로 진행 2) 예외적인 경우에서 정상인 경우로 진행 *암호 검사기 연습 예제 순서를 보면 쉬운 경우에서 어려운 경우로 진행 됨 1. 모든 규칙 충족: 단순 값(Ex. 상수)을 리턴값으로 넣어서 테스트 -> 새로운 추가 테스트 넣어서 에러 발생 시 -> 상수 제거 후 일반화 2. 1번 규칙 미충족, 나머지 규칙 충족 3. 2번 규칙 미충족, 나머지 규칙 충족 4. 3번 규칙 미충족, 나머지 규칙 충족 5. Null이거나 값이 없는 문자열 -> 유효하지 않은 값 6. 1번 규칙 충족, 나머지 규칙 미충족 7. 2번 규칙 충족, 나머지 규칙 미충족 8. 3번 규칙 충족, 나머지 규칙 미충족 9. 모든 규칙 미충족 2. 예외 상황을 먼저 테스트 해야하는 이유 - .. 더보기 테스트 주도 개발 시작하기 - TDD 시작, TDD 암호 검사기 3 1. 일곱 번째 테스트 숫자 포함 조건만 충족하는 경우 1) 테스트 코드 작성 import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class PasswordStrengthMeterTest { private PasswordStrengthMeter meter = new PasswordStrengthMeter(); // 중복되는 코드, 필드에서 생성하도록 수정 private void assertStrength(String password, PasswordStrength expStr) { // 중복되는 코드.. 더보기 이전 1 2 3 4 5 6 7 8 ··· 12 다음