Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/...

26
Spring Framework & MyBatis 스스스 스스스스스 & 스스스스스 스스 스스스스스 스스스스

Transcript of Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/...

Spring Framework & MyBatis스프링 프레임워크 & 마이바티스 강의

탑크리에듀 교육센터

CONTENTS

1. 스프링 프레임워크 개요

2. Spring & DI

3. Spring AOP((Spring Asp

4. Spring JDBC

4.1 기존 JAVA JDBC 와 Spring JDBC 의 비교

4.2 Spring JDBC 에서 DataSource 취득하는 방법

4.3 Spring JDBC 에서 DB 접근하는 방법

4.3.1 Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4.3.1.1 Maven, Gradle 에서 오라클 설정

4.3.1.2 마리아 DB 및 HeidiSQL 설치

4.3.1.3 간단한 Spring JDBC jdbcTemplate 예제

4.3.1.4 Spring JDBC 내부 콜백 (PreparedStatementCreator, PreparedStatementSetter)

4.3.1.5 jdbcTemplate 의 execute 메소드

Chapter 4 Spring JDBC

~ 4.3.1.5

4. Spring JDBC4-1. 기존 JAVA JDBC 와 Spring JDBC 의 비교 

Spring 의 DAO 프레임워크에서는 Connection 객체를 DataSource 를 통해서 취득하며 Connection 객체를 프로그래머가 직접 다루지 않는다 .

스프링은 데이터 접근 프로세스에 있어서 고정된 부분과 가변적인 부분을 명확히 분류하는데 고정적인 부분은 템플릿 (template)이며 , 가변적인 부분은 콜백 (callback) 이다 .

템플릿은 프로세스의 고정적인 부분 ( 트랜잭션 관리 , 자원관리 , 예외처리 ) 을 관리하며 콜백 ( 질의문 생성 , 파라미터 바인딩 , 결과집합 마샬링 ) 은 구체적인 구현을 넣어야 하는 장소이다 . 프로그래머는 콜백부분만 구현하면 된다 .

4. Spring JDBC4-1. 기존 JAVA JDBC 와 Spring JDBC 의 비교 

기존 JDBC 를 이용하여 퍼시스턴스 계층을 구현할 때 문제점 퍼시스턴스 계층은 Connection 생성 , PreparedStatement 생성 , SQLException 처리와 같이 중복적으로 구현해야 하는 소스 코드가 너무 많다 .

Spring 프레임워크는 JDBC 를 추상화한 API 를 새롭게 제공하고 있는데 이것이 Spring JDBC 이다 . Spring JDBC 는 기존의 JDBC 를 추상화하고 있는 만큼 지금까지 개발자들이 직접 구현해 왔던 Connection 생성 , PreparedStatement 생성 ,

SQLException 처리와 같은 반복적인 작업들을 프레임워크가 담당하고 있다 .

Spring 의 DAO 프레임워크가 던지는 모든 예외는 DataAccessException 이다 . SQLException 이나 HibernateEx-

ception 등과 같은 특정 기술에 의존적인 예외를 던지지 않는다 .

데이터 접근 인터페이스가 구현에 의존적인 예외가 아닌 스프링의 일반적인 예외를 던짐으로써 특정한 퍼시스턴스 구현에 결합되는 일이 없다 (loose coupling).

DataAccessException 은 반드시 직접 처리할 필요는 없다 . RuntimeException 이기 때문에 Uncheck Exception 에 속한다 . Checked Exception 이 과도한 catch 나 throws 절을 야기시켜 코드가 난잡하게 만들수 있다 .

Unchecked Exception 이 발생하는 경우는 대부분 복구가 불가능한 것이므로 직접 처리할 필요는 없다 . 비지니스 로직을 수행하는 중 발생하는 비즈니스 로직 오류는 Checked Exception 으로 처리하고 그렇지 않으면 Unchecked Exception 으로 처리하면 된다 .

4. Spring JDBC

4-2. Spring JDBC 에서 DataSource 취득하는 방법  DriverManagerDataSource 클래스 이용

- 자바 소스에서       DriverManagerDataSource dataSource = new DriverManagerDataSource();     dataSource.setDriverClassName(“oracle.jdbc.driver.OracleDriver”);     dataSource.setUrl(“jdbc:oracle:thin:@localhost:1521:onj”);     dataSource.setUsername(“scott”);     dataSource.setPassword(“tiger”); - 설정파일에서

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">    <property name="driverClassName" value="${jdbc.driverClassName}"/>    <property name="url" value="${jdbc.url}"/>    <property name="username" value="${jdbc.username}"/>    <property name="password" value="${jdbc.password}"/></bean>

4. Spring JDBC

4-2. Spring JDBC 에서 DataSource 취득하는 방법  DBCP 이용

common-dbcp.jar, commons-pool.jar 파일이 클래스패스에 필요하다 . <bean id="dataSource"         class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">    <property name="driverClassName" value="${jdbc.driverClassName}"/>    <property name="url" value="${jdbc.url}"/>    <property name="username" value="${jdbc.username}"/>    <property name="password" value="${jdbc.password}"/></bean> <context:property-placeholder location="jdbc.properties"/>

4. Spring JDBC4-2. Spring JDBC 에서 DataSource 취득하는 방법  JNDI 이용

[context.xml]<?xml version=”1.0″ encoding=”UTF-8″?><Context><Resource name=”jdbc/onjdb” auth=”Container” type=”javax.sql.DataSource” driverClassName=”oracle.jdbc.OracleDriver” url=”jdbc:oracle:thin:@localhost:1521:onj” username=”scott” password=”tiger” maxActive=”20″ maxIdle=”10″ maxWait=”-1″/></Context> [ 빈 정의 XML]<bean id=”dataSource” class=”org.springframework.jndi.JndiObjectFactoryBean”> <property name=”jndiName” value=”java.comp/env/jdbc/onjdb”/></bean>

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법  JdbcTemplate : 전형적인 Spring JDBC 접근법으로 SQL 을 실행하며 자주 사용된다 .

NamedParameterJdbcTemplate : 전형적인 JDBC 의 ?(Placeholder) 대신에 이름있는 바인딩 파라미터를 제공하기 위한 것이다 .

SimpleJdbcTemplate : JdbcTemplate + NamedParameterJdbcTemplate

SimpleJdbcInsert : 최소한의 구성으로 Insert 가 가능하도록 지원하며 DataSource 를 가진 클래스를 인스턴스한 직후 with-

TableName 메소드를 불러 테이블 이름을 지정해야 한다 .

SimpleJdbcCall : 최소한의 설정으로 데이터베이스 내에 저장된 저장 프로시저 , 함수 등을 호출하도록 지원한다 .

SqlUpdate : 재사용 가능한 SQL DML(insert, update, dalete) 구문을 생성한다 .

StoredProcedure : RDB 의 저장 프로시저에 대한 추상 수퍼 클래스 , 다양한 execute 메소드를 제공한다 .

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

  모든 형태의 SQL 구문을 실행해서 원하는 결과 타입을 반환한다 .

스프링의 모든 데이터 접근 프레임워크는 템플릿 클래스를 포함하는데 이 경우 템플릿 클래스는 JdbcTemplate 클래스이다 .

JdbcTemplate 클래스가 작업하기 위해 필요한 것은 Data-Source 이며 스프링의 모든 DAO 템플릿 클래스는 스레드에 안전하기 때문에 애플리케이션 내의 각각의 DataSource 에 대해서 하나의 JdbcTemplate 인스턴스만을 필요로 한다 .

public class StudentDao { private JdbcTemplate jdbcTemplate; public void setJdbcTeamplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; }//:}///~ <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="dataSource"/> </property> </bean> <bean id=“studentDao" class="oraclejava.training.jdbc.StudentDao"> <property name="jdbcTemplate"> <ref bean="jdbcTemplate"/> </property></bean>  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >  <property name="driverClassName“><value>oracle.jdbc.driver.OracleDriver</value></property> <property name="url“><value>jdbc:oracle:thin:@192.168.0.27:1521:onj</value></property> <property name="username“><value>scott</value></property> <property name="password“><value>tiger</value></property></bean>   

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-1 Maven, Gradle 에서 오라클 설정  그래들 설정

1. 메이븐 로컬 레포지터리에 오라클 JDBC Driver 설치를 위한 메이븐을 설치하자 . https://maven.apache.org/download.cgi 에서 binary zip 파일을 다운받자 . (apache-maven-3.3.3-bin.zip) 

2. 적당히 압축을 풀자 . (c\java\ 아래 ) 압축을 출고 bin 폴더를 환경변수에서 path 에 추가하자 . (C:\java3\apache-maven-3.3.3\bin) 

3. Oracle JDBC Driver 를 다운받자 . http://www.oracle.com/technetwork/apps-tech/jdbc-112010-090769.html ( 오라클 11g 용 ojdbc6.jar) 4. 다운받은 폴더에서 CMD 로 도스창을 띄운 후 아래 명령을 실행하여 로컬 메이븐 레포지터리에 저장하자 . mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.4 -Dpackaging=jar -Dfile=ojdbc6.jar -DgeneratePom=true 

5. build.grdle 을 작성 apply plugin : 'java' apply plugin : 'application' mainClassName = "onj.edu.jdbc.JdbcClient" dependencies { compile 'org.springframework:spring-context:4.2.4.RELEASE' compile 'org.springframework:spring-jdbc:4.2.4.RELEASE' runtime 'commons-dbcp:commons-dbcp:1.2.2' runtime 'com.oracle:ojdbc6:11.2.0.4' } repositories { mavenCentral() mavenLocal() }

메이븐 설정<dependencies>……<!-- DBCP --><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifac-tId><version>1.2.2</version></dependency> <!-- ORACLE --><dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</artifactId><version>11.1.0.7.0</version></dependency>……</dependencies><repositories><repository><id>oracle</id><name>ORACLE JDBCRepository</name><url>http://maven.jahia.org/maven2</url></repository></repositories>

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-2 마리아 DB 및 HeidiSQL 설치  1. https//download.mariadb.org 에 접속 후 “ Download 10.1.10 Stable Now!” 를 클릭

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-2 마리아 DB 및 HeidiSQL 설치  2. 자신의 환경에 맞는 파일을 다운로드 한다 .

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-2 마리아 DB 및 HeidiSQL 설치  3. 적당한 경로에 압축을 풀고 bin 폴더로 가서 인스톨 하자 .( 관리자 권한으로 CMD 실행할 것 , datadir :

DB 설치경로 , service : 서비스이름 , password : root 비밀번호 )

 

압축푼경로 \bin>mysql_install_db --datadir=DB 설치경로 --service=MySQL --

password=1111

Running bootstrap

2016-05-02 9:45:28 7540 [Note] D:\dev-ecommerce\mariadb-10.1.10-winx64\bin\mysq

ld.exe (mysqld 10.1.10-MariaDB) starting as process 7568 ...

Removing default user

Setting root password

Creating my.ini file

Registering service 'MySQL'

Creation of the database was successfull

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-2 마리아 DB 및 HeidiSQL 설치  4. 원도우 서비스에 보면 MySQL 이라는 서비스가 떠 있을 것이다 .

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-2 마리아 DB 및 HeidiSQL 설치  5. 한글 사용을 위해 DB 설치경로 아래 my.ini 파일을 열어 수정하자 .

[mysqld]datadir= DB 설치경로 [client]default-character-set = utf8[mysqld]init_connect = SET collation_connection = utf8_general_ciinit_connect = SET NAMES utf8character-set-server = utf8collation-server = utf8_general_ci[mysqldump]default-character-set = utf8[mysql]default-character-set = utf8 

6. MySQL 서비스 시작압축푼경로 \bin>sc start MySQL 

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-2 마리아 DB 및 HeidiSQL 설치 

7. DB 에 접속해서 데이터 등을 확인하기 위해 클라이언트도 설치하자 . http://www.heidisql.com/download.php에 접속하여 HeidiSQL 을 설치하자 .

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-2 마리아 DB 및 HeidiSQL 설치  8. 설치파일을 실행하면 HeidiSQL 이 설치되며 실행한 후 신규 버튼을 클릭 후 root 비번 (“1111”) 을 입력하면 접속된다 .

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-3 간단한 Spring JDBC jdbcTemplate 예제  마리아 DB 에서 EMP 테이블의 데이터를 Spring JDBC 의 JdbcTemplate 을 이용하여 화면에 출력하는 간단한 예제를

작성해 보자 .

STS 에서 File -> New -> Project -> Spring Legacy ProjectProject name : jdbc1Simple Spring Maven 선택 Finish 클릭

[ 마리아 DB 및 데이터소스 사용을 위해 pom.xml 에 다음 의존성을 추가 ]

<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring-framework.version}</version>

</dependency> 

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version><scope>runtime</scope>

</dependency> 

<dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version>

</dependency>

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-3 간단한 Spring JDBC jdbcTemplate 예제  [EmpDao.java]

package jdbc; import java.util.List;import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate; public class EmpDao {

private DataSource dataSource;private JdbcTemplate jdbcTemplate;

 public void setDataSource(DataSource dataSource) {

this.dataSource = dataSource;this.jdbcTemplate = new

JdbcTemplate(dataSource);}

 List getNames() {

String sql = "select * from emp";return jdbcTemplate.queryForList(sql);

}}

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-3 간단한 Spring JDBC jdbcTemplate 예제  [src/main/resources/app-jdbc.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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://

www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="EmpDao" class="jdbc.EmpDao">

<property name="dataSource"><ref bean="dataSource" />

</property></bean>

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"

destroy-method="close"><property name="driverClassName">

<value>com.mysql.jdbc.Driver</value></property><property name="url">

<value>jdbc:mysql://localhost/jdbc1</value></property><property name="username">

<value>root</value></property><property name="password">

<value>1111</value></property>

</bean></beans>

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-3 간단한 Spring JDBC jdbcTemplate 예제  [JdbcClient.java]

package jdbc; import org.springframework.context.support.GenericXmlApplicationContext;import org.springframework.core.io.FileSystemResource; public class JdbcClient {

public static void main(String[] args) { 

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("app-jdbc.xml");ctx.refresh();

EmpDao e = (EmpDao)ctx.getBean("EmpDao");System.out.println(e.getNames());ctx.close();

}}

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-4 Spring JDBC 내부 콜백 (PreparedStatementCreator, Prepared-StatementSetter)

  PreparedStatementCreator

// 이 인터페이스는 다음과 같은 하나의 메소드를 제공한다 .

public PreparedStatement createPreparedStatement(Connection con) throws SQLException; 

//JdbcTemplate 이 아래 클래스를 호출할 때 실행된 SQL 로그를 남긴다 .

//SqlProvider 는 getSql() 이라는 메소드를 제공 , SQL 문자열을 JdbcTemplate 에서 사용가능하도록 제공한다 .

public class InsertPersonStatementCreator implements PreparedStatementCreator, SqlProvider

{

private String sql = “INSERT INTO ( id, firstname, lastname) VALUES ( ? , ? ?)”;

public PreparedStatement createPreparedStatement(Connection con) ..

return con.preparedStatement(sql);

}//:

public String getSql() { return sql; }

}

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-4 Spring JDBC 내부 콜백 (PreparedStatementCreator, Prepared-StatementSetter)

  PreparedStatementSetter

// 이 인터페이스는 SQL 파라미터를 Setting 하는 메소드를 제공한다 .

void setValues(PreparedStatement ps) throws SQLException;

 

private Person person;

public void setVales(PreparedStatement ps) throws SQLException {

ps.setInt (1, person.getId().intValue());

ps.setString (2, person.getFirstName());

ps.setString (3, person.getLastName());

}

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-1. Spring JDBC 에서 DB 접근하는 방법 – jdbcTemplate

4-3-1-5 jdbcTemplate 의 execute 메소드  대개 SQL 문자열로 부터 PreparedStatement 를 생성하고 파라미터를 바인딩 하는 작업을 많이 하므로 Jd-

bcTemplate 은 execute 메소드를 제공한다 . 주로 DDL 처리용으로 아래와 같은 경우 백그라운드에서 JdbcTemplate 이 PreparedStatement 와 Pre-

paredStatementSetter 를 생성 시킨다 .

public int insertPerson(Person person) {

String sql = “insert into person (id, firstname, lastname) values (?,?,?)”;

 

Object[] params = new Object[] {

person.getId(),

person.getFirstName(),

person.getLastName()

};

return jdbcTemplate.execute(sql, params);

}

Any Questions ?

THANK YOU FOR YOUR ATTENTION

무료국비지원교육 / 구로자바학원 _ 탑크리에듀 교육센터 http://www.-topcredu.co.kr