반응형
Spring JDBC
Spring Framework는 JDBC 프로그래밍을 위해 JdbcTemplate 클래스를 제공합니다.
JdbcTemplate 클래스는 SQL 쿼리문을 손쉽게 구현할 수 있도록 구현되어 있습니다.
라이브러리드 추가
Spring Framework는 JDBC 프로그래밍을 위해 JdbcTemplate 클래스를 제공하고 있습니다.
JdbcTemplate 클래스는 SQL 쿼리문을 손쉽게 구현할 수 있도록 구현되어 있습니다.
pom.xml
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>kr.co.softcampus</groupId>
<artifactId>AOPXML</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- xml에서 사용할 속성들 -->
<properties>
<!-- 자바 버전 -->
<java-version>1.8</java-version>
<!-- 스프링 버전 -->
<org.springframework-version>5.1.9.RELEASE</org.springframework-version>
<!--<org.springframework-version>4.3.25.RELEASE</org.springframework-version> -->
<org.slf4j-version>1.7.26</org.slf4j-version>
<ch.qos.logback-version>1.2.3</ch.qos.logback-version>
<javax.annotation-version>1.3.2</javax.annotation-version>
<org.aspectj-version>1.9.4</org.aspectj-version>
<com.oracle-version>11.2.0.3</com.oracle-version>
<org.apache.commons-version>2.7.0</org.apache.commons-version>
</properties>
<!-- Repository 정보 -->
<repositories>
<repository>
<id>oracle</id>
<name>ORACLE JDBC Repository</name>
<url>http://code.lds.org/nexus/content/groups/main-repo</url>
</repository>
</repositories>
<!-- 프로젝트에서 사용할 라이브러리 정보 -->
<dependencies>
<!-- spring context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<!-- logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${ch.qos.logback-version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>${javax.annotation-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- oracle jdbc -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>${com.oracle-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>${org.apache.commons-version}</version>
</dependency>
</dependencies>
</project>
JdbcBean.java
package kr.co.softcampus.beans;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope("prototype")
public class JdbcBean {
private int int_data;
private String str_data;
public int getInt_data() {
return int_data;
}
public void setInt_data(int int_data) {
this.int_data = int_data;
}
public String getStr_data() {
return str_data;
}
public void setStr_data(String str_data) {
this.str_data = str_data;
}
}
BeanConfigClass.java
package kr.co.softcampus.config;
import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
@Configuration
@ComponentScan(basePackages = {"kr.co.softcampus.beans", "kr.co.softcampus.db"})
public class BeanConfigClass {
// DataSource
@Bean
public BasicDataSource source() {
BasicDataSource source = new BasicDataSource();
source.setDriverClassName("oracle.jdbc.OracleDriver");
source.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
source.setUsername("scott");
source.setPassword("1234");
return source;
}
// 데이터베이스에 접속해서 쿼리를 전달하는 빈을 등록한다.
@Bean
public JdbcTemplate db(BasicDataSource source) {
JdbcTemplate db = new JdbcTemplate(source);
return db;
}
}
MapperClass.java
package kr.co.softcampus.db;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;
import kr.co.softcampus.beans.JdbcBean;
@Component
public class MapperClass implements RowMapper<JdbcBean> {
public JdbcBean mapRow(ResultSet rs, int rowNum) throws SQLException {
// TODO Auto-generated method stub
JdbcBean bean = new JdbcBean();
bean.setInt_data(rs.getInt("int_data"));
bean.setStr_data(rs.getString("str_data"));
return bean;
}
}
JdbcDAO.java
package kr.co.softcampus.db;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import kr.co.softcampus.beans.JdbcBean;
@Component
public class JdbcDAO {
// JDBC 관리 객체를 주입 받는다.
@Autowired
private JdbcTemplate db;
// Mapper를 주입받는다.
@Autowired
private MapperClass mapper;
// 저장
public void insert_data(JdbcBean bean) {
String sql = "insert into jdbc_table (int_data, str_data) values (?, ?)";
db.update(sql, bean.getInt_data(), bean.getStr_data());
}
// 가져오기
public List<JdbcBean> select_data(){
String sql = "select int_data, str_data from jdbc_table";
List<JdbcBean> list = db.query(sql, mapper);
return list;
}
// 수정
public void update_data(JdbcBean bean) {
String sql = "update jdbc_table set str_data = ? where int_data = ?";
db.update(sql, bean.getStr_data(), bean.getInt_data());
}
// 삭제
public void delete_data(int int_data) {
String sql = "delete from jdbc_table where int_data = ?";
db.update(sql, int_data);
}
}
MainClass.java
package kr.co.softcampus.main;
import java.util.List;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import kr.co.softcampus.beans.JdbcBean;
import kr.co.softcampus.config.BeanConfigClass;
import kr.co.softcampus.db.JdbcDAO;
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanConfigClass.class);
// dao를 가져온다.
JdbcDAO dao = ctx.getBean(JdbcDAO.class);
// insert
// JdbcBean bean1 = new JdbcBean();
// bean1.setInt_data(1);
// bean1.setStr_data("문자열1");
// dao.insert_data(bean1);
//
// JdbcBean bean2 = new JdbcBean();
// bean2.setInt_data(2);
// bean2.setStr_data("문자열2");
// dao.insert_data(bean2);
//
// System.out.println("저장완료");
// update
// JdbcBean bean4 = new JdbcBean();
// bean4.setInt_data(1);
// bean4.setStr_data("문자열3");
// dao.update_data(bean4);
// delete
dao.delete_data(1);
// select
List<JdbcBean> list = dao.select_data();
for(JdbcBean bean3 : list) {
System.out.printf("int_data : %d\n", bean3.getInt_data());
System.out.printf("str_data : %s\n", bean3.getStr_data());
System.out.println("----------------------------------------");
}
ctx.close();
}
}
Mapper 클래스
select 문로 데이터를 가져올 때, 어떤 컬럼의 값을 bean 어디에 주입할 것인지 결정을 해줘야 합니다.
이 역할을 하는 클래스가 Mapper 클래스입니다.
정리
이번 시간에는 Spring JDBC를 활용해보았습니다. 이전 Java 프로그래밍을 하면서 JDBC가 익숙하신 분들이 활용하기에 좋은 기능일꺼 같다라는 생각이 들었습니다.
만약 그런것이 아니라면, MyBatis나 Hibernate를 활용하는 것이 더 모던한 개발이 가능할 것 같다라는 생각이 들었습니다. 기본적인 JDBC 기능보다 중복된 코드를 줄여주고, 자동적으로 지원되는 기능들이 편리할 것이라는 생각이 들었습니다.
하지만, 근본적인 동작 원리들을 좀 더 row하게 이해해보기 위해서는 이런 예제들을 한번 사용해보는 것도 좋은 방법이 될 수 있을 것 같습니다.
자세한 활용법은 아래 강좌에서 내용을 확인할 수 있습니다.
반응형
'SW > Java' 카테고리의 다른 글
Java : Spring Boot : 네이버 아이디로 로그인 : 예제, 구현 (0) | 2020.08.24 |
---|---|
Java : Spring : MyBatis : 개념, 예제, 방법, 구현 (0) | 2020.06.16 |
Java : Spring :AspectJ 어노테이션 : 개념, 사용, 방법, 예제, 구현 (0) | 2020.06.14 |
Java : Spring : Execution 명시자 : 종류,개념, 사용 방법, 예제, 구현 (0) | 2020.06.13 |
Java : Spring : AOP 기본 개념, 용어, 구현, 예제 (0) | 2020.06.12 |