✿∘˚˳°∘°

75일차 : SpringMVC - 회원, 공지사항 본문

국비수업/Spring

75일차 : SpringMVC - 회원, 공지사항

_HYE_ 2023. 3. 15. 21:40

20230315

 

1. Member : 전체회원조회 / 로그인 / 로그아웃 / 회원가입 / 마이페이지(정보수정) / 회원탈퇴 

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Spring MVC CRUD</h1>
	<hr>
	<c:choose>
		<c:when test="${not empty sessionScope.m }">
			<h3>[${sessionScope.m.memberName }]님 환영합니다.</h3>
			<h3><a href="/logout.do">로그아웃</a></h3>
			<form action="/searchMember.do" method="get">
				조회할 회원 아이디 입력 : 
				<input type="text" name="memberId">
				<input type="submit" value="조회">
			</form>
		<h3><a href="/allMember.do">전체회원조회</a></h3>
		<h3><a href="/mypage.do">마이페이지</a></h3>
		<h3><a href="/deleteMember.do?memberNo=${sessionScope.m.memberNo }">회원탈퇴</a></h3>
		<h3><a href="/noticeList.do">공지사항</a></h3>
		</c:when>
		<c:otherwise>
			<form action="/login.do" method="post">
				<fieldset>
					<legend>로그인</legend>
					아이디 : <input type="text" name="memberId"><br>
					비밀번호 : <input type="password" name="memberPw"><br>
					<input type="submit" value="로그인">
				</fieldset>
			</form>
			<h3><a href="/joinFrm.do">회원가입</a></h3>
		</c:otherwise>
	</c:choose>
</body>
</html>

VO 

Member

package kr.or.member.model.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
	private int memberNo;
	private String memberId;
	private String memberPw;
	private String memberName;
	private String memberPhone;
	private String memberEmail;
}

MemberRowMapper

package kr.or.member.model.vo;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

//select를 하고 while 또는  if 에서 해주던 rset.getString 작업을 해줄 것
public class MemberRowMapper implements RowMapper{

	@Override
	public Object mapRow(ResultSet rset, int rowNum) throws SQLException {
		Member m = new Member();
		m.setMemberNo(rset.getInt("member_no"));
		m.setMemberId(rset.getString("member_id"));
		m.setMemberPw(rset.getString("member_pw"));
		m.setMemberName(rset.getString("member_name"));
		m.setMemberPhone(rset.getString("member_phone"));
		m.setMemberEmail(rset.getString("member_email"));
		return m;
	}
}

 

1 - 1 ) 회원가입

Controller : joinFrm으로 이동하기 위한 메소드(joinFrm.do)

	@RequestMapping(value="/joinFrm.do")
	public String joinFrm() {
		return "member/joinFrm";
	}

joinFrm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/join.do" method="post">
		<fieldset>
			<legend>회원가입</legend>
			아이디 : <input type="text" name="memberId"><br>
			비밀번호 : <input type="password" name="memberPw"><br>
			이름 : <input type="text" name="memberName"><br>
			전화번호 : <input type="text" name="memberPhone" placeholder="010-0000-0000"><br>
			이메일 : <input type="text" name="memberEmail"><br>
			<input type="submit" value="회원가입">
			<input type="reset" value="취소">
		</fieldset>
	</form>
</body>
</html>

Controller : insert를 진행하기위한 controller(join.do)

	@RequestMapping(value="/join.do")
	public String join(Member m) {
		//String memberId, String memberPw, String memberName, String memberPhone, String memberEmail
		//값추출할 name값과 매개변수명을 반드시 맞춰줘야한다.
		//lombok에서 기능을 지원해줘서 Member m 으로도 받을 수 있음
		//만약 jsp에서 넘겨주지 않은 값이 있으면 기본값을 받는다.(int면 0)
		int result = service.insertMember(m);
		if(result > 0) {
			//메인페이지로 보내주기
			//viewresolver를 거치지 않고 페이지를 이동하고 싶은 경우(다른 컨트롤러를 호출할경우)
			//(viewresolver는 WEB-INF/view/...jsp를 포함하므로)
			return "redirect:/"; //redirect: 를 사용하면 viewresolver를 거치지않음
		}else {
			return "member/joinFrm";			
		}
	}

