고코딩

@Size, @Length, @Column 차이점 본문

Spring 공부

@Size, @Length, @Column 차이점

고코딩 2021. 11. 29. 10:52

@Size, @Length, @Column 차이점

팀 프로젝트를 하면서 내가 JPA쪽 부분을 담당하게 되었다. Entity를 작성하던중 필드의 속성을 지정해줘야 했는데 필드의 사이즈를 무엇으로 주어야하나 고민을 했다. 구글링을 해보니 @Size, @Length, @Column 3개중 하나로 필드의 사이즈를 지정해주었느데 도대체 무슨 차이인지 궁금했다.

이곳저곳을 찾아보던중 잘 설명해 놓은곳이 있어서, 이 사이트의 설명을 번역해서 올린다.

https://www.baeldung.com/jpa-size-length-column-differences


1. Overview

JSR-330의 @Size, Hibernate의 @Length , 그리고 JPA의 @Column에 대해서 살펴보겠습니다.

언뜻 보기엔 비슷해 보이지만 서로 다른 기능을 하고있습니다. 알아봅시다.

2. Origins

간단히 말해서 이 annotation은 필드의 크기를 전달하기 위한 것입니다.

@Size@Length는 비슷합니다. 둘다 필드의 크기에 검증하기위해 사용합니다. @SizeJava-standard annotation이고 @Lengthspecific to Hibernate입니다.

하지만 @Column은 DDL을 컨트롤 하기위해 사용되는 JPA annotation입니다.

3. @Size

검증을 위해서, @Size 검증 어노테이션을 사용합니다. @Size가 붙은 middleName속성을 사용하여 min, max 특성 사이의 값을 확인합니다.

public class User {

    // ...

    @Size(min = 3, max = 15)
    private String middleName;

    // ...

}

가장 중요한 점은, @Size가 JPA와 Hinernate로부터 독립적인 bean을 만들어줍니다. 결과적으로 @Size는 @Length보다 더 가볍습니다.

4. @Length

그리고 말했듯이, @Length는 Hiberbate의 @Size어노테이션입니다. LastName 속성에 @Length를 사용해서 범위를 지정해 봅시다.

@Entity
public class User {

    // ...

    @Length(min = 3, max = 15)
    private String lastName;

    // ...

}

5. @Column(length=value)

하지만 @Column 은 많이 다릅니다.

@Column은 실제 데이터베이스 열의 특정 특성을 나타내기 위해 사용됩니다. @Column의 length속성을 사용해서 열의 문자열의 길이를 특정해봅시다.

@Entity
public class User {

    @Column(length = 3)
    private String firstName;

    // ...

}

열은 VARCHAR(3) 타입으로 생성되고 3보다 긴 문자열을 넣으려고 하면 SQL error가 나타납니다.

@Column은 유효성 검사를 제공하지 않으므로 테이블 열 속성 지정에만 사용됩니다.

물론, @Column 과 @Size를 같이 사용해 bean 검증을 통해 테이터베이스 열 특성을 지정할 수 있습니다.

@Entity
public class User {

    // ... 

    @Column(length = 5)
    @Size(min = 3, max = 5)
    private String city;

    // ...

}

6. Conclusion

이 글에서 우리는 @Size과 @Length 그리고 @Column length 속성의 차이점에 대해서 배웠습니다.


역시 영어 문서는 영어 문서 그대로 읽는게 제일 좋은것 같다. 번역하려니 영 의미 전달이 힘들다.