본문 바로가기
백엔드/Spring Framework

게시판 구현 / 2. 로그인

by maverick11471 2024. 7. 16.

[요약]

 - 로그인이 가능토록 구현(HttpSession으로 자바에서 화면단으로 전송)

2024.07.15 - [분류 전체보기] - Web Application(2) / 화면에서 전송한 데이터 자바로 받기

 

Web Application(2) / 화면에서 전송한 데이터 자바로 받기

2024.07.15 - [분류 전체보기] - Web Application(1) / 화면에서 자바로 데이터 전송(1. Form Data) / 요청 url 매핑 방식 Web Application(1) / 화면에서 자바로 데이터 전송(1. Form Data) / 요청 url 매핑 방식[과제] 1. Na

maverick11471.tistory.com

 

 - 

 


[화면단 / login.jsp]

<script>
    $(() => {
        // model, session, request에 담겨있는 데이터 javascript에서 꺼내서 사용하기
        const loginFailMsg = '${loginFailMsg}';

        if(loginFailMsg === 'idNotExist') {
            alert("존재하지 않는 아이디입니다.");
        } else if(loginFailMsg === 'wrongPassword') {
            alert("잘못된 비밀번호입니다.");
        }
    });
</script>

 

[mapper]

 - 값이 username, password 2개이기 때문에 뒤에 service에서 loginMember가 2개가 된다.

<select id="login" parameterType="member" resultType="member">
    SELECT ID
         , USERNAME
         , PASSWORD
         , EMAIL
         , NICKNAME
         , TEL
        FROM MEMBER
        WHERE USERNAME = #{username}
          AND PASSWORD = #{password}
</select>

 

[Dao]

public MemberDto login(MemberDto memberDto) {
    return mybatis.selectOne("MemberDao.login", memberDto);
}

 

[service + Impl]

MemberDto login(MemberDto memberDto);
@Override
public MemberDto login(MemberDto memberDto) {
    int usernameCheck = memberDao.usernameCheck(memberDto.getUsername());

    if(usernameCheck == 0)
        throw new RuntimeException("idNotExist");

    MemberDto loginMember = memberDao.login(memberDto);
	
    // loginMember는 id, password 2개이지만 어차피 위에서 usernameCheck를 했기 때문에
    // wrongPassword만 thorw로 던져주면 된다
    if(loginMember == null)
        throw new RuntimeException("wrongPassword");

    return loginMember;
}

 

[controller] : 로그인과 로그아웃

@PostMapping("/login.do")
public String login(MemberDto memberDto, Model model, HttpSession session) {
    try {
        MemberDto loginMember = memberService.login(memberDto);

        loginMember.setPassword("");

        session.setAttribute("loginMember", loginMember);

        return "redirect:/";
    } catch (Exception e) {
        model.addAttribute("loginFailMsg", e.getMessage());
        return "member/login";
    }
}

@GetMapping("/logout.do")
public String logout(HttpSession session) {
    // 세션에 있는 내용 모두 초기화
    session.invalidate();

    return "redirect:/member/login.do";
}

 

[header.jsp 수정]

<%@ taglib prefix="c" uri="jakarta.tags.core" %>
        <c:choose>
        // loginMember 값이 null일때 우측 위 표시 할 부분을 설정
        <c:when test="${loginMember eq null}">
            <li class="nav-item">
                <a class="nav-link" href="/member/login.do">로그인</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="/member/join.do">회원가입</a>
            </li>
        </c:when>
        // null이 아닐 때 우측 위 부분 설정
        <c:otherwise>
            <li class="nav-item">
            	// 닉네임이 나오도록
                <a class="nav-link">${loginMember.nickname}</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="/member/logout.do">로그아웃</a>
            </li>
        </c:otherwise>
    </c:choose>