코딩공부

내일배움캠프 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;
}