쇼핑몰 만들기 프로젝트 - 회원가입과 여러가지 세부 사항에 대해서 알아보자

yeom yaloo·2023년 7월 3일
0

쇼핑몰

목록 보기
11/19
post-thumbnail

[MSA의 회원가입 로직]

1. 회원가입 시 해당 구조의 흐름

2. 설명

  • client가 해당 회원가입을 위한 요청을 보낸다.
  • front server 측에서는 해당 요청을 받고 dto 객체로 변환하여 API server에서 작성한 API를 사용해서 응답 객체를 얻어온다.
  • API server 측에서는 front server에서 넘긴 요청을 확인하고 올바른 요청이 넘어왔다면 회원가입을 진행한다.
  • 이때 여러 주의점이 있다

[@ModelAttribute와 @RequestBody]

1. @ModelAttribute? @RequestBody?

코드 비교

[@ModelAttribute]

@PostMapping
public ResponseEntity<String> createPost(@ModelAttrubute RequestDto requestDto){

}

[@RequestBody]

@PostMapping
public ResponseEntity<String> createPost(@RequestBody RequestDto requestDto){

}

공통점

  • 클라이언트 측에서 데이터를 보내주면 이를 java코드에서 사용할 수 있게 Object로 만들어준다는 공통점이 있다.
  • 둘다 데이터 바인딩에 사용하는 기술이다.

차이점

@RequestBody
- JSON(application/json) 형태의 HTTP Body를 java 객체로 변환 시켜주는 역할을 한다.

  • 이때 RequestBody를 사용해서 넘겨주는 데이터는 Spring에서 관리하는 MessageConverter들 중 하나를 사용해서 java로 변환이 되는데 이때 이 작업을 위해서 ObjectMapper가 사용되는 것이다.

@ModelAttribute

  • Form(폼) 형태의 HTTP Body와 요청 파라미터들을 생성자나 Setter를 사용해 java 객체로 변환 시켜준다.
  • 해당 작업엔 Setter이 없으면 안 된다.

2. @ModelAttribute와 setter

  • Front server내에서 해당 Request Dto 객체를 Form을 통해서 입력받고 이를 java를 이용해 사용하기 위해서는 @ModelAttribute를 사용해서 데이터 바인딩을 진행해주어야 한다.
  • 이때 @ModelAttribute의 경우엔 가장 적절한 생성자를 찾아서 객체를 생성 및 초기화 해준다.
  • 해당 @ModelAttribute를 사용한 데이터 바인딩 작업은 객체 생성 및 초기화 👉 데이터 바인딩 👉 검증(validation) 순서로 진행된다.(해당 애너테이션의 작업 순서)
  • 데이터 바인딩은 getter/setter이 존재하는 변수에 한해서 이루어진다.

requestDto에 setter이 없다면 데이터 바인딩이 제대로 이루어지지 않고 null값이 넘어가게 됩니다.
데이터 바인딩 작업과 함께 더불어서 값 검증의 역할을 하는 것이 @ModelAttribute고 setter이 없더라도 적절한 생성자가 있다면 그것을 통해서 객체를 생성하기도 하는 것 같다.

중요한 점은!

  • 해당 @ModelAttribute를 사용해서 매핑할 DTO 객체에 Setter이 있어야 한다.

3. @ModelAttribute에 Setter 없는 경우?

Field error in object 'member' on field 'id': rejected value [null]; codes [NotBlank.member.id,NotBlank.id,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [member.id,id]; arguments []; default message [id]]; default message [공백과 빈값은 허용하지 않습니다. 올바르게 입력해주세요.]
Field error in object 'member' on field 'phoneNumber': rejected value [null]; codes [NotBlank.member.phoneNumber,NotBlank.phoneNumber,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [member.phoneNumber,phoneNumber]; arguments []; default message [phoneNumber]]; default message [공백과 빈값은 허용하지 않습니다. 올바르게 입력해주세요.]
Field error in object 'member' on field 'gender': rejected value [null]; codes [NotBlank.member.gender,NotBlank.gender,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [member.gender,gender]; arguments []; default message [gender]]; default message [공백과 빈값은 허용하지 않습니다. 올바르게 입력해주세요.]
Field error in object 'member' on field 'birthday': rejected value [null]; codes [NotBlank.member.birthday,NotBlank.birthday,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [member.birthday,birthday]; arguments []; default message [birthday]]; default message [공백과 빈값은 허용하지 않습니다. 올바르게 입력해주세요.]
Field error in object 'member' on field 'nickname': rejected value [null]; codes [NotBlank.member.nickname,NotBlank.nickname,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [member.nickname,nickname]; arguments []; default message [nickname]]; default message [공백과 빈값은 허용하지 않습니다. 올바르게 입력해주세요.]
Field error in object 'member' on field 'password': rejected value [null]; codes [NotBlank.member.password,NotBlank.password,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [member.password,password]; arguments []; default message [password]]; default message [공백일 수 없습니다]
Field error in object 'member' on field 'name': rejected value [null]; codes [NotBlank.member.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [member.name,name]; arguments []; default message [name]]; default message [공백과 빈값은 허용하지 않습니다. 올바르게 입력해주세요.]
Field error in object 'member' on field 'emailAddress': rejected value [null]; codes [NotBlank.member.emailAddress,NotBlank.emailAddress,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [member.emailAddress,emailAddress]; arguments []; default message [emailAddress]]; default message [공백과 빈값은 허용하지 않습니다. 올바르게 입력해주세요.]

  • 패스워드의 경우 encode 작업을 위해서 setPassword를 만들어둔 모습인데 다른 필드의 경우엔 setter가 없어서 바인딩이 제대로 되지 않는 문제가 있다. 이를 해결 하기 위해선 setter를 사용해주어야 한다.

[Valid 사용의 주의]

  • 해당 프로젝트 내에서 검증을 두번을 한다.
  • 처음은 front server에서 form에서 넘겨 받은 dto의 검증
  • 두번째는 front에서 넘어온 signup request dto를 API server 측에서 다시 한 번 검증

비밀번호를 평문 저장하지 않기 위해 encode 작업 후의 API server측의 entity valid를 위배하는 경우?
이때 발생할 수 있는 가벼운 예시로 Front에서 비밀번호를 encode하는 작업에 글자수가 늘어나고 이를 API server에서 비밀번호 필드를 @size()로 사이즈 제한을 했다 이때 이 수를 넘어서 회원가입이 실패하는 검증 문제가 발생했다. 이를 해결하고자 entity의 비밀번호 필드의 @size()부분을 삭제해주어 잘 가입되는 것을 확인했다.

profile
즐겁고 괴로운 개발😎

0개의 댓글