[JPA기초강좌] 식별자매핑, 복합키매핑 @EmbeddedId, @Embeddable_자바/스프링프레임워크/마이바티스/ORM/JPA실무교육학원
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/...
Transcript of 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 메소드
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);
}