회원 등록

2023. 5. 18. 07:31카테고리 없음

  • 폼객체를 사용해서 화면계층과서비스계층을 명확하게분리한다.

회원 등록 폼 객체

package jpabook.jpashop.web;

import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class MemberForm {
    @NotEmpty(message = "회원 이름은 필수 입니다") //값이 비어있으면 오류가 나는 어노테이션 추가.
    private String name;

    private String city;
    private String street;
    private String zipcode;
}

 

회원 등록 컨트롤러

package jpabook.jpashop.domain.controller;

import jakarta.validation.Valid;
import jpabook.jpashop.domain.Address;
import jpabook.jpashop.domain.Member;
import jpabook.jpashop.service.MemberService;
import jpabook.jpashop.web.MemberForm;
import lombok.RequiredArgsConstructor;
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 java.util.List;

@Controller
@RequiredArgsConstructor
public class MemberController {
    private final MemberService memberService;
    @GetMapping(value = "/members/new")
    public String createForm(Model model) {
        model.addAttribute("memberForm", new MemberForm());
        //뷰 리졸버로 데이터를 넘길때 멤버 폼이라는 빈 껍데기를 가져감,validation같은것을 해줄 수 있어서
        //여기서 질문 validation 기능이란 무엇일까요
       
        return "members/createMemberForm";
    }
    @PostMapping(value = "/members/new")
    public String create(@Valid MemberForm form, BindingResult result) {
        //@Valid라는 어노테이션 사용해서 MemberForm 파라미터를 다 validation 기능을 사용하게끔 만들어줄수있음.
        // @Valid가 되있는 파라미터에서 오류가 나도 BindingResult가 그걸 담아서 밑에 코드를 실행시켜줌.
        if (result.hasErrors()) { // 만약 오류가 생기면, 밑에 화면으로 이동
            return "members/createMemberForm";
        }
        Address address = new Address(form.getCity(), form.getStreet(),
                form.getZipcode()); //생성자, 값 가져올것들.
        Member member = new Member();
        member.setName(form.getName());
        member.setAddres(address);

        memberService.join(member);
        return "redirect:/"; // 재로딩 되는건 별로 좋지 않으니 처음 페이지로 돌아가게 redirect를 사용.
    }

밑에 사진처럼.

필수내용을 적지않고 뛰어넘었을때

회원 등록 폼 화면

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header" />
<style>
  .fieldError {
    border-color: #bd2130;
  }
</style>
<body>
<div class="container">
  <div th:replace="fragments/bodyHeader :: bodyHeader"/>
  <form role="form" action="/members/new" th:object="${memberForm}"
        method="post">
    <div class="form-group">
      <label th:for="name">이름</label>
      <input type="text" th:field="*{name}" class="form-control"
             placeholder="이름을 입력하세요"
             th:class="${#fields.hasErrors('name')}? 'form-control
fieldError' : 'form-control'">
      <p th:if="${#fields.hasErrors('name')}"
         th:errors="*{name}">Incorrect date</p>
    </div>
    <div class="form-group">
      <label th:for="city">도시</label>
      <input type="text" th:field="*{city}" class="form-control"placeholder="도시를 입력하세요">
    </div>
    <div class="form-group">
      <label th:for="street">거리</label>
      <input type="text" th:field="*{street}" class="form-control"
             placeholder="거리를 입력하세요">
    </div>
    <div class="form-group">
      <label th:for="zipcode">우편번호</label>
      <input type="text" th:field="*{zipcode}" class="form-control"
             placeholder="우편번호를 입력하세요">
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
  </form>
  <br/>
  <div th:replace="fragments/footer :: footer" />
</div> <!-- /container -->
</body>
</html>

 

출처 : 인프런 강의: 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard