프런트에서 자바스크립트 디버깅할 때 아래와 같이 진행한다.

(html은 디버그 안되고 javascript 디버그 할 때 사용)

 

1. tomcat start(일반 모드)

 

2. 개발자 도구를 실행하여 디버깅하고 싶은 Javascript 파일을 연다. (컨트롤 + p)

 

3. 해당 파일에서 확인하고 싶은 부분을 breakpoints 를 찍는다.

 

4. 해당 breakpoints를 찍은 기능이 실행되도록 화면에서 실행한다.

 - F8 : 다음 breakpoint 로 이동

 

(서버 재시작 왜했었지..? 캐시 날리고 했었는데..)

 

5. 해당 변수값을 확인 및 수정할 수 있다.

 

6. html 화면 변수값을 수정해서 입력할 수 있다.

 - $0.value

개요

Spring을 사용하면서 보통 *-context.xml, *-properties.xml 과 같은 설정파일은 src/main/resources 아래 위치하여 사용한다.

프로젝트를 war로 Export 하면 보통 /WEB-INF/classes/config/* 에 설정파일이 위치한다.

하지만, 설정파일 모두를 외부 특정 폴더로 이동시켜야 한다면, 톰캣의 외부 classpath 설정은 어떻게 할까?

 

상황 설명

예를 들어 src/main/resources 아래 *-context.xml, *-properties.xml 파일이 있고

Maven Build(Goals : clean package) 하면, 설정파일들을 외부 경로(C:/Project/Appserver/tomcat/app_config) 에 위치한다. 

이런 경우 Tomcat의 외부 폴더를 classpath로 설정해야지 설정파일을 읽어서 정상적으로 동작할 수 있다.

 

방법

tomcat 설정 후 아래 사진과 같이 classpath를 설정한다.

Scope : 해당 의존성을 언제 어떻게 Class Path에 넣어서 사용할 것인가를 정의하는 값이다.

 

Scope Type 

1. Compile : 
 - Compile 시점에 필요하다.
 - 기본값(=Default)이다.
 - 프로젝트의 모든 Class Path에 추가된다.
 - 기본값이기 때문에 만일 scope 설정을 안하면 compile이 기본입니다
 
2. Runtime : 
 - Runtime 시점에 필요하다.
 - Compile 시점에는 필요가 없지만 실행 시점에는 필요하다.
 - Runtime, 테스트 시 Class Path에 추가 되지만 Compile시에는 추가 되지 않는다.
 - ex) JDBC 드라이버
 
3. Provided :
 - Compile 시점에 필요하지만 배포시점에는 불필요한 라이브러리로 JDK, servlet API, Java EE API 등이 해당된다.
 - provided 스코프는 최종 Build Artifact 에 포함되지 않을 때 사용한다. 
 - 예를 들면 프로젝트가 servlet api를 의존하고 있는데, tomcat에서는 기본적으로 servlet api을 제공하고 있을 경우 artifact 에 포함시킬 필요가 없다.
 - Scope 값을 provided로 설정한 의존성에 대해서는 Runtime 시점에 JDK 혹은 컨테이너가 제공한다.
 - 간략 요약하면 Wep Application 개발 시 Servlet API or Java EE API들은 provided Scope으로 지정해야한다. 왜냐하면 톰캣과 같은 컨테이너가 제공해주기 때문이다.
 - 만약 운영환경에서 servlet-api.jar 중복으로 인한 문제가 발생한다면 꼭 provided로 바꿔주셔야 합니다.
 - ex) Servlet API
 
4. Test
 - Compile 시점에 필요하다.
 - 배포때는 제외된다.
 - ex) JUnit
 
5. system
 - system은 provided와 유사하지만 JAR 파일을 직접 사용합니다.
 - 이 때는 JAR 파일의 위치를 지정하는 systemPath 엘리먼트가 따라와야 해요.

context 네임스페이스 설정

어노테이션 설정을 하려면 스프링 설정파일의 루트 엘리먼트인 <beans>에 Context 관련 네임스페이스와 스키마 문서의 위치를 등록해야 한다.

 

xmlns:context="http://www.springframework.org/schema/context" 

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd"

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context" 
	xsi:schemaLocation="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.2.xsd">
	
</beans>

 

컴포넌트 스캔(component-scan) 설정

스프링 설정파일에 사용할 객체들을 <bean> 등록하지 않고 자동으로 생성하려면 <context:component-scan/> 엘리먼트를 사용해야 한다.

이 설정을 추가하면 스프링 컨테이너는 클래스 path에 있는 클래스들을 스캔하여 @Component가 설정된 클래스들을 자동으로 객체 생성한다.

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context" 
	xsi:schemaLocation="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.2.xsd">
	
	<!-- Context nameSpace 추가, 해당 Package class에 @Component 선언해야함! -->
	<context:component-scan base-package="polymorphism"></context:component-scan>
</bean>

 

@Component

스프링 설정파일에 <context:component-scan> 설정을 했다면. 사용할 객체의 클래스 선언부 위에 @Component 를 설정하면 된다.

package polymorphism;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class LgTV implements TV {
	public LgTV() {
		System.out.println("===> LgTV 객체 생성");
	}
}

 

그러나 위에 코드는 클라이언트 프로그램에서 LgTV 객체를 요청할 수는 없다.

클라이언트가 스프링 컨테이너가 생성한 객체를 요청하려면, 요청할 때 사용할 아이디나 이름이 반드시 설정되야함!

→ @Component("tv")

public class TVUser {

	public static void main(String[] args) {
		// 1. Spring 컨테이너를 구동한다.
		AbstractApplicationContext factory = new GenericXmlApplicationContext("root-context.xml");

		// 2. Spring 컨테이너로부터 필요한 객체를 요청(Lookup)한다.
		TV tv = (TV) factory.getBean("tv");
    }
}
package polymorphism;

import javax.annotation.Resource;
import org.springframework.stereotype.Component;

@Component("tv")
public class LgTV implements TV {
	public LgTV() {
		System.out.println("===> LgTV 객체 생성");
	}
}

 

@Autowired

@Autowired 는 생성자나 메소드, 멤버변수 위에 모두 사용할 수 있음

주로 멤버변수 위에 선언하여 사용함

스프링 컨테이너는 멤버 변수 위에 붙은 @Autowired 를 확인하는 순간 해당 변수의 타입을 체크한다. 그리고 그 타입의 객체가 메모리에 존재하는지를 확인한 후에, 그 객체를 변수에 주입한다.

 

만약 @Autowired 가 붙은 객체가 메모리에 없다면 스프링 컨테이너는 NoSuchBeanDefinitionException을 발생시킨다.

package polymorphism;

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

@Component("tv")
public class LgTV implements TV {
	@Autowired
	private Speaker speaker;
	
	public LgTV() {
		System.out.println("===> LgTV 객체 생성");
	}

	public void powerOn() {
		System.out.println("LgTV---전원 켠다.");
	}

	public void powerOff() {
		System.out.println("LgTV---전원 끈다.");
	}
	
	public void volumeUp() {
		speaker.volumeUp();
	}

	public void volumeDown() {
		speaker.volumeDown();
	}
}
package polymorphism;

public interface Speaker {
	void volumeUp();
	void volumeDown();
}
package polymorphism;

import org.springframework.stereotype.Component;

@Component("sony")
public class SonySpeaker implements Speaker{
	public SonySpeaker() {
		System.out.println("===> SonySpeaker 객체 생성");
	}

	public void volumeUp() {
		System.out.println("SonySpeaker---소리 올린다.");
	}

	public void volumeDown() {
		System.out.println("SonySpeaker---소리 내린다.");
	}
}

 

@Qualifier

문제는 의존성 주입 대상이 되는 Speaker 타입의 객체가 두개 이상일 때 발생한다.

만약 SonySpeaker와 AppleSpeaker 객체가 모두 메로리에 생성되어 있는 상황이라면, 스프링 컨테이너는 어떤 객체를 할당할지 스스로 판단할 수 없어서 에러를 발생시킨다.

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: (생략~)
expected single matching bean but found 2 : apple, sony

위와 같은 상황일 때, @Qualifier 어노테이션을 이용하면 의존성 주입될 객체의 아이디나 이름을 지정할 수 있는데, 이때 Speaker 객체의 이름(sony, apple) 중 사용할 하나를 지정한다.

 

package polymorphism;

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

@Component("tv")
public class LgTV implements TV {
    @Autowired
    @Qualifier("sony")
    private Speaker speaker;
	
	public LgTV() {
		System.out.println("===> LgTV 객체 생성");
	}

	public void powerOn() {
		System.out.println("LgTV---전원 켠다.");
	}

	public void powerOff() {
		System.out.println("LgTV---전원 끈다.");
	}
	
	public void volumeUp() {
		speaker.volumeUp();
	}

	public void volumeDown() {
		speaker.volumeDown();
	}
}

 

어노테이션과 XML 설정 병행하여 사용하기

변경되지 않는 객체는 어노테이션으로 설정하고, 변경될 가능성이 있는 객체는 XML 설정으로 사용한다.

 - 변경되지 않는 객체 : LgTv.java

 - 변경될 가능성이 있는 객체 : SonySpeaker.java, AppleSpeaker.java

package polymorphism;

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

@Component("tv")
public class LgTV implements TV {
    @Autowired
    private Speaker speaker;
	
	public LgTV() {
		System.out.println("===> LgTV 객체 생성");
	}

	public void powerOn() {
		System.out.println("LgTV---전원 켠다.");
	}

	public void powerOff() {
		System.out.println("LgTV---전원 끈다.");
	}
	
	public void volumeUp() {
		speaker.volumeUp();
	}

	public void volumeDown() {
		speaker.volumeDown();
	}
}
package polymorphism;

public class SonySpeaker implements Speaker{
	public SonySpeaker() {
		System.out.println("===> SonySpeaker 객체 생성");
	}

	public void volumeUp() {
		System.out.println("SonySpeaker---소리 올린다.");
	}

	public void volumeDown() {
		System.out.println("SonySpeaker---소리 내린다.");
	}
}
package polymorphism;

public class AppleSpeaker implements Speaker {
	public AppleSpeaker() {
		System.out.println("===> AppleSpeaker 객체 생성");
	}

	public void volumeUp() {
		System.out.println("AppleSpeaker---소리 올린다.");
	}

	public void volumeDown() {
		System.out.println("AppleSpeaker---소리 내린다.");
	}
}
<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context" 
	xsi:schemaLocation="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.2.xsd">
	
	<!-- LgTv는 어노테이션으로, Speaker는 <bean> xml 설정으로 SonySpeaker 주입 -->
	<context:component-scan base-package="polymorphism"></context:component-scan>
	<bean id="sony" class="polymorphism.SonySpeaker"></bean>
 </beans>

 

어노테이션, <bean>설정 주의사항

직접 개발한 클래스는 어노테이션을 사용할 수도 있고, <bean>를 등록하여 XML 설정을 할 수도 있다.

하지만 라이브러리 형태로 제공되는 클래스는 반드시 XML 설정을 통해서만 사용할 수 있음!

 

예를들어 commons-dbcp-1.4.jar 라이브러리를 이용하여 DB연결을 할 때 XML 설정을 통해 사용해야 한다.

 

정의

스프링 설정파일에 class를 등록하려면 <bean> 엘리먼트를 사용한다.

이때 id와 class 속성을 사용하는데, id는 생략 가능하다.

 

<bean> 엘리먼트 속성

id 속성 : 자바의 식별자 작성 규칙을 따름(CamelCase)

name 속성 : 자바의 식별자 작성 규칙이 아닌, 특수기호가 포함된 아이디를 <bean>으로 지정할 때 사용함

 

init-method : 스프링 컨테이너는 스프링 설정파일에 등록된 클래스를 객체 생성할 때 디폴트 생성자를 호출한다.

객체를 생성한 후에 멤버변수 초기화 작업이 필요할 때, init-method 속성을 class파일에 사용한다.

즉 <bean>에 등록된 객체가 생성된 후 init-method로 지정된 "initMethod()"를 호출한다. 

// root-context.xml (스프링 설정파일)
<bean id="tv" class="polymorphism.SamsungTV" init-method="initMethod"></bean>
package polymorphism;

public class SamsungTV implements TV {
	public void initMethod(){
    	System.out.println("객체 초기화 작업");
    }
}

 

destroy-method : 스프링 컨테이너가 객체를 삭제하기 직전에 호출될 메소드를 지정할 수 있다.

// root-context.xml (스프링 설정파일)
<bean id="tv" class="polymorphism.SamsungTV" destroy-method="destroyMethod"></bean>
package polymorphism;

public class SamsungTV implements TV {
	public void destroyMethod(){
    	System.out.println("객체 삭제 전에 처리할 로직 처리");
    }
}

 

lazy-init : 스프링 컨테이너가 구동되면, 구동되는 시점에 스프링 설정 파일에 등록된 <bean>들을 생성하는 즉시 로딩 방식으로 동작한다.

자주 사용되지 않으면서 메모리를 많이 차지하여 시스템에 부담을 주는 경우가 있기 때문에, 해당 <bean>이 사용되는 시점에 객체를 생성하도록 lazy-init 속성을 사용한다.

즉 클라이언트가 요청하는 시점에 생성한다.

// root-context.xml (스프링 설정파일)
<bean id="tv" class="polymorphism.SamsungTV" lazy-init="true"></bean>

 

scope="singleton" : 클래스를 하나만 생성하여 유지하고 싶을때 싱글톤 패턴을 사용하는데, 스프링 컨테이너도 이러한 기능을 scope 속성을 통하여 제공한다.

scope 속성값은 기본이 싱글톤이다. (=값을 생략하면 싱글톤으로 적용됨)

// root-context.xml (스프링 설정파일)
<bean id="tv" class="polymorphism.SamsungTV" scope="singleton"></bean>

 

scope="prototype" : 반대로 스프링 컨테이너가 해당 <bean>을 요청될 때마다 매번 새로운 객체를 생성하여 반환할 땐 아래와 같이 사용함.

// root-context.xml (스프링 설정파일)
<bean id="tv" class="polymorphism.SamsungTV" scope="prototype"></bean>

 

에러 내용

Error occured processing XML 'Are you using a JRE with an outdated version of '. See Error Log for more details

 

발생 원인

Spring root-context.xml 파일을 생성하자 위와 같은 오류가 발생하였다.

 

해결 방법

아래 사진과 같이 프로젝트에서 마우스 오른쪽 클릭 - Spring - Remove Spring Project Nature 클릭하면 해결된다.

1. 목적 : Spring 프로젝트 생성 후 오라클 DB jdbc 설정하여 정상적으로 연동되어 데이터 조회가 되는지 확인한다.

 

2. SPEC : 

 1) eclipse : 2020-06 (4.16.0)

 2) STS plug in 설치 : Marketplace에서 sts 검색 후 "Spring Tool 3 Add on ~~ " 설치

 3) DB : oracle 11g R2


스프링 pom.xml 설정
<properties>
	<java-version>1.8</java-version>
	<org.springframework-version>4.3.2.RELEASE</org.springframework-version>
	<org.aspectj-version>1.6.10</org.aspectj-version>
	<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>

<!-- ojdbc 다운받기위해 추가 -->
<repositories>
	<repository>
		<id>oracle</id>
		<name>ORACLE JDBC Repository</name>
		<url>http://mesir.googlecode.com/svn/trunk/mavenrepo</url>
	</repository>
</repositories>

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>${org.springframework-version}</version>
</dependency> 
<!-- MyBatis -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.4.5</version>
</dependency>
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>1.3.2</version>
</dependency>
<dependency>
	<groupId>commons-dbcp</groupId>
	<artifactId>commons-dbcp</artifactId>
	<version>1.4</version>
</dependency> 
<!-- Oracle -->
<dependency>
	<groupId>com.oracle.database.jdbc</groupId>
	<artifactId>ojdbc6</artifactId>
	<version>11.2.0.4</version>
</dependency>

 

Spring web.xml 설정
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>

 

Spring TEST 소스 작성 (ex01.java)
package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class ex01 {

	public static void main(String[] args) {
		// 1단계 : 데이터 베이스 연결
		try {
			String className = "oracle.jdbc.driver.OracleDriver";
			Class.forName(className);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

		// 2단계 : 연결을 관리하는 객체 생성
		try {
			String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
			/* "jdbc:oracle:thin:@"192.168.0.23":1521:xe"; 로 선택 가능 */
			String id = "scott";
			String pass = "scott";

			Connection conn = DriverManager.getConnection(url, id, pass);

			// 3단계 : 작업관리(Query)
			PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM dept");

			// 4단계 : 결과처리
			ResultSet rs = pstmt.executeQuery();

			while (rs.next()) {
				int deptNo = rs.getInt("deptno");
				String deptName = rs.getString("dname");
				String loc = rs.getString("loc");

				System.out.println(deptNo + "\t" + deptName + "\t" + loc);
			}

			// 5단계 : 종료
			rs.close();
			pstmt.close();
			conn.close();

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

 

