[Spring] 회원 가입


MemberVO

package kr.or.ddit.member.vo;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

import javax.validation.constraints.Past;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.multipart.MultipartFile;

import kr.or.ddit.CardVO;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

// 자바빈 클래스

public class MemberVO {
	@NotBlank
	private String memberid;
	@NotBlank
	private String password;
	@NotBlank
	@Size(max=30)
	private String name;
	@Email
	private String email;
	private String introduction;
	private String memberSertPic;
	
	private MultipartFile[] uploadFile;
	
	private String postno;
	private String addr;
	private String detAddr;
	@Past // Date일때만 쓸 수 있음
	@DateTimeFormat(pattern="MM/dd/yyyy") // 데이트일때만 쓸 수 있음
	private Date birth;
	@DateTimeFormat(pattern="yyyy-MM-dd") 
	private Date regdate;
	private String enabled;
	
	private List<String> hobbyList;
	private String[] hobbyArray;
	
	private String gender; // 성별
	
	// MemberVO : CardVO = 1: n 의 관계
	private List<CardVO> cardList;
	private List<MemberAuth> authList;
	
	public MemberVO() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public MemberVO(String memberid, String password, String name, String email, Date regdate) {
		super();
		this.memberid = memberid;
		this.password = password;
		this.name = name;
		this.email = email;
		this.regdate = regdate;
	}


	// 비밀번호 변경 기능 구현 시 사용
	public boolean matchPassword(String pwd) {
		return password.contentEquals(pwd);
	}

// getter/setter, toString 생략
	
}

mapper.xml

