2024. 6. 25. 18:25ㆍJSP+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 값을 가져와서 자바에서 가져온 값을 담을 공간
--------------------------------------------------------------------------------------------------------------------------------------
'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 |