Dev/Struts

Struts2/Spring2.5/iBatis 셋팅

창문닦이 2019. 3. 28. 13:39


JDK7 설치

이때, 자바 JDK 버전이 7 이었음. 현재 PC 설치한 JDK는 버전 8

JDK8은 어노테이션 인식이 안되므로 JDK7 설치를 하고자한다.

설치되는 위치가 다르기 떄문에 충돌은 일어나지 않음 64비트와 32비트 차이로 인해 저장위치 다름

서버 환경설정 변경

1. Runtime Environment 클릭

2. Installed JREs 클릭

3. Standard VM 클릭

4. ADD JRE의 Directory 클릭

5. JRE7이 설치된 경로 ▶ 확인 ▶ finish

6. JRE7으로 설정 변경


7. 디폴트 설정을 'jre7'로 변경 ▶ finish

8. 프로젝트 마우스 우클릭 ▶ properties ▶ Java Compiler ▶ Compiler Compliance level 1.7로 변경  


9. 객체생성은 스프링에게 시킨다고 struts.properties 환경설정


★ BeanFactory의 역할


라이브러리 추가


스프링의 가장 큰장점은 어노테이션.

xmlns:p="http://www.springframework.org/schema/p" 사용자 정의


Spring을 이용하여 iBatis 셋팅 - 제어의 역전

XML 네임스페이스를 이용하여 <property> 태그를 사용하지 않고 간단하게 프로퍼티를 설정 할 수 있다. 
네임 스페이스 http://www.springframework.org/schema/p 접두어를 사용하여 프로퍼티 값을 간편하게 설정 할 수 있다. 
위 예에서는 접두어로 p를 설정 했는데 기본 데이터 타입을 『p:프로퍼티이름="값"』 형식으로 설정하고, 
bean 객체인 경우에는 『p:프로퍼티이름-ref="값"』형식으로 설정한다.

<beans xmlns="http://www.springframework.org/schema/beans"

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

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

자바 패키지 생성

의존성 주입

1. DAO 인터페이스

package com.util.dao;

import java.sql.SQLException;

import java.util.List;

import java.util.Map;

public interface CommonDAO {

//오버로딩

//데이터 추가

public void insertData(String id, Object value) throws SQLException;

//데이터 수정

public int updateData(String id, Object value) throws SQLException;

public int updateData(String id, Map<String, Object> map) throws SQLException;

//데이터 삭제

public int deleteData(String id) throws SQLException;

public int deleteData(String id, Object value) throws SQLException;

public int deleteData(String id, Map<String, Object> map) throws SQLException;

//해당 레코드 가져오기

public Object getReadData(String id);

public Object getReadData(String id, Object value);

public Object getReadData(String id, Map<String, Object> map);

public int getIntValue(String id);

public int getIntValue(String id, Object value);

public int getIntValue(String id, Map<String, Object> map);

public List<Object> getListData(String id);

public List<Object> getListData(String id, Object value);

public List<Object> getListData(String id, Map<String, Object> map);

}

2. 인터페이스를 구현한 DAO 클래스

package com.util.dao;

import java.sql.SQLException;

import java.util.List;

import java.util.Map;

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

import org.springframework.orm.ibatis.SqlMapClientTemplate;

import org.springframework.stereotype.Repository;

@Repository("dao")

