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에 저장하는 과정을 한번에 처리하는 메서드를 작성한다.
이렇게 하면 이메일을 '발송만' 하는 프로그램은 모두 제작되었다.
'Programming > Java' 카테고리의 다른 글
[Spring] Gmail SMTP를 이용하여 이메일 인증 구현 - 인증코드 검증 (0) | 2025.03.24 |
---|---|
[Spring] Gmail SMTP를 이용하여 이메일 인증 구현 - 이메일 발송 프로그램(1) (0) | 2025.03.21 |
[Spring] Gmail SMTP를 이용하여 이메일 인증 구현 - 데이터의 흐름 (0) | 2025.03.21 |
[Spring] Gmail SMTP를 이용하여 이메일 인증 구현 - 설정 (0) | 2025.03.21 |
[Error : Mybatis/jdbc] ORA-12541:접속할 수 없습니다. host (host name) port 1521에 리스너가 없습니다. (0) | 2025.03.15 |