-
pom.xml
-
기존 파일 응용
-
main.xml
-
src/main/java=>kr.spring.config=>Appconfig.java
-
kr.spring.main.controller => MainController
-
webapp => WEB-INF => views => template => header,footer,layout_basic.jsp
-
header.jsp
-
footer.jsp
-
layout_basic.jsp
-
views=>main=>main.jsp
-
기존 파일 응용
-
webapp=>sql => table.sql
-
kr.spring.member.vo => MemberVO
-
kr.spring.member.dao => MemberMapper
-
kr.spring.member.service => MemberService
-
kr.spring.member.service =>MemberServiceImpl
-
kr.spring.member.controller => MemberController
-
Appconfig.java 내용추가
-
views=>member=>memberRegister.jsp
-
static=>css=>member.css
-
common.css 내용추가
-
member.xml 내용추가
-
member=>memberCSS.jsp
-
layout_basic.jsp에 내용추가
-
common.css 내용수정
-
MemberMapper 추가
-
ch12에 있는 BoardMapper.xml을 가져와서
-
MemberMapper.xml로 이름수정 및 내용수정
-
MemberServiceImpl을 미리 써놨지만 내가 잘못쓴거라 수정
-
MemberController 내용추가
-
views=>common=>resultView.jsp


Project Lombok
projectlombok.org




이클립스 재부팅 후 실행
lombok을 쓰면 VO작성을 할 떄 getter,setter,tostring같은걸 어노테이션으로 처리가능하다.
pom.xml
<!--라이브러리 추가 시작-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-servlet</artifactId>
<version>3.0.7</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>3.0.7</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<!--라이브러리 추가 끝-->
기존 파일 응용
ch13Springtiles에 있던 application.yml을 복사해서 src/main/resources에 넣어준다
ch12mybatisboot에 있던src/main/resources 안에 messages 폴더와 validation.propertie를 복사해온다
webapp => WEB-INF => tiles-def ,views 를 만들고
tiles-def안에 ch13Springtiles에 있던 tilesdef-xml을 가져온뒤 main.xml로 이름 변경
main.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<definition name="main" template="/WEB-INF/views/template/layout_basic.jsp">
<put-attribute name="title" value="SpringPage"/>
<put-attribute name="header" value="/WEB-INF/views/template/header.jsp"/>
<put-attribute name="body" value="/WEB-INF/views/main/main.jsp"/>
<put-attribute name="footer" value="/WEB-INF/views/template/footer.jsp"/>
</definition>
</tiles-definitions>
src/main/java=>kr.spring.config=>Appconfig.java
package kr.spring.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesView;
import org.springframework.web.servlet.view.tiles3.TilesViewResolver;
//자바코드 기반 설정 클래스
@Configuration
public class Appconfig implements WebMvcConfigurer {
@Bean
public TilesConfigurer tilesConfigurer() {
final TilesConfigurer configurer = new TilesConfigurer();
//XML 설정 파일 경로 지정
configurer.setDefinitions(new String[] {
"WEB-INF/tiles-def/main.xml"
});
configurer.setCheckRefresh(true);
return configurer;
}
@Bean
public TilesViewResolver tilesViewResolver(){
final TilesViewResolver tilesViewResolver = new TilesViewResolver();
//뷰 지정
tilesViewResolver.setViewClass(TilesView.class);
return tilesViewResolver;
}
}
kr.spring.main.controller => MainController
package kr.spring.main.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import lombok.extern.slf4j.Slf4j;
@Slf4j //lombok 객체
@Controller
public class MainController {
@GetMapping("/")
public String init() {
return "redirect:/main/main";
}
@GetMapping("/main/main")
public String main() {
return "main"; //Tiles의 설정명
}
}
webapp => WEB-INF => views => template => header,footer,layout_basic.jsp
header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 상단 시작 -->
<h2 class="align-center">SpringPage</h2>
<div class="align-right">
<c:if test="${empty user}">
<a href="${pageContext.request.contextPath}/member/registerUser">회원가입</a>
<a href="${pageContext.request.contextPath}/member/login">로그인</a>
</c:if>
</div>
<!-- 상단 끝 -->
footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 하단시작 -->
<div class="align-center">
© SpringPage
</div>
<!-- 하단끝 -->
layout_basic.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><tiles:getAsString name="title"/></title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/common.css" type="text/css">
</head>
<body>
<div id="main">
<div id="main_header">
<tiles:insertAttribute name="header"/>
</div>
<div id="main_body">
<tiles:insertAttribute name="body"/>
</div>
<div id="main_footer">
<tiles:insertAttribute name="footer"/>
</div>
</div>
</body>
</html>
views=>main=>main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 메인 시작 -->
<div class="page-main">
<h3>메인</h3>
</div>
<!-- 메인 끝-->

기존 파일 응용
ch06_mvcPage에 있는 css/style.css 폴더와 파일을 복사해서 src/main/resources=>static 안에 넣어준다. 그리고 style.css를 common.css로 변경해준다.
common.css 일부 수정 후 실행결과