ex01.java 실행 결과 (Run As - Java Application)
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES		CHICAGO
40	OPERATIONS	BOSTON

 

JDBCUtil.java 파일 생성

 - DB 설정 내용을 저장해 놓고 재사용하고 싶은 경우 사용함.

package com.springbook.biz.common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JDBCUtil {
	public static Connection getConnection() {
		try {
			//Class.forName("org.h2.Driver");
			//return DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test", "sa", "");
			Class.forName("oracle.jdbc.driver.OracleDriver");
			return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL",	"scott", "scott");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void close(PreparedStatement stmt, Connection conn) {
		if (stmt != null) {
			try {
				if (!stmt.isClosed())
					stmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				stmt = null;
			}
		}
		if (conn != null) {
			try {
				if (!conn.isClosed())
					conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				conn = null;
			}
		}
	}

	public static void close(ResultSet rs, PreparedStatement stmt, Connection conn) {
		if (rs != null) {
			try {
				if (!rs.isClosed())
					rs.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				rs = null;
			}
		}
		if (stmt != null) {
			try {
				if (!stmt.isClosed())
					stmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				stmt = null;
			}
		}
		if (conn != null) {
			try {
				if (!conn.isClosed())
					conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				conn = null;
			}
		}
	}
}

 

스프링 프로젝트를 import 하거나 SVN에서 체크아웃 받은 후 환경설정 하다보면 아래와 같은 오류가 나온다.

 

[오류 내용]

maven java ee configuration problem(2 items)

- dynamic web module 3.1 requires java 1.7 or newer

- one or more constraints have not been satisfied



위 에러는 dynamic web module 3.1 로 설정이 되어있지만, Spring의 web.xml에 들어가는 Servlet Version 이 달라서 생기는 오류로 보인다.

 

[dynamic web module 버전 확인]

프로젝트 마우스 오른쪽 클릭 - Build Path - Configure Build Path - ProJect Facets - Dynamic Web Module 버전 확인

 

[Spring web.xml 확인]

dynamic web module 버전마다 Servlet Version이 다르므로 아래 내용 참조하여 수정하면 된다.

dynamic web module 버전이 3.1로 설정되어 있는 경우 

web-app_3_1.xsd" version="3.1" 로 변경한다.

 

Servlet 2.2

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app/>

Servlet 2.3

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app/>

Servlet 2.4 - DTD에서 Schema로 변경됨

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="servlet-2_4" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>

Servlet 2.5

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="servlet-2_5"
	version="2.5">
</web-app>

Servlet 3.0

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">
</web-app>

Servlet 3.1

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1">
</web-app>

Servlet 4.0

<?xml version="1.0" encoding="UTF-8"?>
<web-app
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
	version="4.0">
</web-app>

 

[참고 자료]

http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html

UserVO 생성

public class UserVO {
	private String userId;
	private String userPw;
	private String userName;
	
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getUserPw() {
		return userPw;
	}
	public void setUserPw(String userPw) {
		this.userPw = userPw;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	@Override
	public String toString() {
		return "UserVO [userId=" + userId + ", userPw=" + userPw + ", userName=" + userName + "]";
	}
}

 

컨트롤러 생성

@RequestMapping("/login")
	public void login(UserVO user){
    }

post방식으로 /login 요청이 들어올때

파라미터 이름이 만약 UserVO 객체의 필드명 각각의 set메서드의 필드명과 일치하면

알아서 setter가 작동하여 객체에 파라미터값들을 이름이 서로 일치하는 변수로 다 주입 시킵니다.

# 환경

- Spring 4.6.1.RELEASE

- mybatis

- 뷰 페이지 : jsp 

- tomcat v9.0

 

# 구현 방법 정리

1. login.jsp : <form>에서 로그인 ID, PW를 받아서 controller로 넘긴다.  

2. controller : ID, PW 확인하는 로직을 수행 후 리턴값 널 체크, 조건문으로 분기한다.

 - ID, PW가 틀릴 경우 : HttpSession에 원하는 에러메세지를 담아서 로그인 페이지로 리턴한다.

3. login.jsp : ID 또는 PW가 틀렸을 경우 에러메세지를 보여준다.

 

#간략한 중요 코드

1. login.jsp

<script>
function login_submit() {
	var user_id = document.frm.user_id.value.trim().toUpperCase();
	var password = document.frm.password.value.trim();
	var send_frm = document.frm;

	if (user_id == "") {
	alert("아이디를 입력하여 주시기 바랍니다.");
	document.frm.user_id.focus();
	return false;
	}

	if (password == "") {
		alert("비밀번호를 입력하여 주시기 바랍니다.");
		document.frm.password.focus();
	return false;
	}
	send_frm.action = "host_main"
	send_frm.method = "post";
	send_frm.submit();
}
</script>

<body>
<form name="frm">
ID : <input type="text" name="user_id" id="user_id">
PW : <input type="password" name="password" id="password">
<img src="web/images/login_btn.gif" onclick="login_submit()" style="cursor: pointer;">
</form>

<input type="hidden" id="loginCheck" name="loginCheck" value="${check}">

<script>
	$(document).ready(function() {
		var check = $('#loginCheck').val();
		if(check != ""){
			alert(check);
			$('#loginCheck').val() = "";
		}
	});
</script>
</body>

 

2. Controller

@Controller
public class HostController {
	@Autowired
	private HostService service;
    
 	// 관리자 로그인처리
	@RequestMapping("host_main")
	public String goHostMain(UserVO vo, Model model, HttpSession session, HttpServletRequest request) {
    UserVO uvo = service.loginCheck(vo);
		
		if(uvo == null) {
			session.setAttribute("check", "ID를 확인해주세요.");
			return "host/login";
		}
        
        if(vo.getUser_id().equals(uvo.getUser_id())) {
			// id OK
			if(vo.getPassword().equals(uvo.getPassword())) {
				// pw OK
                
            } else {
				// PW NO OK
				session.setAttribute("check", "PW를 확인해주세요.");
				return "host/login";
			}
		} else {
			// ID NOT OK
			session.setAttribute("check", "ID를 확인해주세요.");
			return "host/login";
		}
		return "main/main";
	}

 

+ Recent posts