국비교육(22-23)

52일차(1)/Spring(10) : 회원가입, 로그인, 로그아웃, 회원정보 보기 기능 구현

서리/Seori 2022. 12. 20. 23:11

- Spring04_Final MVC프로젝트 생성

 

- myBatis 기반으로 DB 연동할 준비하기

- servlet-context 에 이 3가지 추가해주기

- DAO에 DI 되기 위해 필요한 요소들!

 

- myBatis 관련 설정은 configuration.xml에서 시작된다.

- classpath:의 경로는 src-resources 이다. 기억하기!

 

 

- Mapper와 configuration 앞선 프로젝트에서 복사해와서 수정

 

- Datasource 설정이 제대로 되려면 기본 Tomcat 서버의 context.xml 에 이 내용이 있어야 한다.

 

- 위의 모든 조건이 맞아야만 DB 연동이 가능한 것!

 


 

com.sy.spring04.users.controller / service / dto / dao 패키지 생성

 

UsersController (전체)

package com.sy.spring04.users.controller;

import java.net.URLEncoder;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.sy.spring04.users.dto.UsersDto;
import com.sy.spring04.users.service.UsersService;

@Controller
public class UsersController {

	@Autowired
	private UsersService service;
	
	/*
	 * GET 방식 /users/signup_form 요청을 처리할 메소드
	 * - 요청방식이 다르면 실행되지 않는다.
	 */
	@RequestMapping(method = RequestMethod.GET, value = "/users/signup_form")
	public String signupform() {
		
		return "users/signup_form";
	}
	//회원가입 요청 처리
	@RequestMapping(method = RequestMethod.POST, value = "/users/signup")
	public ModelAndView signup(ModelAndView mView, UsersDto dto) {
		service.addUser(dto);
		mView.setViewName("users/signup");		
		return mView;
	}
	//로그인 폼 요청 처리
	@RequestMapping(method = RequestMethod.GET, value="/users/loginform")
	public String loginForm() {
		
		return "users/loginform";
	}	
	//로그인 요청 처리
	@RequestMapping("/users/login")
	public ModelAndView login(ModelAndView mView, UsersDto dto, String url, HttpSession session) {
		/*
		 * 서비스에서 비즈니스 로직을 처리할 때 필요로 하는 객체를 컨트롤러에서 직접 전달해주어야 한다.
		 * 주로, HttpServletRequest, HttpServletResponse, HttpSession, ModelAndView
		 * 등등의 객체이다.
		 */
		service.loginProcess(dto, session);
		
		//로그인 후에 가야할 목적지 정보를 
		String encodedUrl=URLEncoder.encode(url);
		mView.addObject("url", url);
		mView.addObject("encodedUrl", encodedUrl);
		mView.setViewName("users/login");
		return mView;
	}
	
	//로그아웃 요청 처리
	@RequestMapping("/users/logout")
	public String logout(HttpSession session) {		
		//세션에서 id라는 키값으로 저장된 값 삭제
		session.removeAttribute("id");
		return "users/logout";
	}
}

 

 

 

- @requestMapping의 새로운 옵션 

- 메소드 지정, 어떤 요청을 처리할지 value값으로 전달하는 것 등이 가능

- 받는 타입이 [] 배열로 되어있지만 하나만 지정할거면 굳이 배열로 전달 안해도 된다.

 

- annotation의 괄호 안에 이렇게 입력 가능

 

 

- 요청경로만 맞는다고 응답되는 것이 아니라,

 전송 방식에 따라서 다른 응답을 해야할 때가 있다.

 

- link 누르면 get방식 요청한다는 의미에서 GET이라는 상수를 넣어주고, value값에 경로를 넣어준다.

 

- 이전 작성방식은 경로만 넣으면 어떤 요청이든 다 받아주는 것이고,

 이렇게 get방식만 받는다고 명시하면 요청이 get방식일때만 받아진다.

 

 

users/ signup_form

<%@ 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>/users/signup_form.jsp</title>
</head>
<body>
	<div class="container">
		<h1>회원 가입 폼 입니다.</h1>
	   <form action="${pageContext.request.contextPath}/users/signup" method="post" id="myForm">
	      <div>
	         <label class="control-label" for="id">아이디</label>
	         <input class="form-control" type="text" name="id" id="id"/>      
	      </div>
	      <div>
	         <label class="control-label" for="pwd">비밀번호</label>
	         <input class="form-control" type="password" name="pwd" id="pwd"/>   
	      </div>
	      <div>
	         <label class="control-label" for="pwd2">비밀번호 확인</label>
	         <input class="form-control" type="password" name="pwd2" id="pwd2"/>
	      </div>
	      <div>
	         <label class="control-label" for="email">이메일</label>
	         <input class="form-control" type="text" name="email" id="email"/>
	      </div>
	      <button class="btn btn-primary" type="submit">가입</button>
	   </form>		
	</div>
