마이페이지 조회,수정, 삭제, 검색

2024. 6. 25. 18:25JSP+Spring Boot

Login-Mapper.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="com.khmall.mapper.LoginMapper">
	<!-- 로그인, 마이페이지 정보 보기 -->
	<select id="getLogin" resultType="com.khmall.dto.Member" parameterType="java.util.Map">
		select * from member
		where member_name = #{member_name}
		and member_phone = #{member_phone}
	</select>
    <-- 정보 수정 -->
	<update id="updateMember" parameterType="com.khmall.dto.Member">
		update member set member_name = #{member_name}, 
		member_phone = #{member_phone},
		member_age = #{member_age}
		where member_id = #{member_id}
	</update>
	<-- 회원탈퇴 -->
	<delete id="deleteMember" parameterType="int">
		delete from member where member_id = #{member_id}
	</delete>
    <-- 유저 검색 -->
	<select id="searchMembers" resultType="com.khmall.dto.Member" parameterType="String">
		select * from member
		 where member_name like '%'|| #{keyword}|| '%'
		 or member_phone like '%'|| #{keyword}|| '%'
	</select>
	
</mapper>

 

--------------------------------------------------------------------------------------------------------------------------------------

 

index.html

<!DOCTYPE html>
<html xmlns:th="www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>홈페이지 메인</title>
</head>
<body>
	<div th:if="${session.loginSession != null}">
		<p th:text="${session.loginSession.member_name} + ' 님 환영합니다.'"></p>
		<a href="/logout">로그아웃 하기</a>
		<a href="/myPage">마이페이지 가기</a>
	</div>
	
	<div th:if="${session.loginSession == null}">
		<p>로그인 하지 않았습니다.</p>
		<a href="">회원가입 하기</a>
		<a href="/login">로그인 하기</a>
		<a href="/search">회원정보검색하기</a>
	</div>
</body>
</html>

 

session은 model.addAttribute나 어떤 값으로 전달하지 않아도 컴퓨터에서 임시로 저장한다는 의미가 내재되어 있다.

session.setAttribute("임시저장에사용할변수명", 변수에 담을 내용); 
-> 자바에서 전달이 오면
    html 파일에서는 'session.임시저장에사용할변수명' 을 작성해주면 됨
    맨 앞의 'session'은 컴퓨터 상의 약속이기 때문에 붙여야함

 

 

--------------------------------------------------------------------------------------------------------------------------------------

 

login.html

<!DOCTYPE html>
<html xmlns:th="www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>로그인</title>
</head>
<body>
	<h1>로그인</h1>
	<form action="/login" method="post">
		이름 : 
		<input type="text" th:field="${m.member_name}"><br>
		번호 : 
		<input type="text" th:field="${m.member_phone}"><br>
		<button>로그인</button>
	</form>
	<div th:if="${e}">
		<p th:text="${e}" style="color:red;"></p>
	</div>
</body>
</html>

 

myPage.html

 

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>마이페이지</title>
</head>
<body>
	<h1>마이페이지</h1>
	
	<div th:if="${member != null}">
		<p>Name : </p> <p th:text="${member.member_name}"></p>
		<p>Phone : </p> <p th:text="${member.member_phone}"></p>
		<p>Age : </p> <p th:text="${member.member_age}"></p>
		<a th:href="@{/modifyProfile}">마이페이지 수정하기</a>
		
		<form th:action="@{/deleteMember}" method="get">
			<button>계정 삭제하기</button>
		</form>
	</div>
</body>
</html>

 

modifyProfile.html

<!DOCTYPE html>
<html xmlns:th="www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>마이페이지 수정하기</title>
</head>
<body>
	<h1>마이페이지 수정하기</h1>
	<form th:action="@{modifyProfile}" th:object="${member}" method="post">
		이름 : <input type="text" th:field="*{member_name}">
		나이 : <input type="text" th:field="*{member_age}">
		번호 : <input type="text" th:field="*{member_phone}">
		<button>수정하기</button>
	</form>
</body>
</html>

 

search.html

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>회원 정보 검색하기</title>
</head>
<body>
	<h1>내 친구 찾기</h1>
	<form th:action="@{/search}" method="post">
	<!-- post : db에 무언가 하는 것, get : db에서 가져오기만 하는 것 -->
	<input type="text" name="keyword" placeholder="이름 또는 번호 입력" required>
	<button>검색하기</button>
	</form>
	<div th:if="${results}">
		<h2>검색결과</h2>
		<ul>
			<li th:each = "member : ${results}">
				<p>이름 : <span th:text="${member.member_name}"></span></p>
				<p>번호 : <span th:text="${member.member_phone}"></span></p>
				<p>나이 : <span th:text="${member.member_age}"></span></p>
			</li>
		</ul>
	</div>
</body>
</html>

 

----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------

 

Service

 

package com.khmall.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.khmall.dto.Member;
import com.khmall.mapper.LoginMapper;

@Service
public class MemberService {

	@Autowired
	private LoginMapper memberMapper;
	
	public Member getLogin(String member_name, String member_phone) {
		//추후에 서비스에 비밀번호를 암호화해서 db에 저장하고
		//암호화된 비밀번호를 가져와서 로그인하는 코드 작성
		
		return memberMapper.getLogin(member_name, member_phone);
		
	}
    
	// 업데이트
	public void updateMember(Member member) {
		
		memberMapper.updateMember(member);
	}
    
	// 회원 탈퇴
	public void deleteMember(int member_id) {
		
		memberMapper.deleteMember(member_id);
	}
    
	// 회원 검색
	public List<Member> searchMembers(String keyword){
		
		return memberMapper.searchMembers(keyword);
	}


}

 

 

 

----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------

 

Mapper

 

package com.khmall.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.khmall.dto.Member;

@Mapper
//@MapperScan mapper위치가 찾아지지 않을 때 main 메서드에 Mapper 주소를 작성해주는 어노테이션
//@MapperScan("com.khmall.mapper.LoginMapper") 매퍼 하나 가져오기
//@MapperScans("com.khmall.mapper.*") 매퍼 여러개 가져오기
public interface LoginMapper {

	Member getLogin(@Param("member_name") String member_name,
			@Param("member_phone") String member_phone);
	
	//insert와 update, delete는 void
	//select에서 1개의 값을 볼 떄는 List를 안쓰고 2개 이상의 값을 볼 때는 List
	
    //정보 수정
	void updateMember(Member member);
	
    //회원 탈퇴
	void deleteMember(@Param("member_id") int member_id);
	
    //회원 검색
	List<Member> searchMembers(@Param("keyword") String keyword);
	
	
}

 

----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------

 

Controller

 

package com.khmall.controller;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.khmall.dto.Member;
import com.khmall.service.MemberService;

import jakarta.servlet.http.HttpSession;
@Controller
// @RestController -> 추후, 리액트에서 사용할 예정
public class LoginController {
	@Autowired
	private MemberService memberService;
	
	@GetMapping("/login")
	public String showLogin(Model model) {
		model.addAttribute("m", new Member());
		return "login";
	}
	
	@PostMapping("/login")
	public String getLogin(Model model,
			     @RequestParam("member_name") String Member_name,
			     @RequestParam("member_phone") String Member_phone,
			     HttpSession session) {
		
		Member member = memberService.getLogin(Member_name, Member_phone);
		
		// 만약, 사용자의 입력 값과 DB 에 저장된 정보가 일치한다면, null 이 아님
		if(member != null) {
			session.setAttribute("loginSession", member);
			return "redirect:/";
			
		} else { // 하지만, 일치하지 않는다면, null 임
			model.addAttribute("e", "일치하는 회원 정보가 없습니다.");
			model.addAttribute("m", new Member());
			return "login";
		}
		
	}
	
	@GetMapping("/logout")
	public String logout(HttpSession session /* SessionStatus status -> 시간이 지나면 자동으로 로그아웃되게 설정할 때 사용*/) {
		session.invalidate(); // 로그인 풀리게 만들기
		return "redirect:/";
	}
	
	@GetMapping("/myPage")
	public String showMyPage(HttpSession session, Model model) {
		// 현재 로그인 상태인 세션의 정보를 가져와, 멤버 정보를 조회하는 코드
		Member member = (Member) session.getAttribute("loginSession");
		
		// 만약, 로그인 되어있지 않은 상태에서 접속하려 한다면, 바로 홈페이지로 돌려보내기
		if(member == null) {
			return "redirect:/login";
		}
		
		// 만약, 모델에 정보가 담겨있다면, 보여줄 멤버 객체
		model.addAttribute("member", member);
		return "myPage";
	}
	
