티스토리 뷰
오늘은.. 이펙티브자바의 빌더 패턴을 적용 해 볼 것이다.
1. Jwt 토큰 발급 서버가 필요하다.
2. 그래서 만든다. 이번에 Security 적용하면서 Builder 패턴이 너무 많이나와서 한번 만들어본다.
3. PHP 서버에서도 사용가능한 토큰으로 만들어야한다.
4. Spring Security Jwt
Entity 클래스는 Lombok 의 @Builder 어노테이션을 쓰면 간단히 만들 수 있다.
생성자를 private로 선언해도 @Builder 어노테이션은 스프링 빈을 만들어 주더라.
JPA에서 리턴때 쓰는 Entity의 생성자를 private로 했을 때 이게 생성이 되는지는 모르겠다.
JPA 추가 후에 한번 트라이 해 볼 예정이다.
우선 io.jsonwebtoken 라이브러리로 생성하여 php 서버와 Spring 서버에서 둘다 사용 할 수 있는 토큰을 만들 목표로 한다.
public final class JwtTokenFactory {
private JwtTokenFactory(){}
public static JwtTokenBuilder tokenBuilder(JwtUser jwtUser){
return new JwtTokenBuilder(jwtUser);
}
}
우선 JwtTokenFactory 클래스를 만듭니다.
이후 생성자를 private 로 선언하여 외부에서 생성자를 호출할 수 없도록 막아줍니다.
이후 JwtTokenBuiler라는 이너클래스를 안에 선언 해 줍니다.
해당 패턴은 new 생성자를 사용해서 호출할 수 없고 반드시 빌더 클래스를 리턴받아서 동작할 수 있도록 행동을 강제한다.
이후 이너 클래스에서 사용할 널체크 및 벨리데이션 체크를 하여 특정 동작을 할 때 행동을 강제할 수 있고 메소드 명을 직관적으로 지정하여 무슨 동작을 할 지 다른 개발자가 유용하게 할 수 있다는 장점이 있다고 한다.
public final class JwtTokenFactory {
private JwtTokenFactory(){}
public static JwtTokenBuilder tokenBuilder(JwtUser jwtUser){
return new JwtTokenBuilder(jwtUser);
}
private static final class JwtTokenBuilder{
private String token;
JwtUser jwtUser;
private JwtTokenBuilder(){}
private JwtTokenBuilder(JwtUser jwtUser){
if(userDetails == null){
ExceptionFactory.nullpointException("UserDetails Is Null");
}
JwtUser.jwtUser = jwtUser;
}
private JwtTokenBuilder parse(){
if(CommonUtil.isEmail(jwtUser.getUsername())) {
//todo 유저 전용 토큰 발급
}else if(jwtUser.getUsername().equals("tarotmoon")){
//todo 관리자 전용 토큰 발급
}else{
//todo 마스터 전용 토큰 발급
}
createToken();
return this;
}
private void createToken(){
//make token
}
private String getToken(){
return this.token;
}
}
}
이너 클래스를 만들어서 여러가지를 선언해 주자.
String token = JwtTokenFactory.tokenBuilder(jwtUser).parse().getToken();
사용은 다음과 같이 하게 된다
이번 빌드패턴을 적용해 본 것은 Security 적용시에 죄다 빌더패턴으로 라이브러리가 만들어져 있었기 때문이다.
사실 장점을 잘 알고 쓰지 못하면 패턴이란것이 읽기 힘든 소스코드가 되버리지만 숙지가 잘 되어있으면 해당 클래스가 왜 여기에 선언되어있는지 잘 알 수 있는 패턴인 것 같다.
'Spring' 카테고리의 다른 글
Docker 적용하기 (Spring Boot) (0) | 2019.11.27 |
---|---|
Docker 적용하기 (Mariadb) (0) | 2019.11.26 |
Project Module (0) | 2019.11.21 |
Kafka 적용일기 1.. (0) | 2019.11.08 |
Spring Security 적용 (0) | 2019.10.29 |