Spring

Spring(스프링) 로그인 기능 구현

개발윗미 2021. 10. 17. 12:45

1. 프로젝트 - src - main - webapp - WEB-INF - jsp - main 폴더 하위에 login.jsp 파일 생성

<login.jsp 주요 코드>

			<form action="${pageContext.request.contextPath}/loginCK.do" novalidate="novalidate" method="post">
                                <fieldset>
                                    <div>
                                        <section>
                                            <div class="row input_size">
                                                <label class="label col col-4">아이디</label>
                                                <div class="col col-8">
                                                    <label class="input">
                                                        <input type="text" name="id" autocomplete="off" autofocus>
                                                    </label>
                                                </div>
                                            </div>
                                        </section>
                                        <section>
                                            <div class="row input_size">
                                                <label class="label col col-4">비밀번호</label>
                                                <div class="col col-8">
                                                    <label class="input">
                                                        <input type="password" name="pw" autocomplete="current-password">
                                                    </label>
                                                </div>
                                            </div>
                                        </section>
                                    </div>
                                </fieldset>
                                <button class="btn btn-user btn-block" style="color: white; background-color: red" type="submit">로그인</button>
                            </form>

 

위 코드는 로그인 기능을 수행하기 위해 임시로 만든 아직 꾸며지지 않은 jsp파일이다.

 

또한, jsp 내 코드에서 주요 코드만 가져온 것이기 때문에 아래와 같이 나오지 않을 수도 있다.

 

로그인 UI

 

2. Controller

@RequestMapping(value = "/loginCK.do")
public void loginCK(CommandMap commandMap, HttpServletRequest req, HttpServletResponse res) throws Exception {
        res.setContentType("text/html; charset=UTF-8");
        PrintWriter out = res.getWriter();
        if (commandMap.getMap().get("id").equals("")) {
            out.print("<script>alert('아이디를 입력해주세요.');window.location.href='login_page.do'</script>");
            return;
        }

        int flag = memberService.Login(commandMap.getMap(), req);

        if (flag == 1) {
            out.print("<script>alert('가입된 아이디가 아닙니다. 회원가입을 진행해주세요.');window.location.href='login_page.do'</script>");
        } else if (flag == 2) {
            out.print("<script>alert('비밀번호를 잘못 입력하였습니다.');window.location.href='login_page.do'</script>");
        } else if (flag == 3) {
            HttpSession session = req.getSession();
            Map<String, Object> map = (Map<String, Object>) session.getAttribute("member_info");
            out.print("<script>window.location.href='sample/openSampleBoardList.do'</script>");
        }

    }

 

3. Service

public interface MemberService {

    int Login(Map<String, Object> map, HttpServletRequest req) throws Exception;
}

 

4. ServiceImpl

@Resource(name = "memberDAO")
    private MemberDAO memberDAO;

    @Override
    public int Login(Map<String, Object> map, HttpServletRequest req) throws Exception {
        HttpSession session = req.getSession();
        Map<String, Object> resultMap = new HashMap<>();

        if ((resultMap = memberDAO.Login(map)) == null) {
            log.error("등록이 안된 회원 ID : " + map.get("id"));
            return 1;
        } else {
            try {
                map.put("pw", (String)map.get("pw"));
            } catch (Exception e) {
                log.error("비밀번호 sha 암호화 오류 : " + e);
            }
            if ((resultMap = memberDAO.Login_2(map)) == null) {
                log.error("비밀번호 오류 ID : " + map.get("id"));
                return 2;
            }
        }

        session.setAttribute("member_info", resultMap);
        log.debug("로그인 : " + resultMap);

        return 3;
    }

 

 

5. DAO

@Repository
public class MemberDAO extends AbstractDAO {
    Logger log = Logger.getLogger(this.getClass());

    public Map<String, Object> Login(Map<String, Object> map) {
        return (Map<String, Object>) selectOne("member.Login", map);
    }

    public Map<String, Object> Login_2(Map<String, Object> map) {
        return (Map<String, Object>) selectOne("member.Login_2", map);
    }
}

 

6. SQL

<mapper namespace="member">
    <select id="Login" parameterType="hashmap" resultType="hashmap">
        <![CDATA[
            SELECT
                id, pw
            FROM
                member_info
            WHERE
                id=#{id}
        ]]>
    </select>

    <select id="Login_2" parameterType="hashmap" resultType="hashmap">
        <![CDATA[
            SELECT
                id, pw, name
            FROM
                member_info
            WHERE
                id=#{id}
            AND
                pw=#{pw}
        ]]>
    </select>
</mapper>

 

7. 결과

로그인 수행 시 로그에 "로그인 : {pw, name, id} 의 값들이 나타나면서 정상적으로 로그인 기능이 수행된 것을 확인할 수 있다.