Service

	public int insertMember(Member m) {
		int result = dao.insertMember(m);
		return result;
	}

Dao

	public int insertMember(Member m) {
		String query = "insert into member_tbl values(member_seq.nextval, ?, ?, ?, ?, ?)";
		Object[] params = {m.getMemberId(), m.getMemberPw(), m.getMemberName(), m.getMemberPhone(), m.getMemberEmail()};
		int result = jdbc.update(query, params);
		return result;
	}

 

1 - 2 ) 로그인

Controller

	@RequestMapping(value="/login.do")
	public String login(Member member, HttpSession session) {
		//매개변수 두개로 받아도 되고, Member로 받아도된다.(보내준 값만 값이 들어있고 나머지는 기본값(0, null)
		Member loginMember = service.selectOneMember(member);
		if(loginMember != null) {
			session.setAttribute("m", loginMember);
		}
		return "redirect:/";
	}

Service

	public Member selectOneMember(Member member) {
		/*
		Member loginMember = dao.selectOneMember(member);
		return loginMember;
		*/
		return dao.selectOneMember(member);
	}

Dao

	public Member selectOneMember(Member member) {
		String query = "select * from member_tbl where member_id = ? and member_pw = ?";
		Object[] params = {member.getMemberId(), member.getMemberPw()};
		List list = jdbc.query(query, params, new MemberRowMapper());
		if(list.isEmpty()) {
			return null;
		}else {
			Member loginMember = (Member)list.get(0);
			return loginMember;
		}		
	}

1 - 3 ) 로그아웃

Controller

	@RequestMapping(value="/logout.do")
	public String logout(HttpSession session) {
		session.invalidate();
		return "redirect:/";
	}

 

1 - 4 ) 회원탈퇴

Controller

	@RequestMapping(value="/deleteMember.do")
	public String deleteMember(int memberNo) {
		int result = service.deleteMember(memberNo);
		if(result > 0) {
			return "redirect:/logout.do";
		}else {
			return "redirect:/";
		}
	}

Service

	public int deleteMember(int memberNo) {
		return dao.deleteMember(memberNo);
	}

Dao

	public int deleteMember(int memberNo) {
		String query = "delete from member_tbl where member_no = ?";
		Object[] params = {memberNo};
		int result = jdbc.update(query, params);
		return result;
	}

 

1 - 5 ) 전체회원조회

Controller

	@RequestMapping(value="/allMember.do")
	public String allMember(Model model) {
		//매개변수가 없으므로 값추출할게 X 바로 비즈니스로직으로 가면된다.
		ArrayList<Member> list = service.selectAllMember();
		model.addAttribute("list", list);
		return "member/allMember";
	}

Service

	public ArrayList<Member> selectAllMember() {
		ArrayList<Member> list = dao.selectAllMember();
		return list;
	}

Dao

	public ArrayList<Member> selectAllMember() {
		String query = "select * from member_tbl";
		//위치홀더가 없기 때문에 Object[] params = {} 생략
		List list = jdbc.query(query, new MemberRowMapper());
		return (ArrayList<Member>)list;
	}

화면구현 JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>전체회원조회</h1>
	<hr>
	<table border="1">
		<tr>
			<th>회원번호</th>
			<th>아이디</th>
			<th>비밀번호</th>
			<th>이름</th>
			<th>전화번호</th>
			<th>이메일</th>
		</tr>
		<c:forEach items="${list}" var="m">
			<tr>
				<td>${m.memberNo }</td>
				<td>${m.memberId }</td>
				<td>${m.memberPw }</td>
				<td>${m.memberName }</td>
				<td>${m.memberPhone }</td>
				<td>${m.memberEmail }</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

 

1 - 6 )  마이페이지+정보수정

Controller

- mypage이동 메소드

	@RequestMapping(value="/mypage.do")
	public String mypage(){
		return "member/mypage";
	}

