[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" />
<form:radiobutton path="gender" value="Female" label="Female" />
<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>
Author And Source
이 문제에 관하여([Spring] 회원 가입), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@vgo_dongv/Spring-회원-가입저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)