</body>
</html>

 

 

- 이 입력받은 id,pwd,email값을 컨트롤러에서 추출해서

 DB에 저장하는 작업을 하고 응답해야 한다.

 

 

UsersDto

package com.sy.spring04.users.dto;

public class UsersDto {
	//필드
	private String id;
	private String pwd;
	private String email;
	private String profile;
	private String regdate;
	private String newPwd;
	
	//디폴트 생성자
	public UsersDto() {}

	public UsersDto(String id, String pwd, String email, String profile, String regdate, String newPwd) {
		super();
		this.id = id;
		this.pwd = pwd;
		this.email = email;
		this.profile = profile;
		this.regdate = regdate;
		this.newPwd = newPwd;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getProfile() {
		return profile;
	}

	public void setProfile(String profile) {
		this.profile = profile;
	}

	public String getRegdate() {
		return regdate;
	}

	public void setRegdate(String regdate) {
		this.regdate = regdate;
	}

	public String getNewPwd() {
		return newPwd;
	}

	public void setNewPwd(String newPwd) {
		this.newPwd = newPwd;
	}
		
}

 

UsersDao(인터페이스)

package com.sy.spring04.users.dao;

import com.sy.spring04.users.dto.UsersDto;

public interface UsersDao {
	//인자로 전달된 아이디가 존재하는지 여부를 리턴하는 메소드
	public boolean isExist(String inputId);
	//인자로 전달된 가입하는 회원의 정보를 DB에 저장하는 메소드
	public void insert(UsersDto dto);
	//인자로 전달하는 아이디에 해당하는 정보를 리턴하는 메소드
	public UsersDto getData(String id);
	//비밀번호를 수정하는 메소드
	public void updatePwd(UsersDto dto);
	//개인정보를 수정하는 메소드
	public void update(UsersDto dto);
	//회원정보를 삭제하는 메소드
	public void delete(String id);
}

 

UsersDaoImpl (클래스) - 전체

package com.sy.spring04.users.dao;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.sy.spring04.users.dto.UsersDto;

@Repository
public class UsersDaoImpl implements UsersDao{

	@Autowired
	private SqlSession session;
	
	//해당 아이디가 존재하는지 여부를 리턴하는 메소드
	@Override
	public boolean isExist(String inputId) {
		//id를 이용해서 select 해보면 null 혹은 null이 아니다.
		UsersDto dto=session.selectOne("users.getData", inputId);
		//아이디 존재 여부를 알아내서
		boolean isExist= dto==null ? false : true;
		//리턴해준다.
		return isExist;
	}

	@Override
	public void insert(UsersDto dto) {
		
		session.insert("users.insert", dto);		
	}

	@Override
	public UsersDto getData(String id) {
		/*
		 * mapper's namespace => users
		 * sql's id => getData
		 * parameter Type => String
		 * selectOne() 으로 메소드 호출한ㄱ경우 result Type이 메소드의 return type이 된다.
		 * resultType => UsersDto
		 */
		UsersDto dto=session.selectOne("users.getData", id);
		return dto;
	}
	//비밀번호 수정
	@Override
	public void updatePwd(UsersDto dto) {		
		session.update("users.updatePwd", dto);		
	}
	//이메일과 프로필 수정
	@Override
	public void update(UsersDto dto) {
		session.update("users.update", dto);		
	}
	//아이디를 이용한 삭제
	@Override
	public void delete(String id) {
		session.delete("users.delete", id);		
	}

}

 

@Repository 붙여주기!

@Autowired
private SqlSession session; 추가

(sessiontemplate 객체가 들어올 수 있도록!)

 

- 메소드를 작성하면서 3가지 정보를 확인하고, mapper를 작성하러 가기!

 

- namespace, id, dto타입(파라미터타입) 인 것을 인지하기

 

 

UsersMapper (전체)

<?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="users">
	<insert id="insert" parameterType="com.sy.spring04.users.dto.UsersDto">
		INSERT INTO users
		(id, pwd, email, regdate)
		VALUES( #{id}, #{pwd}, #{email}, SYSDATE)
	</insert>
	
	<select id="getData" parameterType="string" resultType="com.sy.spring04.users.dto.UsersDto">
		SELECT id, pwd, profile, email, regdate 
		FROM users		
		WHERE id=#{id}
	</select>
	
	<update id="updatePwd" parameterType="com.sy.spring04.users.dto.UsersDto">
		UPDATE users
		SET pwd=#{newPwd}
		WHERE id=#{id}
	</update>	
	
	<update id="update" parameterType="com.sy.spring04.users.dto.UsersDto">
		UPDATE users
		SET email=#{email}, profile=#{profile}
		WHERE #{id}
	</update>
	
	<delete id="delete" parameterType="string">
		DELETE FROM users
		WHERE id=#{id}
	</delete>
</mapper>

 

- UsersDto 안의 각각의 값이 들어갈 수 있도록 #{ } 으로 적어주기

 

- 메소드와 Mapper는 이런 연관성을 가지고있다. 기억하기!

 

 

getData 메소드 작성

@Override
public UsersDto getData(String id) {
    /*
     * mapper's namespace => users
     * sql's id => getData
     * parameter Type => String
     * selectOne() 으로 메소드 호출한ㄱ경우 result Type이 메소드의 return type이 된다.
     * resultType => UsersDto
     */
    UsersDto dto=session.selectOne("users.getData", id);
    return dto;
}

- 하나를 select하므로 SELECTONE 사용

 

- 위 주석의 내용을 기억하고 mapper를 작성하기

- dto정보를 받으려면 mapper resultType이 dto여야 한다.

 

- String 값을 가져온다는 것 명시(대소문자 무관) 원래 java.lang이 붙어야하지만 string은 자주 쓰이니까 생략..

- 가져오는 값이 하나이면 #{ } 안에 아무 단어나 넣어도 된다!

- row 하나가 dto 객체에 포장되어서 리턴된다.

 

- row 가 하나여도 사실 selectList로도 작성할 수 있다.

UsersDto dto=session.selectOne("users.getData", id);

→ List<UsersDto> list = session.selectList("users.getData", id); 

- 이렇게 작성할 수도 있다. 하지만 이러면 list를 리턴하게 된다.

- Selectone 으로 사용하느냐 Selectlist를 사용하느냐에 따라 리턴타입이 달라진다.

 

- 만약 select 했는데 row가 선택되지 않으면 dto일 경우에는 null이고 / list일 경우 size가 0이 된다.

- List로 가지고오면 ResultType이 <> 제너릭이 된다는 것을 기억하기!

 

- string을 받아올 때와 dto를 받아올 때를 구분하기! (parameterType)

 

- isExist 메소드

id를 이용해서 select(getData 메소드를 활용)해서 아이디가 존재하는지 여부를 읽어온다.

 


 

- 서비스 추가하기

 

UsersService (인터페이스)

package com.sy.spring04.users.service;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.sy.spring04.users.dto.UsersDto;

public interface UsersService {
	public Map<String, Object> isExistId(String inputId);
	public void addUser(UsersDto dto);
	public void loginProcess(UsersDto dto, HttpSession session);
	public void getInfo(HttpSession session, ModelAndView mView);
	public void updateUserPwd(HttpSession session, UsersDto dto, ModelAndView mView);
	public Map<String, Object> saveProfileImage(HttpServletRequest request, 
			MultipartFile mFile);
	public void updateUser(UsersDto dto, HttpSession session);
	public void deleteUser(HttpSession session, ModelAndView mView);
}

 

UsersServiceImpl

package com.gura.spring04.users.service;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.gura.spring04.users.dao.UsersDao;
import com.gura.spring04.users.dto.UsersDto;

@Service
public class UsersServiceImpl implements UsersService{

	@Autowired
	private UsersDao dao;

	@Override
	public Map<String, Object> isExistId(String inputId) {
		// TODO Auto-generated method stub
		return null;
	}
	//회원 한명의 정보를 추가하는 메소드
	@Override
	public void addUser(UsersDto dto) {
		dao.insert(dto);
	}
	//로그인 처리를 하는 메소드
	@Override
	public void loginProcess(UsersDto dto, HttpSession session) {
		//입력한 정보가 맞는지 여부
		boolean isValid=false;
		//아이디를 이용해서 회원 정보를 얻어온다.
		UsersDto resultDto=dao.getData(dto.getId());
		//만일 select 된 회원 정보가 존재하고 
		if(resultDto != null) {
			//비밀번호도 일치한다면 isValid 에 true 를 대입한다. 
			isValid = dto.getPwd().equals(resultDto.getPwd()) ? true : false; 
		}
		//만일 유효한 정보이면 
		if(isValid) {
			//로그인 처리를 한다.
			session.setAttribute("id", resultDto.getId());
		}
	}

	@Override
	public void getInfo(HttpSession session, ModelAndView mView) {
		// TODO Auto-generated method stub

	}

	@Override
	public void updateUserPwd(HttpSession session, UsersDto dto, ModelAndView mView) {
		// TODO Auto-generated method stub

	}

	@Override
	public Map<String, Object> saveProfileImage(HttpServletRequest request, MultipartFile mFile) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void updateUser(UsersDto dto, HttpSession session) {
		// TODO Auto-generated method stub

	}

	@Override
	public void deleteUser(HttpSession session, ModelAndView mView) {
		// TODO Auto-generated method stub

	}

}

 

- @Service, @Autowired 빠뜨리지 말고 쓰기!

 

ex) 은행에 가서 입금을 한다고 가정하면, 입금하는 데에는 두가지 방법이 있다.
1. 은행원에게 돈을 주고 입금을 요청한다. → service 메소드 사용
2. 내가 금고에 직접 입금한다. → controller에 작성하는 것

 

- dao를 사용해서 서비스메소드 만들기

 

- Service 는 서비스를 제공하는 유틸리티라고 생각하면 된다.

 

- insert 작성

@Override
public void insert(UsersDto dto) {

    session.insert("users.insert", dto);		
}

- 컨트롤러

//회원가입 요청 처리
@RequestMapping(method = RequestMethod.POST, value = "/users/signup")
public ModelAndView signup(ModelAndView mView, UsersDto dto) {
    service.addUser(dto);
    mView.setViewName("users/signup");		
    return mView;
}

 

- post방식의 signup 요청을 받아야 한다는 것을 기억하고 controller 작성

- id, pwd, email 요청

 

- service 객체를 받아서 원하는일 처리

 

 

- view page 생성 : signup.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>/views/users/signup.jsp</title>
</head>
<body>
	<div class="container">
		<p> <!-- form 전송된 파라미터를 view page에서 당연히 사용할 수 있음 -->
			<strong>${param.id}</strong>회원님 가입 되었습니다.
			<a href="${pageContext.request.contextPath}/users/loginform">로그인 하러가기</a>
		</p>	
	</div>
</body>
</html>

 

- ${param.id} : form 전송된 파라미터를 view page에서 당연히 사용할 수 있음 

- EL로 읽어오기. 이 경우 param. 은 생략 불가능하다

 

- 여기까지 하면 가입 절차는 완료!

 

참고) 서버가 시작할 때부터 나는 에러는 BeanCreationException일 수 있다. bean이 생성되지 않은 것!

