[Spring] DB연결

김장환·2022년 8월 22일

Spring

목록 보기
6/17

Spring에서 db연결을 정리해보고자 한다.
순서대로 예제를 통해 정리하고자 한다.

테이블 생성

우선 db에 사용할 테이블을 생성해준다
=>create table student(
id int not null,
name varchar(20) not null,
age int not null,
primary key(id));

생성 후
desc student 로 확인

pom.xml 확인

pom.xml에 이상이 없는지 확인한다.
특히 jdbc에 관련된 부분이나 오라클 등 관련된 부분 이상없는지 채크한다.

<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>org.springframework.samples</groupId>
  <artifactId>SpringTest3</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <properties>

		<!-- Generic properties -->
		<java.version>1.6</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

		<!-- Spring -->
		<spring-framework.version>3.2.3.RELEASE</spring-framework.version>

		<!-- Hibernate / JPA -->
		<hibernate.version>4.2.1.Final</hibernate.version>

		<!-- Logging -->
		<logback.version>1.0.13</logback.version>
		<slf4j.version>1.7.5</slf4j.version>

		<!-- Test -->
		<junit.version>4.11</junit.version>

	</properties>
	<!-- 오라클의 다운로드 받을 수 있는 Repository -->
	<repositories>
	  <repository>
	     <id>oracle</id>
	     <name>oracle jdbc respository</name>
	     <url>http://maven.jahia.org/maven2</url>
	  </repository>
	</repositories>
	
	<dependencies>
		<!-- Spring and Transactions -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.2.5.RELEASE</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>4.2.5.RELEASE</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.2.5.RELEASE</version>
		</dependency>
		<!-- jdbc에 관련된 외부패키지 (68번줄까지)-->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>4.2.5.RELEASE</version>
		</dependency>
		
		<!-- dbcp(ConnectionPool) or mysql -->
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>
		
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.34</version>
		</dependency>
		
		<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>12.1.0.1</version>
        </dependency>
		
	</dependencies>	
</project>


DTO 생성 => 여기서는 Student.java

jsp의 DTO를 spring에서도 생성한다.

  • 래퍼클래스를 사용해봤다. (Integer)
  • 멤버변수는 id(학생번호), age(나이), name(이름)을 설정했다.
  • DTO는 Setter, Getter 메서드

package studentdb;

//String,int->Integer(래퍼클래스)=>DTO or VO이름으로 작성이 가능
public class Student {

	private Integer id;//학생번호 //int id를 Integer로 써도 된다.
	private Integer age;//나이
	private String name;//이름
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}


DAO 생성=>여기서는 StudentDAO(인터페이스로 생성)

DAO가 꼭 java가 아닐수있다
인터페이스로도 가능하며 여기서는 인터페이스로 해볼려한다.

다음과 같은 순서로 작성한다.
1. DB연결을 시켜주는 메서드 필요(초기화)
2. insert-> create(Student st);
3. 학생정보-> pk로 검색
4. 학생들 전체 select * from student;
5. 학생정보 삭제
6. 6.학생정보를 수정->update

package studentdb;

//import java.sql.*//Connection.pstmt.stmt.rs
import javax.sql.DataSource;//DB연결할때 필요(JNDI방법 사용시)
import java.util.List;//select할때

//DB연동의 초기화=>Student에 접속->DataSource객체->DB연동 O
public interface StudentDAO {

	//1.DB연결을 시켜주는 메서드 필요(초기화)DataSource객체->DB연동 O
	public void setDs(DataSource ds);
	
	//2.insert-> create(Student st);
	public void create(Integer id,String name,Integer age);
	
	//3.학생정보-> pk로 검색 select * from student where id=1
	public Student getStudent(Integer id);//~(int id);
	
	
	//4.학생들 전체 select * from student;
	public List<Student> listStudents();
	
	//5.학생정보 삭제 delete from student where id=2;
	public void delete(Integer id);
	
	// update(Student st)
	//6.학생정보를 수정->update테이블명 set 필드명=값,,,where 조건식
	public void update(Integer id,Integer age);//(int,int)
	
}


Bean.xml 생성

Bean.xml을 통해
1. DB연결을하고 (driver,url,username,password 설정)
2. 연결시켜서 가져올 빈즈객체를 만든다.

<!--1.DB연결(dataSource) p220~221  
		driver,url,username,password -->
<bean id="dataSource" 
	class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
	<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
	<property name="username" value="scott" />
	<property name="password" value="tiger" />
</bean>

<!--2.DB연결시켜서 가져올 수 있는 빈즈객체  --> <!-- ds에 위에 만든 dataSource를 넣는다 -->
<bean id="studentJDBCTemplate" class="studentdb.StudentJDBCTemplate">
	<property name="ds" ref="dataSource" />
</bean>


StudentJDBCTemplate 작성

DB접속해서 crud할 수 있는 클래스
예제 내용과 주석 메모를 통해 정리하고자 한다.


package studentdb;

import java.util.List;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;

//DB접속해서 crud할 수 있는 클래스
public class StudentJDBCTemplate implements StudentDAO {

	private DataSource ds;//DB접속->Bean.xml에서 가져옴
	//접속 후 sql실행=>pstmt와 비슷한 역할
	private JdbcTemplate jt; // pstmt
	//query()(select),(insert,update,delete)->update() //=> select는 query,나머지 3개는 update
	
	@Override
	public void setDs(DataSource ds) {
		// TODO Auto-generated method stub
		this.ds=ds;
		System.out.println("ds=>"+ds);//null->DB설정값 오타 확인
		this.jt=new JdbcTemplate(ds);//JdbcTemplate(DB정보객체)
		System.out.println("setDS() call(jt->)"+jt);
	}

