Day56

2020. 12. 18. 11:34교육과정/KOSMO

키워드 : JDBC에서의 테스트 작업 / Mybatis에서의 테스트 작업 / 

 

 

****

 

 

1. JDBC에서의 테스트 작업

 

※ 테스트 작업을 할 때는 패키지도 따로 만들어서 작업한다. 

※ 원본파일은 건드리지 않고 테스트하기 위해 테스트 작업이 존재하는 것이며,

    실무에서는 원본 파일에는 기능과 연관성 없는 sysout과 같은 구문은 모두 배제해야 한다. 

 

JdbcTest.java
0.00MB

 

 

(1) hWebBoard 프로젝트에서 테스트를 위한 패키지를 만든다.

    (어제 지워서 만드는 것으로 이미 파일이 있을 경우엔 생략)

    윈도우의 파일 탐색기에서 프로젝트로 경로로 찾아 들어가서 test 폴더를 만들고 테스트용 패키지를 만든다. 

test 폴더경로 : C:\java\webwork\Spring\Junior\hWebBoard\src\test

 

다운받은 파일을 넣을 테스트용 패키지 경로 : C:\java\webwork\Spring\Junior\hWebBoard\src\test\java\com\javaclass\basic

 

(2) JdbcTest.java 파일엥서 테스트하고 싶은 부분인 textConnection( )  함수에 @Test 애노테이션을 붙인다. 

     org.junit.Test 가 import 되어야 한다. 

 

※ JUnit : Java에서 독립된 단위 테스트 (Unit Test)를 지원해주는 프레임워크

            JUnit4 부터 테스트를 지원하는 애노테이션을 제공한다. (@Test @Before After)

            @Test 메소드가 호출할 때마다 새로운 인스턴스를 생성하여 독립적인 테스트가 이루어지게 한다. 

 

@Test

 - @Test가 선언된 메소드는 테스트를 수행하는 메소드가 된다. 

 - JUnit은 각각의 테스트가 서로 영향을 주지 않고 독립적으로 실행됨을 원칙으로 하여
   @Test마다 객체를 생성한다. 

@Ignore  - @Ignore가 선언된 메소드는 테스트를 실행하지 않게 한다. 
@Before

 - @Before가 선언된 메소드는 @Test 메소드가 실행되기 전에 반드시 실행된다. 

 - @Test 메소드에서 공통으로 사용하는 코드를 @Before 메소드에 선언하여 사용하면 된다. 

 @After  - @After가 선언된 메소드는 @Test 메소드 이후에 실행된다. 
 @BeforeClass  - @BeforeClass 애노테이션은 @Test 메소드보다 먼저 한 번만 수행되어야 할 경우에 사용한다. 
 @AfterClass  - @AfterClass 애노테이션은 @Test 메소드보다 나중에 한 번만 수행되어야 할 경우에 사용한다. 

 

( 참고 : shlee0882.tistory.com/202)

import org.junit.Test;
....

    @Test
    public void testConnection() {
        try {
            Connection con = 
                DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.17:1521:orcl", 
                "scott", "tiger");
            System.out.println("[테스트] DB 연동 성공");
        } catch (Exception e) {
        e.printStackTrace();
        }
    }

 

 

(3) 파일 우클릭 - Run As - JUnit Test 선택 - JUnit 콘솔에서 초록색으로 표시되어야 정상 (빨간색이면 잘못된 것)

 

 

 

( 실행결과 )

[테스트] DB 연동 성공

 

 

< JdbcTest.java 전체 소스 코드 >

더보기
package com.javaclass.basic;

import java.sql.Connection;
import java.sql.DriverManager;

import org.junit.Test;


