1-2. 회원가입 페이지 CSS, Validation Error 표시

2021. 1. 8. 00:54프로젝트/Salle(살래) 중고거래 웹

728x90

Validator의 MessageSource 미출력에 대한 문제를 해결하면서 Error message가 눈에 잘 띄도록 CSS를 적용하고 싶었습니다. Youtube를 참고하다 그만 예뻐보이는 UI에 현혹돼 전체적인 CSS를 변경해주었습니다. CSS 지식이 얕아서 영상보면서 모르는 부분은 구글링해가며 따라한다고 시간이 생각보다 오래 걸렸습니다.

 

그리고 Validator를 Front JavaScript로 처리해줄 수 있더라구요. Error 발생할 때 조금 더 UI에 alert를 줄 수 있다는 장점이 있어서 공백이나, 비밀번호 확인, 이메일 양식까지는 가능하길래 그렇게 하려다 중복된 이메일 검증은 DB를 거쳐야 되기 때문에 Back으로 되돌아왔습니다. 세부사항들을 모두 고려하지 못해 처리하는 위치를 왔다갔다 하면서 시간을 꽤 허비했습니다. 

 

마지막으로 회원가입 정보가 양식에 맞지 않거나, 공백이나 틀렸을 경우 Controller에서 URI는 같지만 이전 페이지를 Load해주는데요, 그럴 때 써놓았던 정보들이 없어지는 어처구니 없는 상황이 벌어졌습니다. 해결은 <input> 태그를 <form:input path="">로 변경해서 페이지는 새로고침 되었지만 ModelAttribute의 Member 객체에 저장되기 때문에 <form:input>에 정보가 남아있습니다. 사용자의 편의성을 고려해 어떻게든 살리고 싶었는데 그렇게 돼서 기분이 좋았습니다. 사실 고집을 부려 path를 사용하지 않고 남기는 방법을 찾아봤는데, JS로 처리해주던지 AJAX를 사용해야되는 것 같았습니다. 찾는데 몇 시간을 썼습니다... 스트레스는 덤 :)

 

Register.jsp 코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


<!DOCTYPE html>
<html>
<head>
    <title>회원가입</title>
    <link rel="stylesheet" href="/resources/css/register_main.css">
</head>
<body>

    <div class="container">
    	<div class="header">
    		<h2>회원가입</h2>
    	</div>
	    <form:form class="form" action="done" method="post" modelAttribute="member">
    	<div class="register_info">
	        <label>이메일</label>
	        <form:input type="text" path="email"/>
	        <form:errors class="errors" path="email"/>	       
	    </div>
		<div class="register_info">
	        <label>비밀번호</label>
	        <form:input type="password" path="password"/>
	        <form:errors class="errors" path="password"/>
		</div>
		<div class="register_info">
	        <label>비밀번호 확인</label>
	        <form:input type="password" path="confirmPassword"/>
	        <form:errors class="errors" path="confirmPassword"/>
	        
		</div>
		<div class="register_info">
	        <label>이름</label>
	        <form:input type="text" path="name" />
	        <form:errors class="errors" path="name"/>
		</div>
		<div class="register_info">
	        <label>닉네임</label>
	        <form:input type="text" path="nickName" />    
	        <form:errors class="errors" path="nickName"/>
		</div>
		
		<div class="register_info">
	        <label>휴대전화</label>
	        <input type="text" name="phoneNum" />
	        <form:errors class="errors" path="phoneNum"/>
    	</div>
    <input class="submit" type="submit" value="가입하기">
    </form:form>
	</div>
</body>
</html>

Register.jsp CSS코드

글꼴은 GoogleFonts에서 Noto Sans KR 링크를 @import해서 사용했습니다. 수치 단위 vh 는 viewport 높이/너비의 1/100 입니다. 따라서 100vh를 해주면 브라우저 화면을 가득 채웁니다.

@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300&display=swap');

* {
	box-sizing: border-box;
	font-family: 'Noto Sans KR', sans-serif;	
}

body {
	background-color: rgb(153, 204, 255);
	font-size: 12px;
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 100vh; 
	margin: 0;
}

.container {
	background-color: #fff;
	border-radius: 5px;
	width: 400px;
	max-width: 100%;
	overflow: hidden;
}

.header {
	padding: 10px 20px;
	background-color: #f7f7f7;
}

.header h2 {
	margin: 0;
}

.form {
	padding: 30px 40px;
}

.register_info {
	margin-bottom: 10px;
	padding-bottom: 10px;
	position: relative;
}

.register_info label {
	display: inline-block;
	margin-bottom: 5px;
}

.register_info input {
	border: 1.5px solid #535053;
	border-radius: 3px;
	display: block;
	font-size: 11px;
	padding: 5px;
	width: 100%;
}

.errors {
	color: red;
	font-size: 11px;
}

.submit {
	background-color: #70b8ff;
	border: 2px solid #70b8ff;
	width: 100%;
	border-radius: 5px;
	padding: 5px;
	color: #ffffff;
}






RegisterController 코드

이메일 중복 검증을 위해선 memberInfo로 DB에 접근해서 해당 이메일을 가진 member가 있는 조회가 필요한데, @Validator를 상속한 클래스에선 DB에 접근하는 Service 메서드를 호출하면 null값을 받더라구요. Bean 등록이 Validator로 되어있어서 Component가 아니라 @Autowired가 안되는 것 같습니다. (참고링크) 그래서 Controller에서 처리해줬습니다. 방법은 memberVO에 이메일 중복여부 확인용 Variant(Boolean타입, emailDuplicate)를 추가해서 Validator 클래스에서 member 객체로 받아 검증할 수 있게 했습니다. 

	    @RequestMapping(value = "/register/done", method = RequestMethod.POST)
	    public String registerHandle(@ModelAttribute("member") Member member, 
	    		Errors errors) {		
	    	
	    		if (memberService.memberInfo(member.getEmail()) != null) {
	    			member.setEmailDuplicate(true);
	    		}
	    	
	    		new RegisterValidation().validate(member, errors);
	    		
	    		if (errors.hasErrors()) {
	    			
	    			return "register/main";
	    		}
	    		
	    	
		        memberService.insertMember(member);
		   
		        return "register/done";
		}