16주차 - Spring (8) 커넥션풀(DBCP) 세팅

2022. 10. 21. 11:41Spring framwork

이번의 목표

01. root-context.xml을 수정하여 커넥션풀 환경을 구축해보자

02. config.java를 만들어서 커넥션풀 환경을 구축해보자

03. 공통 과정


지난 시간에는 커넥션풀을 사용하기 위한 dependency를 설정하는 방법에 대해 공부했습니다.

이번시간에는 실제로 커넥션풀을 사용하기 위한 환경 구축을 하는 방법에 대해 공부하겠습니다.

커넥션풀을 사용하기 위한 환경을 구축하는데에는 두가지 방법이 있습니다. 이 두 방법에 대해 공부해보겠습니다.

01. root-context.xml을 수정하여 커넥션풀 환경을 구축해보자 

파일의 경로는 src/main/webapp/WEB-INF/spring/root-context.xml 입니다.

01)  파일을 열고 하단에 있는 Namespaces를 클릭합니다.

 

02) mybatis를 체크합니다.

Namespaces에 들어와서 mybatis를 체크하는 방법 외에도 <beans> 태그에 직접 xmlns 코드를 타이핑할 수도 있습니다.

이경우에는 xmlns를 추가하고 xsi:schemaLocation에도 값을 추가해줘야 합니다.

xmlns와 xsi:schemaLocation에 추가되는 코드는 각각 아래와 같습니다.

※ xmlnm란? => xml name space의 약자

xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd

하지만 코드를 타이핑 하는것보다 체크하는 것으로 간편하게 설정이 가능하니 Namespaces에서 체크하는 편이 좋을 것 같습니다.

이 과정이 필요한 이유는 바로 다음에서 설명하겠습니다.

 

03) 아래의 코드를 작성합니다.

여기서 빨간줄친 것들은 개발자의 환경에 맞게 수정합니다.

username의 value는 오라클 id, password의 value는 오라클 pw 입니다.

그리고 base-package는 dao가 위치할 경로를 설정합니다.

 

 참고로 알아둘 것으로 여기서 임의로 수정이 가능한 부분은 id 입니다.

그리고 위에서 Namespaces의 mybatis를 체크했었던 이유는 코드의 마지막줄에 <mybatis-spring:scan> 이라는 태그 때문입니다. 해당 태그는 스프링에서 기본적으로 제공하는 태그가 아니고 mybatis를 통해서 추가된 태그이기 때문에 이 태그를 사용하기 위해서는 반드시 위의 세팅을 해야만합니다.

 

02. config.java를 만들어서 커넥션풀 환경을 구축해보자

01) *config.java파일을 생성합니다.

config 파일의 예시

02) config 파일에 코드작성

// Configuration 어노테이션은 이 파일은 설정 파일의 용도임을 선언한다.
@Configuration

// <mybatis-spring:scan base-package="com.care.db.basic.repository"/>
// 위의 코드를 아래의 어노테이션으로 대체
@MapperScan(basePackages = {"com.care.db.basic.repository"})

public class DBConfig {
	
	// 설정하는 메서드는 반환값을 아래의 자료형으로 고정
	public HikariDataSource dataSource() {
		
//	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
//		<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
//		<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe"/>
//		<property name="username" value="oracle"/>
//		<property name="password" value="oracle"/>
//	</bean>	
		
		// config객체를 만들어서 위의 name들을 setter를 통해 값을 따로 저장한다.
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName("oracle.jdbc.OracleDriver");
		hikariConfig.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");
		hikariConfig.setUsername("oracle");
		hikariConfig.setPassword("oracle");
		
		//위에서 config 객체의 속성들을 저장했고, 이 객체를 통해 dataSource를 만든다
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		return dataSource;
	}
	
	//	<property name="dataSource" ref="ds"/>
	//	<property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml"/>	
	// Bean 어노테이션의 반환 자료형은 SqlSessionFactoryBean 이다
	@Bean
	public SqlSessionFactoryBean sessionFactory() throws IOException {
		SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
		sessionFactory.setDataSource(dataSource());
		
		PathMatchingResourcePatternResolver resolver = 
				new PathMatchingResourcePatternResolver();
		sessionFactory.setMapperLocations(resolver.getResources("classpath:/mappers/**/*Mapper.xml"));
		return sessionFactory;
	}
}

 

