com.google.common.cache.CacheLoaderGoogle Guava 라이브러리의 일부입니다. Gradle에서 이 라이브러리를 사용하려면 build.gradle 파일에 Guava 의존성을 추가해야 합니다.


Gradle 의존성 추가

build.gradle에 아래와 같이 Guava 의존성을 추가하세요:

dependencies {
    implementation 'com.google.guava:guava:32.0.1-jre'
}

위 버전은 Guava의 최신 안정 버전 중 하나입니다. 필요에 따라 더 최신 버전이 있을 경우 업데이트할 수 있습니다.

의존성을 추가한 후 ./gradlew build 명령을 실행하여 라이브러리를 프로젝트에 적용하세요.


Maven 의존성 추가

Guava 라이브러리를 Maven 프로젝트에 추가하려면 pom.xml 파일에 다음과 같이 Guava 의존성을 추가해야 합니다.

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>32.0.1-jre</version>
</dependency>

소스코드


package smartView.system.security.service;  

import java.util.Random;  
import java.util.concurrent.TimeUnit;  

import org.springframework.stereotype.Service;  

import com.google.common.cache.LoadingCache;  
import com.google.common.cache.CacheBuilder;  
import com.google.common.cache.CacheLoader;  

@Service("otpService")  
public class OtpService {  
    private static final Integer EXPIRE_MINS = 3;  

     private LoadingCache<String, Integer> otpCache;  

     public OtpService(){  
     super();  
     otpCache = CacheBuilder.newBuilder().  
         expireAfterWrite(EXPIRE_MINS, TimeUnit.MINUTES).build(new CacheLoader<String, Integer>() {  
           public Integer load(String key) {  
                 return 0;  
           }  
         });  
     }  

    public int generateOTP(String key){  
       Random random = new Random();  
       int otp = 100000 + random.nextInt(900000);  
       otpCache.put(key, otp);  
       return otp;  
    }  

    public int getOtp(String key){   
       try{  
          return otpCache.get(key);   
       }catch (Exception e){  
          return 0;   
       }  
    }  

    public void clearOTP(String key){   
       otpCache.invalidate(key);  
    }  
}

OtpService 클래스는 OTP(One Time Password, 일회용 비밀번호)를 생성하고 관리하는 서비스로, 주로 인증번호 발급 및 검증 과정에서 사용됩니다. OTP는 일회성 비밀번호로 설정된 만료 시간 이후에 자동으로 삭제됩니다. 여기서는 Google Guava의 캐싱 기능을 이용해 OTP를 캐시에 저장하고, 만료 시간을 설정하여 시간 내에 사용되지 않으면 자동 삭제되도록 구현하였습니다.


  1. 클래스 및 의존성
  • @Service("otpService"): Spring의 서비스 컴포넌트로, 이 클래스는 Spring 컨텍스트에 등록되어 OTP 관련 기능을 제공합니다.
  • Guava Cache: LoadingCache를 이용해 OTP를 저장하며, 특정 시간이 지나면 캐시에서 자동으로 삭제됩니다.

  1. 필드 및 상수
    • EXPIRE_MINS: OTP의 만료 시간을 나타내며, 여기서는 3분으로 설정되어 있습니다.
    • otpCache: 캐시에 OTP를 저장하며, 키는 사용자 ID나 이메일 등, 고유한 문자열이고 값은 생성된 OTP입니다.

  1. 생성자
    • OtpService(): 생성자에서 CacheBuilder를 통해 OTP 캐시를 초기화합니다. expireAfterWrite(EXPIRE_MINS, TimeUnit.MINUTES)는 OTP가 생성된 후 3분이 지나면 만료되도록 설정합니다. load()는 캐시가 비어있을 때 호출되며, 기본적으로 0을 반환합니다.

  1. 주요 메서드

    • generateOTP(String key):

      • 주어진 key에 대해 6자리의 랜덤한 OTP를 생성합니다.
      • 100000 + random.nextInt(900000)은 6자리 숫자를 생성하는 코드입니다.
      • 생성된 OTP는 캐시에 저장됩니다.
    • getOtp(String key):

      • 주어진 key로 저장된 OTP를 반환합니다. 캐시에 존재하지 않으면 0을 반환합니다.
    • clearOTP(String key):

      • 주어진 key에 대해 캐시에 저장된 OTP를 무효화(삭제)합니다. OTP를 사용한 후 호출하여 캐시를 지울 수 있습니다.

OTP 서비스 사용 시나리오


  1. 사용자가 로그인 또는 인증을 시도하면, generateOTP()를 호출하여 OTP를 생성하고 사용자의 이메일이나 전화번호로 전송합니다.
  2. 사용자가 받은 OTP를 입력하면, 서버에서 getOtp()로 캐시된 OTP를 가져와 사용자 입력과 비교하여 일치하는지 확인합니다.
  3. OTP가 사용되었거나 만료되면 clearOTP()로 캐시에서 해당 OTP를 제거합니다.

코드 사용 예시


OtpService otpService = new OtpService();

// 1. OTP 생성
int otp = otpService.generateOTP("user123");
System.out.println("Generated OTP: " + otp); // 예시 출력: Generated OTP: 654321

// 2. OTP 검증
int storedOtp = otpService.getOtp("user123");
if (storedOtp == otp) {
    System.out.println("OTP 인증 성공");
} else {
    System.out.println("OTP 인증 실패");
}

// 3. OTP 삭제
otpService.clearOTP("user123");