webapp=>sql => table.sql
--회원관리
create table spmember(
mem_num number not null,
id varchar2(12) unique not null,
nick_name varchar2(30),
auth number(1) default 2 not null, --0탈퇴회원, 1정지회원,2일반회원,9관리자
constraint spmember_pk primary key (mem_num)
);
create table spmember_detail(
mem_num number not null,
au_id varchar2(36) unique, --자동 로그인에 사용되는 식별값
name varchar2(30) not null,
passwd varchar2(35) not null,
phone varchar2(15) not null,
email varchar2(50) not null,
zipcode varchar2(5) not null,
address1 varchar2(90) not null,
address2 varchar2(90) not null,
photo blob,
photo_name varchar2(100),
reg_date date default sysdate not null,
modify_date date,
constraint spmember_detail_pk primary key (mem_num),
constraint spmember_detail_fk foreign key (mem_num)
references spmember (mem_num)
);
create sequence spmember_seq;
kr.spring.member.vo => MemberVO
package kr.spring.member.vo;
import java.io.IOException;
import java.sql.Date;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import org.springframework.web.multipart.MultipartFile;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString(exclude = {"photo"})
public class MemberVO {
private long mem_num;
@Pattern(regexp="^[A-Za-z0-9]{4,12}$")
private String id;
private String nick_name;
private int auth;
private String auto;
private String au_id;
@NotBlank
private String name;
@Pattern(regexp="^[A-Za-z0-9]{4,12}$")
private String passwd;
private String phone;
@Email
@NotBlank
private String email;
@Size(min=5,max=5)
private String zipcode;
@NotBlank
private String address1;
@NotBlank
private String address2;
private byte[] photo;
private String photo_name;
private Date reg_date;
private Date modify_date;
//비밀번호 변경시 현재 비밀번호를 저장하는 용도로 사용
@Pattern(regexp="^[A-Za-z0-9]{4,12}$")
private String now_passwd;
//비밀번호 일치 여부 체크
public boolean ischeckedPassword(String userPasswd) {
if(auth >1 && passwd.equals(userPasswd)) {
return true;
}
return false;
}
//이미지 BOLB 처리
//(주의)폼에서 파일업로드 파라미터네임은 반드시 upload로 지정해야 함
public void setUpload(MultipartFile upload) throws IOException {
//MutipartFile => byte[] 바이트 배열로 변경한다.
setPhoto(upload.getBytes());
//파일이름
setPhoto_name(upload.getOriginalFilename());
}
}
kr.spring.member.dao => MemberMapper
package kr.spring.member.dao;
import org.apache.ibatis.annotations.Mapper;
import kr.spring.member.vo.MemberVO;
@Mapper
public interface MemberMapper {
//회원관리-일반회원
public long selectMem_num();
public void insertMember(MemberVO member);
public void insertMember_detail(MemberVO member);
public MemberVO selectCheckMember(String id);
public MemberVO seleectMember(long mem_num);
public void updatemember(MemberVO member);
public void updatemember_detail(MemberVO member);
public void updatePassword(MemberVO member);
public void deleteMember(long mem_num);
public void deleteMember_detail(long mem_num);
}
kr.spring.member.service => MemberService
package kr.spring.member.service;
import kr.spring.member.vo.MemberVO;
public interface MemberService {
//회원관리-일반회원
public void insertMember(MemberVO member);
public MemberVO selectCheckMember(String id);
public MemberVO seleectMember(long mem_num);
public void updatemember(MemberVO member);
public void updatePassword(MemberVO member);
public void deleteMember(long mem_num);
}
kr.spring.member.service =>MemberServiceImpl
package kr.spring.member.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import kr.spring.member.dao.MemberMapper;
import kr.spring.member.vo.MemberVO;
@Service
@Transactional
public class MemberServiceImpl implements MemberService{
@Autowired
MemberMapper memberMapper;
@Override
public void insertMember(MemberVO member) {
memberMapper.insertMember(member);
}
@Override
public MemberVO selectCheckMember(String id) {
return memberMapper.selectCheckMember(id);
}
@Override
public MemberVO selectMember(long mem_num) {
return memberMapper.selectMember(mem_num);
}
@Override
public void updatemember(MemberVO member) {
memberMapper.updatemember(member);
}
@Override
public void updatePassword(MemberVO member) {
memberMapper.updatePassword(member);
}
@Override
public void deleteMember(long mem_num) {
memberMapper.deleteMember(mem_num);
}
}
kr.spring.member.controller => MemberController
package kr.spring.member.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import kr.spring.member.service.MemberService;
import kr.spring.member.vo.MemberVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class MemberController {
@Autowired
private MemberService memberService;
/* =======================================
* 회원가입
* ======================================*/
//자바빈(VO) 초기화
@ModelAttribute
public MemberVO initCommand() {
return new MemberVO();
}
//회원가입 폼 호출
@GetMapping("/member/registerUser")
public String form() {
return "memberRegister"; //Tiles 설정명
}
}
main.xml 을 똑같이 복사해서 이름을 member.xml로 하나 만든다.
member.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<definition name="memberRegister" extends="main">
<put-attribute name="title" value="회원가입"/>
<put-attribute name="body" value="/WEB-INF/views/member/memberRegister.jsp"/>
</definition>
</tiles-definitions>
Appconfig.java 내용추가
//자바코드 기반 설정 클래스
@Configuration
public class Appconfig implements WebMvcConfigurer {
@Bean
public TilesConfigurer tilesConfigurer() {
final TilesConfigurer configurer = new TilesConfigurer();
//XML 설정 파일 경로 지정
configurer.setDefinitions(new String[] {
"WEB-INF/tiles-def/main.xml",
"WEB-INF/tiles-def/member.xml"
});
configurer.setCheckRefresh(true);
return configurer;
}
"WEB-INF/tiles-def/member.xml" 를 추가한다
views=>member=>memberRegister.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!-- 회원가입 시작 -->
<div class="page-main">
<h2>회원가입</h2>
<form:form action="registerUser" id="member_register" modelAttribute="memberVO">
<ul>
<li>
<form:label path="id">아이디</form:label>
<form:input path="id" placeholder="영문,숫자만 4~12자" autocomplete="off"/>
<input type="button" id="confirmId" value="ID중복체크" class="default-btn">
<span id="message_id"></span>
<form:errors path="id" cssClass="error-color"/>
</li>
<li>
<form:label path="name">이름</form:label>
<form:input path="name"/>
<form:errors path="name" cssClass="error-color"/>
</li>
<li>
<form:label path="nick_name">별명</form:label>
<form:input path="nick_name"/>
<form:errors path="nick_name" cssClass="error-color"/>
</li>
<li>
<form:label path="passwd">비밀번호</form:label>
<form:password path="passwd" placeholder="영문,숫자만 4~12자"/>
<form:errors path="passwd" cssClass="error-color"/>
</li>
<li>
<form:label path="phone">전화번호</form:label>
<form:input path="phone"/>
<form:errors path="phone" cssClass="error-color"/>
</li>
<li>
<form:label path="email">이메일</form:label>
<form:input path="email"/>
<form:errors path="email" cssClass="error-color"/>
</li>
<li>
<form:label path="zipcode">우편번호</form:label>
<form:input path="zipcode"/>
<input type="button" onclick="execDaumPostcode()" value="우편번호 찾기" class="default-btn">
<form:errors path="zipcode" cssClass="error-color"/>
</li>
<li>
<form:label path="address1">주소</form:label>
<form:input path="address1"/>
<form:errors path="address1" cssClass="error-color"/>
</li>
<li>
<form:label path="address2">상세주소</form:label>
<form:input path="address2"/>
<form:errors path="address2" cssClass="error-color"/>
</li>
</ul>
<div class="align-center">
<form:button class="default-btn">전송</form:button>
<input type="button" value="홈으로" class="default-btn" onclick="location.href='${pageContext.request.contextPath}/main/main'">
</div>
</form:form>
<!-- 우편번호 시작 -->
<!-- iOS에서는 position:fixed 버그가 있음, 적용하는 사이트에 맞게 position:absolute 등을 이용하여 top,left값 조정 필요 -->
<div id="layer" style="display:none;position:fixed;overflow:hidden;z-index:1;-webkit-overflow-scrolling:touch;">
<img src="//t1.daumcdn.net/postcode/resource/images/close.png" id="btnCloseLayer" style="cursor:pointer;position:absolute;right:-3px;top:-3px;z-index:1" onclick="closeDaumPostcode()" alt="닫기 버튼">
</div>
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script>
// 우편번호 찾기 화면을 넣을 element
var element_layer = document.getElementById('layer');
function closeDaumPostcode() {
// iframe을 넣은 element를 안보이게 한다.
element_layer.style.display = 'none';
}
function execDaumPostcode() {
new daum.Postcode({
oncomplete: function(data) {
// 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
// 각 주소의 노출 규칙에 따라 주소를 조합한다.
// 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
var addr = ''; // 주소 변수
var extraAddr = ''; // 참고항목 변수
//사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
addr = data.roadAddress;
} else { // 사용자가 지번 주소를 선택했을 경우(J)
addr = data.jibunAddress;
}
// 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
if(data.userSelectedType === 'R'){
// 법정동명이 있을 경우 추가한다. (법정리는 제외)
// 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
extraAddr += data.bname;
}
// 건물명이 있고, 공동주택일 경우 추가한다.
if(data.buildingName !== '' && data.apartment === 'Y'){
extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
}
// 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
if(extraAddr !== ''){
extraAddr = ' (' + extraAddr + ')';
}
//(주의)address1에 참고항목이 보여지도록 수정
// 조합된 참고항목을 해당 필드에 넣는다.
//(수정) document.getElementById("address2").value = extraAddr;
}
//(수정) else {
//(수정) document.getElementById("address2").value = '';
//(수정) }
// 우편번호와 주소 정보를 해당 필드에 넣는다.
document.getElementById('zipcode').value = data.zonecode;
//(수정) + extraAddr를 추가해서 address1에 참고항목이 보여지도록 수정
document.getElementById("address1").value = addr + extraAddr;
// 커서를 상세주소 필드로 이동한다.
document.getElementById("address2").focus();
// iframe을 넣은 element를 안보이게 한다.
// (autoClose:false 기능을 이용한다면, 아래 코드를 제거해야 화면에서 사라지지 않는다.)
element_layer.style.display = 'none';
},
width : '100%',
height : '100%',
maxSuggestItems : 5
}).embed(element_layer);
// iframe을 넣은 element를 보이게 한다.
element_layer.style.display = 'block';
// iframe을 넣은 element의 위치를 화면의 가운데로 이동시킨다.
initLayerPosition();
}
// 브라우저의 크기 변경에 따라 레이어를 가운데로 이동시키고자 하실때에는
// resize이벤트나, orientationchange이벤트를 이용하여 값이 변경될때마다 아래 함수를 실행 시켜 주시거나,
// 직접 element_layer의 top,left값을 수정해 주시면 됩니다.
function initLayerPosition(){
var width = 300; //우편번호서비스가 들어갈 element의 width
var height = 400; //우편번호서비스가 들어갈 element의 height
var borderWidth = 5; //샘플에서 사용하는 border의 두께
// 위에서 선언한 값들을 실제 element에 넣는다.
element_layer.style.width = width + 'px';
element_layer.style.height = height + 'px';
element_layer.style.border = borderWidth + 'px solid';
// 실행되는 순간의 화면 너비와 높이 값을 가져와서 중앙에 뜰 수 있도록 위치를 계산한다.
element_layer.style.left = (((window.innerWidth || document.documentElement.clientWidth) - width)/2 - borderWidth) + 'px';
element_layer.style.top = (((window.innerHeight || document.documentElement.clientHeight) - height)/2 - borderWidth) + 'px';
}
</script>
<!-- 우편번호 끝 -->
</div>
<!-- 회원가입 끝 -->
static=>css=>member.css
@charset "UTF-8";
/* 회원가입 등록, 수정, 삭제 폼
------------------------*/
#member_register{
width:800px;
}
#member_regisger ul, #member_modify ul{
padding-left:120px;
}
#member_register input[id="id"]{
width:236px;
}
#member_register input[id="zipcode"],#member_modify input[id="zipcode"]{
width:220px;
}
#member_modify{
width:96%;
}
#member_delete input[id="id"],#member_delete input[id="passwd"]{
width:240px;
}
/* 로그인
---------------------*/
#login_form{
width:300px;
margin:0 auto;
padding:0;
border:none;
}
#login_form ul{
padding:0;
}
.floating-label{/*floating label 설정*/
position:relative;
}
.floating-label > .form-input{
width:300px;
height:32px;
padding:0.55rem 0.55rem;
}
.floating-label > label{
position:absolute;
top:0;
left:0;
padding:1.05rem 0.75rem;
transition:all 0.25s;
}
.floating-label > .form-input::placeholder{
color:transparent;
}
.floating-label > .form-input:focus,
.floating-label > .form-input:not(:placeholder-shown){
padding-top:1.125rem;
padding-bottom:0.125rem;
}
.floating-label > .form-input:focus + label,
.floating-label > .form-input:not(:placeholder-shown) + label{
opacity:0.65;
transform:scale(0.85) translateY(-0.5rem) translateX(-0.5rem);
}
/* MY페이지
---------------------*/
.mypage-div{
width:48%;
float:left;
padding:5px;
}
.mypage-end{
clear:both;
}
.my-photo{
object-fit:cover;
/*정사각형이 아니라 직사각형일 경우 원 안에 보여지게 할 중심 이미지의 위치를 지정*/
object-position:top;
/*사각형의 모서리 둥근 정도를 지정하는 속성,50%를 지정하면 완전한 원*/
border-radius:50%;
}
common.css 내용추가
/* 공통 목록
---------------------*/
form#search_form{
width:98%;
padding-bottom:0;
border:none;
}
ul.search{
width:380px;
list-style:none;
padding:0;
margin:0 auto;
}
ul.search li{
margin:0 0 9px 0;
padding:0;
display:inline;
}
ul.search li select{
height:30px;
}
.list-space{
width:700px;
margin:10px auto;
}
table{
width:100%;
border:1px solid #000;
border-collapse:collapse;
margin-top:5px;
}
table td, table th{
border:1px solid #000;
padding:5px;
}
/* 공동 버튼
---------------------*/
[type="submit"],[type="button"]{
height:30px;
}
.menu-btn{
width:100%;
height:50px;
font-size:12pt;
background-color:#fcfcfc;
border-color:#b7b5b5;
border-radius:5px;
}
.default-btn{
padding:4px 20px;
border:1px solid #09aa5c;
border-radius:2px;
color:#fff; /* 흰색 */
background-color:#09aa5c;
font-weight:bold;
cursor:pointer;
}
.default-btn:hover{
background-color: #FFF;
color:#09aa5c;
transition:0.2s ease-out;
height:30px;
}
member.xml 내용추가
<put-attribute name="css" value="/WEB-INF/views/member/memberCSS.jsp"/>
member=>memberCSS.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/member.css" type="text/css">
membercss.jsp를 이제 include하기위해 수정작업을 해야됨
member.xml에 있는 name="css"부분과 연결 필요함.
layout_basic.jsp에 내용추가
<tiles:insertAttribute name="css" ignore="true"/>

