Spring DB Connection & Test

Let's Just Go·2022년 7월 7일
0

Spring

목록 보기
7/26

Spring

Spring DB Connection

DB connection

  • DB connection TEST

    • src/test/java에서 클래스를 만들어 DB connection test
    • System계정으로 sqlplus에 접속해서 계정 생성

  • 유저 권한 설정

    • CREATE USER spring IDENTIFIED BY spring;
    • GRANT CREATE SESSION TO spring;
    • GRANT connect, resource TO spring;
    • ALTER USER spring DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;

  • junit으로 테스트 진행

  • CREATE TABLE

    • Score

      CREATE TABLE scores(
          stu_id number(3) primary key,
          stu_name varchar2(30) not null,
          kor number(3) default 0,
          eng number(3) default 0,
          math number(3) default 0,
          total number(5) default 0,
          average number(5,2)
      );
      
      CREATE SEQUENCE id_seq 
      	start with 1
      	increment by 1
      	maxvalue 1000
      	nocycle
      	nocache;

Connection Method

  • JDBC, DB관련 빈 등록 및 관리
    • root-context.xml에서 jdbc와 db 관련 설정 작성

    • namespace에서 jdbc와 mvc 클릭

    • 히카리 커넥션 풀 빈 등록

    • 등록한 Connection pool을 히카리 DataSource에 주입

    • JdbcTemplate 클래스 빈 등록

    • jdbcTemplate은 히카리 데이터 소스 빈을 참조하고 히카리 데이터 소스 빈은 히카리 커넥션 풀 빈 등록을 참조

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
      	xmlns:mvc="http://www.springframework.org/schema/mvc"
      	xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
      		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
      		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
      
      	<!-- Root Context: defines shared resources visible to all other web components -->
      
      	<!-- JDBC, DB 관련 빈을 등록하고 관리하는 설정 파일 -->
      	<!-- 히카리 커넥션 풀 빈 등록 -->
      	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
      		<!-- property는 객체의 setter처럼 값 주입 -->
      		<property name="driverClassName"
      			value="oracle.jdbc.driver.OracleDriver" />
      		<property name="jdbcUrl"
      			value="jdbc:oracle:thin:@localhost:1521:xe" />
      		<property name="username" value="spring" />
      		<property name="password" value="spring" />
      	</bean>
      
      	<!-- 히카리 데이터 소스 빈 등록 -->
      	<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
      		<constructor-arg ref="hikariConfig" />
      		<!-- 히카리 데이터 소스에 히카리 커넥션 풀 주입 -->
      	</bean>
      
      	<!-- Spring JDBC를 사용하기 위한 핵심 객체인 JdbcTemplate 클래스 빈 등록 -->
      	<bean id="jdbcTemplate"
      		class="org.springframework.jdbc.core.JdbcTemplate">
      		<property name="dataSource" ref="ds" />
      	</bean>
      
      </beans>

Spring DB Test (JDBC TEMPLATE)

Update

  • Update Method
    • DB에 삽입, 삭제, 수정을 할 때 사용하는 함수

    • JdbcTemplate가 Connection등의 반복 수행해야 하는 것을 자동으로 수행

    • JdbcTemplate객체.update(sql, 값) 함수를 통해 삽입, 삭제, 수정을 쉽게 할 수 있음

      @Repository
      // 자동 bean 등록 annotation (@Repository)
      public class ScoreDAO implements IScoreDAO {
      
      	// 학생들의 점수 정보를 저장할 리스트를 생성 (DB 대용)
      	private List<ScoreVO> scoreList = new ArrayList<>();
      	
      	// root-context.xml에서 jdbc설정 끝나고 진행해야함 
      	// Spring-jdbc 방식의 처리 : JdbcTemplate 활용
      	
      	@Autowired 
      	// container에 저장되어 있는 bean을 타입을 통해 자동으로 찾아줌
      	private JdbcTemplate template;
      	
      	@Override
      	public void insertScore(ScoreVO score) {
      //		scoreList.add(score);
      		// db에 넣어주는 작업을 현재에는 list로 작성하고 있으므로 간단하게 끄읏 
      		// service에서 가져온 score를 받아서 값을 넣음
      		
      		String sql = "INSERT INTO scores VALUES(id_seq.NEXTVAL, ?, ?, ?, ?, ?, ?)";
      		template.update(sql, 
      						score.getStuName(),
      						score.getKor(),
      						score.getEng(),
      						score.getMath(),
      						score.getTotal(),
      						score.getAverage());	
      		// 전역 변수로 지정한 template을 활용하여 sql 작업 진행
      		// JdbcTemplate이 Connection이나 부가적인 다른 것들은 자동으로 진행 됨
      		// 엄청 간단하게 진행 가능 
      	}
      }