→ 각각의 문서에 필요한 Annotation이 들어가지 않았을 수 있다.

 


 

- STS에 퀀텀 DB설치

 

* QuantumDB 설치 : https://quantum.sourceforge.net/

 

- help-install new software에 붙여넣기

 

- 복사한 링크를 집어넣고 core만 선택해서 설치!

 

 

- STS에 quantum DB환경 추가해서 북마크추가

- 익스플로러 창에서 우클릭-New bookmark- jar파일을 넣어주기

- 로그인정보, xe 입력하고 LocalOracle로 이름 지정해서 저장!


 

/users/loginform

<%@ 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>/views/users/loginform.jsp</title>
</head>
<body>
   <div class="container">
      <h1>로그인 폼 입니다.</h1>
      <form action="${pageContext.request.contextPath}/users/login" method="post">
         <c:choose>
            <c:when test="${ empty param.url }">
               <input type="hidden" name="url" value="${pageContext.request.contextPath}/"/>
            </c:when>
            <c:otherwise>
               <input type="hidden" name="url" value="${param.url }"/>
            </c:otherwise>
         </c:choose>
         <div>
            <label for="id">아이디</label>
            <input type="text" name="id" id="id"/>
         </div>
         <div>
            <label for="pwd">비밀번호</label>
            <input type="password" name="pwd" id="pwd"/>
         </div>
         <button type="submit">로그인</button>
      </form>
   </div>