    //회원 정보 수정
	//마이페이지 불러오고 수정하는 get, post
	@GetMapping("/modifyProfile")//html 파일 이름
	public String modifyMypage(HttpSession session, Model model) {
		// 현재 로그인 상태인 세션의 정보를 가져와, 멤버 정보를 조회하는 코드
		Member member = (Member) session.getAttribute("loginSession");
		
		// 만약, 로그인 되어있지 않은 상태에서 접속하려 한다면, 바로 홈페이지로 돌려보내기
		if(member == null) {
			return "redirect:/login";
		}
		
		// 만약, 모델에 정보가 담겨있다면, 보여줄 멤버 객체
		model.addAttribute("member", member);
		return "modifyProfile";
	}
	
	@PostMapping("/modifyProfile")//form action에 적은 주소값
	public String updateMember(HttpSession session, Member updateMember) {
		// 현재 로그인 상태인 세션의 정보를 가져와, 멤버 정보를 조회하는 코드
		Member member = (Member) session.getAttribute("loginSession");
		
		// 만약, 로그인 되어있지 않은 상태에서 접속하려 한다면, 바로 홈페이지로 돌려보내기
		if(member == null) {
			return "redirect:/login";
		}
		
		updateMember.setMember_id(member.getMember_id());
		memberService.updateMember(member);
		session.setAttribute("loginSession", updateMember);
		return "redirect:/myPage";
	}
	
    //회원 탈퇴
	@GetMapping("/deleteMember")
	public String deleteMember(HttpSession session) {
		Member member = (Member) session.getAttribute("loginSession");
		
		// 만약, 로그인 되어있지 않은 상태에서 접속하려 한다면, 바로 홈페이지로 돌려보내기
		if(member == null) {
			return "redirect:/login";
		}
		
		//세션에 저장된 member_id 불러오기
		memberService.deleteMember(member.getMember_id());
		
		session.invalidate(); //삭제 후 로그인 무효화
		return "redirect:/";
	}
	
    //회원 검색
	@GetMapping("/search")
	public String showSearchForm(Model model) {
		
		return "search";
	}
	
	@PostMapping("/search")
	public String searchMembers(Model model, @RequestParam("keyword") String keyword) {
		
		List<Member> member = memberService.searchMembers(keyword);
		model.addAttribute("results", member);
		return "search";
	}
}

 

Member updateMember와 Member member
Member updateMember는 소비자(클라이언트)가 새롭게 작성하고 DB에 덮어쓸 내용이 저장
Member member는 소비자가 기존에 DB에 저장했던 값

Member member = (Member) session.getAttribute("loginSession);
    - session에서 loginSession이라는 변수명에 저장된 로그인 정보 가져오기
    가져와서 member의 기존의 저장된 값 가져오기

updateMember.setMember_id(member.getMember_id()); -> 덮어쓰기
    - DB에 저장된 값 중 id는 개발자가 회원가입의 순번을 소비자에게 부여한 순서값으로, 
    소비자가 가입한 순서를 스스로 변경할 수 없기 때문에, id 값으로 소비자가 
    input에 수정해서 작성한 값을 가져와서 임시저장

member.getMember_id : 기존의 DB에 저장된 정보

setMember_id : 새롭게 DB에 저장할 정보
                id(회원가입순서)는 동일하지만 밑 내용은 다름

memberService.updateMember(member);
    - 덮어쓰기한 내용을 DB에 저장하기

 

session.setAttribute("loginSession", updateMember);
    - 새롭게 DB에 저장된 내용을 loginSession이라는 변수명에 다시 저장

 

 

@RequestParam("keyword") String keyword
<input type="text" name="keyword" placeholder="이름 또는 번호 입력" required>

@RequestParam("input이나 태그에 작성한 name 또는 th로 작성된 변수명")
    input에서 name="keyword"이기 때문에 @RequestParam("keyword")
    input에서 name, th:field로 작성한 변수명과 반드시 일치할 것.

    String keyword는 input에서 바라보는 keyword 값을 가져와서 자바에서 가져온 값을 담을 공간

 

 

--------------------------------------------------------------------------------------------------------------------------------------

마이페이지
수정 폼 입력
DB 값 변경

 

회원 탈퇴 후 같은 이름, 번호 입력 시 없다고 출력
회원 검색하기

'JSP+Spring Boot' 카테고리의 다른 글

중복 확인하기(ajax)  (0) 2024.07.09
이메일 인증  (0) 2024.06.26
로그인  (0) 2024.06.25
이미지 파일 업로드하기(insert-image)  (0) 2024.06.21
이미지 파일 불러오기(select-image)(resourses)  (0) 2024.06.20