내일배움캠프 D+54: 0610 ⏳

enyo9rt·2022년 6월 9일

TIL-S

목록 보기
37/79

🌌 실시간 강의

버킷 CORS

버킷 정책 설정



⏳ 타임어택 구현 테스트

튜터님이 쉽다고 여러 번 강조하셨는데 그럴 만큼 CRUD와 JPA에 충실한 문제가 나왔다. 크게 응용을 요하는 부분이 없어서 다행히 다 풀었다.
조건을 설정해서 찾는 JPA는 꽤나 직관적이어서 홈페이지를 들어간 뒤 풀었다.

1주차에서는 update만 서비스에서 처리했고 2주차는 전부 서비스에서 처리했는데 나는 2주차의 방식을 따랐다. 임포트 한 번씩만 하면 되니까 ㅎㅎ...
또한 처음부터 dto를 만들어 진행했는데 이메일이 들어가지 않는 경우가 필요해서 dto를 하나 더 만들었다. dto 자체에 email이 안 들어가야한다는 생각으로 그런건데... 지금와서 생각해보니까 그냥 dto 그대로 받고 함수를 설정하기만 했어도 됐겠다.



📑 Select Shop 관리자 페이지

사실 어제까지 제출 기한이어서 마감을 한참 넘겼다.
하지만 어제 하루를 css & js와 싸우며 보냈는 걸요...😭
죽도록 안되던 css는 앞에 슬래시를 하나 더 붙이는 걸로 말끔히 해결되어서 너무 어이가 없었다. 시큐리티를 얼매나 건드렸던가...
자스는 할 말도 없다... 어휴...

게다가 어제는 안 되던, 로그인 직후 권한별 페이지 이동을 달리 하는 것도 오늘은 거짓말처럼 됐다. 하룻밤 자고 일어나면 시간이 해결해 주는 것도 있나보다^^... 그래도 이거 한 번 해보고 나니까 프로젝트할 때는 좀 덜 헤맬 것 같...기도 하다ㅎ



🍃 Spring 심화반

✳ 3주차 ❇

테스트 프레임 워크

▶ 스프링에서 제공하는 테스트 프레임 워크를 사용하여 테스트 코드 작성법을 배워본다!

테스트의 필요성

버그(bug): 소프트웨어가 예상치 못한 결과를 내는 것

  1. 블랙박스 테스팅 사용자 입장에서 검사

    누구나 테스트가 가능

    기능 증가에 따라 테스트의 범위도 증가

  2. 개발자 테스트(화이트박스 테스팅) 개발자가 테스트 코드 작성

    빠르고 정확한 테스트
    테스트 자동화
    기존 코드 정상 작동
    배포 시 항상 검증 가능

    개발 시간이 오래 걸림
    테스트 코드 유지보수 비용


▶ Unit Test
단위 테스트는 클래스 단위로 생각하면 된다
객체 하나에 function 하나당 테스트

▶ Product.java 관심 상품을 생성하는 함수를 테스트해보자!
테스트에는 @Test 어노테이션이 붙는다.
@DisplayName()은 실행 화면에서 보여질 이름이다.
기본적으로 1씩 더해지는 id는 초기값이 null인 것을 확인하는 것이 중요하다.
테스트 에러가 나는 경우 그 뒤의 동작들은 수행하지 않는다.

▶ Edge Case 고려하기
: 모든 입력값의 여러 상황을 고려해본다.

  • id가 null 이거나 음수
  • 상품명이 null 이거나 빈 문자열
  • url이 url 형태가 아님
  • 상품 최저가가 음수

▶ URL 입력값 예외 처리 함수

public class URLValidator {
	public static boolean urlValidator(String url)
	{
		try {
			new URL(url).toURI();
			return true;
		}
		catch (URISyntaxException exception) {
			return false;
		}
		catch (MalformedURLException exception) {
			return false;
		}
	}
}

toURI() function of URL class converts the URL object to a URI object
MalformedURLException url 문자열이 null이거나 프로토콜을 알 수 없는 등의 상황에 발생

▶ 위의 테스트에 맞춰 상품 테스트 클래스를 수정해보자!
@Nested 하위 테스트가 존재할 때
@BeforeEach 초기값 세팅

// when
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
						new Product(requestDto, userId);
					});
					
// then
assertEquals("회원 Id 가 유효하지 않습니다.", exception.getMessage());

입력값 Validation에 따라 처리될 예외의 경우를 예상되는 경우로 지정해 확인한다.

❔ TDD(Test-Driven Development)?
테스트 코드를 먼저 만들고 개발을 시작하는 것!

  • AS-IS) 설계 → 개발 → 테스트 (→ 설계 수정) 순서를
  • TO-BE) 설계 → 테스트 (→설계 수정) → 개발로 변경

▶ Mock Object
이상적인 테스트를 위해서는 Mock Object로 연관된 클래스들이 아닌 하나의 클래스를 테스트하는 것이 좋다.
DB에 저장되는 것처럼 리스트에 넣어서 임시로 쓸 수 있게끔 만들어 준다.

❔ Mockito? Mock 객체를 쉽게 만들 수 있는 방법을 제공하는 프레임워크
@ExtendWith(MockitoExtension.class)

	@Mock
	ProductRepository productRepository;
    
    		ProductService productService = new ProductService(productRepository);
		when(productRepository.findById(productId))
				.thenReturn(Optional.of(product));
		

레포를 알아서 만들어준다. 하지만 초기값을 쓸 수 있게 정해줘야 한다!


SAVE 💾

티스토리는 복붙하면 알아서 코드로 넣어주는데 벨로그 이 바보야... 귀찮다고...

1개의 댓글

comment-user-thumbnail
2022년 6월 11일

고생많으셨습니다~ㅋㅋ dto를 나누고 엔티티와 변수명을 다르게 하는건 보안적인 측면과 관리의 측면 둘 다 있으니 나누신게 잘 하고 계신거에요~

답글 달기