⛓ 코틀린
과 JWT
를 활용한 로그인 로직 구현하기
Q. 강사님은 Entity를 만들 때 LocalDate에 @Temporal(TemporalType.DATE) 어노테이션을 붙여도 잘 실행되었다. 그러나 내가 실행했을 때는 오류가 발생했다. 버전의 문제일까?
@Table(
uniqueConstraints = [UniqueConstraint(name = "uk_member_login_id", columnNames = ["loginId"])]
)
A. "uk_member_login_id" 라는 이름으로 loginId 컬럼의 고유 제약 조건(중복된 값 비허용)을 정의한다. 나중에 조건을 참조하거나 변경할 때 정의된 이름을 사용할 수 있다.
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
@Constraint(validatedBy = [VaildEnumVaildator])
annotation class VaildEnum(
val message: String = "Invalid enum value",
val groups: Array<KClass<*>> = [],
val payload: Array<KClass<out Payload>> = [],
val enumClass: KClass<out Enum<*>>
)
A. @Target은 어노테이션이 적용할 수 있는 타겟을 지정하는 어노테이션이다. 많은 종류가 있으나 이 코드에 적용된 AnnotationTarget.FIELD는 필드에 대한 어노테이션이라는 뜻이다.
A. @Retention은 어노테이션의 유지기간을 정의한다. 이 코드에 적용된 AnnotationRetention.RUNTIME은 컴파일된 클래스파일에 포함되며 런타임에 사용할 수 있다고 정의한다. 리플렉션을 통해 실행 중 어노테이션 정보에 접근 할 수 있다.
A. KClass는 코틀린에서 클래스의 런타임 메타데이터에 접근하기 위해 사용되는 클래스이다. 클래스에 대한 정보를 동적으로 얻는데에서 활용된다. KClass<*>는 코틀린의 런타임 메타데이터를 나타내는 클래스이며 <>안의 *은 와일드 카드타입으로 모든 타입을 허용한다는 뜻이다. out키워드는 공변성을 나타내며, out 뒤에 오는 클래스의 하위 클래스를 허용한다는 뜻이다.
A. ConstraintValidator는 Bean Validation API에서 제공하는 인터페이스로 커스텀한 유효성 검사 로직을 작성할 수 있다. initialize 메서드는 초기화 로직을 실행하며, isValid 메서드는 유효성 검사 로직을 실행한다.
private val key by lazy { Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretKey)) }