03. 공통 과정

01)

Mapper의 경로에서 classpath란 프로젝트의 src/main/resources 까지의 경로를 의미합니다.

경로에 적혀있듯이 폴더 아래에 mappers라는 폴더를 생성후 DAO파일과 매핑될 Mapper.xml을 생성합니다.

생성 예시는 아래와 같습니다.

Mapper.xml의 예시

02)

Mapper 파일을 생성 하면 처음 코드는 

<?xml version="1.0" encoding="UTF-8"?>

위의 코드 한줄이 끝입니다.

이제 바로 다음에 이 문서의 형식이 mybatis의 형식을 따른다는 코드를 작성합니다. 코드 예시는 아래와 같습니다.

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 

03)

DAO와 매핑을 하기위해서는 먼저 <mapper> 태그를 열고 namespace 속성을 지정합니다.

namespace는 연동하게될 DAO 파일의 경로를 입력합니다.

이때 체크할것은 이제부터 연동하게 될 파일은 기존에 사용하던 class파일이 아니라는 것입니다.

이제부터 데이터베이스와 연결될 DAO는 Interface 파일을 사용합니다.

코드 예시는 아래와 같습니다.

04)

mapper 태그에서는 <insert>,<update>,<delete>,<select> 태그가 사용 될 수 있습니다.

원래 DAO에서 사용했던 쿼리문은 이제 위의 네가지 태그에 들어가게 될 것이고 이때에 쿼리문과 태그의 종류를 맞춰서 작성하면 됩니다. 이후에 각각의 태그에 id를 메서드의 이름과 일치시키는 것으로 매핑을 할 수 있습니다.

코드 예시는 아래와 같습니다.

 이때 쿼리에서 특정한 값을 찾거나 조건을 걸때에 기존의 DAO에선 ? 를 남겨두고 사용했지만 이제부터는 #{} 을 사용하고 괄호 안에는 파라미터의 이름을 입력하면 스프링에서 매핑하여 사용할 수 있습니다.

아래의 이미지에서 밑줄친 부분을 확인할 수 있습니다.

 

그리고 파라미터를 이용하기 위해서는 파라미터의 자료형이 무엇인지를 명시해야 하는데 이때 사용하는 속성은 parameterType 입니다. Integer, String, Double 등의 자료형을 값으로 입력할 수 있으며, DTO와 같은 자료형의 경우에는 해당 파일의 경로를 입력하여 사용할 수 있습니다. 아래의 이미지에서 밑줄친 부분을 확인할 수 있습니다.

++ 여기서 파라미터의 자료형은 DTO로 되어있는데 입력되는 파라미터명은 id, pw, name, email로 되어있는것이 의아하다 생각 될 수 있습니다. 이 경우에는 스프링에서 DTO 안에 있는 id, pw, name, email을 자동으로 매핑시키는 것입니다.

 

 select에서는 반환받는 값의 자료형도 지정할 수 있습니다. 이때 사용하는 속성은 resultType이며 이것도 위와같이 Integer, Double, Boolean 등이 사용가능하며, DTO또한 경로를 입력하여 사용이 가능합니다.

단 insert, update, delete의 반환값은 성공 여부에 따라 int형으로 고정되어 있기 때문에 resultType 사용이 불가능 합니다.

코드의 예시는 아래와 같습니다.

++ 여기서는 id 라는 이름의 파라미터를 필요로 하는데 parameterType이 지정되어 있지 않습니다. 이 것도 상당히 이상하다 생각될 수 있는데 String, Integer, Double 등의 자료형일 때에는 입력을 하지 않아도 스프링에서 자동으로 매핑해줍니다. 매핑이 안되는 경우가 발생한다면 그때 parameterType를 지정하면 됩니다.

 

※ 파라미터를 필요로 할때, 파라미터의 이름과 데이터베이스의 컬명이 같아야 스프링에서 자동으로 매핑하여 입력해줍니다. 이게 다르다면 직접 값을 매핑하는 과정이 필요한데 이는 추후에 공부해보겠습니다.