public class JdbcTest {

	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Test
	public void testConnection() {
		try {
			Connection con = 
			DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.17:1521:orcl", 
					"scott", "tiger");
			System.out.println("[테스트] DB 연동 성공");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

 


 

2. Mybatis에서의 테스트 작업

 

MybatisTest.java
0.00MB

 

 

(1) MybatisTest.java 에서 클리스명 윗줄에 @RunWith, @ContextConfiguration 애노테이션을 붙인다. 

 @RunWith(SpringJUnit4ClassRunner.class)  - JUnit 프레임워크의 테스트 실행방법을 확장할 때 사용한다.
 - SpringJUnit4ClassRunner라는 클래스를 지정해주면
    JUnit이 테스트를 진행하는 중에 ApplicationContext를 만들고
    관리하는 작업을 진행해준다. 
 - @RunWith 애노테이션은 각각의 테스트 별로 객체가 생성되더라도
    싱글톤(Singletone)의 ApplicationContext를 보장한다. 
 @ContextConfiguration  - 스프링 빈(Bean) 설정 파일의 위치를 지정할 때 사용한다. 
 @Autowired  - 스프링 DI 에서 사용하는 특별한 애노테이션으로
    해당 변수에 자동으로 빈(Bean)을 매칭해준다. 
 - 스프링 빈(Bean) 설정 파일을 읽기 위해 굳이
    GenericXmlApplicationContext를 사용할 필요가 없다. 
 - 변수, setter, 생성자, 일반 메소드에 적용할 수 있다. 
 - 의존하는 객체를 주입할 때 주로 Type을 이용하게 된다. 
 - <property>, <constructor-arg> 태그와 동일한 역할을 한다. 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")

 

(2) 변수로 사용하는 클래스를 스프링 컨테이너에서 찾아서 연결시킬 수 있도록 @Autowired 애노테이션을 붙인다. 

@Autowired
private DataSource dataSource;
	
@Autowired
private SqlSessionFactory sqlSessionFactory;

 

(3) 테스트하고자 하는 함수에 @Test 애노테이션을 붙인다. 

@Test
public void timeTest() {

 

(4) timeTest( ) 함수에서는 세션을 하나 얻어오는 selectOne( ) 메소드를 사용하여

     TestMapper.xml에 있는 SQL문을 콘솔에 출력할 수 있다. 

     selectOne( ) 메소드는 세션을 하나만 얻어오는 함수이며

     파라미터는 testMappser.xml 에 있는 namespace와 id를 기술한다. 

SqlSession session = sqlSessionFactory.openSession();
    System.out.println("[테스트] " + session.selectOne("org.javassem.TestMapper.getTime"));

 

( 실행결과 )

[테스트] RESEARCH

 

 

< MybatisTest.java 전체 소스 코드 >

더보기
package com.javaclass.basic;

import java.sql.Connection;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class MybatisTest {

	@Autowired
	private DataSource dataSource;
	
	@Autowired
	private SqlSessionFactory sqlSessionFactory;
	
	@Test
	public void timeTest() {
		try {
		
			SqlSession session = sqlSessionFactory.openSession();
//			Connection con = session.getConnection();
			// 세션을 하나만 얻어오는 selectOne() 메소드를 사용하여 TestMapper.xml에 있는 namespace와 id를 기술
			System.out.println("[테스트] " + session.selectOne("org.javassem.TestMapper.getTime"));
			
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
}

< TestMapper.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="org.javassem.TestMapper">

	<select id="getTime" resultType="string"><!-- 
		select sysdate from dual  -->
		select dname from dept where deptno=20
	</select>
</mapper>

 


 

3. 스프링 마이바티스를 사용하여 회원가입 완성하기

 

gWebBoard2.zip
0.09MB

 

 

 

(1) Spring Legacy Project로 새 프로젝트 hWebBoard2 를 생성하여 실습 파일로 덮어쓰기 해준다. 

 

(2) 프로젝트 우클릭 - Properties

              ㄱ) Project Facets : java 1.8 변경 후 Apply

              ㄴ) server :  tomcat 선택 후 Apply

 

(3) Servers 콘솔에서 Tomcat 더블클릭 - Module 탭 - Path와 Document Base명 동일하게 설정

 

(4) 1_시작.txt 참고하여 pom.xml 에서 버전 정상적으로 수정되었는지 확인

<!-- ### 버전 변경 ### -->
    <java-version>1.8</java-version>
    <org.springframework-version>5.0.8.RELEASE</org.springframework-version>
    <org.aspectj-version>1.6.10</org.aspectj-version>
    <org.slf4j-version>1.6.6</org.slf4j-version>
		
<!-- ### 버전 변경 ### -->		
    <plugin>		            	
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <compilerArgument>-Xlint:all</compilerArgument>
            <showWarnings>true</showWarnings>
            <showDeprecation>true</showDeprecation>
        </configuration>
    </plugin>

 

(5) 프로젝트 우클릭 - Maven - Update Project 클릭 - JRE System Library [JavaSE-1.8]로 수정되었는지 확인

 

(6) 2_DB연결.txt 참고하여 DB에 테이블을 생성한다. 

CREATE TABLE member(
    userid VARCHAR2(10),
    userpass varchar2(10),
    username varchar2(10),
    CONSTRAINT pk_member_id PRIMARY KEY(userid)
);

 

(7) servlet-context.xml 에서 오토스캔 범위 확인

<context:component-scan base-package="com.javassem" />

 

(8) root-context.xml 에서 DB 연결정보 수정

<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
    <property name="url" value="jdbc:oracle:thin:@192.168.0.17:1521:orcl"></property>
    <property name="username" value="scott"></property>
    <property name="password" value="tiger"></property>
</bean>	

 

(9) mybatis-config.xml 에서 VO 객체 별칭 지정

     : 여기서 지정한 별칭은 mapper에서 parameterType을 기술할 때 사용한다. 

<!-- VO 객체 별칭 지정 (일반적으로 DB 테이블 수만큼 VO 존재)-->
<typeAliases>
    <typeAlias type="com.javassem.domain.MemberVO" alias="member"/>
</typeAliases>

 

(10) MemberMapper.xml 에서 mapper의 namespace 부여 후 <insert> 태그 작성

     member라는 별칭이 부여된 VO에 지정된 데이터를 EL 표현언어를 사용하여 가져올 수 있다. 

<mapper namespace="user">

<insert id="userInsert" parameterType="member">
    <![CDATA[
    INSERT INTO member2 (userid, userpass, username) 
    VALUES (#{userId}, #{userPass}, #{userName})
    ]]>
</insert>

 

(11) index.jsp 에서 작동할 요청명을 확인

<p> <a href='user/userLogin.do'>로그인</a></p>
<p> <a href='user/userJoin.do'>회원가입</a></p>

 

(12) MemberController.java 가 컨트롤러 역할을 하도록 애노테이션을 붙인 뒤,

     index.jsp 로부터 오는 각각의 요청을 수행할 함수 작성한다. 

     단순히 페이지 전환만 필요하므로 @PathVariable 을 사용하여

     들어온 요청과 동일한 페이지로 리다이렉트 시켜준다. 

@Controller
public class MemberController {
	
    @RequestMapping("/user/{url}.do")
    public String test(@PathVariable String url) {
        return "/user/"+url;
    }

 

( 실행결과 )

 

 

 

(13) "회원가입" 하이퍼링크를 클릭하면 userJoin.do 요청을 수행하여 userjoin.jsp 페이지로 전환된다. 

 

(14) userJoin.jsp 의 <form>에 작성된 입력값은 "등록" 버튼 클릭시 userInser.do 요청을 보내면서,

      외부 js인 js_userinput.js에서 유효성 검사 및 전송 작업을 수행한다.

<script type="text/javascript" src="../resources/js/jquery-1.7.1.js"></script>
<script  src="../resources/js/js_userinput.js"></script>
....
<form method="post" action="userInsert.do" name="userinput" id="userinput">
....
<input type="button" name="confirm" id="confirm" value="등   록">

 

$(function(){
    $('#confirm').click(function(){ 
    ....
    document.userinput.submit();

 

(15) 컨트롤러에서 userInsert.do 요청을 받아 DB에 연결해주는 메소드 test2( )를 작성한다. 

@Autowired
private MemberService memberService;
....
@RequestMapping("/user/userInsert.do")
public String test2(MemberVO vo){
    memberService.userInsert(vo);
    return "redirect:/user/userJoin_ok.do";
}

 

      test2( ) 에서는 @Service의 userInsert( ) 메소드를 호출하므로

      MemberServiceImpl.java에 @Service 애노테이션을 붙이고

      MemberDAOImpl 객체를 가져와서 연결되도록 @Autowired 애노테이션을 붙여줘야 한다.

@Service("memberService")
public class MemberServiceImpl implements MemberService{

    @Autowired
    private MemberDAOImpl memberDAO;
    ....
    public int userInsert(MemberVO vo ) {
        return memberDAO.memberInsert(vo);
    }

 

      userInsert( )는 @Repository의 memberInsert( )를 호출하므로

      MemberDAOImpl.java에 @Repository 애노테이션을 붙이고

      커넥션인 SqlSessionTemplate 객체를 가져와서 연결되도록 @Autowired 애노테이션을 붙여줘야 한다.

@Repository("memberDAO")
public class MemberDAOImpl implements MemberDAO{

    @Autowired
    private SqlSessionTemplate mybatis;
    ....
    @Override
    public int memberInsert(MemberVO vo) {
        System.out.println("===>  MemberMapper userInsert() 호출");
        return mybatis.insert("user.userInsert", vo);
    }

 

      memberInsert( ) 는 SqlSessionTemplate을 통해

      namespace=user인 mapper (Membermapper.xml) 에서 id=userInsert인 태그와 매핑시킨다. 

<mapper namespace="user">

<insert id="userInsert" parameterType="member">
    <![CDATA[
    INSERT INTO member (userid, userpass, username) 
    VALUES (#{userId}, #{userPass}, #{userName})
    ]]>
</insert>

      

      parameterType에 기술된 member는 mybatis-config.xml 에서 지정했던 VO 객체의 별칭이다. 

<!-- VO 객체 별칭 지정 (일반적으로 DB 테이블 수만큼 VO 존재)-->
<typeAliases>
    <typeAlias type="com.javassem.domain.MemberVO" alias="member"/>
</typeAliases>

 

(16) DB에 입력이 끝나면 페이지가 전환되도록 리다이렉트 시켜준다. 

memberService.userInsert(vo);
return "redirect:/user/userJoin_ok.do";

 

( 실행결과 )

    : DB에 입력된다. 

 

 

 

(17) 회원 가입 성공시에는 가입한 회원의 이름이 출력시키고,

      회원 가입 실패시에는 실패 문구가 나오려면

     ① 전송결과를 받은 뒤 그 결과에 따라 각기 다른 출력문을 정하여

int result = memberService.userInsert(vo);
String message = vo.getUserName() + "님 죄송합니다.";
if (result > 0) {
    message = vo.getUserName() + "님 회원가입을 축하합니다.";
}

 

     ② Model 을 이용하여 다음 페이지로 SQL의 결과로 받아온 데이터를 전달할 수 있다. 

         (ModelAndView 를 사용해도 된다)

@RequestMapping("/user/userInsert.do")
public String test2(MemberVO vo, Model m){
    int result = memberService.userInsert(vo);
    String message = vo.getUserName() + "님 죄송합니다.";
    if (result > 0) {
        message = vo.getUserName() + "님 회원가입을 축하합니다.";
    }
    m.addAttribute("message", message);
    return "redirect:/user/userJoin_ok.do";
}

 

( 실행결과 )

 

 

 

< pom.xml 전체 소스 코드 >

더보기
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.javassem</groupId>
	<artifactId>basic</artifactId>
	<name>gWebMybatis</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<!-- ### 버전 변경 ### -->
		<java-version>1.8</java-version>
		<org.springframework-version>5.0.8.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				 </exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
				
		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>	
		
		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
				
		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	
		<!-- ### Test 버전 변경 ###-->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency> 

		
		<!-- 마이바티스 추가  -->
		<!-- mybatis -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis</artifactId>
		    <version>3.4.6</version>
		</dependency>
		
		<!-- mybatis-spring -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>1.3.2</version>
		</dependency>
		
	  	<!--  SPRING JDBC 필요 --> 
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>${org.springframework-version}</version>
		</dependency>	
		
		<!-- 트랜잭션 필요 -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-tx</artifactId>
		    <version>${org.springframework-version}</version>
		</dependency>
			       
	</dependencies>
	
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
            	<!-- ### 버전 변경 ### -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

< servlet-context.xml 전체 소스 코드 >

더보기
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<context:component-scan base-package="com.javassem" />
	
	
	
</beans:beans>

< root-context.xml 전체 소스 코드 >

더보기
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
	
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
	<property name="url" value="jdbc:oracle:thin:@192.168.0.17:1521:orcl"></property>
	<property name="username" value="scott"></property>
	<property name="password" value="tiger"></property>
</bean>	
	
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
 	<property name="dataSource" ref="dataSource" />
  <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
  <property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>
 </bean>
 
 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
   <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
 </bean>
 
    		
</beans>


< mybatis-config.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>

<!-- VO 객체 별칭 지정 (일반적으로 DB 테이블 수만큼 VO 존재)-->
<typeAliases>
   <typeAlias type="com.javassem.domain.MemberVO" alias="member"/>
</typeAliases>

</configuration>

< MemberMapper.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="user">

<!-- 여기를 완성 -->

<insert id="userInsert" parameterType="member">
	<![CDATA[
	INSERT INTO member2 (userid, userpass, username) 
	VALUES (#{userId}, #{userPass}, #{userName})
	]]>
</insert>



</mapper>

< index.jsp 전체 소스 코드 >

더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<p> <a href='user/userLogin.do'>로그인</a></p>
<p> <a href='user/userJoin.do'>회원가입</a></p>

</body>
</html>

< MemberController.java 전체 소스 코드 >

더보기
package com.javassem.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import com.javassem.domain.MemberVO;
import com.javassem.service.MemberService;

@Controller
public class MemberController {
	
	@Autowired
	private MemberService memberService;

	// 메인화면에서 페이지 전환
    @RequestMapping("/user/{url}.do")
    public String test(@PathVariable String url) {
        return "/user/"+url;
    }

    // 회원가입
    @RequestMapping("/user/userInsert.do")
    public String test2(MemberVO vo, Model m){
    	int result = memberService.userInsert(vo);
    	String message = vo.getUserName() + "님 죄송합니다.";
    	if (result > 0) {
    		message = vo.getUserName() + "님 회원가입을 축하합니다.";
    	}
    	m.addAttribute("message", message);
    	return "redirect:/user/userJoin_ok.do";
    }


    
}

< userJoin.jsp 전체 소스 코드 >

더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<title>사용자 등록</title>

<!-- 
          정적자원들은 resources 폴더에 저장
	 현재 프로젝트명에서 user 경로를 더한 상태이기에 상위경로를 올라갔다가 resources를 찾음.
 -->

<link rel="stylesheet" href="../resources/style/stylecss.css" type="text/css">
<script type="text/javascript" src="../resources/js/jquery-1.7.1.js"></script>
<script  src="../resources/js/js_userinput.js"></script>
</head>



<body bgcolor="#FFFFFF">

<table class='table1'>
  <tr bgcolor="#3399CC"> 
    <td height="30" class="normalbold"><font color="#FFFFFF">사용자 정보입력</font></td>
  </tr>
  <tr>
    <td>안녕하세요. 우리 홈페이지를 자유롭게 이용하려면 회원가입을 하셔야 합니다.<br>
      아래의 사항들을 빠짐없이 기록해 주세요.</td>
  </tr>
</table>

<form method="post" action="userInsert.do" name="userinput" id="userinput">
  <table class='table2'>
    <tr> 
      <td class="normalbold tb_ttl"> 
        <div align="center">사용자 ID</div>
      </td>
      <td colspan="3" class="normal"> 
        <input type="text" name="userId" id="userId" size="20"> 
        <span id="idCheckResult" style="width:150px;color:red"></span>
      </td>
    </tr>
    <tr> 
      <td class="normalbold tb_ttl">
        <div align="center">비밀번호</div>
      </td>
      <td width="154" class="normal"> 
        <input type="password" name="userPass" id="userPass">
      </td>
      <td class="normalbold tb_ttl"> 
        <div align="center">비밀번호 확인</div>
      </td>
      <td width="160"> 
        <input type="password" name="userPass2" id="userPass2">
      </td>
    </tr>
    <tr> 
      <td class="normalbold tb_ttl"> 
        <div align="center">사용자 이름</div>
      </td>
      <td colspan="3" height="23" class="normal"> 
        <input type="text" name="userName" id="userName">
      </td>
    </tr>
    <tr>
      <td colspan="4" class="normal"> 
        <div align="center"> 
          <input type="button" name="confirm" id="confirm" value="등   록">
          <input type="reset" name="reset" value="취   소">
        </div>
      </td>
    </tr>
  </table>
</form>

</body>
</html>

< userJoin_ok.jsp 전체 소스 코드 >

더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>성공</title>
</head>
<body>
	${param.message}
</body>
</html>

< js_userinput.js 전체 소스 코드 >

더보기
$(function(){
	// 사용자의 자료 입력여부를 검사하는 함수
	$('#confirm').click(function(){
    	if( $.trim($("#userId").val()) == '' ){
            alert("아이디를 입력해 주세요.");
            $("#userId").focus();
            return;
        }
    	
    	if($.trim($('#userPass').val())==''){
    		alert("비번입력해주세요.");
    		$('#userPass').focus();
    		return;
    	}
    	
    	if($.trim($('#userPass').val()) != $.trim($('#userPass2').val())){
    		alert("비밀번호가 일치하지 않습니다..");
    		$('#userPass2').focus();
    		return;
    	}
    	
    	
    	if($.trim($('#userName').val())==''){
    		alert("이름입력해주세요.");
    		$('#userName').foucs();
    		return;
    	}
       
        // 자료를 전송합니다.
        document.userinput.submit();
	});
	
	//아이디 중복체크
	$('#userId').keyup(function(){
        
       
	})
})

 


 

4. 스프링 마이바티스를 사용하여 로그인 완성하기

 

(1) main.jsp 실행 후 "로그인" 하이퍼링크를 클릭하면 userLogin.do 요청을 컨트롤러에서 수행하여

    userLogin.jsp 페이지로 전환된다. 

 

 

(2) userLogin.jsp 에서는 "로그인" 버튼이 눌렸을 때 사용자 입력값을 가지고 login.do 요청을 보낸다. 

<form name="form" action="login.do" method="post">
....
<input type="button" name="Submit" id="Submit" value="로그인">

 

(3) 컨트롤러에서 login.do 요청을 받았을 때 수행할 login( ) 메소드를 작성한다. 

     DB에 사용자 입력값과 동일한 정보가 있을 경우에는 login_ok.jsp 페이지로 이동하고

     결과가 없을 경우에는 다시 로그인 페이지로 이동시킨다. 

@RequestMapping("/user/login.do")
public String login(MemberVO vo) {
    MemberVO result = memberService.idCheck_Login(vo);
    if (result == null || result.getUserId() == null ) {
        // 결과가 없을 경우엔 다시 로그인 페이지로 이동
        return "user/login.do";
    } else {
        // 결과가 있을 경우 user/login_ok.jsp 이동
        return "user/login_ok.do";
    }
}

 

(4) MemberDAOImpl.java 에서 selectOne( ) 메소드와 idCheck( ) 메소드를 호출할 때 

      SqlSessionTemplate을 통해

      namespace=user인 mapper (Membermapper.xml) 에서 id=idCheck인 태그와 매핑시킨다. 

@Repository("memberDAO")
public class MemberDAOImpl implements MemberDAO{

    @Autowired
    private SqlSessionTemplate mybatis;
    ....
    @Override
    public MemberVO idCheck(MemberVO vo) {
        System.out.println("===> MemberMapper idCheck 호출");
        return mybatis.selectOne("user.idCheck", vo);
    }
    
    @Override
    public MemberVO memberLogin(MemberVO vo) {
        System.out.println("===> MemberMapper idCheck 호출");
        return mybatis.selectOne("user.idCheck", vo);
    }

 

(5) MemberMapper.xml 에서 id가 idCheck인 SELECT문을 작성한다. 

     Repository에서 데이터를 받아서 SQL 수행하므로 parameterType가 필요하고,

     SQL 결과를 받아가야 하므로 resultType이 필요하다. 

<select id="idCheck" parameterType="member" resultType="member">
    <![CDATA[
    SELECT * FROM member2 
    WHERE USERID=#{userId} AND USERPASS=#{userPass}
    ]]>
</select>

 

(6) 로그인 성공시 세션에 사용자 이름을 저장하여 다음 페이지에서 출력시킨다. 

     세션에 저장한 내용은 브라우저를 종료하기 전까지 유지된다. 

@RequestMapping("/user/login.do")
public String login(MemberVO vo, HttpSession session) {
    MemberVO result = memberService.idCheck_Login(vo);
    if (result == null || result.getUserId() == null ) {
        // 결과가 없을 경우엔 다시 로그인 페이지로 이동
        return "redirect:/user/login.do";
    } else {
        // 세션에 login 이름에 사용자 이름 저장
        session.setAttribute("login", result.getUserName());
        // 결과가 있을 경우 user/login_ok.jsp 이동
        return "redirect:/user/login_ok.do";
    }
}

 

${sessionScope.login}님 로그인 성공하였습니다.<hr>

 

 

 

< userLogin.jsp 전체 소스 코드 >

더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style>
	table{border:#FF9900 double }
	td{text-align:center;padding:5}
</style>

</head>
<script>
	window.onload = function(){
		document.getElementById('Submit').onclick = check;	
	}
	
	function check(){
		if(document.form.userId.value==""){
			alert("ID를 입력하세요.")
			document.form.userId.focus();
			return false;
		}
		
		if(document.form.userPass.value==""){
			alert("패스워드를 입력하세요.")
			document.form.userPass.focus();
			return false;
		}
		
		document.form.submit();//전송
		
	}
	
	
</script>
<body>

<h4> 안녕하세요. 우리 홈페이지입니다.<p>
 사이트에 접속하기 위해서 사용자 인증 절차가 필요합니다.<p>
아이디와 패스워드를 입력하세요.</h4>

	<form name="form" action="login.do" method="post">
  <table width="300" height="120" >
    <tr> 
      <td width="100"> 아이디</td>
      <td ><input type="text" name="userId"></td>
    </tr>
    
	<tr> <td>  패스워드</td>
      <td> <input type="password" name="userPass"></td>
    </tr>
  <tr>
  <td colspan=2>
    <input type="button" name="Submit" id="Submit" value="로그인">
    <input type="button"  value="회원가입" onclick="location.href='userJoin.do'">
    <input type="reset" value="취소">
	
</td>
 </tr>
  </table>
  </form>

</body>
</html>

< login_ok.jsp 전체 소스 코드 >

더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${sessionScope.login}님 로그인 성공하였습니다.<hr>
	
	<a href=''>모든 회원 정보 보기 </a>
	
</body>
</html>

< MemberMapper.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="user">

<!-- 여기를 완성 -->

<insert id="userInsert" parameterType="member">
	<![CDATA[
	INSERT INTO member2 (userid, userpass, username) 
	VALUES (#{userId}, #{userPass}, #{userName})
	]]>
</insert>

<select id="idCheck" parameterType="member" resultType="member">
	<![CDATA[
	SELECT * FROM member2 
	WHERE USERID=#{userId} AND USERPASS=#{userPass}
	]]>
</select>



</mapper>

< MemberController.java 전체 소스 코드 >

더보기
package com.javassem.controller;


import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import com.javassem.domain.MemberVO;
import com.javassem.service.MemberService;

@Controller
public class MemberController {
	
	@Autowired
	private MemberService memberService;

	// 메인화면에서 페이지 전환
    @RequestMapping("/user/{url}.do")
    public String test(@PathVariable String url) {
        return "/user/"+url;
    }

    // 회원가입
    @RequestMapping("/user/userInsert.do")
    public String test2(MemberVO vo, Model m){
    	int result = memberService.userInsert(vo);
    	String message = vo.getUserName() + "님 죄송합니다.";
    	if (result > 0) {
    		message = vo.getUserName() + "님 회원가입을 축하합니다.";
    	}
    	m.addAttribute("message", message);
    	return "redirect:/user/userJoin_ok.do";
    }
    
    // 로그인
    @RequestMapping("/user/login.do")
    public String login(MemberVO vo, HttpSession session) {
    	MemberVO result = memberService.idCheck_Login(vo);
    	if (result == null || result.getUserId() == null ) {
    		// 결과가 없을 경우엔 다시 로그인 페이지로 이동
    		return "redirect:/user/login.do";
    	} else {
    		// 세션에 login 이름에 사용자 이름 저장
    		session.setAttribute("login", result.getUserName());
    		// 결과가 있을 경우 user/login_ok.jsp 이동
    		return "redirect:/user/login_ok.do";
    	}
    }

    
}

 

 


5. 스프링 마이바티스에서 AJAX를 사용하여 회원가입시 아이디 중복체크 완성하기

 

 

(1) 회원가입 페이지에서 키가 눌릴 때마다 키 업 이벤트가 생기는지 js_userinput.js 에서 확인한다.

//아이디 중복체크 (최근에는 키 이벤트 X)
$('#userId').keyup(function(){
    alert('a');
})

 

(2) AJAX를 사용하여 아이디 중복체크 하는 스크립트를 작성하되, 

     MVC 패턴을 사용하기 위해 url 작성시 미리 지정한 url-pattern을 사용한다. 

//아이디 중복체크 (최근에는 키 이벤트 X)
$('#userId').keyup(function(){
    $.ajax({  
        type : 'post',                               // 전송방식
        async : true,                                // 비동기통신
        url : 'idCheck.do',                          // ***요청(request) (MVC패턴을 사용하기 위해 .jsp 사용 X)
        data : { 'userId' : $('#userId').val() },    // 보낼 데이터
        contentType : 'application/x-www-form-urlencoded;charset=utf-8',	// 한글처리 
        success : function(result){
            $('#idCheckResult').text(result);
        },
        error : function(err){
            console.log(err);
        }
    });
})

 

(3) 아이디 중복체크시 발생하는 idCheck.do 요청을 받을 idcheck( ) 메소드를 컨트롤러에 작성한다. 

    idCheck.do는 AJAX에서 보내는 요청이므로 리턴형이 다르게 처리된다. 

    본래 리턴형이 String인 경우는 뷰 페이지를 지정하지만, AJAX에서는 결과값을 AJAX로 반환한다. 

@RequestMapping("/user/idCheck.do")
public String idcheck(MemberVO vo) {

    MemberVO result = memberService.idCheck_Login(vo);
    
    String message = "이미 사용중입니다.";
    if (result == null) {
        message = "사용 가능한 아이디입니다.";
    }
    return message;
    /********************************************************
    * 리턴형이 String인 경우 원래는 뷰 페이지 지정이어야 하지만
    * AJAX인 경우는 결과 반환
    */
}

 

(4) idchech( )가 AJAX로 수행되는 것임을 명확히 하기 위해 @ResponseBody 애노테이션을 붙인다. 

 @RequestBody  - HTTP 요청 본문에 담긴 값들을 자바 객체로 변환시켜 객체에 저장
 @ResponseBody  - 자바 객체를 HTTP 응답 본문의 객체로 변환하여 클라이언트로 전송
 - 메소드에서 리턴되는 값을 view로 출력하지 않고 HTTP Response Body에 직접 쓰임
@RequestMapping("/user/idCheck.do")
@ResponseBody
public String idcheck(MemberVO vo) {

 

(5) 데이터가 오고갈 때 한글이 깨지지 않도록 RequestMapping 애노테이션에 속성을 추가한다. 

@RequestMapping(value="/user/idCheck.do", produces="application/text;charset=utf-8")

 

(8) mapper에서 기존에 작성된 SELECT문을 활용하기 위해

    입력값에 Password가 없을 경우에 대한 조건문으로 수정한다. 

<select id="idCheck" parameterType="member" resultType="member">
    SELECT * FROM member2 
    WHERE USERID=#{userId} 
    <if test="userPass != null">
    AND USERPASS=#{userPass}
    </if>
</select>

 

(9) 추후에는 보내는 데이터가 많아지기 때문에 JSON 구조로 만들고 그 JSON을 문자열로 변환해서 리턴한다. 

    (JSON 라이브러리가 필요하며, JSON은 배열처리까지 해준다.)

 

( 실행결과 )

 

< userjoin.jsp 전체 소스 코드 >

더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<title>사용자 등록</title>

<!-- 
          정적자원들은 resources 폴더에 저장
	 현재 프로젝트명에서 user 경로를 더한 상태이기에 상위경로를 올라갔다가 resources를 찾음.
 -->

<link rel="stylesheet" href="../resources/style/stylecss.css" type="text/css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script  src="../resources/js/js_userinput.js"></script>
</head>



<body bgcolor="#FFFFFF">

<table class='table1'>
  <tr bgcolor="#3399CC"> 
    <td height="30" class="normalbold"><font color="#FFFFFF">사용자 정보입력</font></td>
  </tr>
  <tr>
    <td>안녕하세요. 우리 홈페이지를 자유롭게 이용하려면 회원가입을 하셔야 합니다.<br>
      아래의 사항들을 빠짐없이 기록해 주세요.</td>
  </tr>
</table>

<form method="post" action="userInsert.do" name="userinput" id="userinput">
  <table class='table2'>
    <tr> 
      <td class="normalbold tb_ttl"> 
        <div align="center">사용자 ID</div>
      </td>
      <td colspan="3" class="normal"> 
        <input type="text" name="userId" id="userId" size="20"> 
        <span id="idCheckResult" style="width:150px;color:red"></span>
      </td>
    </tr>
    <tr> 
      <td class="normalbold tb_ttl">
        <div align="center">비밀번호</div>
      </td>
      <td width="154" class="normal"> 
        <input type="password" name="userPass" id="userPass">
      </td>
      <td class="normalbold tb_ttl"> 
        <div align="center">비밀번호 확인</div>
      </td>
      <td width="160"> 
        <input type="password" name="userPass2" id="userPass2">
      </td>
    </tr>
    <tr> 
      <td class="normalbold tb_ttl"> 
        <div align="center">사용자 이름</div>
      </td>
      <td colspan="3" height="23" class="normal"> 
        <input type="text" name="userName" id="userName">
      </td>
    </tr>
    <tr>
      <td colspan="4" class="normal"> 
        <div align="center"> 
          <input type="button" name="confirm" id="confirm" value="등   록">
          <input type="reset" name="reset" value="취   소">
        </div>
      </td>
    </tr>
  </table>
</form>

</body>
</html>

< MemberServiceImpl.java 전체 소스 코드 >

더보기
package com.javassem.service;


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

import com.javassem.dao.MemberDAOImpl;
import com.javassem.domain.MemberVO;

@Service("memberService")
public class MemberServiceImpl implements MemberService{

	@Autowired
	private MemberDAOImpl memberDAO;
	
	
	/**
	  * 아이디 중복 체크하는 sql + 로그인 기능 sql
	  */
	  public MemberVO idCheck_Login( MemberVO vo)
	  {
		  return memberDAO.idCheck(vo);
	  }
	  
	  
	  /**
	   * 회원가입 sql
	   */
	   public int userInsert(MemberVO vo )
	   {
		  return memberDAO.memberInsert(vo);
	   }
}

< MemberDAOImpl.java 전체 소스 코드 >

더보기
package com.javassem.dao;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.javassem.domain.MemberVO;

@Repository("memberDAO")
public class MemberDAOImpl implements MemberDAO{

	@Autowired
	private SqlSessionTemplate mybatis;
	
	@Override
	public MemberVO idCheck(MemberVO vo) {
		System.out.println("===> MemberMapper idCheck 호출");
		return mybatis.selectOne("user.idCheck", vo);
	}

	@Override
	public int memberInsert(MemberVO vo) {
		System.out.println("===>  MemberMapper userInsert() 호출");
		return mybatis.insert("user.userInsert", vo);
	}

	@Override
	public MemberVO memberLogin(MemberVO vo) {
		System.out.println("===> MemberMapper idCheck 호출");
		return mybatis.selectOne("user.idCheck", vo);
	}

}

< js_userinput.js 전체 소스 코드 >

더보기
$(function(){
	// 사용자의 자료 입력여부를 검사하는 함수
	$('#confirm').click(function(){
    	if( $.trim($("#userId").val()) == '' ){
            alert("아이디를 입력해 주세요.");
            $("#userId").focus();
            return;
        }
    	
    	if($.trim($('#userPass').val())==''){
    		alert("비번입력해주세요.");
    		$('#userPass').focus();
    		return;
    	}
    	
    	if($.trim($('#userPass').val()) != $.trim($('#userPass2').val())){
    		alert("비밀번호가 일치하지 않습니다..");
    		$('#userPass2').focus();
    		return;
    	}
    	
    	
    	if($.trim($('#userName').val())==''){
    		alert("이름입력해주세요.");
    		$('#userName').focus();
    		return;
    	}
       
        // 자료를 전송합니다.
        document.userinput.submit();
	});
	
	//아이디 중복체크 (최근에는 키 이벤트 X)
	$('#userId').keyup(function(){
        $.ajax({
        	type : 'post',		// 전송방식
        	async : true,		// 비동기통신
        	url : 'idCheck.do',	// ***요청(request) (MVC패턴을 사용하기 위해 .jsp 사용 X)
        	data : { 'userId' : $('#userId').val() },	// 보낼 데이터
        	contentType : 'application/x-www-form-urlencoded;charset=utf-8',	// 한글처리 
        	success : function(result){
        		$('#idCheckResult').text(result);
        	},
        	error : function(err){
        		console.log(err);
        	}
        });
       
	})
})
	
	
	
	
	
	
	
	
	

< MemberController.java 전체 소스 코드 >

더보기
package com.javassem.controller;


import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.javassem.domain.MemberVO;
import com.javassem.service.MemberService;

@Controller
public class MemberController {
	
	@Autowired
	private MemberService memberService;

	// 메인화면에서 페이지 전환
    @RequestMapping("/user/{url}.do")
    public String test(@PathVariable String url) {
        return "/user/"+url;
    }

    // 회원가입
    @RequestMapping("/user/userInsert.do")
    public String test2(MemberVO vo, Model m){
    	int result = memberService.userInsert(vo);
    	String message = vo.getUserName() + "님 죄송합니다.";
    	if (result > 0) {
    		message = vo.getUserName() + "님 회원가입을 축하합니다.";
    	}
    	m.addAttribute("message", message);
    	return "redirect:/user/userJoin_ok.do";
    }
    
    // 로그인
    @RequestMapping("/user/login.do")
    public String login(MemberVO vo, HttpSession session) {
    	MemberVO result = memberService.idCheck_Login(vo);
    	if (result == null || result.getUserId() == null ) {
    		// 결과가 없을 경우엔 다시 로그인 페이지로 이동
    		return "redirect:/user/login.do";
    	} else {
    		// 세션에 login 이름에 사용자 이름 저장
    		session.setAttribute("login", result.getUserName());
    		// 결과가 있을 경우 user/login_ok.jsp 이동
    		return "redirect:/user/login_ok.do";
    	}
    }
    
    @RequestMapping(value="/user/idCheck.do", produces="application/text;charset=utf-8")
    @ResponseBody
    public String idcheck(MemberVO vo) {
    	MemberVO result = memberService.idCheck_Login(vo);
    	String message = "이미 사용중입니다.";
    	if (result == null) {
    		message = "사용 가능한 아이디입니다.";
    	}
    	/***************
    	 * 추후에는 보내는 데이터가 많아지기 때문에 JSON 구조로 만들고 그 JSON을 문자열로 변환해서 리턴함
    	 * (JSON 라이브러리 필요)
    	 * JSON은 배열처리까지 해줌
    	 */
    	return message;
    	/********
    	 * 리턴형이 String인 경우 원래는 뷰 페이지 지정이어야 하지만
    	 * AJAX인 경우는 결과 반환
    	 */
    	
    }
    
}

< MemberMapper.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="user">

<!-- 여기를 완성 -->

<insert id="userInsert" parameterType="member">
	<![CDATA[
	INSERT INTO member2 (userid, userpass, username) 
	VALUES (#{userId}, #{userPass}, #{userName})
	]]>
</insert>

<select id="idCheck" parameterType="member" resultType="member">
	SELECT * FROM member2 
	WHERE USERID=#{userId} 
	<if test="userPass != null">
	AND USERPASS=#{userPass}
	</if>
</select>



</mapper>
반응형

'교육과정 > KOSMO' 카테고리의 다른 글

Day58  (0) 2021.01.05
Day57  (0) 2021.01.04
Day55  (0) 2020.12.17
Day54  (0) 2020.12.16
Day53  (0) 2020.12.15