<!-- 회원가입 -->
	<insert id="insert" parameterType="memberVO">
		INSERT INTO MEMBER(MEMBERID, PASSWORD, NAME, EMAIL ,REGDATE, INTRODUCTION,MEMBER_SERT_PIC,
		ENABLED, POSTNO, ADDR, DET_ADDR, BIRTH)
		VALUES(#{memberid}, #{password}, #{name}, #{email}, SYSDATE, #{introduction},
		#{memberSertPic}, NULL, #{postno}, #{addr}, #{detAddr}, #{birth} )
	</insert>

controller

	
    //클래스 레벨 매핑
@RequestMapping(value="/member")
@Controller
public class MemberController {
	private static final Logger logger = 
			LoggerFactory.getLogger(MemberController.class);
	//DI(Dependency Injection : 의존성 주입)
	@Autowired
	MemberService memberService;
    //컨트롤러의 insert메서드의 매개변수로 자바빈즈 객체가 전달이 되면 
	//기본적으로 다시 화면(view(jsp))으로 전달함
	//컨트롤러와 뷰 사이에 자바빈즈 객체를 서로 공유함
	//1) 폼 객체의 속성명을 직접 지정
	//2) 폼 객체의 속성명은 직접 지정하지 않으면 * 폼 객체의 클래스명의 맨 처음 문자를 소문자로 변환하여 처리
	//3) ModelAttribute 애너테이션으로 폼 객체의 속성명을 gaeddongi라고 지정했다면.. 
	//스프링 폼의 modelAttribute 속성의 값도 똑같이 gaeddongi라고 작성해줘야 함
	//MemberVO -> memberVO
	@RequestMapping("/insert")
	public String insert(Model model, @ModelAttribute("memberVO") MemberVO memberVO) {
		//modelAttribute="memberVO"
		//폼 객체의 속성명과 스프링 폼 태그의 modelAttribute 속성값이 같아야 함
//		model.addAttribute("memberVO", new MemberVO());
		//폼 객체의 프로퍼티 값을 지정..
		//모델을 통해서 뷰(jsp)로 전달이 됨
		memberVO.setMemberid("a001");
		memberVO.setName("개똥이");
		//<form:password -> 값을 설정해서 뷰(jsp)에 전달하더라도 패스워드 필드에 반영되지 않음
		memberVO.setPassword("java");
		memberVO.setEmail("[email protected]");
		
		String introduction = "안녕하세요.\n반갑습니다.";
		memberVO.setIntroduction(introduction);
		
		//취미 세팅
		Map<String, String> hobbyMap = new HashMap<String, String>();
		hobbyMap.put("01", "야구");
		hobbyMap.put("02", "BTS Music");
		hobbyMap.put("03", "스파이더맨 시리즈");
		
		model.addAttribute("hobbyMap", hobbyMap);
		
		//성별 세팅
		Map<String,String> genderMap = 
				new HashMap<String, String>();
		genderMap.put("Male", "남성");
		genderMap.put("Female", "여성");
		genderMap.put("Other", "기타");
		
		//session.setAttribute("genderMap",genderMap);
		model.addAttribute("genderMap", genderMap);
		
		return "member/joinForm";
	}
	
	@RequestMapping(value="/insert", method=RequestMethod.POST)
	public String insertPost(@Validated MemberVO memberVO,
			BindingResult result, Model model) {
		// 파일 업로드 처리 시작
		String uploadFolder = "D:\\A_TeachingMaterial\\6.JspSpring\\workspace\\springProj3\\src\\main\\webapp\\resources\\upload";
		
		// 연월일 폴더 생성
		java.io.File uploadPath = new java.io.File(uploadFolder, getFolder());
		
		if(uploadPath.exists()==false) {
			uploadPath.mkdirs();
		}
		
		MultipartFile[] MultipartFiles = memberVO.getUploadFile();
		
		for(MultipartFile multipartFile : MultipartFiles) {
			logger.info("Upload File Name: " + multipartFile.getOriginalFilename());
			// lastIndexOf("\\")+1 => k
			// .subString => ksh.jpg
			String uploadFileName = multipartFile.getOriginalFilename();
			uploadFileName = uploadFileName.substring(uploadFileName.lastIndexOf("\\")+1);
			logger.info("uploadFileName: "+ uploadFileName);
			
			UUID uuid = UUID.randomUUID();
			
			uploadFileName = uuid.toString() + "_" + uploadFileName;
			
			String path = "/resources/upload/"+getFolder()+"/"+ uploadFileName;
			memberVO.setMemberSertPic(path);
			
			File saveFile  = new File(uploadPath, uploadFileName);
			
			try {
				multipartFile.transferTo(saveFile);
			}catch(Exception e) {
				logger.warn(e.getMessage());
			} // catch
		} // for
		
		// 파일 업로드 처리 끝
		
		logger.info(memberVO.toString());
		
		List<String> hobbyList = memberVO.getHobbyList();
		for(String hobby : hobbyList) {
			logger.info(hobby);
		}
		String[] hobbyArray = memberVO.getHobbyArray();
		for(String str : hobbyArray) {
			logger.info(str);
		}
		//성별
		logger.info(memberVO.getGender());
		
		//입력값 검증 후 BindingResult가 제공하는 메서드를 이용하여 검사 결과를 확인
		//result.hasErrors : 검증 오류 발생 시
		if(result.hasErrors()) {
			//취미 세팅
			Map<String, String> hobbyMap = new HashMap<String, String>();
			hobbyMap.put("01", "야구");
			hobbyMap.put("02", "BTS Music");
			hobbyMap.put("03", "스파이더맨 시리즈");
			
			model.addAttribute("hobbyMap", hobbyMap);
			
			//성별 세팅
			Map<String,String> genderMap = 
					new HashMap<String, String>();
			genderMap.put("Male", "남성");
			genderMap.put("Female", "여성");
			genderMap.put("Other", "기타");
			
			//session.setAttribute("genderMap",genderMap);
			model.addAttribute("genderMap", genderMap);
			//forwarding
			return "member/joinForm";
		}else {	//입력 검증 통과
			//회원아이디가 중복되었는지 체킹
			int dupChkResult = memberService.memberDupchk(memberVO.getMemberid());
			
			if(dupChkResult>0) {//중복된 아이디
				model.addAttribute("dupChkResult", "아이디가 중복되었습니다");
				
				//취미 세팅
				Map<String, String> hobbyMap = new HashMap<String, String>();
				hobbyMap.put("01", "야구");
				hobbyMap.put("02", "BTS Music");
				hobbyMap.put("03", "스파이더맨 시리즈");
				
				model.addAttribute("hobbyMap", hobbyMap);
				
				//성별 세팅
				Map<String,String> genderMap = 
						new HashMap<String, String>();
				genderMap.put("Male", "남성");
				genderMap.put("Female", "여성");
				genderMap.put("Other", "기타");
				
				//session.setAttribute("genderMap",genderMap);
				model.addAttribute("genderMap", genderMap);
				
				//forwarding
				return "member/joinForm";
			}else {//중복되지 않은 아이디
				//회원 등록 처리
				int rslt = memberService.insert(memberVO);
				
				//뷰의 경로(mav.setViewName("member/result"))
				//forwarding
				return "member/result";
			}
			
		}
	}
	
    }

joinForm

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<script src="https://ssl.daumcdn.net/dmaps/map_js_init/postcode.v2.js"></script>
<script type="text/javascript" src="/resources/ckeditor/ckeditor.js"></script>
<link rel="stylesheet" href="/resources/css/style.css" />
<link rel="stylesheet" href="//code.jquery.com/ui/1.13.1/themes/base/jquery-ui.css">
<!-- <link rel="stylesheet" href="/resources/css/jquery-ui.css" /> -->
<script type="text/javascript" src="/resources/js/jquery-ui.js"></script>
<title>회원가입</title>
<style type="text/css">
	.img_wrap{
		width:100px;
		margin-top:20px;
	}
	.img_wrap img{
		max-width:100%;
	}
</style>
<script type="text/javascript">
	//다음 우편번호 검색
	function openHomeSearch(){
		new daum.Postcode({
			oncomplete:function(data){
// 				alert("data : " + JSON.stringify(data));
				$('[name=postno]').val(data.zonecode);
				$('[name=addr]').val(data.address);
				$('[name=detAddr]').val(data.buildingName);
			}
		}).open();
	}
	
	$(function(){
		$("#birth").datepicker();
	});
</script>
</head>
<body>
<!-- 
스프링 폼 태그 라이브러리
 - 스프링 폼은 HTML 폼을 표시하기 위한 태그 라이브러리
 - 스프링 폼을 이용하면 HTML 폼과 자바 객체를 쉽게 바인딩할 수 있음

path : 폼 항목에 바인딩되는 폼 객체(Controller에 있음)의 프로퍼티를 지정
-->
<script type="text/javascript">
	$(function(){
		$("#input_img").on("change",handleImgFileSelect);		
	});
	//e : change 된 이벤트 정보
	function handleImgFileSelect(e){
		//e.target : <input type="file".. 요소
		var files = e.target.files;
		var filesArr = Array.prototype.slice.call(files);
		filesArr.forEach(function(f){
			if(!f.type.match("image.*")){
				alert("확장자는 이미지 확장자만 가능합니다");
				return;
			}
			
			var reader = new FileReader();
			reader.onload = function(e){
				$("#img").attr("src",e.target.result);
			}
			reader.readAsDataURL(f);
		});
	}
</script>
<form:form modelAttribute="memberVO" method="post" action="/member/insert"
	enctype="multipart/form-data">
	<p>
		<div>
			<div class="img_wrap">
				<img id="img" />
			</div>
		</div>
		<div>
			<h5>회원이미지</h5>
			<input type="file" id="input_img" name="uploadFile" />
		</div>
	</p>
	<p>
		아이디 : <form:input path="memberid" />
		<c:if test="${dupChkResult!=null}">
			<font color="red">
				${dupChkResult}
			</font>
		</c:if>
		<font color="red">
			<form:errors path="memberid" />
		</font>
	</p>
	<p>
		이름 : <form:input path="name" />
		<font color="red">
			<form:errors path="name" />
		</font>
	</p>
	<p>
		비밀번호 : <form:password path="password" />
		<font color="red">
			<form:errors path="password" />
		</font>
	</p>
	<p>
		우편번호 : <form:input path="postno" />
		<button type="button" class="btn btn-primary btn-icon-split btn-sm" 
			onclick="openHomeSearch()">
            <span class="icon text-white-50">
                <i class="fas fa-flag"></i>
            </span>
            <span class="text">우편번호검색</span>
        </button>
		<font color="red">
			<form:errors path="postno" />
		</font>
	</p>
	<p>
		주소 : <form:input path="addr" style="width:50%;" />
		<font color="red">
			<form:errors path="addr" />
		</font>
	</p>
	<p>
		상세주소 : <form:input path="detAddr"  style="width:50%;" />
		<font color="red">
			<form:errors path="detAddr" />
		</font>
	</p>
	<p>
		이메일 : <form:input path="email" />
		<font color="red">
			<form:errors path="email" />
		</font>
	</p>
	<p>
		생일 : <form:input path="birth" />
		<font color="red">
			<form:errors path="birth" />
		</font>
	</p>
	<p>
		자기소개 : 
		<form:textarea path="introduction" rows="6" cols="30" />
	</p>
	<p>
		취미 : 
		<form:checkboxes path="hobbyList" items="${hobbyMap}" />
	</p>
	<p>
		취미(hobbyArray) : 
		<form:checkbox path="hobbyArray" value="안찰수" label="안찰수" /><br />
		<form:checkbox path="hobbyArray" value="이재면" label="이재면" /><br />
		<form:checkbox path="hobbyArray" value="윤선열" label="윤선열" /><br />
		<form:checkbox path="hobbyArray" value="심상전" label="심상전" /><br />
	</p>
	<p>
		성별 :
<%-- 		<form:radiobuttons path="gender" items="달러{genderMap}" /> --%>
		<form:radiobutton path="gender" value="Male" label="Male" />&nbsp;
		<form:radiobutton path="gender" value="Female" label="Female" />&nbsp;
		<form:radiobutton path="gender" value="Other" label="Other" />
	</p>
	<form:button name="register">등록</form:button>
</form:form>
<script type="text/javascript">
CKEDITOR.replace("introduction");
</script>
</body>
</html>












좋은 웹페이지 즐겨찾기