본문 바로가기

Dot Programming/Spring Clone

[스프링 웹앱 프로젝트 #6]회원가입 폼 서브밋 처리

@Profile 이란?   

(check) (check2)

 

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()}, "이미 사용중인 닉네임입니다.");
        }
    }

 


참고

인프런 강의 - 스프링과 JPA 기반 웹 애플리케이션 개발