인턴 생활을 시작하게 되면서 시간날때 조금씩 진행하느라 생각보다 오래 걸린 프로젝트였다.
이번 프로젝트에서는 예약하기, 예약 목록 보기, 예약 취소 기능을 구현해야 한다.
또한 예약을 하기 위해서는 로그인 기능을 구현해야하고 로그인을 하지 않은 사용자는 로그인할 수 없다.
Commnet1
단일 책임 원칙에 맞게 작성했는지 고민해보시기 바랍니다.
단일 책임 원칙이란 모든 클래스는 하나의 책임만을 가지며, 클래스는 그 책임을 완전히 캡슐화해야 한다는 것을 의미한다.
예약에 대한 댓글 기능을 구현하면서 해당 메소드를 예약 컨트롤러에 위치시켰다.
이는 예약에 관한 책임을 갖고 있지만 댓글에 대한 책임도 갖고 있다.
정답은 없지만 예약 컨트롤러에 위치시키는 것보다 다른 컨트롤러를 만들어 위치시키는게 좋을 것이다.
https://ko.wikipedia.org/wiki/%EB%8B%A8%EC%9D%BC_%EC%B1%85%EC%9E%84_%EC%9B%90%EC%B9%99
https://www.nextree.co.kr/p6960/
Comment2
Mock 단위테스트 질문 답변
컨트롤러 Mock 테스트를 진행했을 때 오류가 해결되지않아서 질문드렸는데 친절하게 답변해주셨다.
먼저 에러가 발생한 이유는 테스트 케이스 실행 시 principal이 null이기 때문에
principal.getName() 했을 때 NullPointException이 발생한 것이었다.
이러한 인증을 테스트하기 위해 pom.xml에 의존성을 추가해준다.
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<version>${spring.security.version}</version>
<scope>test</scope>
</dependency>
그 후 단위테스트에 @WithMockUser 애노테이션을붙여준다.
@Test
@WithMockUser
public void addReservationInfos() throws Exception {
// 생략
}
@WithMockUser 애노테이션의 역할은 임의의 인증정보로 단위테스트를 실행시키며
아무설정 없이 @WithMockUser 애노테이션만 붙였을 경우
default username은 user, password는 password, roles는 USER로 실행된다.
인증정보를 지정하고 싶다면 아래와 같이 각 값을 할당해주면 된다.
@WithMockUser(username = "테스트계정", password = "custom_password", roles = {"USER","ADMIN"})
그 다음 MockMvc principal에 SecurityContextHolder.getContext().getAuthentication()를 할당해 주면 된다.
mockMvc.perform(MockMvcRequestBuilders
.post("/api/reservationinfos")
.content(content)
.principal(SecurityContextHolder.getContext().getAuthentication())
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
'Record > boostcourse' 카테고리의 다른 글
프로젝트E. 예약 : 한줄평 관련 Web API 만들기 (1) | 2021.11.22 |
---|---|
프로젝트C. 예약 : 메인, 상세보기 관련 Web API 만들기 (0) | 2021.08.18 |
[boostcourse] 4. 웹 앱 개발 예약 서비스 생각해보기 #1 ~ #4 (0) | 2021.08.02 |
[boostcourse] 3. 웹 앱 개발 예약 서비스 생각해보기 #2 ~ #3 (0) | 2021.08.01 |
[boostcourse] 3. 웹 앱 개발 예약 서비스 생각해보기 #1 (0) | 2021.07.30 |
댓글