1. 회원가입 관련 enums Package, utils Package생성 및 기능 구현
Util 클래스를 사용하는 이유에 대해서 알아보자.
- 현재 이 프로젝트 안에서 사용되는 Hashing관련 코드는 중복되어 사용되기 때문에 클래스안에 묶어서 사용하는 것이 효율적이다.
1. CrytoUtils 클래스안 hashSha512메서드를 생성 및 로직 구현
public static String hashSha512(String input) {
try {
StringBuilder passwordSaltHashBuilder = new StringBuilder();
MessageDigest md = MessageDigest.getInstance("SHA-512");
md.update(input.getBytes(StandardCharsets.UTF_8));
for (byte hashByte : md.digest()) {
passwordSaltHashBuilder.append(String.format("%02x", hashByte));
}
return passwordSaltHashBuilder.toString();
} catch (NoSuchAlgorithmException e) {
return null;
}
}
이때 우리가 생성한 hashsha512 클래스는 고유한 로직을 가지고 있어야 하기 때문에 임의로 로직을 변경 해서는 안된다. 이러한 Hash관련 객체 생성 막기는 어떻게 해야할까?
- Utils클래스에서 생성자의 접근제한자를 public → private 로 바꿔주면 다른 클래스에서 CryptoUtils 클래스에 관한 객체의 생성을 제한할 수있다.
- 아래의 자료 처럼 CryptoUtils 클래스 타입의 새로운 객체를 생성할 수 없게 된다.
2. Result 관련 클래스 생성하기
- 아래의 사진처럼 enums Package에 공통결과(CommonResult와) member관련 결과(member/result)를 나누어 클래스를 생성한다.
- RegisterResult Class → 회원가입에 관한 결과 관련 열거형
public enum RegisterResult implements IResult {
EMAIL_NOT_VERIFIED
}
- SendEmailAuthResult Class → 이메일 전송에 관한 결과 관련 열거형
public enum SendEmailAuthResult implements IResult {
EMAIL_DUPLICATE
}
- VerifyEmailAuthResult Class → 이메일 인증에 관한 결과 관련 열거형
public enum VerifyEmailAuthResult implements IResult {
EXPIRED
}
- CommonResult Class
public enum CommonResult implements IResult {
SUCCESS,
FAILURE
}
4개의 클래스는 모두 공통적인 특징이 있다. 바로 implements IResult 를 하고 있다는 점이다.
- extends
- 부모에서 선언 / 정의를 모두하며 자식은 메소드 / 변수를 그대로 사용할 수 있다.
- implements(interface 구현)
- 부모 객체는 선언만 하며 정의(내용)은 자식에서 오버라이딩(재정의)해서 사용해야함.
여기서 중요한 사실 한가지는 implements의 가장 큰 특징 2가지를 기억해야한다.
- implements는 부모의 메소드를 반드시 오버라이딩(재정의)해야 한다!
- implements는 다중상속(?)을 대신해준다.
- Ex) public enum CommonResult implements IResult, IResult2 {. . .}
상속은 부모가 가진 것들을 자유자재로 사용하기 위한다는 의미가 강하지만 어쩔 수 없다. Java에서는 interface를 이런식으로 지정해놨기 때문에 분류에 의미가 강하다는 정도로 이해하는 것이 마음의 안정에 도움이 된다.
그래서 왜 Why(?) IResult로 묶어주는 것이냐?
- 다른 클래스(Ex) Controller, Service)에서 Enum클래스를 사용하는데 있어서 또다른 열거형들의 접근을 막기 위해 사용 한다.
- 위 참고자료와 같이 Enum클래스가 <?>(제네릭 타입으로써 모든 것을 상속 받는다)을 사용했을 경우에는 RequestMethod.POST 처럼 자바에서 기본적으로 제공하는 열거형 타입도 사용할 수 있게 된다.
- 그러나 <? extends IResult> IResult를 상속받는 다고 설정을 해둘경우 모든 Enum타입중 IResult 값을 상속 받는 값만 사용할 수 있도록 설정해 둠으로써 다른 열거형의 접근을 막아준 것이다.
3. Result 클래스의 사용 관련 기능 구현
- 그래서 Result 열거형 클래스를 왜 만들었는지에 대해서는 설명이 되었고 이제 어떻게 사용하느냐가 문제이다.
- Result의 결과값을 Json객체에 담아 결과에 따른 input의 값들을 같이 보내기 위해 사용하였다.
- 성공, 실패, 이메일 중복, 이메일 인증이 완료되지 않음 등을 결과값으로 보내어 Js에서 xhr을 통해 결과값에 맞는 value값들을 실어서 클라이언트에게 혹은 DB에 전달하기 위해 사용한다.
'SpringBoot' 카테고리의 다른 글
SpringBoot 게시판 기능구현 1 (0) | 2022.11.20 |
---|---|
SpringBoot 회원가입 기능구현 4 , 비밀번호 재설정 기능구현 (0) | 2022.11.15 |
SpringBoot 로그인 기능 구현, session값을 통한 게시판 접근 (0) | 2022.11.15 |
SpringBoot 회원가입 기능구현 2 (1) | 2022.11.11 |
SpringBoot 회원가입 기능구현 1 (2) | 2022.11.11 |