이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것이 일부 존재합니다.
@PostMapping("/view")
public String updateProfile(@Valid Profile profile, Errors errors, Model model) {
if(errors.hasErrors()) {
return "view";
}
}
Spring Boot에서 객체를 binding하여 받아올 때, 유효성 검증이나 DB에 없는 값인지 확인을 해줘야 할 것이다. 객체의 에러를 잡기 위해 Errors라는 interface를 파라미터로 넣는다.
이때 binding 받는 객체의 오른쪽에 errors라는 이름으로 파라미터를 놓으면 된다.
바인딩 받는 Profile 객체에 @ModelAttribute
가 생략되어 있으며, 바인딩을 받다가 문제가 생길 시 if(errors.hasErrors())
로 에러를 받고 그에 해당하는 뷰로 랜더링하면 된다. (REST 방식이면 데이터를 보내면 된다)
사용자가 화면을 refresh하더라도 form submit이 다시 일어나지 않도록 redirect하는 것
테스트를 실행할 때 @WithMockUser
를 주면 Authentication 안에다가 UsernamePasswordAuthenticationToken
타입으로 username에는 user
, password에는 password
를 준다.
@WithUserDetails
는 실제로 우리가 만든 UserDetailsService
를 사용해서 이 유저이름에 해당하는 데이터를 가지고 테스트를 실행하게 된다.
@WithUserDetails("BruceHan")
@WithUserDetails
는 @BeforeEach
보다 더 빨리 실행된다. 이때 Spring Security가 제공해주는 기능을 이용하면
@WithUserDetails(value = "BruceHan", setupBefore = TestExecutionEvent.TEST_EXECUTION)
이런 식으로 Security Context를 설정하는 위치를 setupBefore 옵션을 이용해서 지정할 수 있다. 위의 소스에서는 @BeforeEach
다음 Test코드 실행 직전에 @WithUserDetails
가 실행될 것이다.
회원의 프로필같은 경우 프로필 사진을 매번 불러오는 상황이 발생할 수 있다. 그때 파일을 직접 선택하여 불러오기도 번거로울 뿐더러 (회원)데이터랑 같이 다니니까 이런 불편함을 해소하는 데 용이하다.
Reference