이번에는 인증된 사용자를 표현하는 클래스를 만들 것이다.
package com.august.soil.api.security;
security
패키지 아래에 JwtAuthentication
이라는 이름으로 클래스를 생성한다.import com.august.soil.api.model.commons.Id;
import com.august.soil.api.model.user.Email;
import com.august.soil.api.model.user.User;
public class JwtAuthentication {
public final Id<User, Long> id; //*1
public final String name;
public final Email email; //*2
}
final
을 붙여주어 불변성을 가지게 한다.
Id<User, Long>
클래스는 커스터마이징 제네릭 클래스로 DB 테이블 내의 PK값을 표현하는 클래스이다. 그런데Long
타입으로만 선언해도 되는데 왜 제네릭 클래스로 만들었느냐?
코드 상에서<객체, 데이터타입>
으로 어떤 객체의 PK인지 보다 명확하게 알아볼 수 있는 장점이 있어 제네릭 클래스로 만들게 되었다.
https://github.com/miro7923/soil/blob/main/soil/src/main/java/com/august/soil/api/model/commons/Id.java
전문은 Github에서 볼 수 있다.- 사용자 이메일의 유효성 검증 등 비즈니스 로직의 관리를 위해 별도의 클래스로 선언 및 사용하고 있다.
String
타입으로 이메일을 선언하고insert
작업시에 이메일의 유효성을 검증하는 것 보다는 클래스 내 생성자 단계에서 유효성 검증 후 객체를 생성하는 것이 훨씬 응집도가 높다고 생각한다.
https://github.com/miro7923/soil/blob/main/soil/src/main/java/com/august/soil/api/model/user/Email.java
전문은 Github에서 볼 수 있다.
import com.august.soil.api.model.commons.Id;
import com.august.soil.api.model.user.Email;
import com.august.soil.api.model.user.User;
import static com.google.common.base.Preconditions.checkArgument;
public class JwtAuthentication {
...
public JwtAuthentication(Long id, String name, Email email) {
checkArgument(id != null, "id must be provided.");
checkArgument(name != null, "name must be provided.");
checkArgument(email != null, "email must be provided.");
this.id = Id.of(User.class, id);
this.name = name;
this.email = email;
}
}
checkArgument
를 통과하지 못하면 예외가 발생한다. import com.august.soil.api.model.commons.Id;
import com.august.soil.api.model.user.Email;
import com.august.soil.api.model.user.User;
import org.apache.commons.lang3.builder.ToStringStyle;
import static com.google.common.base.Preconditions.checkArgument;
import static org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString;
public class JwtAuthentication {
...
@Override
public String toString() {
return reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
그리고 toString()
오버라이딩으로 마무리한다.
다음 포스트에서 계속...