이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것이 일부 존재합니다.

1. 바인딩과 에러 처리는 짝을 짓자

@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 방식이면 데이터를 보내면 된다)

2. GET-POST-REDIRECT 패턴

사용자가 화면을 refresh하더라도 form submit이 다시 일어나지 않도록 redirect하는 것

3. JPA 객체 상태 토막 상식

  • transient 상태 : 새로 만든 객체 상태
  • detached 상태 : JPA가 한 번이라도 알고 있는 상태이며 id값이 있다. 한 번이라도 DB에 JPA를 통해서 저장 됐던 객체이다. 즉, 연관되어있는 영속성 컨텍스트에서 관리 중인 객체가 아니며, 아무리 변경하더라도 변경 이력을 감지하지 않는다. 그러므로 Transaction이 끝나도 DB에 반영을 하지 않는다.

4. @WithMockUser, @WithUserDetails(feat.Spring Security Test - Mockito)

테스트를 실행할 때 @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가 실행될 것이다.

5. Data URLs란?

  • 이미지, HTML 등 컨텐츠 자체를 어떤 페이지에 내장된 형태로 가져올 수 있게끔 지원한다.
  • data: 라는 접두어를 가진 URL로, 파일을 문서에 내장할 때 사용할 수 있다.
  • 이미지를 DataURL로 저장할 수 있다.
  • Binary(데이터, 이미지, 파일 등)를 나타내는 굉장히 긴 문자열을 저장한다고 보면 된다.

사진 파일 등을 DB에 넣는 대신 Data URLs를 쓰면 좋은 점

회원의 프로필같은 경우 프로필 사진을 매번 불러오는 상황이 발생할 수 있다. 그때 파일을 직접 선택하여 불러오기도 번거로울 뿐더러 (회원)데이터랑 같이 다니니까 이런 불편함을 해소하는 데 용이하다.

Reference

전체 Reference

profile
만 가지 발차기를 한 번씩 연습하는 사람은 두렵지 않다. 내가 두려워 하는 사람은 한 가지 발차기를 만 번씩 연습하는 사람이다. - Bruce Lee

0개의 댓글