Programming/Java

[Spring] Gmail SMTP를 이용하여 이메일 인증 구현 - 이메일 발송 프로그램(2)

mar1po5a 2025. 3. 21. 17:41
DROP TABLE authCode CASCADE CONSTRAINTS;

CREATE TABLE authCode (
    authCodeNo NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, -- 자동 증가 기본 키
    email VARCHAR2(255) NOT NULL,
    authCode VARCHAR2(6) NOT NULL,
    expireTime DATE NOT NULL -- 만료 시간
);

DB에 authCode 테이블을 생성한다.

 

인증코드가 DB에 저장되어 있어야 입력받은 데이터와 실제 인증코드가 일치하는지 확인이 가능하다.

@Service
@Log4j
public class MemberService {

    @Autowired
    private SqlSessionTemplate sqlSession;
	
    @Autowired
    private EmailService emailService;

해당 서비스 클래스에는 회원과 관련된 다양한 기능들을 처리하는 메서드들이 포함되어있다.

  • SqlSessionTemplate : Mybatis에서 제공하며, SQL 쿼리문을 수행 (사용하기 위한 설정 필요)
public void insertAuthCode(String email, String authCode) {
    Map<String, Object> map = new HashMap<>();
    map.put("email", email);
    map.put("authCode", authCode);
    sqlSession.insert("memberMapper.insertAuthCode", map);
}

인증 코드를 DB에 저장하는 메서드이다.

  • Map<String, Object> : Key와 Value 한쌍으로 이루어진 자료형

MyBatis의 insert()는 기본적으로 하나의 객체만 파라미터로 전달받을 수 있다.

다만, Map 타입으로 지정하면 키-값 쌍으로 저장되기에 여러 개의 값들을 하나의 객체로 전달할 수 있다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="memberMapper">

SQL 쿼리문은 각 기능에 따라 알맞은 태그를 사용하여 Mapper.xml에 작성한다.

<insert id="insertAuthCode" parameterType="map">
	INSERT INTO AUTHCODE (EMAIL, AUTHCODE, EXPIRETIME)
	VALUES (#{email}, #{authCode}, SYSDATE + 5/(24*60))
</insert>

인증코드 저장을 위한 SQL 쿼리, 넘겨받는 데이터가 Map이므로 parameterType을 map으로 지정해준다.

  • EXPIRETIME : 인증코드가 만료되는 시간을 지정해주는 컬럼
  • SYSDATE : 현재 날짜와 시간을 반환
  • 24*60 : 하루에 있는 분의 수, 24시간*60분 = 1440분
  • 5/(24*60) : 5분을 일(day) 단위로 변환, 5/1440 = 0.00347... (day)
  • SYSDATE + 5/(24*60): 현재 시간에 0.00347일(즉, 5분)을 더한다.

authCodeNo 컬럼을 해당 쿼리에서 지정해주지 않는 이유는,

Oracle이 자체적으로 값을 생성하고 관리해주도록 지정해두었기 때문이다.

 

이제 EmailService로 돌아가자.

public void authCodeSendEmail(String email) {
    String authCode = authCode(6);
    String subject = "회원가입 이메일 인증 코드입니다.";
    String text = "인증 코드: " + authCode;

    log.info("인증 코드 확인용: " + authCode);
        
    sendEmail(email, subject, text);

    service.insertAuthCode(email, authCode);
}

EmailService로 돌아와서 인증 코드를 생성 + 이메일 발송 + DB에 저장하는 과정을 한번에 처리하는 메서드를 작성한다.

이렇게 하면 이메일을 '발송만' 하는 프로그램은 모두 제작되었다.