Coding History

Spring Login Logout 구현

BlackBirdIT 2024. 8. 13. 08:59
    @RequestMapping("/usr/member/doLogin")
    @ResponseBody
    public ResultData<Member> doLogin(HttpServletRequest request, String loginId, String loginPw) {
        HttpSession session = request.getSession();
        // 이미 로그인된 상태인지 확인
        if (session.getAttribute("loginUser") != null) {
            return ResultData.from("F-0", "이미 로그인된 상태입니다.");
        }

        if (Ut.isEmptyOrNull(loginId)) 
            return ResultData.from("F-1", "아이디를 입력해주세요.");


        if (Ut.isEmptyOrNull(loginPw)) 
            return ResultData.from("F-2", "비밀번호를 입력해주세요.");


        ResultData<Member> loginRd = memberService.doLogin(loginId, loginPw);

        if (loginRd.isFail()) return loginRd;


     // 로그인 성공 시 세션에 사용자 정보 저장
        session = request.getSession();
        session.setAttribute("loginUser", loginRd.getData1());

        return memberService.doLogin(loginId, loginPw);
    }
    public ResultData<Member> doLogin(String loginId, String loginPw) {
        Member member = memberRepository.getMemberByLoginId(loginId);

        if (member == null) {
            return ResultData.from("F-3", "아이디 또는 비밀번호가 일치하지 않습니다.");
        }

        if (!member.getLoginPw().equals(loginPw)) {
            return ResultData.from("F-3", "아이디 또는 비밀번호가 일치하지 않습니다.");
        }

        return ResultData.from("S-1", Ut.f("%s님 환영합니다.", member.getNickname()), member);
    }
@Mapper
public interface MemberRepository {

    @Select("SELECT LAST_INSERT_ID();")
    public int getLastInsertId();

    @Insert("INSERT INTO `member` SET regDate = NOW(), updateDate = NOW(), loginId = #{loginId}, loginPw = #{loginPw}, `name` = #{name}, nickname = #{nickname}, cellphoneNum = #{cellphoneNum}, email = #{email}")
    public void doJoin(String loginId, String loginPw, String name, String nickname, String cellphoneNum, String email);

    @Select("SELECT * FROM `member` WHERE id = #{id}")
    public Member getMemberById(int id);

    @Select("SELECT * FROM `member` WHERE loginId = #{loginId}")
    public Member getMemberByLoginId(String loginId);

    @Select("SELECT * FROM `member` WHERE nickname = #{nickname}")
    public Member getMemberByNickname(String nickname);

    @Select("SELECT * FROM `member` WHERE email = #{email}")
    public Member getMemberByEmail(String email);

    @Select("SELECT * FROM `member` WHERE email = #{email} AND `name` = #{name}")
    public Member getMemberByNameAndEmail(String name, String email);

    @Select("SELECT * FROM `member` WHERE cellphoneNum = #{cellphoneNum} AND `name` = #{name}")
    public Member getMemberByNameAndCellphoneNum(String name, String cellphoneNum);

    @Select("SELECT COUNT(*) FROM `member` WHERE loginId = #{loginId} AND loginPw = #{loginPw}")
    public int doLogin(String loginId, String loginPw);

    @Select("SELECT nickname FROM `member` WHERE id = #{id}")
    public String getNickname(int id);
//    
//    @Select("SELECT * FROM `member` WHERE loginId = #{loginId}")
//    public int getMemberByLoginId1(String loginId);

}

일단 중복쿼리가 전에는 존재했었다. 그 부분을 해결 하고, login 상태를 저장하기 위해서 저번에 배웠던 HttpSession session 을 사용해서 로그인 상태를 저장했다.

일단 바꾼 코드도 로그인이 잘 되는 것을 확인하고,

    @RequestMapping("/usr/member/doLogout")
    @ResponseBody
    public ResultData<Void> doLogout(HttpSession session) {
        // 로그인 상태 확인
        if (session.getAttribute("loginUser") == null) 
            return ResultData.from("F-0", "로그인 상태가 아닙니다.");


        // 로그아웃 처리
        session.invalidate();

        return ResultData.from("S-1", "로그아웃 되었습니다.");
    }

로그아웃은 컨트롤러에만 구현하면 되서 간단하게 했다.

이렇게 끝!