본문 바로가기

프로그래밍/스프링(spring)

[스프링/spring] 스프링 로그인 기능 만들기(DB 사용)

오늘은 예전에 연결 되었던 DB를 연결하여 로그인 기능을 구현해보도록 하겠습니다.

일단 mybatis라는 라이브러리를 사용하여 구현해 보도록 하겠습니다.

 

 

pom.xml 에 추가 해 주시고요.

 

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.5.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>2.0.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>${org.springframework-version}</version>
</dependency> 

 

 

스프링 사용하는 버전도 바꿔 보겠습니다.

자 이제

 

 

views 폴더에 common 폴더를 만들어주시고 LoginPage.jsp 를 만들어 줍니다.

jsp 소스는

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
	<meta charset="UTF-8">
	<title>로그인</title>
	<style>
   form{
       text-align: center;
       margin:0 auto;
   }

   .border{
       margin:0 auto;
       width:400px;
       height:500px;
       border:1px solid #000;
       border-radius: 10%;
   }

   img{
       margin-top:20px;
       margin-bottom:80px;
   }

   input{
       width:300px;
   }
	</style>
	</head>
	<body>
    	<form action ="/Login" method="post">
        	<div class="border">
            	<h1>로그인</h1>
            	<img src ="/images/profle.jpg"><br>
            	
                <input type="text"  name="id" id="id" placeholder="아이디를 입력해주세요."><br>
            	<input type="password" name="password" id="password" placeholder="비밀번호를 입력해주세요."><br><br>
            	<input type="submit" value="로그인">

        	</div> 
    	</form>
	</body>
</html>

 

자 이제 root-servlet 안에 mybatis 를 쓴다는 설정을 해줘야 해요.

 

 

 

위치는 여기에 있고요. 밑에는 소스 코드를 복사해서 붙여 놓기 해주시면 되겠습니다. (저번시간과 같은 DB url, id, pw 사용하였습니다.)

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <!-- 베이스가 되는 패키지 이름 -->
    <context:component-scan base-package="com.spring.example"></context:component-scan>

    <mybatis-spring:scan base-package="com.spring.example"/>

    <context:annotation-config></context:annotation-config>
    
    <!-- Root Context: defines shared resources visible to all other web components -->
    <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl"  value="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&serverTimezone=UTC" />
        <property name="username" value="root" />
        <property name="password" value="0000" />
    </bean>

    <!-- 커넥션폴 설정 -->
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
        <constructor-arg ref="hikariConfig" />
    </bean>
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <property name="mapperLocations" value="classpath:mapper/**/*.xml" />
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg ref= "sqlSessionFactory"></constructor-arg >
    </bean>

</beans>

 

자, 이제 mybatis 라는 애들 사용하여 DB에 있는것을 사용하는 SQL 를 작성해 보곘습니다.

 

 

resource 라는 곳에 mapper 폴더에 common 폴더를 만들어주시고 Member.xml 를 만들어 주세요.

또 resource 폴더에 myvatis-config.xml를 만들어 줍니다.

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="Member">

    <select id="Login" parameterType="MemberVO" resultType="Int">
        SELECT COUNT(*)
          FROM USER
         WHERE ID = #{id}
           AND PASSWORD = #{password}
    </select>

</mapper>

 

Member.xml 에는 이 소스를 넣어주시고요.

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0/EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <typeAliases>
          <typeAlias alias="MemberVO" type="com.spring.example.VO.MemberVO" />
    </typeAliases>
</configuration>

 

mybatis-config.xml에는 이 것을 넣어줍니다.

 

 

 

자, 이제 자바소스를 만들어보겠습니다.

패키지로 com.spring.example. dao , com.spring.example.Login , com.spring.example.service, com.spring.example.serviceImpl, com.spring.example.VO 를 만들어주고 각각 폴더에

MemberDao 클래스 , LoginController 클래스, MemberService 인터페이스, MemberServiceImple 클래스 , MemberVO 클래스 를 넣만들어줍니다.

MemberDao 클래스 에는 이 소스를 넣어주시고

 

package com.spring.example.dao;

 
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.spring.example.VO.MemberVO;

@Repository
public class MemberDao {

    @Autowired
    private SqlSessionTemplate mybatis;

    public int Login(MemberVO vo) throws Exception {
        return mybatis.selectOne("Member.Login", vo);
    }

}

 

LoginController 클래스에는

 

package com.spring.example.Login;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.spring.example.VO.MemberVO;
import com.spring.example.serviceImpl.MemberServiceImpl;

@Controller
public class LoginController {