</body>
</html>

 

- 패러미터 값으로 어떤 url이 넘어오면 해당 위치로 이동시키고,

 넘어오지 않으면 context의 루트로 갈 수 있도록 처리하는 것

 

- parameter로 이렇게 3가지가 넘어온다.

- 이것을 controller에서 처리하기!

 

 

컨트롤러

//로그인 요청 처리
@RequestMapping("/users/login")
public ModelAndView login(ModelAndView mView, UsersDto dto, String url, HttpSession session) {
    /*
     * 서비스에서 비즈니스 로직을 처리할 때 필요로 하는 객체를 컨트롤러에서 직접 전달해주어야 한다.
     * 주로, HttpServletRequest, HttpServletResponse, HttpSession, ModelAndView
     * 등등의 객체이다.
     */
    service.loginProcess(dto, session);

    //로그인 후에 가야할 목적지 정보를 
    String encodedUrl=URLEncoder.encode(url);
    mView.addObject("url", url);
    mView.addObject("encodedUrl", encodedUrl);
    mView.setViewName("users/login");
    return mView;

- 로그인 요청을 처리하는 컨트롤러

- 인자를 4개 넣어준다. mView, dto, url, session

 

- setViewname() 으로 담아주면 알아서 forward 이동 해준다.

 

- 필요한 객체가 있다면 선언하는 것만으로도 들어온다.

 

- 폼의 name 속성의 value와 똑같이 적으면 알아서 parameter가 추출된다.

- id와 pwd는 dto에 담겨서 추출된다.

 

 

- 서비스 작성(loginProcess)

//로그인 처리를 하는 메소드
	@Override
	public void loginProcess(UsersDto dto, HttpSession session) {
		//입력한 정보가 맞는지 여부
		boolean isValid=false;
		//아이디를 이용해서 회원정보를 얻어온다.
		UsersDto resultDto=dao.getData(dto.getId());
		//만일 select된 회원정보가 존재하고 (아이디가 없을경우 null이 리턴된다.)
		if(resultDto!=null) {
			//비밀번호도 일치한다면 isValid에 true를 대입힌다.
			isValid=dto.getPwd().equals(resultDto.getPwd()) ? true : false;
		}
		//만일 유효한 정보이면
		if(isValid) {
			//로그인 처리를 한다.
			session.setAttribute("id", resultDto.getId());
		}
		
	}

 

session.setAttribute("id", resultDto.getId());

- 로그인 처리란? session에다가 "id"라는 키 값으로 로그인된 아이디를 담는 것! 으로 정의한다.

 (단, 입력한 id,pwd가 서버에 저장된 id, pwd와 일치했을 때에만)

- session영역에 사용자를 식별할 수 있는 값을 담는 것이다.

 

 

 

- 찾아온 아이디가 null이 아닌지, 입력한 아이디가 맞는지,

 입력한 pwd가 저장된 비밀번호와 맞는지 검증

 

- 이런 복잡한 로직처리는 모두 서비스에서 하는 것이다. controller에서 하지 않는다!

 

- 초기값이 false이기 때문에 중간을 건너뛰더라도 false이다. true로 바뀌는 방법은 id와 pwd가 일치할 때뿐!

 

/users/login 뷰 페이지

<%@ 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>/views/users/login.jsp</title>
</head>
<body>
	<div class="container">
	   	<h1>알림</h1>
	   	<c:choose>
	      <c:when test="${not empty sessionScope.id }">
	         <p>
	            <strong>${sessionScope.id }</strong>님 로그인 되었습니다.
	            <a href="${requestScope.url }">확인</a>
	         </p>
	      </c:when>
	      <c:otherwise>
	         <p>
	            아이디 혹은 비밀번호가 틀려요.
	            <a href="loginform?url=${requestScope.encodedUrl }">다시 시도</a>
	         </p>
	      </c:otherwise>
	   	</c:choose>
	</div>   
</body>
</html>

 

- request 영역에 담긴 url 값으로 다시 원래 목적지 정보로 보내줄 수 있도록 이렇게 작성해준다.

 


 

- home.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>/home.jsp</title>
</head>
<body>
	<div class="container">
		<c:choose>
	         <c:when test="${ empty sessionScope.id}">
	            <a href="${pageContext.request.contextPath}/users/loginform">로그인</a>
	            <a href="${pageContext.request.contextPath}/users/signup_form">회원가입</a>
	         </c:when>
	         <c:otherwise>
	            <p>
	               <a href="${pageContext.request.contextPath}/users/info">${sessionScope.id }</a> 로그인중... 
	               <a href="${pageContext.request.contextPath}/users/logout">로그아웃</a>
	            </p>
	         </c:otherwise>
	      </c:choose>   
	      		
		<h1>인덱스 페이지입니다.</h1>
		<ul>
			<li><a href="users/signup_form">회원가입</a></li>			
		</ul>
		<ul>
			<c:forEach var="tmp" items="${noticeList }">
				<li>${tmp }</li>
			</c:forEach>
		</ul>
	</div>
</body>
</html>

 

- 로그인여부에 따라 다른 페이지가 보이도록 수정


 

- logout (컨트롤러)

//로그아웃 요청 처리
@RequestMapping("/users/logout")
public String logout(HttpSession session) {		
    //세션에서 id라는 키값으로 저장된 값 삭제
    session.removeAttribute("id");
    return "users/logout";
}

 

/users/logout

<%@ 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>/views/users/logout.jsp</title>
</head>
<body>
	<script>
		alert("로그아웃 되었습니다.");
		location.href="${pageContext.request.contextPath}/";
	</script>
</body>
</html>

 

요청처리를 만들어보기

컨트롤러(서비스 받아오기)-서비스(메소드완성)

 


 

- 개인정보 보기(info)

 

- Controller

//개인정보 보기 요청 처리
@RequestMapping("/users/info")
public ModelAndView info(HttpSession session, ModelAndView mView) {

    service.getInfo(session, mView);

    mView.setViewName("users/info");
    return mView;		
}

 

- session을 넘겨주는 이유는? session 안에 로그인된 아이디가 들어있으므로.

- 로그인된 회원의 정보를 ModelAndView안에 넣는다

 

- service 메소드 완성하기

//정보를 가져오는 메소드
@Override
public void getInfo(HttpSession session, ModelAndView mView) {
    //로그인된 아이디를 읽어온다.
    String id=(String)session.getAttribute("id");
    //DB에서 회원정보를 얻어와서
    UsersDto dto=dao.getData(id);
    //ModelAndView 객체에 담아준다.
    mView.addObject("dto", dto);		
}

 

- controller 에서 전달받은 값으로 mView에 담아주기

 

- dao와 mapper는 미리 만들어 놓으면 편하다.

 

/users/info.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>/views/users/info.jsp</title>
<style>
   /* 프로필 이미지를 작은 원형으로 만든다 */
   #profileImage{
      width: 50px;
      height: 50px;
      border: 1px solid #cecece;
      border-radius: 50%;
   }
