🎁 모든 강의 30% + 무료 강의 선물🎁

[인프런워밍업클럽  3기 BE] 2주차 발자국

[인프런워밍업클럽 3기 BE] 2주차 발자국

1. 강의

강의 진도 : 섹션3 ~ 섹션4

1.1 학습내용

  • @PostConstruct

    • 빈(Bean)이 생성되고 의존성 주입이 완료된 후 실행할 초기화 메서드를 지정하는 데 사용한다.

    • 애플리케이션 실행 시 해당 빈이 초기화될 때 한 번만 실행된다.

    • 데이터 로드, 캐시 초기화, 설정 값 검증 등에 주로 사용된다.

  • 테스트 코드 작성시 관련 어노테이션

    • @DataJpaTest

      • JPA 관련 빈만 로드하여 테스트 할 수 있게 만들어 준다.

      • 테스트가 끝나면 자동 롤백 됩니다.

    • @TestInstance

      • JUnit 5에서 테스트 클래스의 인스턴스 생명 주기를 지정하는 어노테이션이다.

      • 테스트 메서드간의 인스턴스 변수가 공유되지 않는다.

      • @TestInstance(TestInstance.Lifecycle.PER_CLASS) 사용시 테스트 클래스의 인스턴스를 한 번만 생성하고 모든 테스트 메서드에서 공유한다.

    • @ExtendWith(MockitoExtension::class)

      • JUnit 5에서 Mockito를 사용하여 테스트할 때 사용하는 어노테이션이다.

      • Mockito 관련 설정을 간결하게 해준다.

    • @InjectMocks

      • Mock 객체(가짜객체)를 테스트 대상 객체에 주입해준다.

    • @SpringBootTest

      • 서버를 띄워서 테스트를 할때 사용하는 어노테이션이다.

      • 전체 애플리케이션의 통합 테스트에 사용된다.

    • @AutoConfigureMockMvc

      • MockMvc를 자동으로 설정하는 어노테이션이다.

      • Spring MVC를 모의로 테스트할때 사용된다.

  • 테스트 코드 작성 예시

@Test
fun getIntroductions() {
    /**
     * given : 조건 설정
     */
    val list = mutableListOf<Introduction>()

    // DATA_SIZE 만큼 반복하면서 isActive는 i가 짝수일 경우 true 홀수일 경우 false로 설정한다.
    for (i in 1..DATA_SIZE) {
        val introduction = Introduction(content = "${i}", isActive = i%2 == 0)
        list.add(introduction)
    }

    /**
     * when : 동작 설정 및 실행
     */
    // isActive가 true인 항목들만 필터링하여 activeList를 만든다.
    val activeList = list.filter { item -> item.isActive }

    // presentationRepository.getActiveIntroductions()가 호출되었을 때 반환할 값으로 설정한다.
    // when이 코틀린에서 예약어여서 `when`이 된거
    Mockito.`when`(presentationRepository.getActiveIntroductions())
        .thenReturn(activeList)

    // 실제로 테스트할 대상인 presentationService.getIntroductions() 메서드를 호출하고 그 결과를 introductionDTO에 저장한다.
    val introductionDTO = presentationService.getIntroductions()

    /**
     * then : 결과 검증
     */
    // introductionDTO의 크기가 DATA_SIZE / 2인지 확인한다.
    assertThat(introductionDTO).hasSize(DATA_SIZE / 2)
    // 각 introduction의 content 값이 짝수인지 확인한다.
    // content는 문자열이지만 이를 toInt()로 변환하여 짝수인지 검증한다.
    for (introduction in introductionDTO) {
        assertThat(introduction.content.toInt()).isEven()
    }
}
  • 코틀린 관련 정리

    • mutableListOf()

      • 코틀린에서 변경 가능한 리스트(MutableList)를 생성하는 함수이다.

      • ArrayList를 기반으로 한 가변 리스트(MutableList<T>) 를 생성한다.

     

1.2 느낀 점

이번 주는 바쁜 일정 속에서도 커리큘럼에 맞춰 강의를 모두 수강할 수 있어 뿌듯하다.
특히 DB, 서비스, 컨트롤러별로 테스트 코드를 작성해 보면서 중요성을 다시 한번 느꼈고 실무에서도 적용을 해봐야겠다고 생각했다.


2. 미션

2.1. 테이블 설계하기

  • 주문 관리 시스템을 하기로 결정하고 떠오르는 테이블을 작성해보았다.

  • 테이블 목록

    • TB_ORDER(주문) : 주문 마스터 정보를 저장하는 테이블

    • TB_ORDER_DETAIL(주문 상세) : 주문 상세 정보를 저장하는 테이블

    • TB_PRODUCT(상품) : 상품 정보를 저장하는 테이블

    • TB_CODE(공통코드) : 코드 및 설명을 저장하는 테이블

  • ERD

image

  • 설명

    • TB_ORDER(주문) → TB_ORDER_DETAIL(주문 상세) → TB_PRODUCT(상품) 순서로 주문 데이터가 저장된다.

    • TB_CODE는 주문 상태, 상품 상태 등 다양한 공통 코드를 별도의 테이블로 관리하고자하여 추가하였다.

2.2. REST API 설계하기

2.3. 느낀 점

짧은 기한 내에 미션을 하는 게 힘들긴 했지만 스터디를 계기로 간단하게나마 테이블과 API 설계를 해보게 되어서 재밌었다.

출처

채널톡 아이콘