Backend/Java
Java에서 Generator 규칙에 따라 거래코드 만들기 (SecureRandom 난수 생성)
컴슈터
2023. 11. 24. 22:38
거래코드 생성 규칙이 아래와 같다고 가정하자.
=> 거래날짜yyyyMMdd(8)+난수(10)
Generator 파일을 만들어서 타 서비스에서 거래코드를 쉽게 가져다 쓸 수 있도록 소스를 만들어보았다. 이때 난수는 SecureRandom 클래스를 이용해서 알파벳, 숫자내에서 랜덤으로 10자리 생성된다.
Generator.java
import java.security.SecureRandom;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Generator {
private final static String CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
/**
* 거래코드 생성 규칙 : 거래날짜(8)+난수(10)
*
* @return 거래코드
*/
public String getTrxCode() {
String rule1 = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
String rule2 = _secureRandom(10);
return rule1 + rule2;
}
/**
* 난수 생성
*
* @param genNum 생성할 자릿수
* @return 난수
*/
private String _secureRandom(int genNum) {
SecureRandom random = new SecureRandom();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < genNum; i++) {
int index = random.nextInt(CHARS.length()); // 무작위로 문자열의 인덱스 반환
sb.append(CHARS.charAt(index)); // index의 위치한 랜덤값
}
return sb.toString();
}
}
TrxCodeGenerator.java
public interface TrxCodeGenerator {
String generate();
}
TrxCodeGeneratorImpl.java
public class TrxCodeGeneratorImpl implements TrxCodeGenerator {
private final Generator generator = new Generator();
@Override
public String generate() {
return generator.getTrxCode();
}
}
BeanConfig.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanConfig {
@Bean
TrxCodeGenerator trxCodeGenerator() {
return new TrxCodeGeneratorImpl();
}
}
서비스단에서 사용시
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.company.helloBoard.common.config.TrxCodeGenerator;
import lombok.extern.slf4j.Slf4j;
@Service
@Slf4j
public class TestServiceImpl implements TestService {
@Autowired
TrxCodeGenerator trxCodeGenerator;
@Override
public String getTrxCode() {
String trxCode = trxCodeGenerator.generate();
log.info("거래코드 : {}", trxCode); // 거래코드 : 20231123sMsKzr0R6c
}
}