SpringBoot 프로젝트

Java와 Spring Boot로 로그인 기능 쉽게 구현하기

orin602 2024. 11. 17. 16:59

login.html 

<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org">

<head>

<meta charset="utf-8">

<title>login</title>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.5.2/css/all.min.css">

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@11.4.10/dist/sweetalert2.min.css">

<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.4.10/dist/sweetalert2.min.js"></script>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

<link rel="stylesheet" th:href="@{/css/login.css}">

<script th:src="@{js/login.js}"></script>

</head>

<body>

<div class="login-container">

     <h1>로그인</h1>

      <form id="login-form" method="post">

            <input type="text" name="id" id="id" placeholder="ID">

            <input type="password" name="pwd" id="pwd" placeholder="Password">

            <button class="login-btn" type="button" onclick="login()">로그인</button>

      </form>

      <div class="find-form">

            <button class="findid-btn" type="button" onclick="findId()">아이디찾기</button>

            <button class="findpwd-btn" type="button" onclick="findPwd()">비밀번호찾기</button>

      </div>

</div>

<script th:inline="javascript">

      /*<![CDATA[*/

      var message = [[${message}]];

      var messageType = [[${messageType}]];

      var text = [[${text}]];

      /*]]>*/

      $(document).ready(function() {

            if (message && messageType) {

                  Swal.fire({

                        title: message,

                        text: text,

                        icon: messageType

                  });

            }

      });

</script>

</body>

</html>

19번째 줄 : <button class="login-btn" type="button" onclick="login()">로그인</button> '로그인'버튼을 누르면 
11번째 줄 : <script th:src="@{js/login.js}"></script>  는 login.js에 있는 login()함수를 호출한다.

 

login.js

// 로그인

function login() {

     // 1. ID 필드가 비어 있는지 확인

     if ($("#id").val() == "") {

          swal.fire({

               title: 'ID를 입력해 주세요',

               icon: 'warning'

          });

          return false;

     }

     // 2. Password 필드가 비어 있는지 확인

     else if ($("#pwd").val() == "") {

            swal.fire({

                  title: 'Password를 입력해 주세요',

                  icon: 'warning'

            });

            return false;

      }

      // 3. 모든 필드가 채워졌다면 폼을 제출

      $("#login-form").attr("action", "/login").submit();

}

$("#id") 로 ID 입력 필드의 값을 가져오고, .val()  메서드를 사용해 그 값을 확인합니다.

만약 값이 비어 있다면,

swal.fire({

               title: 'ID를 입력해 주세요',

               icon: 'warning'

          });

를 사용해 경고 메시지를 표시하고 함수를 종료합니다.

return false; 를 통해 폼 제출이 중단한다.

Password 입력 필드 역시 같은 방식으로 확인합니다. 값이 비어 있을 경우 경고 메시지가 표시되고 함수가 종료되어, 사용자는 Password 필드를 입력해야 다음 단계로 넘어갈 수 있습니다.

$("#login-form").attr("action", "/login").submit();  > 모든 필드가 채워졌다면 $("#login-form") 의 action 속성을 /login으로 설정하고, submit() 메서드를 호출해 서버의 /login URL로 폼 데이터를 전송합니다. 이때, 서버는 이 데이터를 받아 로그인 처리를 하게 됩니다.

 

이 함수에서는 jQuery를 사용하여 #login-form의 action을 /login으로 설정하고, submit()을 호출해 Controller에 로그인 요청을 전송한다.

 

MemberRepository

@Query(value="SELECT * FROM member WHERE id =:id", nativeQuery=true)

Member findByLoginId(String id);

@Query 어노테이션을 사용해 데이터베이스에서 ID로 회원 정보를 검색.

nativeQuery=true 를 통해 네이티브 SQL을 사용합니다. "SELECT * FROM member WHERE id =:id" 쿼리는 id 값에 해당하는 회원 정보를 Member 객체로 반환.

 

