본문 바로가기
스프링

Spring MVC Project 로그인 프로세스

by 이페코장인 2024. 4. 3.

로그인 프로세스 예시

 

1. Client가 View에서 아이디-비밀번호 제출

사용자가 아이디와 비밀번호를 제출하게 되면, 해당 제출 form의 데이터가 전송된다. 이 때 요청에 포함된 데이터로는 아이디, 비밀번호, form의 action 그리고 method가 있다. 이번 예시에서는 다음과 같은 from이 사용되어, "/login"으로 post방식으로 아이디와 비밀번호 데이터를 보내게 된다.

 

<form action="${path}/login" method="post">

 

이에 "/login"의 post방식이 매핑된 controller부분으로 요청이 전해지게 된다.

 

 

 

2. Controller로 요청 전달

이번 예시에서 controller.java가 다음과 같은 처리를 하도록 코딩되었다.

	@PostMapping("/login") // POST임을 알리는 어노테이션
	public String login(Model model, String memberId, String memberPwd) {
		Member loginMember = service.login(memberId, memberPwd);
		
		if(loginMember != null) { // 로그인이 성공한 경우
			model.addAttribute("loginMember", loginMember);
			return "redirect:/"; // index로 보내는 리다이렉트문
		} else { // 로그인이 실패한 경우
			model.addAttribute("msg", "아이디와 패스워드를 확인해주세요.");
			model.addAttribute("location", "/");
			return "common/msg";
		}
	}

 

로그인이 성공하면 model에 로그인 회원 객체를 저장하고 메인페이지로 redirect해주고 있다. 회원의 member객체를 찾기 위해 service.login() 메소드를 호출하고 있으므로 service.java코드에서 해당 메소드를 확인해 본다.

	public Member login(String id, String pwd) {
		Member member = mapper.selectMemberById(id);
		if(member == null) {
        	// 저장된 회원 없음
			return null;
		}
		if(member.getPassword().equals(pwd)) {
        	// 로그인 성공
			return member;
		} else {
			// 실패 (비밀번호 불일치)
			return null;
		}
	}

 

service의 코드를 처리하기 위해 mapper에서 selectMemberById 메소드로 member를 조회해야 한다. 조회한 값이 존재하고, 아이디와 비밀번호가 일치해야 member를 반환하게 된다.

 

 

3. Mapper에서 SQL구문 전송

mapper.java에서 selectMemberById메소드를 가지고 있다.

@Mapper
public interface MemberMapper {
	Member selectMemberById(String id);
}

 

이 메소드는 Spring에서 mapper.xml파일의 SQL구문에 연결해 주고 있다.

	<select id="selectMemberById" resultMap="memberResultMap" parameterType="String" >
		SELECT  
			*
		FROM MEMBER WHERE ID = #{id} AND STATUS ='Y' 
	</select>

 

여기서 SQL구문의 #{id}부분에 사용자의 요청에서 보낸 아이디 데이터를 입력해서 MySQL DB에 쿼리를 전송하게 된다.

 

 

4. DB에서 데이터 조회

MySQL에서 데이터를 조회한 뒤, 조회된 데이터를 반환하게 된다. 반환값은 mapper.xml에서 정의된 memberResultMap으로 받아 java객체(Member)로 사용할 수 있게 된다.

<resultMap type="Member" id="memberResultMap">
    <result property="mno" column="MNO"/>
    <result property="id" column="ID"/>
    <result property="password" column="PASSWORD"/>
    <result property="name" column="NAME"/>
    <result property="status" column="STATUS"/>
    <result property="enrollDate" column="ENROLL_DATE"/>
    <result property="modifyDate" column="MODIFY_DATE"/>
</resultMap>

 

 

5. Controller에서 요청 처리, 결과 전달

DB에서 조회된 member 데이터는 -> mapper -> service -> controller로 반환되어, controller에서 요청을 처리할 수 있게 된다. 처리된 결과를 model attribute에 추가하고, 정의된 view에 전달된다. 해당 view에서 model attribute의 값에 따라 JSP EL표현들을 처리한다.

<c:if test="${loginMember != null}">
    <ul class="navbar-nav navbar-nav-hover align-items-lg-center">
        <li class="nav-item" style="color: white">${loginMember.name}님 안녕하세요</li>
    </ul>
</c:if>

 

예시에서 loginMember값이 존재한다면, "이름"님 안녕하세요 라고 헤더에서 나오도록 설계했다.

 

 

6. View 출력

결과를 확인하면, 로그인된 멤버의 이름을 헤더에 처리해 view를 출력하고 있다.