Jin's Dev Story

[스프링 부트 쇼핑몰 프로젝트 with JPA] 2-2. 회원가입 페이지 본문

Web & Android/스프링 부트 쇼핑몰 프로젝트 with JPA

[스프링 부트 쇼핑몰 프로젝트 with JPA] 2-2. 회원가입 페이지

woojin._. 2023. 10. 15. 10:08
이 내용은 스프링 부트 쇼핑몰 프로젝트 with JPA 책을 학습한 내용입니다.

1. MemberController

  • Get 요청으로 회원가입 페이지를 요청할 경우 MemberFormDto 객체를 같이 넘김
  • POST 요청으로 넘어온 회원가입 정보를 MemberFormDto 객체로 받음
package kr.spring.member.controller;

import jakarta.validation.Valid;
import kr.spring.member.dto.MemberFormDto;
import kr.spring.member.entity.Member;
import kr.spring.member.service.MemberService;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@Log4j2
@RequestMapping("/member")
public class MemberController {

    @Autowired
    MemberService memberService;

    @Autowired
    PasswordEncoder passwordEncoder;

    @GetMapping("/new")
    public String memberForm(Model model) {
        model.addAttribute("memberFormDto", new MemberFormDto());
        return "member/memberForm";
    }

    // restfull 방식. 이름이 똑같아도 어노테이션이 다르니까 ㄱㅊ다
    // 하지만 오버로딩이 안 되면 에러 뜹니다 오버로딩 해줘야 함!
    @PostMapping("/new")
    public String memberForm(@Valid MemberFormDto memberFormDto) {// @Valid 자동으로 체크해주는 어노테이션
                               
            Member member = Member.createMember(memberFormDto, passwordEncoder);
            memberService.saveMember(member);
        
        return "redirect:/";
    }
}

2. 회원 가입 페이지

<!DOCTYPE html>
<html lang="en"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{layouts/layout1}">

<!-- 사용자 CSS 추가 -->
<th:block layout:fragment="css">
      <style>
            .fieldError {
                  color: #bd2130;
            }
      </style>
</th:block>

<!-- 사용자 스크립트 추가 -->
<th:block layout:fragment="script">

      <script th:inline="javascript">
            $(document).ready(function(){
                  var errorMessage = [[${errorMessage}]];
                  if(errorMessage != null){
                        alert(errorMessage);
                  }
            });
      </script>

</th:block>

<div layout:fragment="content">
      <form action="/member/new" role="form" method="post"
            th:object="${memberFormDto}">
            <div class="form-group">
                  <label th:for="name">이름</label>
                  <input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력해주세요">
                  <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}" class="fieldError">Incorrect data</p>
            </div>
            <div class="form-group">
                  <label th:for="email">이메일주소</label>
                  <input type="email" th:field="*{email}" class="form-control" placeholder="이메일을 입력해주세요">
                  <p th:if="${#fields.hasErrors('email')}" th:errors="*{email}" class="fieldError">Incorrect data</p>
            </div>
            <div class="form-group">
                  <label th:for="password">비밀번호</label>
                  <input type="password" th:field="*{password}" class="form-control" placeholder="비밀번호 입력">
                  <p th:if="${#fields.hasErrors('password')}" th:errors="*{password}" class="fieldError">Incorrect data</p>
            </div>
            <div class="form-group">
                  <label th:for="address">주소</label>
                  <input type="text" th:field="*{address}" class="form-control" placeholder="주소를 입력해주세요">
                  <p th:if="${#fields.hasErrors('address')}" th:errors="*{address}" class="fieldError">Incorrect data</p>
            </div>
            <div style="text-align: center">
                  <!--  type이 submit인 경우 form에 적혀있는 주소로 값이 post로 값이 날라간다 -->
                  <button type="submit" class="btn btn-primary" style="">Submit</button>
            </div>

            <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
      </form>
</div>

</html>