common.css 내용수정
/* 공통 등록, 수정 폼
---------------------*/
form{
width:600px;
margin:0 auto;
border:1px solid #000;
padding:10px 10px 30px 10px;
}
form ul li label{
width:110px;
display:inline-block;
}
ul {
list-style:none;
}
input,select{
margin-top:4px;
padding:5px;
}
input[type="text"],input[type="password"],
input[type="email"]{
width:350px;
}

MemberMapper 추가
//회원관리-일반회원
@Select("SELECT spmember_seq.nextval FROM dual")
public Long selectMem_num();
@Insert("INSERT INTO spmember (mem_num,id,nick_name) VALUES (#{mem_num},#{id},#{nick_name})") //auth값은 자동으로들어가서 안넣음
public void insertMember(MemberVO member);
ch12에 있는 BoardMapper.xml을 가져와서
MemberMapper.xml로 이름수정 및 내용수정
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.spring.member.dao.MemberMapper"> <!-- 인터페이스 파일과 명칭을 같게 해야됨 --> <!-- 이걸써야지 class 파일을 따로 만들지않아도 작동이 자동으로 연동되어 작동가능 -->
<!-- 회원가입 -->
<insert id="insertMember_detail" parameterType="memberVO">
INSERT INTO spmember_detail (
mem_num,
name,
passwd,
phone,
email,
zipcode,
address1,
address2)
VALUES (
#{mem_num},
#{name},
#{passwd},
#{phone},
#{email},
#{zipcode},
#{address1},
#{address2}
)
</insert>
</mapper>
MemberServiceImpl을 미리 써놨지만 내가 잘못쓴거라 수정
다른 것들도 아마 틀렸을 것으로 예상
@Override
public void insertMember(MemberVO member) {
member.setMem_num(memberMapper.selectMem_num());
memberMapper.insertMember(member);
memberMapper.insertMember_detail(member);
}
MemberController 내용추가
//전송된 데이터 처리
@PostMapping("/member/registerUser")
public String submit(@Valid MemberVO memberVO, BindingResult result, Model model,HttpServletRequest request) {
log.debug("<<회원가입>> :" + memberVO);
//유효성 체크 결과 오류가 있으면 폼 호출
if(result.hasErrors()) {
return form();
}
//회원가입
memberService.insertMember(memberVO);
//UI 메시지 처리
model.addAttribute("accessTitle", "회원가입");
model.addAttribute("accessMsg", "회원가입이 완료되었습니다.");
model.addAttribute("accessBtn", "홈으로");
model.addAttribute("accessUrl", request.getContextPath()+"/main/main");
return "common/resultView";
}
views=>common=>resultView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${accessTitle}</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/common.css" type="text/css">
</head>
<body>
<div class="page-one">
<h2>${accessTitle}</h2>
<div class="result-display">
<div class="align-center">
${accessMsg}
<p>
<input type="button" value="${accessBtn}" onclick="location.href='${accessUrl}'">
</div>
</div>
</div>
</body>
</html>


