Skip to content

Commit

Permalink
⚡ :: (#10) add User SPI interfaces
Browse files Browse the repository at this point in the history
  • Loading branch information
iqpizza6349 committed Jan 18, 2023
1 parent 38733c4 commit 208b534
Show file tree
Hide file tree
Showing 10 changed files with 267 additions and 0 deletions.
23 changes: 23 additions & 0 deletions User-Domain/src/main/java/com/dgsw/cns/user/spi/UserInfoSpi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.dgsw.cns.user.spi;

import com.dgsw.cns.user.vo.MemberInfoVO;

/**
* 지원생의 기본 정보를 조회하는 서비스 인터페이스
*/
public interface UserInfoSpi {

/**
* 지원생의 기본 정보를 조회합니다.
* <pre>
* - 이름
* - 생일
* - 성별
* - 전화번호
* </pre>
* @param id 지원생 식별키(PK)
* @return 조회한 기본 정보를 반환합니다.
*/
MemberInfoVO findUserInfo(final long id);

}
24 changes: 24 additions & 0 deletions User-Domain/src/main/java/com/dgsw/cns/user/spi/UserParentSpi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.dgsw.cns.user.spi;

import com.dgsw.cns.user.vo.MemberParentVO;

/**
* 지원생의 부모 정보를 조회 및 수정하는 서비스 인터페이스
*/
public interface UserParentSpi {

/**
* 지원생의 부모 정보를 수정 및 저장합니다.
* @param id 지원생 식별키(PK)
* @param memberParentVO 지원생의 부모 정보
*/
void modifyParentInfo(final long id, final MemberParentVO memberParentVO);

/**
* 지원생의 부모 정보를 조회합니다.
* @param id 지원생 식별키(PK)
* @return 조회한 부모 정보를 반환합니다.
*/
MemberParentVO findParentInfoById(final long id);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.dgsw.cns.user.spi;

import com.dgsw.cns.user.spi.certification.PasswordCertificationSpi;
import com.dgsw.cns.user.spi.certification.email.EmailCertificationSpi;

/**
* 유저 회원가입을 진행하는 서비스 인터페이스
* @see com.dgsw.cns.user.spi.certification.PasswordCertificationSpi
* @see com.dgsw.cns.user.spi.certification.email.EmailCertificationSpi
*/
public interface UserRegistrationSpi
extends PasswordCertificationSpi, EmailCertificationSpi {

/**
* 이메일, 비밀번호, 이메일 인증 코드를 인자로 사용하여 회원가입을 진행합니다.
* 이때, 이메일은 {@link EmailCertificationSpi#validationEmail(String)}를 통해
* 이메일 검증을 거챠야합니다.
* Database 에 저장할 때에는 보안을 위해
* {@link PasswordCertificationSpi#encryptPassword(String)}
* 를 통해 비밀번호를 반드시 암호화한 후, 저장을 해야합니다.
* 저장할 대상(이메일)로 전송한 랜덤한 6자리(인증 코드) 역시 인증을 한 후
* 최종적으로 회원가입이 완료됩니다.
* <pre>
* {@link EmailCertificationSpi#sendCertificationCode(String)}
* {@link EmailCertificationSpi#matches(String)}
* </pre>
*
*
* @param email
* @param password
* @param verificationCode
*/
void register(final String email, final String password, final String verificationCode);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.dgsw.cns.user.spi;

import com.dgsw.cns.user.vo.MemberVeteranVO;

/**
* 국가 보훈 코드를 저장하고 조회하는 서비스 인터페이스
*/
public interface UserVeteranSpi {

/**
* 국가 보훈 코드를 조회합니다.
* @param id 지원생 식별키(PK)
* @return 조회한 보훈 정보를 반환합니다.
*/
MemberVeteranVO getVeteranInfo(final long id);

/**
* 국가 보훈 코드 및 보훈청을 입력합니다.
* @param id 지원생 식별키(PK)
* @param department 국가 보훈청
* @param veteranId 국가 보훈 번호
*/
void updateVeteranInfo(final long id, final String department, final String veteranId);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.dgsw.cns.user.spi.certification;

/**
* 비밀번호 암화 및 유효성 검증 서비스 인터페이스
*/
public interface PasswordCertificationSpi {

/**
* 비밀번호의 유효성을 검증합니다.
* @param rawPassword 입력받은, 암호되지 않은 비밀번호
* @param encodedPassword 암호환된 비밀번호
* @return 비밀번호가 유효한지를 반환합니다.
*/
boolean checkValidation(final String rawPassword, final String encodedPassword);

/**
* 비밀번호를 암호화합니다.
* @param rawPassword 암호화되지 않은 비밀번호
* @return 암호환 비밀번호
*/
String encryptPassword(final String rawPassword);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.dgsw.cns.user.spi.certification;

import com.dgsw.cns.user.vo.certification.TokenVO;

/**
* 회원의 정보를 확인 후, 로그인을 진행하는 서비스 인터페이스
* @see com.dgsw.cns.user.api.certification.UserLoginApi
* @see PasswordCertificationSpi
*/
public interface UserLoginCertificationSpi extends PasswordCertificationSpi {

/**
* 로그인을 진행하기 위한 이메일과 비밀번호를 받아
* 회원의 유효성 확인 및 {@link #checkValidation(String, String)} 를 사용하여 비밀번호의
* 유효성을 확인한 후, JWT 토큰을 반환합니다.
* @param email 회원의 이메일
* @param rawPassword 회원의 암호화되지 않은 비밀번호
* @return 액세스, 리프레시 JWT 토큰을 반환합니다.
* @see TokenVO
*/
TokenVO login(final String email, final String rawPassword);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.dgsw.cns.user.spi.certification.email;

import java.util.regex.Pattern;

/**
* 이메일 인증 코드 발송 및 검증 서비스 인터페이스
*/
public interface EmailCertificationSpi {

Pattern EMAIL_REGEX = Pattern.compile("^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$");

default boolean validationEmail(final String email) {
return EMAIL_REGEX.matcher(email).matches();
}

/**
* 받은 이메일 인증코드(6자리)가 전송한 인증코드와 일치 하는 지를 확인
* @param code 클라이언트 측 이메일 인증코드
* @return 일치하다면 true, 아니라면 false
*/
boolean matches(final String code);

/**
* 이메일로 인증코드(6자리)를 전송합니다.
* @param email 코드를 전달할 이메일
*/
void sendCertificationCode(final String email);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.dgsw.cns.user.spi.certification.token;

/**
* JWT 토큰의 유효성을 검증합니다.
*/
public interface TokenCertificationSpi {

/**
* JWT 토큰의 서명을 검증합니다.
* @param jwtToken JWT 토큰
* @return 서명이 일치하다면, true. 아니라면, false 를 반환합니다.
*/
boolean certificateToken(final String jwtToken);

/**
* JWT 토큰을 파싱하여, subject 를 찾습니다.
* @param jwtToken JWT 토큰
* @return 찾은 subject 를 반환합니다.
*/
String extractToken(final String jwtToken);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.dgsw.cns.user.spi.certification.token;

import com.dgsw.cns.user.vo.certification.TokenVO;

/**
* 엑세스 토큰이 만료된 상태에서 리프레시 토큰을 사용하여,
* 토큰들을 재발급받도록 합니다.
*/
public interface TokenReissueSpi {

/**
* JWT 리프레쉬 토큰의 body 와 header 등을 파싱하여,
* 얻은 회원의 식별키(PK)의 데이터 유효성 확인,
* 존재하는 경우, 새로운 JWT 토큰들을 반환하도록 합니다.
* 이때, 이미 존재하던 리프레시 토큰의 유효 기간은 매우 길기에 사라지도록 유도합니다.
* @param refreshToken JWT 리프레시 토큰
* @return 새로운 엑세스 토큰 및 리프레시 토큰을 반환힙니다.
*/
TokenVO reissueToken(final String refreshToken);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.dgsw.cns.user.spi.certification.token;

import java.security.Key;
import java.util.Optional;

/**
* JWT 토큰을 생성하고, HTTP 헤더로부터 파싱하는 서비스 인터페이스
* @see TokenCertificationSpi
* @see TokenReissueSpi
*/
public interface TokenSpi extends TokenReissueSpi, TokenCertificationSpi {

/**
* JWT 토큰을 발급합니다.
* @param type JWT 종류(엑세스/리프레시)
* @param id JWT subject
* @param expireSecond JWT 만료 일자
* @return type 종류의 JWT 토큰을 생성하여, 반환합니다.
*/
String generateToken(final String type, final String id, final long expireSecond);

/**
* JWT 에 사용할 서명입니다.
* <pre>
* {@code signWith(key, algorithm)}
* </pre>
* @param type JWT 종류(엑세스/리프레시)
* @return type 종류의 JWT 토큰에 사용할 서명을 반환합니다.
*/
Key generateKey(final String type);

/**
* HTTP Header 의 특정 부분을 받아와 해당 부분에 JWT 토큰을 찾습니다.
* 만일 UncheckedException 이 발생한 경우, 그대로 예외를 전달하고 <br>
* CheckedException 이 발생한 경우, {@link Optional#ofNullable(Object)} 를
* 사용하여 반환한다.
* @param header HTTP Header 의 일부분
* @return 찾은 헤더값에 있는 JWT 토큰 반환
*/
Optional<String> getTokenFromHeader(String header);

}

0 comments on commit 208b534

Please sign in to comment.