티스토리 뷰

Spring

Java Builder Pattern

Shmoon 2019. 11. 5. 12:30

오늘은.. 이펙티브자바의 빌더 패턴을 적용 해 볼 것이다.

 

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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함