코딩공부
내일배움캠프 32일차(스프링과제 오류 해결)
정해인3
2023. 6. 29. 20:54
오늘은 스프링 LV2 과제를 작성했다.
오류1
엔티티 간에 다대일 관계를 만든 후 User 엔티티의 username을 Post엔티티의 username에 삽입하려 했으나 실패했다.
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
public Post(PostRequestDto requestDto){
this.username = user.getUsername();
this.contents = requestDto.getContents();
}
String 간의 복사에 맞게 양식을 바꾸어줬더니 해결되었다.
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
public Post(PostRequestDto requestDto){
this.username = new String(user.getUsername());
this.contents = requestDto.getContents();
}
오류2
처음에 @Validation을 Entity에 직접 적용했더니 비밀번호 부분에서 오류가 났다. 아마 암호화된 비밀번호를 검사했더니 규격에 맞지 않아 생기는 일 같았다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
@Size(min = 4, max = 10)
@Pattern(regexp = "^[a-z0-9]+$")
@NotBlank
private String username;
@Column(nullable = false)
@Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[$@$!%*#?&])[A-Za-z\\d$@$!%*#?&]{8,16}$", message = "비밀번호는 8~16자리수여야 합니다. 영문 대소문자, 숫자, 특수문자를 1개 이상 포함해야 합니다.")
@NotBlank
private String password;
@Column(nullable = false, unique = true)
@NotBlank
private String email;
하지만 Controller를 확인해보면 RequestDto부분에 @Validation이 적용되어 있는 것을 알 수 있다.
public String signup(@Valid SignupRequestDto requestDto, BindingResult bindingResult) {
...
}
팀장님의 조언으로 @Validation이 적용되어 있는 RequestDto쪽 필드에 애너테이션들을 적용했더니 오류가 사라지고 문제가 해결되었다. 암호화된 비밀번호가 아니라 입력됐을 때의 비밀번호를 검사하는 것이다.
@Getter
@Setter
public class SignupRequestDto {
@Size(min = 4, max = 10)
@Pattern(regexp = "^[a-z0-9]+$")
@NotBlank
private String username;
@Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[$@$!%*#?&])[A-Za-z\\d$@$!%*#?&]{8,16}$", message = "비밀번호는 8~16자리수여야 합니다. 영문 대소문자, 숫자, 특수문자를 1개 이상 포함해야 합니다.")
@NotBlank
private String password;
@NotBlank
private String email;
}