환경
Java, Spring Boot, Maven, Mybatis, Redis
Redis 설치하기
나의 경우 맥북이어서 아래 블로그의 도움을 받았다.
https://herojoon-dev.tistory.com/170
필요한 코드는 많지 않다.
brew install redis // redis 설치
brew services start redis // redis 실행
brew services stop redis // redis 종료
Redis 포트번호 확인
Redis 환경설정 (RedisConfig.java)
redisConnectionFactory()
redisConnectionFactory() 메서드에서는 Redis 서버 연결 정보만 설정한다. 실제 통신은 진행하지 않는다.
1. RedisStandalongConfiguration을 사용하여 Redis 서버 연결 정보를 설정하고,
2. LettuceConnectionFactory를 생성하여 Redis 서버와 연결한다.
3. connectionFactory.start() 를 호출하여 LettuceConnectionFactory를 초기화한다.
redisTemplate()
redisTemplate 은 RedisConnectionFactory 를 사용하여 Redis 서버와 실제 통신을 수행한다.
1. redisTemplate() 메서드에서 RedisTemplate<String, Object> 를 생성한다.
2. 먼저 생성한 redisConnectionFactory를 RedisTemplate 에 연결한다.
3. template.afterPropertiesSet() 을 호출하여 RedisTemplate 를 초기화한다.
package com.example.studyproject.email;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(); // redis 서버 연결 정보 설정
configuration.setHostName("localhost");
configuration.setPort(6379); // 포트번호 redis-cli로 확인 가능
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(configuration);
connectionFactory.start(); // LettuceConnectionFactory 초기화
return connectionFactory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.afterPropertiesSet(); // 초기화 호출
return template;
}
}
EmailController
mailSend()
1. 사용자가 입력한 이메일 주소로 인증번호를 전송한다.
2. 인증번호는 랜덤으로 생성된다 (emailService 에서 출력된 Number)
3. Redis 에 인증번호 10분간 저장
mailCheck()
1. 사용자가 입력한 인증번호와 Redis에 저장된 인증번호를 비교한다.
2. 인증번호가 일치하면 true, 일치하지 않으면 false 를 반환한다.
package com.example.studyproject.email;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
@RestController
@RequestMapping("/mail")
public class EmailVerificationController {
@Autowired
private EmailService emailService;
private int number;
RedisConfig rc = new RedisConfig();
/**
* 인증번호 이메일 전송
* @param mail
* @param request
* @return
*/
@PostMapping("/mailSend")
public HashMap<String, Object> mailSend(String mail, HttpServletRequest request){
HashMap<String, Object> map = new HashMap<>();
try {
number = emailService.sendMail(mail);
String num = String.valueOf(number);
// redis 저장
rc.redisTemplate(rc.redisConnectionFactory()).opsForValue().set("emailNumChk",num, 10, TimeUnit.MINUTES); // 10분 시간제한
map.put("success", Boolean.TRUE);
map.put("number", num);
} catch (Exception e){
map.put("success", Boolean.FALSE);
map.put("error", e.getMessage());
}
return map;
}
/**
* 인증번호 검사
* @param userNumber
* @return
*/
@GetMapping("/mailCheck")
public ResponseEntity<?> mailCheck(@RequestParam String userNumber){
String value = (String) rc.redisTemplate(rc.redisConnectionFactory()).opsForValue().get("emailNumChk");
boolean isMatch = userNumber.equals(value);
return ResponseEntity.ok(isMatch);
}
}
EmailService()
createNumber
임의의 random 번호를 생성하는 메서드이다.
createMail
메일 양식을 생성하는 메서드이다. 다른분 블로그에서 body 내용을 참고하였다.
sendMail
메일을 전송하는 메서드이다.
package com.example.studyproject.email;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
@Service
public class EmailService {
@Autowired
private JavaMailSender emailSender;
private static final String senderEmail = "studyprojectsup@gmail.com";
private static int number;
public static void createNumber(){
number = (int)(Math.random() * (90000)) + 100000; //(int) Math.random() * (최댓값-최소값+1) + 최소값
}
public MimeMessage CreateMail(String mail){
createNumber();
MimeMessage message = emailSender.createMimeMessage();
try {
message.setFrom(senderEmail);
message.setRecipients(MimeMessage.RecipientType.TO, mail);
message.setSubject("이메일 인증 요청 입니다.");
String body = "";
body += "<h3>" + "요청하신 인증 번호입니다." + "</h3>";
body += "<h1>" + number + "</h1>";
body += "<h3>" + "감사합니다." + "</h3>";
message.setText(body,"UTF-8", "html");
} catch (MessagingException e){
e.printStackTrace();
}
return message;
}
public int sendMail (String mail){
MimeMessage message = CreateMail(mail);
emailSender.send(message);
return number;
}
}
참고