- mypage 화면 JSP(정보수정 폼)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/updateMember.do" method="post">
		<fieldset>
			<legend>마이페이지</legend>
			회원 번호 : <input type="text" name="memberNo" value="${sessionScope.m.memberNo }" readonly><br>
			아이디 : <input type="text" name="memberId" value="${sessionScope.m.memberId }" readonly><br>
			비밀번호 : <input type="text" name="memberPw" value="${sessionScope.m.memberPw }"><br>
			이름 : <input type="text" name="memberName" value="${sessionScope.m.memberName }" readonly><br>
			전화번호 : <input type="text" name="memberPhone" value="${sessionScope.m.memberPhone }"><br>
			이메일 : <input type="text" name="memberEmail" value="${sessionScope.m.memberEmail }"><br>
			<input type="submit" value="정보수정">
		</fieldset>
	</form>
	<a href="/">메인페이지로</a>
</body>
</html>

- 정보수정 Controller

	@RequestMapping(value="/updateMember.do")
	//Member m : 변경값을 적어준 변수
	//Member member : 세션에 저장되어 있는 값을 불러올 변수 
	//@SessionAttribute(required = false) Member member
	// : 세션에서 이름이 m인 객체를 꺼내서 Member타입으로 저장(자료형 맞아야함, 세션에 저장되어있는 정보가 Member)
	// : required = false 가 없는 경우, 이름이 m인 객체가 없으면 에러발생 
	public String upadateMember(Member member, @SessionAttribute(required = false) Member m) {
		int result = service.updateMember(member);
		if(result > 0) {
			//세션에 m이라는 이름으로 로그인 객체를 넣어둔걸 가져옴 
			//정석방법
			//Member member = (Member)session.getAttribute("m");
			m.setMemberPw(member.getMemberPw());
			m.setMemberPhone(member.getMemberPhone());
			m.setMemberEmail(member.getMemberEmail());
			
			return "member/mypage";
		}else {
			return "redirect:/";
		}
	}

Service

	public int updateMember(Member member) {
		return dao.updateMember(member);
	}

Dao

	public int updateMember(Member member) {
		String query = "update member_tbl set member_pw = ?, member_phone = ?, member_email = ? where member_no = ?";
		Object[] params = {member.getMemberPw(), member.getMemberPhone(), member.getMemberEmail(), member.getMemberNo()};
		int result = jdbc.update(query, params);
		return result;
	}

 

2. Notice : 공지사항리스트 / 공지사항 상세 / 공지사항작성 / 수정(작성자만) / 삭제 (작성자만)

- 사전작업 : Controller / Service / Dao / VO

@Controller
//spring한테 객체를 만들라고 지시(context-scan과 함께 이루어져야한다.)
public class NoticeController {
	
	@Autowired //이거없이 선언만 해놓으면 안에는 null이 들어있지만 AutoWired를 사용하면 null(X)
	private NoticeService service;
	
	public NoticeController() {
		super();
	}
}
@Service
public class NoticeService {
	@Autowired
	private NoticeDao dao;

	public NoticeService() {
		super();
	}
}
@Repository
public class NoticeDao {
	@Autowired
	private JdbcTemplate jdbc;

	public NoticeDao() {
		super();
		// TODO Auto-generated constructor stub
	}
}
package kr.or.notice.model.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Notice {
	private int noticeNo;
	private String noticeTitle;
	private String noticeWriter;
	private String noticeContent;
	private String noticeDate;
}
package kr.or.notice.model.vo;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

public class NoticeRowMapper implements RowMapper{
	@Override
	public Object mapRow(ResultSet rset, int rowNum) throws SQLException {
		Notice n = new Notice();
		n.setNoticeContent(rset.getString("notice_content"));
		n.setNoticeDate(rset.getString("notice_date"));
		n.setNoticeNo(rset.getInt("notice_no"));
		n.setNoticeTitle(rset.getString("notice_title"));
		n.setNoticeWriter(rset.getString("notice_writer"));
		return n;
	}
}

 

2 - 1 ) 공지사항 리스트