'쌍용교육(JAVA) > SpringBoot' 카테고리의 다른 글
쌍용교육 -JSP수업 92일차 ch15SpringPage(3) (1) | 2024.06.27 |
---|---|
쌍용교육 -JSP수업 91일차 ch15SpringPage(2) (0) | 2024.06.26 |
쌍용교육 -JSP수업 89일차 ch14SpringThymeleadf(2) (0) | 2024.06.25 |
쌍용교육 -JSP수업 88일차 ch14SpringThymeleadf (0) | 2024.06.24 |
쌍용교육 -JSP수업 87일차 ch13SpringTiles(1) (0) | 2024.06.24 |


Project Lombok
projectlombok.org




이클립스 재부팅 후 실행
lombok을 쓰면 VO작성을 할 떄 getter,setter,tostring같은걸 어노테이션으로 처리가능하다.
pom.xml
<!--라이브러리 추가 시작-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-servlet</artifactId>
<version>3.0.7</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>3.0.7</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<!--라이브러리 추가 끝-->
기존 파일 응용
ch13Springtiles에 있던 application.yml을 복사해서 src/main/resources에 넣어준다
ch12mybatisboot에 있던src/main/resources 안에 messages 폴더와 validation.propertie를 복사해온다
webapp => WEB-INF => tiles-def ,views 를 만들고
tiles-def안에 ch13Springtiles에 있던 tilesdef-xml을 가져온뒤 main.xml로 이름 변경
main.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<definition name="main" template="/WEB-INF/views/template/layout_basic.jsp">
<put-attribute name="title" value="SpringPage"/>
<put-attribute name="header" value="/WEB-INF/views/template/header.jsp"/>
<put-attribute name="body" value="/WEB-INF/views/main/main.jsp"/>
<put-attribute name="footer" value="/WEB-INF/views/template/footer.jsp"/>
</definition>
</tiles-definitions>
src/main/java=>kr.spring.config=>Appconfig.java
package kr.spring.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesView;
import org.springframework.web.servlet.view.tiles3.TilesViewResolver;
//자바코드 기반 설정 클래스
@Configuration
public class Appconfig implements WebMvcConfigurer {
@Bean
public TilesConfigurer tilesConfigurer() {
final TilesConfigurer configurer = new TilesConfigurer();
//XML 설정 파일 경로 지정
configurer.setDefinitions(new String[] {
"WEB-INF/tiles-def/main.xml"
});
configurer.setCheckRefresh(true);
return configurer;
}
@Bean
public TilesViewResolver tilesViewResolver(){
final TilesViewResolver tilesViewResolver = new TilesViewResolver();
//뷰 지정
tilesViewResolver.setViewClass(TilesView.class);
return tilesViewResolver;
}
}
kr.spring.main.controller => MainController
package kr.spring.main.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import lombok.extern.slf4j.Slf4j;
@Slf4j //lombok 객체
@Controller
public class MainController {
@GetMapping("/")
public String init() {
return "redirect:/main/main";
}
@GetMapping("/main/main")
public String main() {
return "main"; //Tiles의 설정명
}
}
webapp => WEB-INF => views => template => header,footer,layout_basic.jsp
header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 상단 시작 -->
<h2 class="align-center">SpringPage</h2>
<div class="align-right">
<c:if test="${empty user}">
<a href="${pageContext.request.contextPath}/member/registerUser">회원가입</a>
<a href="${pageContext.request.contextPath}/member/login">로그인</a>
</c:if>
</div>
<!-- 상단 끝 -->
footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 하단시작 -->
<div class="align-center">
© SpringPage
</div>
<!-- 하단끝 -->
layout_basic.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><tiles:getAsString name="title"/></title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/common.css" type="text/css">
</head>
<body>
<div id="main">
<div id="main_header">
<tiles:insertAttribute name="header"/>
</div>
<div id="main_body">
<tiles:insertAttribute name="body"/>
</div>
<div id="main_footer">
<tiles:insertAttribute name="footer"/>
</div>
</div>
</body>
</html>
views=>main=>main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 메인 시작 -->
<div class="page-main">
<h3>메인</h3>
</div>
<!-- 메인 끝-->