public class CommonDAOImpl implements CommonDAO {

//자동으로 applicationContext.xml에 있는 bean중 id가 동일한 객체를 가져오라는 어노테이션

//Autowired가 작성되었기 때문에 setter를 생략할 수 있다.

@Autowired

private SqlMapClientTemplate sqlMapClientTemplate;

@Override

public void insertData(String id, Object value) throws SQLException {

try {

sqlMapClientTemplate.getSqlMapClient().startTransaction();

sqlMapClientTemplate.getSqlMapClient().getCurrentConnection().setAutoCommit(false);//디비연결

sqlMapClientTemplate.insert(id, value);

sqlMapClientTemplate.getSqlMapClient().getCurrentConnection().commit();//커밋

} catch (Exception e) {

System.out.println(e.toString());

} finally {

//에러 발생시 무조건 커밋

sqlMapClientTemplate.getSqlMapClient().getCurrentConnection().setAutoCommit(true);

sqlMapClientTemplate.getSqlMapClient().endTransaction();

}

}

@Override

public int updateData(String id, Object value) throws SQLException {

int result = 0;

try {

//트랜잭션매니저 bean에서 트랜잭션을 생성하고 끝내므로 작성할 필요없음

result = sqlMapClientTemplate.update(id, value);

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}

@Override

public int updateData(String id, Map<String, Object> map)

throws SQLException {

int result = 0;

try {

result = sqlMapClientTemplate.update(id, map);

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}

@Override

public int deleteData(String id) throws SQLException {

int result = 0;

try {

result = sqlMapClientTemplate.delete(id);

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}

@Override

public int deleteData(String id, Object value) throws SQLException {

int result = 0;

try {

result = sqlMapClientTemplate.delete(id, value);

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}

@Override

public int deleteData(String id, Map<String, Object> map)

throws SQLException {

int result = 0;

try {

result = sqlMapClientTemplate.delete(id, map);

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}

@Override

public Object getReadData(String id) {

return sqlMapClientTemplate.queryForObject(id);

}

@Override

public Object getReadData(String id, Object value) {

return sqlMapClientTemplate.queryForObject(id,value);

}

@Override

public Object getReadData(String id, Map<String, Object> map) {

return sqlMapClientTemplate.queryForObject(id,map);

}

@Override

public int getIntValue(String id) {

int num = 0;

num = ((Integer)sqlMapClientTemplate.queryForObject(id)).intValue();

return num;

}

@Override

public int getIntValue(String id, Object value) {

int num = 0;

num = ((Integer)sqlMapClientTemplate.queryForObject(id,value)).intValue();

return num;

}

@Override

public int getIntValue(String id, Map<String, Object> map) {

int num = 0;

num = ((Integer)sqlMapClientTemplate.queryForObject(id,map)).intValue();

return num;

}

@SuppressWarnings("unchecked")

@Override

public List<Object> getListData(String id) {

List<Object> lists = (List<Object>)sqlMapClientTemplate.queryForList(id);

return lists;

}

@SuppressWarnings("unchecked")

@Override

public List<Object> getListData(String id, Object value) {

List<Object> lists = (List<Object>)sqlMapClientTemplate.queryForList(id,value);

return lists;

}

@SuppressWarnings("unchecked")

@Override

public List<Object> getListData(String id, Map<String, Object> map) {

List<Object> lists = (List<Object>)sqlMapClientTemplate.queryForList(id,map);

return lists;

}

}





1. 서버 시작시 context.xml 실행

web.xml 파일을 읽으라고 태그가 작성되어 있어 읽으러 감


2. web.xml 실행

<listener>가 WEB-INF/applicationContext.xml을 읽음

3. WEB-INF/applicationContext.xml 실행

4. WEB-INF/sqlMapConfig/sqlMapConfig.xml 실행

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

<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"

"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

<settings

cacheModelsEnabled="false"

useStatementNamespaces="true"/>

salMap 찾아갈수 있게 resource 등록

<sqlMap resource="com/util/sqlMap/temp_sqlMap.xml"/>

</sqlMapConfig>

5. com.util.sqlMap.temp_Config.xml sqlMap을 읽어온다.




스프링 어노테이션

@Component : 자동으로 빈 등록


@Scope

자동으로 등록되는 빈의 범위 지정. 스프링 빈을 정의할 때 빈의 Scope를 설정가능. 지정된 Scope에 따라 객체의 라이프사이클과 공유 범위가 결정

 Scope

 설명

 singleton

 컨테이너 단위로 객체를 하나만 생성해서 모든 Bean들이 공유(디폴트)

 prototype

 객체의 요청이 있을때 마다 새로운 객체 생성

 request

 웹 어플리케이션의 경우 요청 라이프사이클 범위 

 session

 웹 어플리케이션의 경우 세션 라이프사이클 범위

global-session : 글로벌 HTTP 세션에 대해 빈 객체를 생성. 포틀릿을 지원하는 컨텍스트에서만 적용 가능


@Required

Setter 메서드에 지정해서 반드시 설정해야 하는 필수 프로퍼티 정의


@Autowired

Setter 메서드, 생성자 메서드 또는 필드(프로퍼티)에 직접 설정 해서 자동으로 의존성 주입이 수행되도록 구성


@Autowired with (required = false) Option

컨테이너가 자동으로 의존성 주입을 수행할 때 대상 Bean을 발견하지 못해도 오류를 발생시키지 않도록 설정


@Qualifier

@Autowired와 함께 사용되어서 자동 의존성 주입이 수행될 대상 Bean을 구체적으로 설정( fileManager의 이름 설정했던과 동일한 개념. 이름을 직접 지정할 수 있다.)

같은 타입의 Bean이 두 개 이상 등록된 경우 @Autowired에 발생할 수 있는 모호성 제거


@Resource <-spring3.0에서는 @Repository와 동일

@Autowired + @Qualifier와 같은 효과


객체를 자동으로 만들어주는데 이름을 dao로 작성한것


Struts2 셋팅

미리 여러개의 인터셉터를 작성해놓고 stack으로 그 묶음을 설정해놓은 것. 반복되는 작업을 줄이기 위함이다.

한번에 여러개의 인터셉터를 써야할 경우 stack의 이름을 호출하면 된다.

myBasicStrack을 사용할 경우 안에있는 3개의 Interceptor가 모두 적용되는 것이다.



★ 참고

struts2에서 전달하는 매개변수의 이름을 params로 사용하고 있다. 내부적인 문법으로 이 params자체가 인터셉터에 해당되도록 코딩이 되어있다.  내가 만든 인터셉터가 없을때는 내부변수(params)가 자동으로 전달되지만, 추가했을 경우 내부적으로 사용된 변수(params)를 기록해줘야한다. 매번 리퍼런스를 기재하는 것 보다 인터셉터를 하나의 이름으로 묶어 한번에 기재하는 방법이 존재한다. 하나의 이름으로 인터셉터 그룹을 묶은 것을 Stack이라고 한다.

 

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

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

 <!-- Configuration for the default package. -->

  <package name="default" extends="struts-default" namespace="" >       

      <!-- interceptors 셋팅 -->

      <interceptors>

       <interceptor-stack name="myBasicStack">

       <interceptor-ref name="exception"/>

       <interceptor-ref name="servletConfig"/>

       <interceptor-ref name="params"/>

       </interceptor-stack>

      

       <interceptor-stack name="myPrepareParamsStack">

       <interceptor-ref name="exception"/>

       <interceptor-ref name="servletConfig"/>

       <interceptor-ref name="prepare"/>

       <interceptor-ref name="modelDriven"/>

       <interceptor-ref name="params"/>

       </interceptor-stack>

      

       <interceptor-stack name="myFileUploadPrepareParamsStack">

       <interceptor-ref name="exception"/>

       <interceptor-ref name="servletConfig"/>

       <interceptor-ref name="fileUpload"/>

       <interceptor-ref name="prepare"/>

       <interceptor-ref name="modelDriven"/>

       <interceptor-ref name="params"/>

       </interceptor-stack>

      </interceptors>

     

      <!-- interceptors를 적용하지 않으면 myBasicStack적용시키도록 설정 -->

      <default-interceptor-ref name="myBasicStack"/>

     

      <global-results>

          <result name="error">/exception/error.jsp</result>

      </global-results>

 </package>

 <include file="struts-temp.xml"/>

</struts>