Controller

	@RequestMapping(value="/noticeList.do")
	public String noticeList(Model model) {
		ArrayList<Notice> list = service.selectAllNotice();
		model.addAttribute("list", list);
		return "notice/noticeList";
	}

Service

	public ArrayList<Notice> selectAllNotice() {
		return dao.selectAllNotice();
	}

Dao

	public ArrayList<Notice> selectAllNotice() {
		String query = "select * from notice";
		List list = jdbc.query(query, new NoticeRowMapper());
		return (ArrayList<Notice>)list;
	}

화면구현 JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>공지사항</h1>
	<hr>
	<c:if test="${not empty sessionScope.m }">
		<a href="/noticeFrm.do">글작성</a>
	</c:if>
	<table border="1">
		<tr>
			<th style="width:10%">글번호</th>
			<th style="width:50%">제목</th>
			<th style="width:20%">작성자</th>
			<th style="width:20%">작성일</th>
		</tr>
		<c:forEach items="${list }" var="n">
			<tr onclick = "location.href='/noticeView.do?noticeNo=${n.noticeNo}'">
				<td>${n.noticeNo }</td>
				<td>${n.noticeTitle }</td>
				<td>${n.noticeWriter }</td>
				<td>${n.noticeDate }</td>
			</tr>
		</c:forEach>
	</table>
	<a href="/">메인으로</a>
</body>
</html>

2 - 2 ) 공지사항 상세보기

Controller

	@RequestMapping(value="/noticeView.do")
	public String noticeView(int noticeNo, Model model) {
		Notice n = service.selectOneNotice(noticeNo);
		if(n != null) {
			model.addAttribute("n", n);
			return "notice/noticeView";
		}else {
			return "notice/noticeList";
		}
	}

Service

	public Notice selectOneNotice(int noticeNo) {
		return dao.selectOneNotice(noticeNo);
	}

Dao

	public Notice selectOneNotice(int noticeNo) {
		String query = "select * from notice where notice_no = ?";
		Object[] params = {noticeNo};
		List list = jdbc.query(query, params, new NoticeRowMapper());
		Notice n = (Notice)list.get(0);
		return n;
	}

화면구현 JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>공지사항 상세</h1>
	<hr>
	<table border="1">
		<tr>
			<th colspan="2">제목</th>
			<td colspan="2">${n.noticeTitle }</td>
		</tr>
		<tr>
			<th>작성자</th>
			<td>${n.noticeWriter }</td>
			<th>작성일</th>
			<td>${n.noticeDate }</td>
		</tr>
		<tr style="height:500px; padding: 20px;">
			<td colspan="4">${n.noticeContent }</td>
		</tr>
	</table>
	<c:if test="${not empty sessionScope.m && sessionScope.m.memberId.equals(n.noticeWriter)}">
		<a href="/updateNoticeFrm.do?noticeNo=${n.noticeNo }">수정</a>
		<a href="/deleteNotice.do?noticeNo=${n.noticeNo }">삭제</a>
	</c:if>
	<a href="/noticeList.do">목록으로</a>
</body>
</html>

 

2 - 3 ) 공지사항 작성

Controller - 작성폼으로 이동해주는 메소드

	@RequestMapping(value="/noticeFrm.do")
	public String noticeFrm(){
		return "notice/noticeFrm";
	}

공지사항 작성폼 JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>공지사항 작성</h1>
	<hr>
	<form action="/insertNotice.do" method="post">
		<fieldset>
			<legend>공지사항작성</legend>
			<table border="1">
				<tr>	
					<th>제목</th>
					<td><input type="text" name="noticeTitle"></td>
				</tr>
				<tr>
					<th>작성자</th>
					<td><input type="text" name="noticeWriter" value="${sessionScope.m.memberId }" readonly></td>
				</tr>
				<tr>
					<th colspan="2">내용</th>
				</tr>
				<tr>
					<td colspan="2"><textarea name="noticeContent"></textarea></td>
				</tr>
			</table>
			<input type="submit" value="작성하기">
			<input type="reset" value="취소">
		</fieldset>
	</form>
	
</body>
</html>