기존 파일 응용
ch06_mvcPage에 있는 css/style.css 폴더와 파일을 복사해서 src/main/resources=>static 안에 넣어준다. 그리고 style.css를 common.css로 변경해준다.
common.css 일부 수정 후 실행결과

webapp=>sql => table.sql
--회원관리
create table spmember(
mem_num number not null,
id varchar2(12) unique not null,
nick_name varchar2(30),
auth number(1) default 2 not null, --0탈퇴회원, 1정지회원,2일반회원,9관리자
constraint spmember_pk primary key (mem_num)
);
create table spmember_detail(
mem_num number not null,
au_id varchar2(36) unique, --자동 로그인에 사용되는 식별값
name varchar2(30) not null,
passwd varchar2(35) not null,
phone varchar2(15) not null,
email varchar2(50) not null,
zipcode varchar2(5) not null,
address1 varchar2(90) not null,
address2 varchar2(90) not null,
photo blob,
photo_name varchar2(100),
reg_date date default sysdate not null,
modify_date date,
constraint spmember_detail_pk primary key (mem_num),
constraint spmember_detail_fk foreign key (mem_num)
references spmember (mem_num)
);
create sequence spmember_seq;
kr.spring.member.vo => MemberVO
package kr.spring.member.vo;
import java.io.IOException;
import java.sql.Date;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import org.springframework.web.multipart.MultipartFile;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString(exclude = {"photo"})
public class MemberVO {
private long mem_num;
@Pattern(regexp="^[A-Za-z0-9]{4,12}$")
private String id;
private String nick_name;
private int auth;
private String auto;
private String au_id;
@NotBlank
private String name;
@Pattern(regexp="^[A-Za-z0-9]{4,12}$")
private String passwd;
private String phone;
@Email
@NotBlank
private String email;
@Size(min=5,max=5)
private String zipcode;
@NotBlank
private String address1;
@NotBlank
private String address2;
private byte[] photo;
private String photo_name;
private Date reg_date;
private Date modify_date;
//비밀번호 변경시 현재 비밀번호를 저장하는 용도로 사용
@Pattern(regexp="^[A-Za-z0-9]{4,12}$")
private String now_passwd;
//비밀번호 일치 여부 체크
public boolean ischeckedPassword(String userPasswd) {
if(auth >1 && passwd.equals(userPasswd)) {
return true;
}
return false;
}
//이미지 BOLB 처리
//(주의)폼에서 파일업로드 파라미터네임은 반드시 upload로 지정해야 함
public void setUpload(MultipartFile upload) throws IOException {
//MutipartFile => byte[] 바이트 배열로 변경한다.
setPhoto(upload.getBytes());
//파일이름
setPhoto_name(upload.getOriginalFilename());
}
}
kr.spring.member.dao => MemberMapper
package kr.spring.member.dao;
import org.apache.ibatis.annotations.Mapper;
import kr.spring.member.vo.MemberVO;
@Mapper
public interface MemberMapper {
//회원관리-일반회원
public long selectMem_num();
public void insertMember(MemberVO member);
public void insertMember_detail(MemberVO member);
public MemberVO selectCheckMember(String id);
public MemberVO seleectMember(long mem_num);
public void updatemember(MemberVO member);
public void updatemember_detail(MemberVO member);
public void updatePassword(MemberVO member);
public void deleteMember(long mem_num);
public void deleteMember_detail(long mem_num);
}
kr.spring.member.service => MemberService
package kr.spring.member.service;
import kr.spring.member.vo.MemberVO;
public interface MemberService {
//회원관리-일반회원
public void insertMember(MemberVO member);
public MemberVO selectCheckMember(String id);
public MemberVO seleectMember(long mem_num);
public void updatemember(MemberVO member);
public void updatePassword(MemberVO member);
public void deleteMember(long mem_num);
}
kr.spring.member.service =>MemberServiceImpl
package kr.spring.member.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import kr.spring.member.dao.MemberMapper;
import kr.spring.member.vo.MemberVO;
@Service
@Transactional
public class MemberServiceImpl implements MemberService{
@Autowired
MemberMapper memberMapper;
@Override
public void insertMember(MemberVO member) {
memberMapper.insertMember(member);
}
@Override
public MemberVO selectCheckMember(String id) {
return memberMapper.selectCheckMember(id);
}
@Override
public MemberVO selectMember(long mem_num) {
return memberMapper.selectMember(mem_num);
}
@Override
public void updatemember(MemberVO member) {
memberMapper.updatemember(member);
}
@Override
public void updatePassword(MemberVO member) {
memberMapper.updatePassword(member);
}
@Override
public void deleteMember(long mem_num) {
memberMapper.deleteMember(mem_num);
}
}
kr.spring.member.controller => MemberController
package kr.spring.member.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import kr.spring.member.service.MemberService;
import kr.spring.member.vo.MemberVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class MemberController {
@Autowired
private MemberService memberService;
/* =======================================
* 회원가입
* ======================================*/
//자바빈(VO) 초기화
@ModelAttribute
public MemberVO initCommand() {
return new MemberVO();
}
//회원가입 폼 호출
@GetMapping("/member/registerUser")
public String form() {
return "memberRegister"; //Tiles 설정명
}
}
main.xml 을 똑같이 복사해서 이름을 member.xml로 하나 만든다.
member.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<definition name="memberRegister" extends="main">
<put-attribute name="title" value="회원가입"/>
<put-attribute name="body" value="/WEB-INF/views/member/memberRegister.jsp"/>
</definition>
</tiles-definitions>
Appconfig.java 내용추가
//자바코드 기반 설정 클래스
@Configuration
public class Appconfig implements WebMvcConfigurer {
@Bean
public TilesConfigurer tilesConfigurer() {
final TilesConfigurer configurer = new TilesConfigurer();
//XML 설정 파일 경로 지정
configurer.setDefinitions(new String[] {
"WEB-INF/tiles-def/main.xml",
"WEB-INF/tiles-def/member.xml"
});
configurer.setCheckRefresh(true);
return configurer;
}
"WEB-INF/tiles-def/member.xml" 를 추가한다
views=>member=>memberRegister.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!-- 회원가입 시작 -->
<div class="page-main">
<h2>회원가입</h2>
<form:form action="registerUser" id="member_register" modelAttribute="memberVO">
<ul>
<li>
<form:label path="id">아이디</form:label>
<form:input path="id" placeholder="영문,숫자만 4~12자" autocomplete="off"/>
<input type="button" id="confirmId" value="ID중복체크" class="default-btn">
<span id="message_id"></span>
<form:errors path="id" cssClass="error-color"/>
</li>
<li>
<form:label path="name">이름</form:label>
<form:input path="name"/>
<form:errors path="name" cssClass="error-color"/>
</li>
<li>
<form:label path="nick_name">별명</form:label>
<form:input path="nick_name"/>
<form:errors path="nick_name" cssClass="error-color"/>
</li>
<li>
<form:label path="passwd">비밀번호</form:label>
<form:password path="passwd" placeholder="영문,숫자만 4~12자"/>
<form:errors path="passwd" cssClass="error-color"/>
</li>
<li>
<form:label path="phone">전화번호</form:label>
<form:input path="phone"/>
<form:errors path="phone" cssClass="error-color"/>
</li>
<li>
<form:label path="email">이메일</form:label>
<form:input path="email"/>
<form:errors path="email" cssClass="error-color"/>
</li>
<li>
<form:label path="zipcode">우편번호</form:label>
<form:input path="zipcode"/>
<input type="button" onclick="execDaumPostcode()" value="우편번호 찾기" class="default-btn">
<form:errors path="zipcode" cssClass="error-color"/>
</li>
<li>
<form:label path="address1">주소</form:label>
<form:input path="address1"/>
<form:errors path="address1" cssClass="error-color"/>
</li>
<li>
<form:label path="address2">상세주소</form:label>
<form:input path="address2"/>
<form:errors path="address2" cssClass="error-color"/>
</li>
</ul>
<div class="align-center">
<form:button class="default-btn">전송</form:button>
<input type="button" value="홈으로" class="default-btn" onclick="location.href='${pageContext.request.contextPath}/main/main'">
</div>
</form:form>
<!-- 우편번호 시작 -->
<!-- iOS에서는 position:fixed 버그가 있음, 적용하는 사이트에 맞게 position:absolute 등을 이용하여 top,left값 조정 필요 -->
<div id="layer" style="display:none;position:fixed;overflow:hidden;z-index:1;-webkit-overflow-scrolling:touch;">
<img src="//t1.daumcdn.net/postcode/resource/images/close.png" id="btnCloseLayer" style="cursor:pointer;position:absolute;right:-3px;top:-3px;z-index:1" onclick="closeDaumPostcode()" alt="닫기 버튼">
</div>
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script>
// 우편번호 찾기 화면을 넣을 element
var element_layer = document.getElementById('layer');
function closeDaumPostcode() {
// iframe을 넣은 element를 안보이게 한다.
element_layer.style.display = 'none';
}
function execDaumPostcode() {
new daum.Postcode({
oncomplete: function(data) {
// 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
// 각 주소의 노출 규칙에 따라 주소를 조합한다.
// 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
var addr = ''; // 주소 변수
var extraAddr = ''; // 참고항목 변수
//사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
addr = data.roadAddress;
} else { // 사용자가 지번 주소를 선택했을 경우(J)
addr = data.jibunAddress;
}
// 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
if(data.userSelectedType === 'R'){
// 법정동명이 있을 경우 추가한다. (법정리는 제외)
// 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
extraAddr += data.bname;
}
// 건물명이 있고, 공동주택일 경우 추가한다.
if(data.buildingName !== '' && data.apartment === 'Y'){
extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
}
// 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
if(extraAddr !== ''){
extraAddr = ' (' + extraAddr + ')';
}
//(주의)address1에 참고항목이 보여지도록 수정
// 조합된 참고항목을 해당 필드에 넣는다.
//(수정) document.getElementById("address2").value = extraAddr;
}
//(수정) else {
//(수정) document.getElementById("address2").value = '';
//(수정) }
// 우편번호와 주소 정보를 해당 필드에 넣는다.
document.getElementById('zipcode').value = data.zonecode;
//(수정) + extraAddr를 추가해서 address1에 참고항목이 보여지도록 수정
document.getElementById("address1").value = addr + extraAddr;
// 커서를 상세주소 필드로 이동한다.
document.getElementById("address2").focus();
// iframe을 넣은 element를 안보이게 한다.
// (autoClose:false 기능을 이용한다면, 아래 코드를 제거해야 화면에서 사라지지 않는다.)
element_layer.style.display = 'none';
},
width : '100%',
height : '100%',
maxSuggestItems : 5
}).embed(element_layer);
// iframe을 넣은 element를 보이게 한다.
element_layer.style.display = 'block';
// iframe을 넣은 element의 위치를 화면의 가운데로 이동시킨다.
initLayerPosition();
}
// 브라우저의 크기 변경에 따라 레이어를 가운데로 이동시키고자 하실때에는
// resize이벤트나, orientationchange이벤트를 이용하여 값이 변경될때마다 아래 함수를 실행 시켜 주시거나,
// 직접 element_layer의 top,left값을 수정해 주시면 됩니다.
function initLayerPosition(){
var width = 300; //우편번호서비스가 들어갈 element의 width
var height = 400; //우편번호서비스가 들어갈 element의 height
var borderWidth = 5; //샘플에서 사용하는 border의 두께
// 위에서 선언한 값들을 실제 element에 넣는다.
element_layer.style.width = width + 'px';
element_layer.style.height = height + 'px';
element_layer.style.border = borderWidth + 'px solid';
// 실행되는 순간의 화면 너비와 높이 값을 가져와서 중앙에 뜰 수 있도록 위치를 계산한다.
element_layer.style.left = (((window.innerWidth || document.documentElement.clientWidth) - width)/2 - borderWidth) + 'px';
element_layer.style.top = (((window.innerHeight || document.documentElement.clientHeight) - height)/2 - borderWidth) + 'px';
}
</script>
<!-- 우편번호 끝 -->
</div>
<!-- 회원가입 끝 -->
static=>css=>member.css
@charset "UTF-8";
/* 회원가입 등록, 수정, 삭제 폼
------------------------*/
#member_register{
width:800px;
}
#member_regisger ul, #member_modify ul{
padding-left:120px;
}
#member_register input[id="id"]{
width:236px;
}
#member_register input[id="zipcode"],#member_modify input[id="zipcode"]{
width:220px;
}
#member_modify{
width:96%;
}
#member_delete input[id="id"],#member_delete input[id="passwd"]{
width:240px;
}
/* 로그인
---------------------*/
#login_form{
width:300px;
margin:0 auto;
padding:0;
border:none;
}
#login_form ul{
padding:0;
}
.floating-label{/*floating label 설정*/
position:relative;
}
.floating-label > .form-input{
width:300px;
height:32px;
padding:0.55rem 0.55rem;
}
.floating-label > label{
position:absolute;
top:0;
left:0;
padding:1.05rem 0.75rem;
transition:all 0.25s;
}
.floating-label > .form-input::placeholder{
color:transparent;
}
.floating-label > .form-input:focus,
.floating-label > .form-input:not(:placeholder-shown){
padding-top:1.125rem;
padding-bottom:0.125rem;
}
.floating-label > .form-input:focus + label,
.floating-label > .form-input:not(:placeholder-shown) + label{
opacity:0.65;
transform:scale(0.85) translateY(-0.5rem) translateX(-0.5rem);
}
/* MY페이지
---------------------*/
.mypage-div{
width:48%;
float:left;
padding:5px;
}
.mypage-end{
clear:both;
}
.my-photo{
object-fit:cover;
/*정사각형이 아니라 직사각형일 경우 원 안에 보여지게 할 중심 이미지의 위치를 지정*/
object-position:top;
/*사각형의 모서리 둥근 정도를 지정하는 속성,50%를 지정하면 완전한 원*/
border-radius:50%;
}
common.css 내용추가
/* 공통 목록
---------------------*/
form#search_form{
width:98%;
padding-bottom:0;
border:none;
}
ul.search{
width:380px;
list-style:none;
padding:0;
margin:0 auto;
}
ul.search li{
margin:0 0 9px 0;
padding:0;
display:inline;
}
ul.search li select{
height:30px;
}
.list-space{
width:700px;
margin:10px auto;
}
table{
width:100%;
border:1px solid #000;
border-collapse:collapse;
margin-top:5px;
}
table td, table th{
border:1px solid #000;
padding:5px;
}
/* 공동 버튼
---------------------*/
[type="submit"],[type="button"]{
height:30px;
}
.menu-btn{
width:100%;
height:50px;
font-size:12pt;
background-color:#fcfcfc;
border-color:#b7b5b5;
border-radius:5px;
}
.default-btn{
padding:4px 20px;
border:1px solid #09aa5c;
border-radius:2px;
color:#fff; /* 흰색 */
background-color:#09aa5c;
font-weight:bold;
cursor:pointer;
}
.default-btn:hover{
background-color: #FFF;
color:#09aa5c;
transition:0.2s ease-out;
height:30px;
}
member.xml 내용추가
<put-attribute name="css" value="/WEB-INF/views/member/memberCSS.jsp"/>
member=>memberCSS.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/member.css" type="text/css">
membercss.jsp를 이제 include하기위해 수정작업을 해야됨
member.xml에 있는 name="css"부분과 연결 필요함.
layout_basic.jsp에 내용추가
<tiles:insertAttribute name="css" ignore="true"/>