    private static final Logger logger = LoggerFactory.getLogger(LoginController.class);

    @Autowired
    private MemberServiceImpl memberServiceImpl;

    @RequestMapping(value = "/Login", method = RequestMethod.GET)
    public String LoginPage() {
        return "/common/LoginPage";
    }

    @RequestMapping(value = "/Login", method = RequestMethod.POST)
    public String Login(@RequestParam("id") String id
                       , @RequestParam("password") String password) throws Exception {

        String path = "";

        MemberVO vo = new MemberVO();

        vo.setId(id);
        vo.setPassword(password);

        int result = memberServiceImpl.Login(vo);

        if(result == 1) {
            path = "home";
        } else {
            path = "/common/LoginPage";
        }

        return path;

    }

}

 

MemberService에는

 

package com.spring.example.service;

import com.spring.example.VO.MemberVO;

public interface MemberService {

    public int Login(MemberVO vo) throws Exception;

}

 

MemberServiceImpl에는

 

package com.spring.example.serviceImpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.spring.example.VO.MemberVO;
import com.spring.example.dao.MemberDao;
import com.spring.example.service.MemberService;

@Service
public class MemberServiceImpl implements MemberService{

    @Autowired
    private MemberDao memberDao;

    @Override
    public int Login(MemberVO vo) throws Exception {
    
        return memberDao.Login(vo);

    }
}

 

MemberVO 에는

 

package com.spring.example.VO;

public class MemberVO {

    private String id;
    private String password;

    // getter, setter
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    

    // 생성자
    public MemberVO() {

    }

    // to String
    @Override
    public String toString() {
        return "MemberVO [id=" + id + ", password=" + password + "]";
    }

} 

 

를 넣어줍니다.

그리고 사진 이 하나 추가 되었으므로

 

이 경로로 넣어주시면 되겠습니다.

 

images.zip
1.79MB

 

db는 터미널에 명령해도 되고 DB툴을 이용하여 넣어주도록하겠습니다. 저는 mysql workbench를 이용하여 넣어 봤습니다.

mysql workbench 는 윈도우는 mysql 설치 시 다운이 자동으로 되어있고 맥은

https://dev.mysql.com/downloads/workbench/

 

MySQL :: Download MySQL Workbench

Select Operating System: Select Operating System… Microsoft Windows Ubuntu Linux Red Hat Enterprise Linux / Oracle Linux Fedora macOS Source Code Select OS Version: All Windows (x86, 64-bit) Recommended Download: Other Downloads: Windows (x86, 64-bit), MSI

dev.mysql.com

 

설치가 가능하고 다 다음버튼을 누르는 식으로 하면 다운로드가 됩니다.

 

 

 

mysql 첫화면인데 여기서 MYSQL Connections 에 + 버튼을 눌러 주세요.

 

 

 

맨위에 Connection Name은 구별하기 쉽게(다른프로젝트 랑) 해주세요 저는 test로 헀습니다.

Test Connection을 누르고 root 비밀번호를 누르면

 

성공메세지가 뜨면 성공

Ok 버튼 후 생긴곳에 들어가게 된후 디비를 작성할수 있게 됩니다.

디비 작성시 스키마를 확인해주세요~ (저희가 사용할 스키마에 넣어야 합니다.)

 

 

 

왼쪽에 보이는게 스키마이고 굵은 글씨로 써져있어야 데이터가 그곳으로 들어가게 됩니다.

create table user(
    id varchar(100) primary key,
    password varchar(100)
);

insert into user values( 'admin', '1234' );

commit;

 

소스를 작성후

 

저장 버튼 옆에 번개모양 버튼을 눌러주시면 잘 들어가게 됩니다.

서버를 실행해 보겠습니다.

 

 

 

메인화면에서 오른쪽 상단에 로그인 버튼을 눌러주시면 로그인페이지로 가게 됩니다.

 

로그인 페이지에서 유저 정보가 아까 전에 넣었던 ID : admin , PW : 1234 가 맞기 않으면 로그인 페이지에 있고 맞게 되면 메인화면으로 가게 됩니다.

 

 

 

 

=============================  Q&A =============================

 

 

 

 

제가 프로젝트 과정을 올리면서 안올라간 부분이 있었네요

제 프로젝트 경우에는 home.jsp 에 href="/login"이라는 것을 추가하여 실행하였습니다.

 

 

 

만약에 제가 올린 프로젝트를 기반으로 커스텀 프로젝트 일경우에는 로그인 페이지로 설정되 path를 설정해주시면 원하는 로직대로 작동합니다.