Controller - 공지사항 Insert

	@RequestMapping(value="/insertNotice.do")
	public String insertNotice(Notice n) {
		int result = service.insertNotice(n);
		if(result > 0) {
			//list를 가려면 controller를 통해가야 값을 넣기때문에 redirect:/noticeList.do로 먼저가야한다
			return "redirect:/noticeList.do";
		}else {
			return "notice/noticeFrm";
		}
	}

Service

	public int insertNotice(Notice n) {
		return dao.insertNotice(n);
	}

Dao

	public int insertNotice(Notice n) {
		String query = "insert into notice values(notice_seq.nextval, ?, ?, ?, to_char(sysdate, 'yyyy-mm-dd'))";
		Object[] params = {n.getNoticeTitle(), n.getNoticeWriter(), n.getNoticeContent()};
		int result = jdbc.update(query, params);
		return result;
	}

 

2 - 4 ) 공지사항 수정

Controller - 수정입력폼으로 이동해줄 메소드

	@RequestMapping(value="/updateNoticeFrm.do")
	public String updateNoticeFrm(int noticeNo, Model model) {
		Notice n = service.selectOneNotice(noticeNo);
		if(n != null) {
			model.addAttribute("n", n);
			return "notice/updateNoticeFrm";			
		}else {
			return "redirect:/";
		}
	}

수정입력폼 JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>공지사항 수정</h1>
	<hr>
	<form action="/updateNotice.do" method="post">
		<fieldset>
			<legend>공지사항수정</legend>
			<table border="1">
				<tr><td><input type="hidden" name="noticeNo" value="${n.noticeNo }"></td></tr>
				<tr>	
					<th>제목</th>
					<td><input type="text" name="noticeTitle" value="${n.noticeTitle }"></td>
				</tr>
				<tr>
					<th>작성자</th>
					<td><input type="text" name="noticeWriter" value="${n.noticeWriter}" readonly></td>
				</tr>
				<tr>
					<th colspan="2">내용</th>
				</tr>
				<tr>
					<td colspan="2"><textarea name="noticeContent">${n.noticeContent }</textarea></td>
				</tr>
			</table>
			<input type="submit" value="작성하기">
			<input type="reset" value="취소">
		</fieldset>
	</form>
</body>
</html>

Controller - update를 진행할 메소드

	@RequestMapping(value="/updateNotice.do")
	public String updateNotice(Notice n) {
		int result = service.updateNotice(n);
		if(result > 0) {
			return "redirect:/noticeView.do?noticeNo="+n.getNoticeNo();
		}else {
			return "redirect:/updateNoticeFrm.do";
		}
	}

Service

	public int updateNotice(Notice n) {
		return dao.updateNotice(n);
	}

Dao

	public int updateNotice(Notice n) {
		String query = "update notice set notice_title = ?, notice_content = ? where notice_no = ?";
		Object[] params = {n.getNoticeTitle(), n.getNoticeContent(), n.getNoticeNo()};
		int result = jdbc.update(query, params);
		return result;
	}

 

2 - 5 ) 공지사항 삭제

Controller

	@RequestMapping(value="/deleteNotice.do")
	public String deleteNotice(int noticeNo) {
		int result = service.deleteNotice(noticeNo);
		if(result > 0) {
			return "redirect:/noticeList.do";
		}else {
			return "redirect:/noticeView.do?noticeNo="+noticeNo;
		}
	}

Service

	public int deleteNotice(int noticeNo) {
		return dao.deleteNotice(noticeNo);
	}

Dao

	public int deleteNotice(int noticeNo) {
		String query = "delete from notice where notice_no = ?";
		Object[] params = {noticeNo};
		int result = jdbc.update(query, params);
		return result;
	}

 

'국비수업 > Spring' 카테고리의 다른 글

79일차 : Dynamic Mybatis  (0) 2023.03.21
78일차 : Mybatis  (0) 2023.03.21
77일차 : SpringMVC - 게시판2  (0) 2023.03.17
76일차 : 정규화, SpringMVC - 게시판  (0) 2023.03.16
74일차 : loC, DI, springMVC  (0) 2023.03.14
Comments