[ClassFlix] EP 7. view 페이지 제작과 컨트롤러 연결 - 3
Project/ClassFlix

[ClassFlix] EP 7. view 페이지 제작과 컨트롤러 연결 - 3

목차 (클릭시 해당 목차로 이동)


     

     

     

    MemberForm에서 입력한 데이터 POST로 받아 멤버등록하기


     

    memberForm.html 제작

     

    • 멤버폼에서는 이름, 나이 성별, 직업을 받아야한다.
    • 이름으로 중복회원을 검사한다
    <!DOCTYPE HTML>
    <html xmlns:th="http://www.thymeleaf.org">
    <head th:replace="fragments/header :: header" />
    <style>
        .fieldError {
            border-color: #bd2130;
        }
    </style>
    <body>
    <div th:replace="fragments/bodyHeader :: bodyHeader"/>
    <div class="container">
        <div class="page-header">
            <h1 class="text-center">회원가입</h1>
        </div>
        <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="age">나이</label>
                <input type="text" th:field="*{age}" class="form-control"placeholder="나이를 입력하세요">
            </div>
            <div class="form-group">
                <label th:for="gender">성별</label>
                <br>
                <input type="radio" th:field="*{gender}" name="gender" value="MALE" checked> 남
                <input type="radio" th:field="*{gender}" name="gender" value="FEMALE"> 여
                <br>
            <div class="form-group">
                <label th:for="career">직업</label>
                <input type="text" th:field="*{career}" class="form-control" placeholder="직업을 입력하세요">
            </div>
            <div class="text-center">
                <button type="submit" class="btn btn-primary">등록하기</button>
            </div>
    
        </form>
        <br/>
    </div> <!-- /container -->
    <div th:replace="fragments/footer :: footer" />
    </body>
    </html>

    성별은 enum으로 정해진 MALE, FEMALE만 받아야하기 때문에 라디오 체크박스로 구현했다.

     

     

    MemberController @PostMapping("/members/new") 제작

        @PostMapping("/members/new")
        public String create(@Valid MemberForm form, BindingResult result) {
            if (result.hasErrors()) {
                return "members/memberForm";
            }
            Member member = new Member(form.getName(), form.getAge(), form.getGender(), form.getCareer());
            memberService.join(member);
            return "redirect:/";
        }

     

    POST 매핑으로 url을 받고 멤버 이름을 필수로 받기 위해 

    @Valid와 BindingResult를 이용해서 유효성검사를 진행한다.

     

    폼에서 멤버이름을 누락할 경우 html에서는 BindingResult에 error를 담아오고 컨트롤러에서 이를 검사해서 에러창을 띄울 수 있게 한다.

    에러창을 띄울때는 @Valid가 붙어있어 MemberForm에서 특정조건을 찾아보고

    @NotEmpty(message = "회원 이름은 필수 입니다")
    private String name;

    를 발견해 해당 메세지를 띄운다.

     

     

     

     

     

    구현확인

     

    url매핑(members/new) 확인

    회원이름 누락시 에러메세지

    등록완료 후 정상적인 redirect

    정상적인 쿼리문과 DB정보

     

     

     

     

     

     

     

     

     

     

    LectureForm에서 입력한 데이터 POST로 받아 강의등록하기


     

    lectureForm.html 제작

    • 강의제목, 강의자이름, 강의내용소개, 강의대표사진업로드, 강의사이트 주소를 입력할 수 있게한다.
    • 강의제목, 강의자이름은 필수로 입력할 수 있도록 한다.
    • 강의사진업로드시 이미지파일로 제한한다.
    <!DOCTYPE HTML>
    <html xmlns:th="http://www.thymeleaf.org">
    <head th:replace="fragments/header :: header" />
    <style>
        .fieldError {
            border-color: #bd2130;
        }
    </style>
    <body>
    <div th:replace="fragments/bodyHeader :: bodyHeader"/>
    <div class="container">
        <div class="page-header">
            <h1 class="text-center">강의등록</h1>
        </div>
        <form role="form" action="/lectures/new" th:object="${lectureForm}"
              method="post">
            <div class="form-group">
                <label th:for="lectureName">강의제목</label>
                <input type="text" th:field="*{lectureName}" class="form-control" placeholder="강의제목을 입력하세요"
                       th:class="${#fields.hasErrors('lectureName')}? 'form-control fieldError' : 'form-control'">
                <p th:if="${#fields.hasErrors('lectureName')}" th:errors="*{lectureName}">Incorrect date</p>
            </div>
            <div class="form-group">
                <label th:for="teacherName">강의자 이름</label>
                <input type="text" th:field="*{teacherName}" class="form-control" placeholder="강의자를 입력하세요"
                       th:class="${#fields.hasErrors('teacherName')}? 'form-control fieldError' : 'form-control'">
                <p th:if="${#fields.hasErrors('teacherName')}" th:errors="*{teacherName}">Incorrect date</p>
            </div>
            <div class="form-group">
                <label th:for="content">강의 내용 소개</label>
                <textarea th:field="*{content}" class="form-control" placeholder="강의내용을 입력하세요"> </textarea>
            </div>
            <div class="form-group">
                <label th:for="representImage">강의 대표사진 업로드</label>
                <input type="file" th:field="*{representImage}" accept="image/*" class="form-control" placeholder="강의 대표사진을 업로드해주세요">
            </div>
            <div class="form-group">
                <label th:for="siteName">강의 사이트 주소</label>
                <input type="url" th:field="*{siteName}" class="form-control" placeholder="강의 사이트의 주소를 입력해주세요">
            </div>
            <div class="text-center">
                <button type="submit" class="btn btn-primary">등록하기</button>
            </div>
    
        </form>
        <br/>
    </div> <!-- /container -->
    <div th:replace="fragments/footer :: footer" />
    </body>
    </html>

     

     

     

     

    LectureController @PostMapping("/lectures/new")

     

        @PostMapping("/lectures/new")
        public String create(@Valid LectureForm form, BindingResult result) {
            if (result.hasErrors()) {
                return "lectures/lectureForm";
            }
            Lecture lecture = new Lecture(form.getLectureName(), form.getTeacherName(), form.getContent(), form.getRepresentImage(), form.getSiteName(), form.getUri());
            lectureService.join(lecture);
            return "redirect:/";
        }

     

    강의제목과 강의자이름을 누락할시 에러메세지를 띄울 수 있도록 Controller에서 검사한다.

     

     

     

     

     

    구현확인

     

    url매핑(lecures/new)

    강의제목, 강의자이름 누락시 에러메세지

     

    파일업로드시 이미지만

     

    정상적인 home redirect 후 강의목록추가 (리뷰가 없으므로 별점은 안보이는게 정상)

     

    정상적인 쿼리문과 DB 정보

     

     

     

     

     

    *홈화면에서 업로드한 이미지가 보이게 구현은 일단 뒤로 미룬다.

    *디자인은 기능구현 완료 후 템플릿들로 보충한다.