본문 바로가기

SpringBoot

SpringBoot 회원가입 기능구현 3

1. 회원가입 관련 enums Package, utils Package생성 및 기능 구현

Util 클래스를 사용하는 이유에 대해서 알아보자.
  • 현재 이 프로젝트 안에서 사용되는 Hashing관련 코드는 중복되어 사용되기 때문에 클래스안에 묶어서 사용하는 것이 효율적이다. 

utils 패키지 및 클래스 생성

   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관련 객체 생성 막기는 어떻게 해야할까?

Class간 객체생성 제한 자료

  • Utils클래스에서 생성자의 접근제한자를 public → private 로 바꿔주면 다른 클래스에서 CryptoUtils 클래스에 관한 객체의 생성을 제한할 수있다. 
  • 아래의 자료 처럼 CryptoUtils 클래스 타입의 새로운 객체를 생성할 수 없게 된다.

CryptoUtils 관련 객체 생성 막기

   2. Result 관련 클래스 생성하기

  • 아래의 사진처럼 enums Package에 공통결과(CommonResult와) member관련 결과(member/result)를 나누어 클래스를 생성한다.

enums 패키지 안 Class 경로

  • 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가지를 기억해야한다.

  1. implements는 부모의 메소드를 반드시 오버라이딩(재정의)해야 한다!
  2. implements는 다중상속(?)을 대신해준다.
    • Ex) public enum CommonResult implements IResult, IResult2 {. . .}

상속은 부모가 가진 것들을 자유자재로 사용하기 위한다는 의미가 강하지만 어쩔 수 없다. Java에서는 interface를 이런식으로 지정해놨기 때문에 분류에 의미가 강하다는 정도로 이해하는 것이 마음의 안정에 도움이 된다.

 

그래서 왜 Why(?) IResult로 묶어주는 것이냐?

  • 다른 클래스(Ex) Controller, Service)에서 Enum클래스를 사용하는데 있어서 또다른 열거형들의 접근을 막기 위해 사용 한다.

Enum 클래스의 상속에 따른 결과 차이

  • 위 참고자료와 같이 Enum클래스가 <?>(제네릭 타입으로써 모든 것을 상속 받는다)을 사용했을 경우에는 RequestMethod.POST 처럼 자바에서 기본적으로 제공하는 열거형 타입도 사용할 수 있게 된다.
  • 그러나  <? extends IResult> IResult를 상속받는 다고 설정을 해둘경우 모든 Enum타입중 IResult 값을 상속 받는 값만 사용할 수 있도록 설정해 둠으로써 다른 열거형의 접근을 막아준 것이다.

   3. Result 클래스의 사용 관련 기능 구현

  • 그래서 Result 열거형 클래스를 왜 만들었는지에 대해서는 설명이 되었고 이제 어떻게 사용하느냐가 문제이다.
  • Result의 결과값을 Json객체에 담아 결과에 따른 input의 값들을 같이 보내기 위해 사용하였다.
  • 성공, 실패, 이메일 중복, 이메일 인증이 완료되지 않음 등을 결과값으로 보내어 Js에서 xhr을 통해 결과값에 맞는 value값들을 실어서 클라이언트에게 혹은 DB에 전달하기 위해 사용한다.