728x90
Spring - 회원 상세정보 조회 구현
1. 컨트롤러(흐름제어)
MemberController
회원 상세정보 조회 매핑(view.do)
model에 회원 상세정보 저장후 member_view.jsp로 포워딩
package com.example.spring01.member.controller; import java.util.List; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import com.example.spring01.member.model.dto.MemberVO; import com.example.spring01.member.service.MemberService; @Controller // 현재의 클래스를 controller bean에 등록시킴 public class MemberController { private static final Logger logger = LoggerFactory.getLogger(MemberController.class); // MemberService 객체를 스프링에서 생성하여 주입시킴 @Inject MemberService memberService; // 01 회원 목록 // url pattern mapping @RequestMapping("member/list.do") public String memberList(Model model){ // controller => service => dao 요청 List<MemberVO> list = memberService.memberList(); model.addAttribute("list", list); return "member/member_list"; } // 02_01 회원 등록 페이지로 이동 @RequestMapping("member/write.do") public String memberWrite(){ return "member/member_write"; } // 02_02 회원 등록 처리 후 ==> 회원목록으로 리다이렉트 // @ModelAttribute에 폼에서 입력한 데이터가 저장된다. @RequestMapping("member/insert.do") // * 폼에서 입력한 데이터를 받아오는 법 3가지 //public String memberInsert(HttpServlet request){ //public String memberInsert(String userId, String userPw, String userName, String userEmail){ public String memberInsert(@ModelAttribute MemberVO vo){ // 테이블에 레코드 입력 memberService.insertMember(vo); // * (/)의 유무에 차이 // /member/list.do : 루트 디렉토리를 기준 // member/list.do : 현재 디렉토리를 기준 // member_list.jsp로 리다이렉트 return "redirect:/member/list.do"; } // 03 회원 상세정보 조회 @RequestMapping("member/view.do") public String memberView(String userId, Model model){ // 회원 정보를 model에 저장 model.addAttribute("dto", memberService.viewMember(userId)); //System.out.println("클릭한 아이디 확인 : "+userId); logger.info("클릭한 아이디 : "+userId); // member_view.jsp로 포워드 return "member/member_view"; } } | cs |
2. 서비스(비지니스로직, DB연동 이외의 작업)
MemberServiceImpl
viewMember메서드 호출
package com.example.spring01.member.service; import java.util.List; import javax.inject.Inject; import org.springframework.stereotype.Service; import com.example.spring01.member.model.dao.MemberDAOImpl; import com.example.spring01.member.model.dto.MemberVO; // 현재 클래스를 스프링에서 관리하는 service bean으로 등록 @Service public class MemberServiceImpl implements MemberService { // MemberDAOImpl 객체를 스프링에서 생성하여 주입시킴 @Inject MemberDAOImpl memberDao; // 01. 전체 회원 목록 조회 @Override public List<MemberVO> memberList() { return memberDao.memberList(); } // 02. 회원 등록 @Override public void insertMember(MemberVO vo) { memberDao.insertMember(vo); } // 03. 회원 정보 상세 조회 @Override public MemberVO viewMember(String userId) { return memberDao.viewMember(userId); } @Override public void deleteMember(String userId) { } @Override public void updateMember(MemberVO vo) { } } | cs |
3. 모델(비지니스로직, DB연동)
MemberDAOImpl
selectOne메서드 호출
package com.example.spring01.member.model.dao; import java.util.List; import javax.inject.Inject; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Repository; import com.example.spring01.member.model.dto.MemberVO; // 현재 클래스를 DAO bean으로 등록시킴 @Repository public class MemberDAOImpl implements MemberDAO { // SqlSession 객체를 스프링에서 생성하여 주입시켜준다. // 의존관계 주입(Dependency Injection, DI) // 느스한 결함 // IoC(Inversion of Control, 제어의 역전) @Inject // Inject애노테이션이 없으면 sqlSession은 null상태이지만 // Inject애노테이션이 있으면 외부에서 객체를 주입시켜주게 된다. // try catch문, finally문, 객체를 close할 필요가 없어졌다. SqlSession sqlSession; // 01. 전체 회원 목록 조회 @Override public List<MemberVO> memberList() { return sqlSession.selectList("member.memberList"); } // 02. 회원 등록 @Override public void insertMember(MemberVO vo) { sqlSession.insert("member.insertMember", vo); } // 03. 회원 정보 상세 조회 @Override public MemberVO viewMember(String userId) { return sqlSession.selectOne("member.viewMember", userId); } @Override public void deleteMember(String userId) { // TODO Auto-generated method stub } @Override public void updateMember(MemberVO vo) { // TODO Auto-generated method stub } } | cs |
MemberMapper.xml
회원 정보 상세 조회 쿼리 작성(Select쿼리 where조건절)
<?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와 중복되지 않도록 네임스페이스 기재 --> <mapper namespace="member"> <!-- 01. 회원록록 --> <select id="memberList" resultType="com.example.spring01.member.model.dto.MemberVO"> SELECT user_id AS userId, user_name AS userName, user_email AS userEmail, user_regdate AS userRegdate FROM tbl_member ORDER BY userId </select> <!-- 02. 회원 등록 --> <insert id="insertMember"> INSERT INTO tbl_member (user_id, user_pw, user_name, user_email) VALUES (#{userId}, #{userPw}, #{userName}, #{userEmail}) </insert> <!-- 03. 회원정보 상세조회 --> <select id="viewMember" resultType="com.example.spring01.member.model.dto.MemberVO"> SELECT user_id AS userId, user_name AS userName, user_email AS userEmail, user_regdate AS userRegdate, user_regdate AS userUpdatedate FROM tbl_member WHERE user_id = #{userId} </select> </mapper> | cs |
4. 뷰
member_header.jsp
jstl 시간 출력 태그 추가
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- jstl 코어 태그 --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!-- jstl 시간 출력 태그 --> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <!-- context 경로 --> <c:set var="path" value="${pageContext.request.contextPath}"/> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> </head> | cs |
member_list.jsp
회원정보 상세 조회를 위해서 회원목록의 이름 태그에 a태그 추가
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>회원 목록</title> <%@ include file="../include/member_header.jsp" %> </head> <body> <%@ include file="../include/member_menu.jsp" %> <h2>회원 목록</h2> <input type="button" value="회원등록" onclick="location.href='${path}/member/write.do'"> <table border="1" width="700px"> <tr> <th>아이디</th> <th>이름</th> <th>이메일</th> <th>회원가입일자</th> </tr> <c:forEach var="row" items="${list}"> <tr> <td>${row.userId}</td> <!-- 회원정보 상세조회를 위해 a태그 추가 --> <td><a href="${path}/member/view.do?userId=${row.userId}">${row.userName}</a></td> <td>${row.userEmail}</td> <td>${row.userRegdate}</td> </tr> </c:forEach> </table> </body> </html> | cs |
member_view.jsp
회원정보 상세보기 페이지 작성
회원가입일자와 회원정보 수정일자에 시간도 함께 출력하기 위해서 fmt 태그 추가
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>회원정보 상세 페이지</title> <%@ include file="../include/member_header.jsp" %> </head> <body> <%@ include file="../include/member_menu.jsp" %> <h2>회원정보 상세</h2> <form name="form1" method="post"> <table border="1" width="400px"> <tr> <td>아이디</td> <!-- id는 수정이 불가능하도록 readonly속성 추가 --> <td><input name="userId" value="${dto.userId}" readonly="readonly"></td> </tr> <tr> <td>비밀번호</td> <td><input type="password" name="userPw"></td> </tr> <tr> <td>이름</td> <td><input name="userName" value="${dto.userName}"></td> </tr> <tr> <td>회원가입일자</td> <td> <fmt:formatDate value="${dto.userRegdate}" pattern="yyyy-MM-dd HH:mm:ss"/> </td> </tr> <tr> <td>회원정보 수정일자</td> <td> <fmt:formatDate value="${dto.userUpdatedate}" pattern="yyyy-MM-dd HH:mm:ss"/> </td> </tr> <tr> <td colspan="2" align="center"> <input type="button" value="수정" id="btnUpdate"> <input type="button" value="삭제" id="btnDelete"> </td> </tr> </table> </form> </body> </html> | cs |
5. 실행화면
전체 회원 목록에서 회원 이름을 클릭하면 회원정보 상세보기 페이지로 이동
회원정보 상세보기화면에서 id는 수정이 불가능하도록 readonly속성 추가