common.css 내용수정
/* 공통 등록, 수정 폼
---------------------*/
form{
width:600px;
margin:0 auto;
border:1px solid #000;
padding:10px 10px 30px 10px;
}
form ul li label{
width:110px;
display:inline-block;
}
ul {
list-style:none;
}
input,select{
margin-top:4px;
padding:5px;
}
input[type="text"],input[type="password"],
input[type="email"]{
width:350px;
}

MemberMapper 추가
//회원관리-일반회원
@Select("SELECT spmember_seq.nextval FROM dual")
public Long selectMem_num();
@Insert("INSERT INTO spmember (mem_num,id,nick_name) VALUES (#{mem_num},#{id},#{nick_name})") //auth값은 자동으로들어가서 안넣음
public void insertMember(MemberVO member);
ch12에 있는 BoardMapper.xml을 가져와서
MemberMapper.xml로 이름수정 및 내용수정
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.spring.member.dao.MemberMapper"> <!-- 인터페이스 파일과 명칭을 같게 해야됨 --> <!-- 이걸써야지 class 파일을 따로 만들지않아도 작동이 자동으로 연동되어 작동가능 -->
<!-- 회원가입 -->
<insert id="insertMember_detail" parameterType="memberVO">
INSERT INTO spmember_detail (
mem_num,
name,
passwd,
phone,
email,
zipcode,
address1,
address2)
VALUES (
#{mem_num},
#{name},
#{passwd},
#{phone},
#{email},
#{zipcode},
#{address1},
#{address2}
)
</insert>
</mapper>
MemberServiceImpl을 미리 써놨지만 내가 잘못쓴거라 수정
다른 것들도 아마 틀렸을 것으로 예상
@Override
public void insertMember(MemberVO member) {
member.setMem_num(memberMapper.selectMem_num());
memberMapper.insertMember(member);
memberMapper.insertMember_detail(member);
}
MemberController 내용추가
//전송된 데이터 처리
@PostMapping("/member/registerUser")
public String submit(@Valid MemberVO memberVO, BindingResult result, Model model,HttpServletRequest request) {
log.debug("<<회원가입>> :" + memberVO);
//유효성 체크 결과 오류가 있으면 폼 호출
if(result.hasErrors()) {
return form();
}
//회원가입
memberService.insertMember(memberVO);
//UI 메시지 처리
model.addAttribute("accessTitle", "회원가입");
model.addAttribute("accessMsg", "회원가입이 완료되었습니다.");
model.addAttribute("accessBtn", "홈으로");
model.addAttribute("accessUrl", request.getContextPath()+"/main/main");
return "common/resultView";
}
views=>common=>resultView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${accessTitle}</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/common.css" type="text/css">
</head>
<body>
<div class="page-one">
<h2>${accessTitle}</h2>
<div class="result-display">
<div class="align-center">
${accessMsg}
<p>
<input type="button" value="${accessBtn}" onclick="location.href='${accessUrl}'">
</div>
</div>
</div>
</body>
</html>


'쌍용교육(JAVA) > SpringBoot' 카테고리의 다른 글
쌍용교육 -JSP수업 92일차 ch15SpringPage(3) (1) | 2024.06.27 |
---|---|
쌍용교육 -JSP수업 91일차 ch15SpringPage(2) (0) | 2024.06.26 |
쌍용교육 -JSP수업 89일차 ch14SpringThymeleadf(2) (0) | 2024.06.25 |
쌍용교육 -JSP수업 88일차 ch14SpringThymeleadf (0) | 2024.06.24 |
쌍용교육 -JSP수업 87일차 ch13SpringTiles(1) (0) | 2024.06.24 |