스프링과 JPA 기반 웹 애플리케이션 개발 #11 회원 가입 폼 서브밋 처리

Jake Seo·2021년 5월 27일
0

스프링과 JPA 기반 웹 애플리케이션 개발 #11 회원 가입 폼 서브밋 처리

해당 내용은 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발의 강의 내용을 바탕으로 작성된 내용입니다.

강의를 학습하며 요약한 내용을 출처를 표기하고 블로깅 또는 문서로 공개하는 것을 허용합니다 라는 원칙 하에 요약 내용을 공개합니다. 출처는 위에 언급되어있듯, 인프런, 스프링과 JPA 기반 웹 애플리케이션 개발입니다.

제가 학습한 소스코드는 https://github.com/n00nietzsche/jakestudy_webapp 에 지속적으로 업로드 됩니다. 매 커밋 메세지에 강의의 어디 부분까지 진행됐는지 기록해놓겠습니다.


회원 가입: 폼 서브밋 처리

  • 회원 가입 처리
    • 회원 정보 저장
    • 인증 이메일 발송
    • 처리 후 첫 페이지로 리다이렉트 (PRG(Post-Redirect-Get) 패턴)

ConsoleMailSender 클래스 생성

// 일단은 콘솔에 출력하는 가상의 `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에서 제공하는 애노테이션으로 로그를 찍기 위함이다.

프로필을 local로 변경하기

application.properties 파일의 내용을 다음과 같이 변경하여 local 프로필로 해당 앱을 실행하도록 하였다.

# 로컬 환경에서 실행할 때
spring.profiles.active=local

AccountController 클래스 코드 수정하기

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 경로에 해당 emailUUID 토큰을 정상적으로 입력하면 인증이 완료되는 방식으로 추후에 구성할 것이다.
  • JavaMailSender.send() 메소드를 통하여 생성한 SimpleMailMessage 객체를 최종적으로 보내준다.
profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글