JSR-330의 @Size 어노테이션, Hibernate의 @Length 어노테이션, 그리고 JPA @Column어노테이션의 length 속성에 대해 알아보자.
JSR(Java Specification Request) : 자바 기술 표준 규격
JSR-330 : 이 JSR은 자바 의존성 주입(Dependency Injection)을 위한 표준화된 방법을 정의하고 프레임워크 간의 호환성과 개발자들의 일관된 코드 작성을 촉진하기 위해 개발되었습니다.
주로 javax.inject 패키지를 통해 정의된 어노테이션들로 구성되어 있습니다.
- @Inject: 의존성 주입을 요청하는 필드, 생성자, 메서드에 사용되며, 해당 자원이 자동으로 주입되도록 지정합니다.
- @Qualifier: 동일한 타입의 여러 의존성을 구분하기 위해 사용됩니다.
- @Named: 특정 이름의 의존성을 주입하는 데 사용됩니다.
- @Singleton: 싱글톤 스코프의 빈을 정의할 때 사용됩니다.
필드의 크기를 검증할 때 @Size, @Length 어노테이션을 사용할 수 있다. 전자는 JPA 표준 어노테이션이고 후자는 Hibernate에 한정된 것이다. JPA 어노테이션인 @Column은 DDL 명령문을 조정하기 위해 사용한다.
public class User {
// ...
@Size(min = 3, max = 15)
private String middleName;
// ...
}
검증을 위해 빈(bean) validation 어노테이션인 @Size를 사용한다. middleName 프로퍼티에 @Size를 annotate 하여 min, max 속성들의 값을 검증한다.
@Size는 JPA와 그 벤더(예를 들어 Hibernate)에 독립적인 bean을 만든다. 결과적으로 @Length보다 이식성이 좋다.
예시) lastName 필드를 @Length를 사용하여 범위 조정
@Entity
public class User {
// ...
@Length(min = 3, max = 15)
private String lastName;
// ...
}
@Entity
public class User {
@Column(length = 3)
private String firstName;
// ...
}
데이터 베이스 열의 물리적 특성을 지정하기 위해 @Column을 사용한다. @Column의 length 속성을 이용해 열의 string 값 길이를 제한할 수 있다.
위 코드는 VARCHAR(3)으로 컬럼을 생성하고, 이보다 긴 스트링 값을 삽입하려 하면 SQL 에러를 발생시킬 것이다.
@Column은 테이블 열 속성을 지정할 때 사용할 뿐, 검증 기능을 제공하지는 않는다. 데이터베이스 열에 bean validation을 지정하고 싶다면 @Size를 같이 사용할 수 있다.
@Entity
public class User {
// ...
@Column(length = 5)
@Size(min = 3, max = 5)
private String city;
// ...
}