spring 2022/03/03(member.java)

무간·2022년 3월 3일

세션 : 메모리

서버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;
        }
    }     
}
profile
당신을 한 줄로 소개해보세요

0개의 댓글