[워밍업 BE 프로젝트 3기] 2주차 발자국
학습
2주차는 섹션 3 뒷부분부터 섹션 4까지 진행합니다. 모르는 부분 위주로 기록하며 학습했습니다.
데이터베이스 초기화하기
스프링 건설 작업 이후 수행되는 데이터 초기화 기능 작성
리포지토리 개발 / 테스트 / 성능 개선
@DataJpaTest에는 @Transactional이 있어 메서드 하나마다 트랜잭션이 적용되며 종료 시 롤백됨
@TestInstance를 적용하여 인스턴스의 라이프사이클 변경 가능
for (i in 1..n) {}같은 문법도 알게 됨N+1 문제 해결을 위해 JPQL로 직접 쿼리 지정
default_batch_fetch_size 를 지정하여 페치 사이즈 지정 가능
컨트롤러 클래스 생성
@RestController는 지정한 응답을 그대로 반환
@Controller는 /resources/templates 하위의 html 파일을 반환
DTO 개발
DTO 생성할 때 필터링을 수행함 -> 데이터 조회 쿼리에서 조건을 추가할 순 있지만, JPA 원칙상 지양해야 함
Presentation Layer 개발 / 테스트
여러 서비스에서 레포지터리를 주입받다보면 관리가 복잡해짐 -> 필요한 레포지터리를 한번에 래핑해서 사용함 (퍼사드패턴)
@Transactional(readOnly=true) → JPA에서 스냅샷 뜨고 비교하는 작업 생략
테스트 시 모킹 인스턴스 주입 방식
@InjectMocks -> 강의에서는 서비스 주입에 사용. @Mock으로 생성된 객체를 주입하여 실제 객체를 생성함
@Mock -> 강의에서는 레포지터리 주입에 사용. 단순히 가짜 객체를 만듦
lateinit -> 초기화를 늦춤
@AutoConfigureMockMvc → 자동으로 MockMvc 관련 설정 추가
Thymeleaf 부트스트랩 템플릿 추가: 파일을 수정하여 사용할 부분 코드만 정리
<div th:replace="~{presentation/fragments/fragment-navigation :: navigation}"></div>-> 해당 파일에서 아이디가 navigation인 컴포넌트를 찾아 로드
인터셉터 개발: HandlerInterceptor의 메서드를 오버라이딩
preHandle: 컨트롤러까지 요청이 가기 전에 동작
postHandle: 컨트롤러가 응답을 리턴한 이후에 동작 - 예외 시 동작 X
afterCompletion: '' - 예외 시 동작 O
미션
1주차에 이어서 2주차 미션도 2가지입니다.
Rest API 설계
조회 API 만들기
API 문서는 사용해본 도구가 많이 없어서, Postman에서 제공하는 Documentation을 이용했습니다. 다 하고 뭐가 부족하다 싶었는데 응답을 설정하지 않았더라고요. 제출을 먼저 해버렸지만 Mock Server 같이 응답 폼을 미리 명시할 수 있는 방법을 더 찾아봐야겠습니다.
여기까지는 대부분 설계한 산출물을 제출하는 작업이었습니다. 하지만 바로 API를 하나 만들게 되면서 그동안 강의에서 배운 모든 작업이 필요했습니다.
application.yml 설정
레포지터리, 서비스, 컨트롤러 구현
더미데이터 추가 클래스 구현
단순히 과제를 제출하는데 의의를 두었다면 조회 기능만 간단하게 구현했을 것 같습니다.
하지만 저는 이번 워밍업을 하면서 그 전에 해보지 않았던 걸 해보며 한 단계 나아가는 경험을 하고 싶었습니다.
그래서 강의에서 나왔던 더미데이터 추가, 테스트 코드 작성도 완료하여 제출하려고 합니다.
테스트 코드를 작성하면서 겪은 문제가 크게 2가지 있었습니다. (상세한 내용은 리드미에 작성할 예정입니다.)
먼저 레포지터리를 추가할 수 없다는 문제를 맞았는데, 해결하며 문제와 관련해서 스프링에서 엔티티를 찾는 원리, 컴포넌트 스캔, ApplicationContext 등에 대해 찾아보게 되었습니다.
두 번째로는 테이블을 생성하는 DDL이 자동으로 실행되면서 생긴 에러입니다. 생각보다 간단한 문제였고 테이블 이름을 지을 때 신중해야겠다고 느꼈습니다. 🥲
확실히 직접 해보면서 강의에서는 마주하지 않은 문제들을 해결해보니 더욱 흥미가 생겼고, 시간 가는 줄 모르게 작업한 것 같습니다.
이제 절반 조금 넘게 달렸는데, 힘내서 꼭 완주하겠습니다. !!