</style>
</head>
<body>
<div class="container">
   <h1>가입 정보 입니다.</h1>
   <table>
      <tr>
         <th>아이디</th>
         <td>${id }</td>
      </tr>
      <tr>
         <th>프로필 이미지</th>
         <td>
         <c:choose>
            <c:when test="${empty dto.profile }">
               <svg id="profileImage" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-person-circle" viewBox="0 0 16 16">
                 <path d="M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0z"/>
                 <path fill-rule="evenodd" d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z"/>
               </svg>
            </c:when>
            <c:otherwise>
               <img id="profileImage" 
                  src="${pageContext.request.contextPath}${dto.profile}"/>
            </c:otherwise>
         </c:choose>
         </td>
      </tr>
      <tr>
         <th>비밀번호</th>
         <td><a href="${pageContext.request.contextPath}/users/pwd_updateform">수정하기</a></td>
      </tr>
      <tr>
         <th>이메일</th>
         <td>${dto.email }</td>
      </tr>
      <tr>
         <th>가입일</th>
         <td>${dto.regdate }</td>
      </tr>
   </table>
   <a href="${pageContext.request.contextPath}/users/updateform">개인정보 수정</a>
   <a href="javascript:deleteConfirm()">탈퇴</a>
</div>
<script>
   function deleteConfirm(){
      const isDelete=confirm("${id} 님 탈퇴 하시겠습니까?");
      if(isDelete){
         location.href="${pageContext.request.contextPath}/users/delete";
      }
   }
</script>
</body>
</html>

 

- 이렇게 개인정보가 나오면 완성

 

- MVC 프로젝트의 특징! jsp 페이지에 java 코드가 없다.

- 로직은 다른 페이지에서 전부 작성한다. 여기서는 응답에만 집중한다!