![[인프런워밍업클럽 3기 BE] 2주차 발자국](https://cdn.inflearn.com/public/files/blogs/cf302a03-79fc-4d7f-94f3-28d0e359c5ac/발자국.png)
[인프런워밍업클럽 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
설명
TB_ORDER
(주문) →TB_ORDER_DETAIL
(주문 상세) →TB_PRODUCT
(상품) 순서로 주문 데이터가 저장된다.TB_CODE
는 주문 상태, 상품 상태 등 다양한 공통 코드를 별도의 테이블로 관리하고자하여 추가하였다.
2.2. REST API 설계하기
URL : https://github.com/pej4303/inflearn-pjt/blob/main/kotlin-mission/README.md
추후 swagger UI를 적용해볼 예정이다.
2.3. 느낀 점
짧은 기한 내에 미션을 하는 게 힘들긴 했지만 스터디를 계기로 간단하게나마 테이블과 API 설계를 해보게 되어서 재밌었다.