	@Override
	public void create(Integer id, String name, Integer age) {
		// TODO Auto-generated method stub
		//형식  jdbcTemplate객체명.update(1.실행시킬sql구문,2.입력받을 값)
		String sql="insert into student values(?,?,?)";
		jt.update(sql,id,name,age);
		System.out.println("create id=>"+id+",name=>"+name+",age=>"+age);
	}

	//-------------select구문은 따로 RowMapper클래스를 이용해서 호출------------------------
	@Override
	public Student getStudent(Integer id) {
		// TODO Auto-generated method stub
		String sql="select * from student where id=?";
		/*형식) 반환값=jdbcTemplate객체명.queryForObject
		  		  (1.실행시킬 sql구문,매개변수(배열표시),RowMapper객체지정)
		 */
		StudentRowMapper sm=new StudentRowMapper();
		Student st=jt.queryForObject(sql,new Object[] {id},
														new StudentRowMapper());
		return st;
	}

	@Override
	public List<Student> listStudents() {
		// TODO Auto-generated method stub
		String sql="select * from student";  //매개변수가 없어서 where 빼버린다
		/*형식) 반환값=jdbcTemplate객체명.query // 매개변수가 없으면 query로 바꾼다 (queryForObject에서 query로)
		  		  (1.실행시킬 sql구문,RowMapper객체지정) // 매개변수 지운다
		 */
		//StudentRowMapper sm=new StudentRowMapper();
		List<Student> sts=jt.query(sql,new StudentRowMapper());
		return sts;
		
	}
	//--------------------------------------------------
	@Override
	public void delete(Integer id) {
		String sql="delete from student where id=?";
		jt.update(sql,id);
		System.out.println("delete id=>"+id);

	}

	@Override
	public void update(Integer id, Integer age) {
		String sql="update student set age=? where id=?";
		//pstmt.setInt(1,age),pstmt.setInt(2,id)와 같다
		jt.update(sql,age,id);
		System.out.println("update id=>"+id+",age=>"+age);
	}

}


StudentRowMapper.java 생성

위에 내용중에 select구문을 실행하기 위해 작성

RowMapper인터페이스->select구문을 실행(mapRow()호츨->DTO에 담아서 결과를 리턴)

package studentdb;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

//RowMapper인터페이스->select구문을 실행(mapRow()호츨->DTO에 담아서 결과를 리턴)
public class StudentRowMapper implements RowMapper<Student> {
	
	//callBack메서드=>내부적으로 자동적으로 호출해주는 메서드
	//1.mapRow(1.ResultSet객체를 반환 2.검색된 레코드갯수=>갯수만큼 for돌려서반환)
	@Override					//jsp의 ResultSet
	public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
		// TODO Auto-generated method stub
		System.out.println("mapRow() call(rowNum)=>"+rowNum);
		//while(rs.next()){담아주는 구문} <=jsp에선
		Student st=new Student();//DTO객체생성=>검색된갯수만큼 담기
		st.setId(rs.getInt("id"));
		st.setName(rs.getString("name"));
		st.setAge(rs.getInt("age"));
		
		return st;//query()의 반환값으로 전달받을 수 있다.
	}
}


MainApp.java 생성(실행시키는 페이지)

다음과 같은 순으로 작성하고자 한다.

  1. xml파일을 메모리에 로딩
  2. 2.xml->getBean(id 또는 name값) =>studentJDBCTemplate를 불러서 연결
  3. 수정
  4. 삭제
  5. 데이터를 검색

package studentdb;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//1.xml파일을 메모리에 로딩
		ApplicationContext context=
				new ClassPathXmlApplicationContext("/studentdb/Bean.xml");
		//2.xml->getBean(id 또는 name값)   =>studentJDBCTemplate를 불러오면 연결가능 (이건 바로위에 db연동하는것을 포함한것이기떄문)
		StudentJDBCTemplate st=(StudentJDBCTemplate)
				context.getBean("studentJDBCTemplate");
		System.out.println("st=>"+st);
		st.create(1,"홍길동",23); //pk가 충돌->무결성 제약조건
		st.create(2,"테스트",34); //34->37
		st.create(3,"박영진",45);
		st.create(4,"임시",22); //id가 4번인 데이터
		st.create(5,"테스트2",32);
		
		System.out.println("전체 레코드 검색중...");
		List<Student> sts=st.listStudents();//RowMapper에서(5번호출)
		for(Student re:sts) {//for(객체자료형 객체명:컬렉션객체명)
			System.out.println("id=>"+re.getId());//=> el문으로바꾸면 ${re.id} 
			System.out.println("name=>"+re.getName());
			System.out.println("age=>"+re.getAge());
		}
		//수정
		st.update(2,37); //id가 2번인 데이터를 찾아서 나이를 37로 변경
		//삭제
		System.out.println("삭제시킬 Record 번호는 4번");
		st.delete(4);//내부적으로 update()호출 =>(insert,update,delete는 전부 update를 호출)
		//5번인 데이터를 검색하기
		Student re=st.getStudent(5);//select * from student where id=5
		System.out.println("id=>"+re.getId());//=> el문으로바꾸면 ${re.id} 
		System.out.println("name=>"+re.getName());
		System.out.println("age=>"+re.getAge());
	}
}

사실 요즘은 이 방법보단 마이바티스를 자주쓴다.
그래도 기본이 튼튼해야하니 정리한다.

2022-08-22

0개의 댓글