DEV-STUDY/Spring

[Spring] Validation 체크는 Controller의 몫이다.

HwangJerry 2023. 8. 8. 23:21

AOP를 통해서 Validation을 구현하던 중, 해당 코드를 원래 Controller에서 작성하고, 검증하고 있었음을 이해하게 되었다. Dto에 해당 조건들을 걸고 난 뒤에는, Controller에서 Validation을 체크하고, 문제가 없을 경우 Service로 내리는 흐름으로 돌게 되어 있다.

 

상황을 가정해보자. 아래와 같이 Entity가 정의되어 있다.

@Entity
@Getter
@Table(name = "user_tb")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(unique = true, nullable = false, length = 20)
    private String username;
    @Column(nullable = false, length = 60) // 패스워드 인코딩(BCrypt)
    private String password;

    @Column(nullable = false, length = 20)
    private String email;
    @Column(nullable = false, length = 20)
    private String fullname;

	// ...
}

위처럼 Entity 필드에 @Column 어노테이션을 이용하여 length = 20과 같은 제약 조건을 설정해뒀다면, 이에 맞게 dto에도 해당 조건을 설정해두고 validation 체크를 컨트롤러 레이어에서 요청이 들어왔을 때 올바르게 요청이 들어온 것인지 유효성 검사를 수행해줘야 한다.

 

만약 이를 수행하지 않으면 DataIntegrityViolationException이 터지게 된다.

이건 DB가 터진 거다. DB는 아무런 문제가 없고, 그냥 명시한대로 테이블의 칼럼 조건을 설정해뒀을 뿐인데, Controller에서 요청값에 대한 Validation 책임을 다하지 않아 아무 문제 없는 DB가 터지게 된 거다. Service에서는 "유효한" 데이터를 가지고 비즈니스를 처리하는 곳이므로, 유효성 검사를 하지 않는다. 이를 감안하여 로직을 구성해야 한다.

 

출처: 스프링부트 JUnit 테스트 (인프런)