본문 바로가기
Record/boostcourse

프로젝트D. Spring Security를 이용한 로그인 및 예약 관련 Web API 만들기

by doongjun 2021. 10. 19.

인턴 생활을 시작하게 되면서 시간날때 조금씩 진행하느라 생각보다 오래 걸린 프로젝트였다.

 

이번 프로젝트에서는 예약하기, 예약 목록 보기, 예약 취소 기능을 구현해야 한다.

또한 예약을 하기 위해서는 로그인 기능을 구현해야하고 로그인을 하지 않은 사용자는 로그인할 수 없다.

 

Commnet1
단일 책임 원칙에 맞게 작성했는지 고민해보시기 바랍니다.

단일 책임 원칙이란 모든 클래스는 하나의 책임만을 가지며, 클래스는 그 책임을 완전히 캡슐화해야 한다는 것을 의미한다.

예약에 대한 댓글 기능을 구현하면서 해당 메소드를 예약 컨트롤러에 위치시켰다.

이는 예약에 관한 책임을 갖고 있지만 댓글에 대한 책임도 갖고 있다.

정답은 없지만 예약 컨트롤러에 위치시키는 것보다 다른 컨트롤러를 만들어 위치시키는게 좋을 것이다. 

https://ko.wikipedia.org/wiki/%EB%8B%A8%EC%9D%BC_%EC%B1%85%EC%9E%84_%EC%9B%90%EC%B9%99

 

단일 책임 원칙 - 위키백과, 우리 모두의 백과사전

객체 지향 프로그래밍에서 단일 책임 원칙(single responsibility principle)이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다. 클래스가 제공하는 모든

ko.wikipedia.org

https://www.nextree.co.kr/p6960/

 

객체지향 개발 5대 원리: SOLID

현재를 살아가는 우리들은 모두 일정한 원리/원칙 아래에서 생활하고 있습니다. 여기서의 원칙 이라 함은 좁은 의미로는 개개인의 사고방식이나 신념, 가치관 정도가 될 수가 있겠고, 넓게는 한

www.nextree.co.kr

 

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());

댓글