[우아한테크코스] 5월 4일 TIL

1 minute read

[Network] 네트워크 기본

  • 서비스는 네트워크를 통해 사용자에게 전달되므로 안정적인 서비스 운영을 위해 공부해야 한다.
  • 통신망: 노드들과 노드를 연결하는 링크로 구성된 하나의 시스템
  • 노드: IP를 가지고 통신할 수 있는 대상(인스턴스, 네트워크 장비 등)
  • ping: 현 네트워크 상태를 체크할 때 사용하는 Internet Control Message Protocol 중 하나로 IP 정보만으로 서버에 요청이 가능한지 확인한다.
  • ICMP: IP가 신뢰성을 보장하지 않아 오류정보 발견 및 보고 기능을 담당하는 프로토콜 (TCP 아님)

[Spring] test

build.gradle에 test{useJUnitPlatform()}의 의미
JUnit Vintage, JUnit Jupiter, JUnit Platform
junit api (@Display, @Test 등등)은 junit-jupiter-api로부터 오고, junit-jupiter-engine에서 동작,
이는 junit-platform-engin -> junit-platform-launcher

  • junit의 동작 원리

[Spring] @SpringBootTest의 동작 원리

spring application의 빈 사용,
webEnvironment에서 웹 서버를 시작하는 기능 포함
@ExtendWith는 junit5에서 제공하는 라이브러리

  • webEnvironment
    mock: mocking된 웹 환경 제공
    RANDOM_PORT: 실제 톰캣을 띄워 환경 구성
    DEFINED_PORT: 지정한 포트에 톰캣을 띄워 환경 구성
    none: 기본적인 applicationContext 로드
    @AutoConfigureMockMvc: Mock 테스트에 필요한 의존성 제공으로 로직상 테스트 진행

[Spring] 통합테스트, 단위테스트

  • 단위테스트
    독립된 객체, 메서드의 검증
    빠르고 작은 규모를 검증할 수 있다.
    내가 무언가 검증하는데에 필요한 객체가 협력 객체
    통합 Sociable 테스트
    고립 Solitary 테스트
    ex @WebMvcTest, @DataJpaTest, @RestClientTest, @JsonTest

  • 통합테스트
    독립된 단위가 서로 연결될 때 올바르게 작동하는지 확인하는 테스트
    db와 동작하는지, 서버와 통신하는지 등
    모든 설정과 bean 로드
    오래 걸리고 무겁다. 디버깅이 어렵다.
    ex @SpringBootTest-properties, webEnvironment(Mock, @AutoConfigureMockMvc)

  • End-to-End Test
    사용자의 입장에서 시나리오, 기능 등을 테스트하는 것
    ex 사용자(client)처럼 api요청을 보내면 원하는 값이 오는지 테스트

[Spring] Restassured vs MockMVC

  • RestAssured
    rest 웹 서비스 검증을 위한 라이브러리로 end to end test인 통합테스트에 사용(@SpringBootTest로 전체 로직 테스트)
    의존성 추가 필요 testImplementation 'io.rest-assured:rest-assured:3.3.0'
    등록된 spring bean 전부 로드
    BDD 스타일 구현으로 가독성 좋음

  • MockMVC: 애플리케이션 서버에 배포없이 스프링 mvc의 동작을 재현할 수 있는 라이브러리
    Presentation Layer의 bean 로드해서 빠름
    모두 Mock 객체로 처리해주는 비용 존재

[Spring] annotation의 동작 원리

어노테이션 프로세싱은 컴파일 타임에 이루어진다.
어노테이션 프로세서는 JVM 위에서 돌아간다.
javac는 어노테이션 프로세서를 위해 jvm 실행

[Spring] ReflectionUtils

findField, setField, getField, makeAccessible 메서드를 이용해 내부 변수를 원하는대로 바꾸는 클래스이다.
private 변수의 경우에도 field.setAccessible(true);를 통해 접근할 수 있게 된다.

Field field = ReflectionUtils.findField(Station.class, "id");
        field.setAccessible(true);
        ReflectionUtils.setField(field, station, ++seq);
        return station;

공식문서

[node] 설치 관련

노드 버전 낮추기: sudo ln -sf /usr/local/bin/node node
출처
npm background 실행: npm run dev &