@Profile 이란?
Profile 은 어떤 특정환 환경에 설정 값을 다르게 하고싶을 때 사용한다.
각 Profile 들은 각각 다른 설정 값이나 각각 Bean 들을 정의한다.
그 후, 빌드 할 때 원하는 Profile 에 맞춰 빌드할 수 있다.
예를 들어, 테스트 환경과 배포 환경을 다르게 두고 Profile 을 설정할 수 있다.
Spring을 통해 이메일 전송기능을 추가하기 위해 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-mail'
테스트용으로 가짜 객체를 만들어서 콘솔에 추가
지금은 일단 테스트용으로 가짜 객체를 만들어서 콘솔에도 추가하는 형식으로 구현 (나중에 진짜 객체로 바꿀 것)
ConsoleMailSender.class
package com.study.Jpawebapp;
import org.springframework.context.annotation.Profile;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Component;
import javax.mail.internet.MimeMessage;
import java.io.InputStream;
@Profile("local")
@Component
public class ConsoleMailSender implements JavaMailSender {
@Override
public MimeMessage createMimeMessage() {
return null;
}
@Override
public MimeMessage createMimeMessage(InputStream contentStream) throws MailException {
return null;
}
@Override
public void send(MimeMessage mimeMessage) throws MailException {
}
@Override
public void send(MimeMessage... mimeMessages) throws MailException {
}
@Override
public void send(MimeMessagePreparator mimeMessagePreparator) throws MailException {
}
@Override
public void send(MimeMessagePreparator... mimeMessagePreparators) throws MailException {
}
@Override
public void send(SimpleMailMessage simpleMessage) throws MailException {
log.info(simpleMessage.getText());
}
@Override
public void send(SimpleMailMessage... simpleMessages) throws MailException {
}
}
application.properties에 추가
spring.profiles.active=local
회원가입 폼 데이터를 DB에 넣어주고, 이메일 인증 토큰을 랜덤으로 생성 후 일단 테스트용으로 콘솔로 인증 토큰 전송하는 것을 확인
AccountController.class
package com.study.Jpawebapp.account;
import com.study.Jpawebapp.domain.Account;
import lombok.RequiredArgsConstructor;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import javax.validation.Valid;
@Controller
@RequiredArgsConstructor
public class AccountController {
private final SignUpFormValidator signUpFormValidator;
private final AccountRepository accountRepository;
private final JavaMailSender javaMailSender;
//...생략
Account account = Account.builder()
.email(signUpForm.getEmail())
.nickname(signUpForm.getNickname())
.password(signUpForm.getPassword()) // TODO : 인코딩 필요
.studyCreatedByWeb(true)
.studyEnrollmentResultByWeb(true)
.studyUpdatedByWeb(true)
.build();
Account newAccount = accountRepository.save(account);
//이메일 인증 토큰 생성
newAccount.generateEmailCheckToken();
//이메일 전송
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setTo(newAccount.getEmail());
mailMessage.setSubject("닷 스터디, 회원 가입 인증");
mailMessage.setText("/check-email-token?token="+ newAccount.getEmailCheckToken() +
"&email=" + newAccount.getEmail());
javaMailSender.send(mailMessage);
// TODO : 회원가입 처리
return "redirect:/";
}
}
Account.class
package com.study.Jpawebapp.domain;
import lombok.*;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.UUID;
@Entity
@Getter @Setter
@EqualsAndHashCode(of ="id")
@Builder @AllArgsConstructor @NoArgsConstructor
public class Account {
@Id
@GeneratedValue
private Long id;
..생략
//이메일 인증 토큰 랜덤 생성
public void generateEmailCheckToken() {
this.emailCheckToken = UUID.randomUUID().toString();
}
}
결과화면
가입하기 버튼 클릭하면 아래와 같이 이메일 주소와 인증 토큰을 주는 것을 볼 수 있다! (따로 log.info해놨음)
오류 발생
객체를 잘못 명시해서 오류가 발생했다.
java.lang.ClassCastException: class org.springframework.validation.BeanPropertyBindingResult cannot be cast to class com.study.Jpawebapp.account.SignUpForm (org.springframework.validation.BeanPropertyBindingResult is in unnamed module of loader 'app'; com.study.Jpawebapp.account.SignUpForm is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @4ff30c57)
SignUpFormValidator.class
아래 해당 부분 수정해서 해결
@Override
public void validate(Object object, Errors errors) {
// SignUpForm signUpForm = (SignUpForm) errors; 에러발생
SignUpForm signUpForm = (SignUpForm)object; // errors가 아닌 첫번째 파라미터(Object)를 SignUpForm으로 변환
if(accountRepository.existsByEmail(signUpForm.getEmail())){
errors.rejectValue("email", "invalid.email"
, new Object[]{signUpForm.getEmail()}, "이메일이 이미 존재합니다");
}
if (accountRepository.existsByNickname(signUpForm.getNickname())){
errors.rejectValue("nickname", "invalid.nickname"
, new Object[]{signUpForm.getNickname()}, "이미 사용중인 닉네임입니다.");
}
}
참고
'Dot Programming > Spring Clone' 카테고리의 다른 글
[스프링 웹앱 프로젝트 #8]회원 가입 패스워드 인코딩 (0) | 2020.11.19 |
---|---|
[스프링 웹앱 프로젝트 #7]회원가입 : 리팩토링 및 테스트 (0) | 2020.11.18 |
[스프링 웹앱 프로젝트 #5]회원 가입 폼 서브밋 검증 (0) | 2020.11.03 |
[스프링 웹앱 프로젝트 #4]회원 가입 뷰 (0) | 2020.11.03 |
[스프링 웹앱 프로젝트 #3]회원 가입 컨트롤러 (0) | 2020.11.02 |