세션 : 메모리
서버1(1000), 서버2(1000), 서버3(1000)
=> 각 서버의 로그인 정보를 공유하기 위함
mongodb <= 자료보관용(분석) <= 파일보관
redis <= 세션용DB <= 메모리 보관
pom.xml
<!-- mongodb로 세션을 관리하기 위해서 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-mongodb</artifactId>
</dependency>
파일명 MemberController.java
package com.example.controller;
import java.util.List;
import javax.servlet.http.HttpSession;
import com.example.entity.Member;
import com.example.service.MemberDB;
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.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping(value = "/member") // 중간에 도메인을 묶어서 사용
public class MemberController {
// DB에 일의 수행하는 클래스
// 클래스명 obj = new 클래스명();
@Autowired
public MemberDB memberDB;
@Autowired
private HttpSession httpSession;
@GetMapping(value = "/mypage")
public String mypageGET(
Model model,
@RequestParam(name="menu",defaultValue = "0")int menu){
if(menu == 0){
return "redirect:/member/mypage?menu=1";
}
// 세션에서 정보를 읽음
String userid =(String)httpSession.getAttribute("USERID");
// 세션에 정보가 없다면 (로그인 되지않은 상태에서 mypage접근)
if(userid == null){
return "redirect:/member/login"; // 로그인 페이지로 이동
}
if(menu == 1){ // 정보수정
Member member = memberDB.selectOneMember(userid);
model.addAttribute("title", "정보수정");
model.addAttribute("mem", member);
}
else if(menu == 2){ // 암호변경
model.addAttribute("title", "암호변경");
}
else if(menu == 3){ // 회원탈퇴
model.addAttribute("title", "회원탈퇴");
}
return "member/mypage"; // 정보변경, 암호변경, 탈퇴하기
}
// 127.0.0.1:8080/member/mypage?menu=1
@PostMapping(value = "/mypage")
public String mypagePOST(
@RequestParam(name ="menu")int menu,
@ModelAttribute Member member){
if(menu == 1){ // jsp에서 정보수정 벼튼
int ret = memberDB.updateMember(member);
if(ret == 1 ){
httpSession.setAttribute("USERNAME", member.getName());
return "redirect:/member/mypage?menu=1";
}
return "redirect:/member/mypage?menu=1";
}
else if(menu == 2){ // jsp에서 암호변경 벼튼
System.out.println(member.toString()); // pw newPw
// 아이디는 세션에서 꺼내서 수동으로 초가하기
String userid =(String)httpSession.getAttribute("USERID");
member.setId(userid);
long ret = memberDB.updateMemberPasswoed(member);
if(ret == 1L){
return "redirect:/member/mypage?menu=2";
}
return "redirect:/member/mypage?menu=2";
}
else if(menu == 3){ // jsp에서 회원탈퇴 벼튼
String userid =(String)httpSession.getAttribute("USERID");
member.setId(userid);
int ret = memberDB.deleteMember1(member);
if(ret == 1L){
return "redirect:/member/logout";
}
return "redirect:/member/mypage?menu=3";
}
// 비정상적 작업영역
return "redirect:/home";
}
// 127.0.0.1:8080/member/login
@GetMapping(value = "/login")
public String loginGET(){
return "member/login";
}
@PostMapping(value = "/login")
public String loginPOST(
@ModelAttribute Member member){
// DB에 아이디, 암호를 전달하여 일치하는 항목 있는지 확인
Member retMember = memberDB.selectLogin(member);
System.out.println(member);
if(retMember != null){
// 여기가 로그인 되는 시점!
// 세션 : 서버에 기록되는 정보(어떤 주소, 어떤 컨트롤러에서 공유)
httpSession.setAttribute("USERID", retMember.getId());
httpSession.setAttribute("USERNAME", retMember.getName());
return "redirect:/home";
}
return "redirect:/member/login";
}
@GetMapping(value = "/logout")
public String logoutGET(){
httpSession.invalidate();
return "/home";
}
// 127.0.0.1:8080/member/update?id=1
@GetMapping(value = "/update")
public String updateGET(
Model model,
@RequestParam(name = "id") String id){
// DB에서 내용을 가져오기
Member member = memberDB.selectOneMember(id);
// jsp로 전달해줌
model.addAttribute("member", member);
return "member/update"; // 표시할 jsp파일명 확장자X
}
// id, name,age
@PostMapping(value = "/update")
public String updatePOST(@ModelAttribute Member member){
System.out.println(member.toString());
int ret = memberDB.updateMember(member);
if(ret == 1 ){
// post에서는 jsp를 표시X
// redirect를 이용하여 주소를 변경
// 127.0.0.1:8080/member/selectlist
return "redirect:/member/selectlist";
}
// 127.0.0.1:8080/member/update?id=1
return "redirect:/member/update?id=" + member.getId();
}
// 127.0.0.1:8080/member/delete?id=1
// <form action="" method="get">
// <input type="text" name="id" valut="1" />
// <form>
// <a href="/member/delete?id=aaa">버튼</a>
@GetMapping(value = {"delete"})
public String deleteGET(@RequestParam(name = "id") String id ){
int ret = memberDB.deleteMember(id);
if(ret == 1){ //성공
return "redirect:/member/selectlist";
}
// 실패
return "redirect:/member/selectlist";
}
// 127.0.0.1:8080/member/selectlist
@GetMapping(value = {"/selectlist"})
public String selectlistGET(Model model){
// 1. DB에서 목록 받아오기
List<Member> list = memberDB.selectListMember();
// 2. jsp로 전달하기
model.addAttribute("list", list);
// 3. member폴더의 select.jsp를 표시하라
return "member/select";
}
// 127.0.0.1:8080/member/insert
@GetMapping(value = {"/insert"})
public String insertGET(){
// member폴더에 있는 insert.jsp로 생성
return "member/insert";
}
// post는 사용자가 입력한 내용이 전달되고 DB작업을 위해서 필요한 시점
// jsp를 표시하는게 아니라 주소창에 입력후 엔터키를 누름
@PostMapping(value = {"/insert"})
public String insertPOST( @ModelAttribute Member mem // 아래 @RequestParam 부분을 한번에 묶음
// @RequestParam(name = "id") String id,
// @RequestParam(name = "pw") String pw,
// @RequestParam(name = "pw1") String pw1,
// @RequestParam(name = "name") String name,
// @RequestParam(name = "age") int age
){
System.out.println(mem.toString());
memberDB.insertMember(mem);
// DB에 추가하기 // 위쪽에 @ModelAttribute로 한번에 실행
// 클래스명 mem = new 생성자();
// Member mem = new Member();
// mem.setId(id);
// mem.setName(name);
// 주소창에 /member/insert를 입력후 엔터키를 누르는것과 같은 역할
return "redirect:/member/insert"; // redirect => 페이지 이동
}
}
파일명 MemberDB.java
package com.example.service;
import java.util.List;
import com.example.entity.Member;
import org.springframework.stereotype.Service;
// DB와 연동하는 부분 구현하는 설계부분
@Service
public interface MemberDB {
// 삭제, 수정, 추가의 리턴은 int
// 추가할 내용을 member로 주면 추가한 후에 실제 추가된 내용을 반환
public Member insertMember( Member member );
// 회원 전체 목록(page, search X)
public List<Member> selectListMember();
// 회원 1명 삭제 (회원 아이디가 오면 삭제후 -1, 0 또는 1로 리턴)
public int deleteMember(String id);
// 회원 1명 조회하기
public Member selectOneMember(String id);
// 회원 정보 변경
public int updateMember(Member member);
// 로그인(아이디, 암호가 전달되면 일치하는 회원정보를 반환)
public Member selectLogin(Member member);
// 암호변경
public long updateMemberPasswoed(Member member);
// 회원 1명 삭제 (회원 아이디,암호가 오면 삭제후 -1, 0 또는 1로 리턴)
public int deleteMember1(Member member);
}
파일명 MemberDBImpl.java
package com.example.service;
import java.util.List;
import com.example.entity.Member;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
// DB연동을 실제로 수행하는 구현부
// 구현부는 프레임워크에 따라서 안만듬..
@Service
public class MemberDBImpl implements MemberDB {
// 환경설정으로 생성된 객체를 가져옴
// MongoTemplate mongodb = new MongoTemplate();
@Autowired
private MongoTemplate mongodb;
@Override
public Member insertMember(Member member) {
try {
return mongodb.insert(member);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public List<Member> selectListMember() {
try {
Query query = new Query();
return mongodb.find(query, Member.class);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public int deleteMember(String id) {
try {
Member member = new Member();
member.setId(id);
DeleteResult result = mongodb.remove(member);
if(result.getDeletedCount() == 1L){
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
@Override
public int deleteMember1(Member member) {
try {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(member.getId()));
query.addCriteria(Criteria.where("pw").is(member.getPw()));
DeleteResult result = mongodb.remove(query, Member.class);
if(result.getDeletedCount() == 1L){
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
@Override
public Member selectOneMember(String id) {
try {
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(id);
query.addCriteria(criteria);
return mongodb.findOne(query, Member.class);
} catch (Exception e) {
e.printStackTrace(); // 개발자를 위한 출력(debug용)
return null;
}
}
@Override
public int updateMember(Member member) {
try {
// query 조건
Query query = new Query();
Criteria criteria = Criteria.where("_id").is(member.getId());
query.addCriteria(criteria);
// update수정할 설정
Update update = new Update();
update.set("name", member.getName());
update.set("age", member.getAge());
UpdateResult result = mongodb.updateFirst(query, update, Member.class);
if(result.getMatchedCount() == 1L){
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace(); // 개발자를 위한 출력(debug용)
return -1;
}
}
@Override
public Member selectLogin(Member member) {
try {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(member.getId()));
query.addCriteria(Criteria.where("pw").is(member.getPw()));
return mongodb.findOne(query, Member.class);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public long updateMemberPasswoed(Member member) {
try {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(member.getId()));
query.addCriteria(Criteria.where("pw").is(member.getPw()));
Update update = new Update();
update.set("pw",member.getNewPw());
UpdateResult result = mongodb.updateFirst(query, update, Member.class);
return result.getModifiedCount();
} catch (Exception e) {
e.printStackTrace();
return -1L;
}
}
}