MemberServiceImpl

@Override

public int loginId(Member vo) {

     int result = -1;

 

      // 회원 조회

      Member member = memberRepo.findByLoginId(vo.getId());

 

      if (member != null) {

            if(member.getPwd().equals(vo.getPwd())) {

                  result = 1; // id, pwd 일치

            } else {

                  result = 0; // pwd 불일치

            }

      } else {

            result = -1; // id 없음

      }

      return result;

}

memberRepo.findByLoginId(vo.getId()) 를 호출해 id에 해당하는 회원 정보를 가져옵니다. 만약 해당 ID가 없으면 null이 반환됩니다.

if문을 통한 로그인 유효성 검사 : 

  • member != null && member.getPwd().equals(vo.getPwd()): id와 password가 모두 일치하는 경우, result를 1로 설정합니다.
  • member != null && !member.getPwd().equals(vo.getPwd()): id는 있지만 password가 일치하지 않는 경우, result를 0으로 설정합니다.
  • member == null: id 자체가 없는 경우, result를 -1로 설정하여 ID가 없음을 나타냅니다.

 

MemberController

@Autowired를 사용하여 Spring이 MemberService의 인스턴스를 자동으로 memberService 필드에 주입.

@Autowired

private MemberService memberService;  MemberService의 메서드들을 사용할 수 있도록 한다.

// 로그인 처리

@PostMapping("/login")

public String loginAction(HttpSession session, Member vo, Model model) {

     int result = memberService.loginId(vo);

 

     model.addAttribute("message", null); // 초기화

 

     if(result == 1) {

         Member user = memberService.getMember(vo.getId());

         session.setAttribute("loginUser", user); // 세션에 로그인 사용자 정보 저장

         return "redirect:/main";

     } else if(result == -1) {

         model.addAttribute("message", "ID가 존재하지 않습니다.");

         model.addAttribute("messageType", "warning");

 

     } else {

         model.addAttribute("message", "비밀번호가 틀립니다.");

         model.addAttribute("messageType", "error");

     }

     return "login/login";

}

@PostMapping("/login")  : /login URL로 들어오는 POST 요청을 @PostMapping을 통해 처리.

memberService.loginId(vo);  : 로그인 요청을 처리하고, 결과값 result를 반환받습니다.

     이때 Member 객체 vo는 login.html에서 사용자가 입력한 ID와 Password.

 

  • result == 1: ID와 비밀번호가 일치하는 경우, memberService.getMember(vo.getId())를 호출하여 사용자 정보를 가져오고, session.setAttribute("loginUser", user)로 세션에 사용자 정보를 저장합니다. 이후 홈 화면으로 리다이렉트합니다.
  • result == -1: ID가 존재하지 않는 경우, Model 객체에 "ID가 존재하지 않습니다." 메시지와 messageType을 "warning"으로 추가하고, 다시 로그인 페이지로 이동합니다.
  • result == 0: 비밀번호가 일치하지 않는 경우, 오류 메시지와 messageType을 "error"로 설정하여 로그인 페이지로 돌아갑니다.
  • 로그인 요청을 처리하는 Controller에서 로그인 결과에 따라 message, messageType, text 값을 설정합니다. 이 값들은 Model 객체에 저장되어 HTML로 전달됩니다.

login.html에서 26번째 줄에 있는

<script th:inline="javascript">

     /*<![CDATA[*/

      var message = [[${message}]];

      var messageType = [[${messageType}]];

      var text = [[${text}]];

      /*]]>*/

      $(document).ready(function() {

            if (message && messageType) {

                  Swal.fire({

                        title: message,

                        text: text,

                        icon: messageType

                  });

            }

      });

</script>

 

Spring Boot와 SweetAlert2를 활용한 로그인 결과

 

 

ID가 존재하지 않을 때

ID가 존재하지 않을 때

비밀번호가 틀렸을 때

비밀번호가 틀렸을 때