스프링과 JPA 기반 웹 애플리케이션 개발 #11 회원 가입 폼 서브밋 처리
해당 내용은 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발의 강의 내용을 바탕으로 작성된 내용입니다.
강의를 학습하며 요약한 내용을 출처를 표기하고 블로깅 또는 문서로 공개하는 것을 허용합니다 라는 원칙 하에 요약 내용을 공개합니다. 출처는 위에 언급되어있듯, 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발입니다.
제가 학습한 소스코드는 https://github.com/n00nietzsche/jakestudy_webapp 에 지속적으로 업로드 됩니다. 매 커밋 메세지에 강의의 어디 부분까지 진행됐는지 기록해놓겠습니다.
// 일단은 콘솔에 출력하는 가상의 `MailSender`를 이용한다.
// TODO: 나중에 진짜로 바꾸도록 함
@Profile("local") // 로컬 설정일 때만 이 빈을 등록함
@Component
@Slf4j
public class ConsoleMailSender implements JavaMailSender {
...
@Override
public void send(SimpleMailMessage simpleMailMessage) throws MailException {
log.info(simpleMailMessage.getText());
}
...
}
로컬 환경에서만 테스트로 작동시킬 ConsoleMailSender
클래스를 만들었다. JavaMailSender
인터페이스를 상속하여 로컬에서만 JavaMailSender
처럼 동작하여 로그로 동작만 확인한다.
@Profile("local")
은 로컬 프로필에서만 빈으로 등록된다는 것을 의미한다.@Component
는 해당 클래스를 빈으로 등록하기 위함이다.@Slf4j
는 Lombok에서 제공하는 애노테이션으로 로그를 찍기 위함이다.application.properties
파일의 내용을 다음과 같이 변경하여 local
프로필로 해당 앱을 실행하도록 하였다.
# 로컬 환경에서 실행할 때
spring.profiles.active=local
public class AccountController {
private final SignUpFormValidator signUpFormValidator;
private final AccountRepository accountRepository;
private final JavaMailSender javaMailSender;
...
회원 정보 저장을 위한 AccountRepository
빈과 회원 인증 메일을 보내기 위한 JavaMailSender
빈을 의존성 주입하기 위해 코드를 추가하였다.
Account account = Account.builder()
.email(signUpForm.getEmail())
.nickname(signUpForm.getNickname())
.password(signUpForm.getPassword()) // TODO: PASSWORD ENCODING 해야 함 (HASH로)
.studyEnrollmentResultByWeb(true)
.studyCreatedByWeb(true)
.studyUpdatedByWeb(true)
.build();
Account newAccount = accountRepository.save(account);
// 이메일 보내기, 이메일을 보내기 위한 의존성은 메이븐에
// spring-boot-starter-mail 을 이용한다.
// `MailSenderAutoConfiguration` 클래스에 메일과 관련된 기본 설정이 들어있다.
// 토큰 값은 UUID를 이용해서 랜덤하게 생성한다.
newAccount.generateEmailCheckToken();
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setTo(newAccount.getEmail());
simpleMailMessage.setSubject("제이크 스터디 회원가입 메일 인증");
simpleMailMessage.setText("/check-email-token?token=" + newAccount.getEmailCheckToken() + "&email=" + newAccount.getEmail());
javaMailSender.send(simpleMailMessage);
Builder
패턴으로 Account
객체를 생성하는 부분을 추가하였고, 해당 부분에서 패스워드 해싱은 일단 나중에 해주기로 하였다. 리포지토리의 .save()
메소드를 통해 저장해준다.Account
도메인에 .generateEmailCheckToken()
을 이용하여 인증을 위한 토큰을 생성하는 부분을 추가하였다.SimpleMailMessage
객체를 생성하고 .setTo()
, .setSubject()
, .setText()
세 메소드를 통하여 송신지, 이메일 제목, 이메일 내용 등을 설정해주었다.UUID
토큰이 들어있고, /check-email-token
경로에 해당 email
과 UUID
토큰을 정상적으로 입력하면 인증이 완료되는 방식으로 추후에 구성할 것이다.JavaMailSender
의 .send()
메소드를 통하여 생성한 SimpleMailMessage
객체를 최종적으로 보내준다.