query

  • query Method
    • 여러 개의 조회 결과를 받을 때 사용하는 함수

    • JdbcTemplate객체.query(sql, RowMapper객체) 를 통해 조회 결과 확인 가능

    • SELECT 쿼리를 위한 ResultSet 사용을 편하게 하기 위해 Mapper클래스를 구현해야함

    • ScoreMapper

      package com.spring.db.common;
      
      import java.sql.ResultSet;
      import java.sql.SQLException;
      
      import org.springframework.jdbc.core.RowMapper;
      
      import com.spring.db.model.ScoreVO;
      
      // JDBCTemplate에서 SELECT 쿼리를 위한 ResultSet 사용을 편하게 하기 위한 클래스 생성 
      // RowMapper 인터페이스 구현 
      public class ScoreMapper implements RowMapper<ScoreVO>{
      
      	@Override
      	public ScoreVO mapRow(ResultSet rs, int rowNum) throws SQLException {
      		System.out.println("mapRow 메서드 발동");
      		System.out.println("rowNum: " + rowNum);
      		
      		ScoreVO score = new ScoreVO();
      		// 조회된 결과를 ScoreVO 객체에 넣어줌 
      		// ScoreVO 객체의 setter 메서드와 db의 컬럼 명을 활용 
      		score.setStuId(rs.getInt("std_id"));
      		score.setStuName(rs.getString("stu_name"));
      		score.setKor(rs.getInt("kor"));
      		score.setEng(rs.getInt("eng"));
      		score.setMath(rs.getInt("math"));
      		score.setTotal(rs.getInt("total"));
      		score.setAverage(rs.getDouble("average"));
      		return score;
      	}
      }

query 진행 절차

  • query 진행 절차
    • sql문과 미리 만들어 둔 ScoreMapper 객체를 생성

    • ScoreMapper객체에는 select 결과를 score객체에 넣어주며 score객체를 리턴

    • jdbctemplate이 mapRow메서드를 불러서 resultset에 값을 전달

    • 이후 객체에 값을 넣어주고 jdbctemplate에 반환하면 jdbctemplate은 리스트를 만들어 놓고 값을 넣음

    • mapRow 메서드는 그냥 jdbctemplate에 포장 방법을 알려준다고 생각하면 될 듯?

    • jsp에서 했던 select를 query함수를 통해서 실행

    • DAO

      @Override
      	public List<ScoreVO> listScore() {
      		String sql = "SELECT * FROM scores ORDER BY stu_id ASC";
      		
      		return template.query(sql, new ScoreMapper());
      }

queryFormObject

  • queryForObject
    • 하나만 조회할 때 사용하는 함수

    • JdbcTemplate객체.queryForObject(sql, RowMapper객체, ?에 채울 값) 를 통해 개별 조회 결과를 반환할 수 있음

      @Override
      	public ScoreVO selectScore(int num) {
      		
      		String sql = "SELECT * FROM scores WHERE stu_id = ?";
      		return template.queryForObject(sql, new ScoreMapper(), num);
      	}

profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글