soft IT life

Validation spring+kotlin, DTO/Entity/Repository 본문

Kotlin

Validation spring+kotlin, DTO/Entity/Repository

softPattern 2023. 9. 14. 14:54

 

바인딩할 DTO에 @어노테이션 적용하기

@field:[Validation]

Kotlin 환경에서 Validation을 적용하려면 변수를 Nullable 타입으로 선언해야한다.

@field:NotNull(message = "a는 필수 입력값입니다.")
var a : String? = "abc"
  • why? 위처럼 Nullable 타입으로 선언하지 않고 그냥 선언하면 Kotlin은 nullsafety이기 때문에 정상적인 핸들링을 기대하기 힘들다.
  • why ? 아무 값을 입력하지 않아도 default value가 설정되는 primitive type 같은 경우에는, 만약 null로 client에서 넘어왔을때 default 값이 설정 되기 때문에 null이 아니라고 인식하여 정상적인 validation check가 불가능하다.
    • ex)default values: int -> 0, Long -> 0L, boolean -> false ...

 

Controller에서 Validation 적용

@RequestBody, @RequestParam, @PathVariable 사용 시 적용

  • @RequestBody
    • validation 검증 에러가 발생하면 400응답코드를 반환한다.
    • exception은 MethodArgumentNotValidException 발생(BindException의 확장이므로 이걸로 잡아도 됨
@PostMapping("/post")
fun postRequestBody(@Valid @RequestBody validRequestDto: ValidRequestDto) {
...}
  •  @RequestParam & @PathVariable
    • DTO가 아니므로(데이터 하나이므로) controller에서 바로 @validation 작성해준다.
    • validation 검증에러는 500에러를 반환한다.
@RestController
@Validated
class ValidationController {
  @GetMapping("/get")
  fun getParam(
      @NotNull(message = "필수값입니다.") @RequestParam("value") value: String?
  ): String? {
    //...
  }
}

 


Entity, DTO, VO, DAO 각각의 역할과 차이

1. Entity
   - 데이터베이스 테이블과 매핑되는 객체. 즉, 데이터베이스에서 가져온 데이터를 표현하는 데 사용됩니다.
   - 주로 Persistence계층에서 사용되며, 데이터베이스와 상호 작용하는 주체입니다.
   - 스프링 부트에서는 JPA(Entity Manager를 사용하는) 또는 Exposed와 같은 ORM(Object-Relational Mapping) 라이브러리를 통해 엔티티를 정의하고 관리합니다.

2. DTO (데이터 전송 객체)
   - 서로 다른 레이어 간 데이터 전송에 사용됩니다. 주로 프레젠테이션 계층에서 비즈니스 로직 계층으로 데이터를 전달할 때 또는 원격 호출(RPC, REST API 등)에서 사용됩니다.
   - 데이터 전송 시에 필요한 속성만 포함하는 가벼운 객체입니다. 즉, 필요한 데이터만 담고 다른 로직이나 메소드를 가지지 않습니다.
   - 주로 불변(Immutable) 객체로 구현되며, 일반적으로 JSON 또는 XML과 같은 형식으로 직렬화되어 전송됩니다.

3. VO (값 객체)
   - 불변(Immutable)하며 비즈니스 도메인의 값(value)을 나타내는 객체입니다. 일반적으로 변경되지 않는 것들을 표현할 때 사용됩니다.
   - 주로 도메인 모델(Domain Model)에서 사용되며, 비즈니스 로직에서 사용됩니다.
   - 예를 들어, 금액, 주소, 날짜와 같이 변경되지 않는 값들은 VO로 표현할 수 있습니다.
   
4. DAO (데이터 액세스 객체) => Repository
   - 데이터베이스와의 상호 작용을 담당하는 객체입니다. 데이터베이스에서 데이터를 읽거나 쓰는 기능을 제공합니다.
   - 과거에 주로 사용되었으며, JDBC 또는 Hibernate와 같은 ORM 라이브러리와 함께 사용되었습니다.
   - 스프링 프레임워크에서는 DAO 패턴보다는 Repository 패턴을 선호하며, JPA, Spring Data JPA를 통해 리포지토리를 사용합니다.

스프링과 Exposed를 사용하는 프로젝트에서는 주로 엔티티와 DTO를 사용합니다. 엔티티는 데이터베이스 테이블과 매핑되는 객체로, 데이터베이스와의 상호 작용 및 영속성을 관리하는 데 사용됩니다. DTO는 서로 다른 레이어 간 데이터 전송을 위한 가벼운 객체로, 웹 또는 API 요청 및 응답과 같은 데이터 전송 시에 사용됩니다.

VO는 데이터의 값(value)을 표현하기 위한 객체로, 비즈니스 로직에서 사용되며 불변성을 가집니다. 하지만 스프링과 Exposed에서는 주로 엔티티나 DTO를 활용하므로 VO를 사용하지 않을 수 있습니다.

마지막으로, DAO는 과거에 많이 사용되었지만 스프링 프레임워크에서는 리포지토리 패턴을 권장하며, JPA나 Spring Data JPA를 통해 데이터 액세스를 처리합니다. 따라서 DAO 대신 리포지토리를 사용하는 것이 좋습니다.