I T H

[스프링프로젝트연습 5] 스프링 프로젝트 구현 - DB연동 본문

Spring Basic

[스프링프로젝트연습 5] 스프링 프로젝트 구현 - DB연동

thdev 2024. 1. 22. 14:28
  •  데이터베이스 (mariadb)를 연동하기 위한 라이브러리 설정 및 컨트롤러 호출을 통한 데이터 쿼리 조회를 진행함으로써 정상 연동을 테스트한다.

해당 문서에서는 Java Config 설정을 통한 컨트롤러 호출까지 테스트를 한 이후 데이터베이스 연동을 통해 데이터 조회를 테스트하는 부분까지 설명함.

 

[데이터베이스 연동 라이브러리 적용]

1. pom.xml 파일 수정

- 데이터베이스 (Mariadb- mysql) 연동을 위한 라이브러리를 다운로드하기 위한 태그를 적용한다.

- 커넥션 라이브러리 및 커넥션 풀 라이브러리를 적용

 

<!-- mysql -->
		<dependency>
		    <groupId>mysql</groupId>
		    <artifactId>mysql-connector-java</artifactId>
		    <version>8.0.28</version>
		</dependency>
		
		<!-- connection pool -->
		<dependency>
		    <groupId>com.zaxxer</groupId>
		    <artifactId>HikariCP</artifactId>
		    <version>2.7.4</version>
		</dependency>

 

라이브러리 참고 사이트
Mysql-connector-java https://mvnrepository.com/artifact/mysql/mysql-connector-java
HikariCP https://mvnrepository.com/artifact/com.zaxxer/HikariCP

 

  • Connection Pool(커넥션 풀)

- 커넥션 풀은 데이터베이스와 연결된 커넥션을 미리 만들어 놓고 이를 pool로 관리하는 것이다.

즉, 필요할 때마다 커넥션 풀의 커넥션을 이용하고 반환하는 기법이다. 이처럼 미리 만들어 놓은 커넥션을 이용하면 Connection에 필요한 비용을 줄일 수 있다. 따라서 DB에 빠르게 접속할 수 있다.

 

  • HikariCP

- HikariCP는 가벼운 용량과 빠른 속도를 가지느 JDBC의 커넥션 풀 프레임워크이다.

     * JDBC: 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API

 

 

2. RootConfig 클래스 수정

- 앞서 4장에서 java config를 통해 생성한 클래스 파일 중 servlet-context.xml 파일을 대체하는 자바 클래스인 RootConfig 클래스 파일을 수정한다.

- 해당 클래스에는 데이터베이스 접속을 위한 DataSource 를 설정한다.

 

package kr.co.values.init;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

/**
 * @Configuration 스프링 설정 파일로서 스프링 컨테이너를 생성하게 만드는 어노테이션 
 * 해당 어노테이션이 붙은 클래스는 Config 파일이 되어 xml 파일과 같은 기능을 한다. 
 * 
 * Bean 객체를 설정하는 파일
 */
@Configuration
@ComponentScan(basePackages= {"kr.co.values"})
@MapperScan(basePackages= {"kr.co.values.persistence"})
public class RootConfig {
	
	@Bean
	public DataSource dataSource() {
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName("com.mysql.jdbc.Driver");
		hikariConfig.setJdbcUrl("jdbc:mysql://...");
		hikariConfig.setUsername("root");
		hikariConfig.setPassword("");
	
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
	
		return dataSource;
	}
	
}

 

3. MYbatis 설정

- SQL 매핑 프레임워크인 Mybatis 설정을 위한 라이브러리 적용

- pom.xml파일에 아래 dependency를 추가하여 설정

- Mybatis와 Mybatis-spring을 사용하기 위해 라이브러리 총 4개를 설정해야됨.

 

  • Spring-jdbc / spring-tx : 스프링에서 DB 처리와 트랜잭션 처리
  • mybatis /mybatis-spring : Mybatis와 스프링 연동용 라이브러리

 

라이브러리 참고 사이트
mybatis https://mvnrepository.com/artifact/org.mybatis/mybatis
mybatis-spring https://mvnrepository.com/artifact/org.mybatis/mybatis-spring
spring-tx https://mvnrepository.com/artifact/org.springframework/spring-tx
spring-jdbc https://mvnrepository.com/artifact/org.springframework/spring-jdbc

 

4. RootConfig 클래스 수정

- SQLSessionFactory 설정 : 설정된 DataSource를 이용하여 SQLSession을 만들어내고 이를 통해 커넥션을 생성하거나 SQL을 전달하고 결과를 리턴함.

package kr.co.values.init;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

/**
 * @Configuration 스프링 설정 파일로서 스프링 컨테이너를 생성하게 만드는 어노테이션 
 * 해당 어노테이션이 붙은 클래스는 Config 파일이 되어 xml 파일과 같은 기능을 한다. 
 * 
 * Bean 객체를 설정하는 파일
 */
@Configuration
@ComponentScan(basePackages= {"kr.co.values"})
@MapperScan(basePackages= {"kr.co.values.persistence"})
public class RootConfig {
	
	@Bean
	public DataSource dataSource() {
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName("com.mysql.jdbc.Driver");
		hikariConfig.setJdbcUrl("jdbc:mysql://...");
		hikariConfig.setUsername("root");
		hikariConfig.setPassword("");
	
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
	
		return dataSource;
	}
	
	@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception {
		SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
		sqlSessionFactory.setDataSource(dataSource());
		return (SqlSessionFactory) sqlSessionFactory.getObject();
	}
}

 

5. Mapper 인터페이스 및 쿼리문 작성

- kr.co.values.persistence 패키지를 생성 후 해당 패키지 아래에 Mapper 인터페이스 및 쿼리문 작성을 위한 xml 파일을 생성한다.

- 앞서 작성한 컨트롤러 클래스의 "/main/home.do"로 접속하는 경우 데이터베이스 연동을 통해 DB 현재 시간을 시스템 로그에 출력해보는 것으로 연동 테스트를 진행한다.

- 어노테이션을 통한 쿼리 매핑 방법 xml 파일을 통한 쿼리 매핑 방법 두가지에 대해 모두 테스트를 진행한다.

 

 

ㄱ. @Select 어노테이션을 활용한 방법

 

  • Mapper 인터페이스 생성

- @Select 어노테이션을 통해 xml 파일 없이 쿼리를 메서드에 바로 적용

- 간단한 쿼리 구문의 경우에는 해당 방법을 이용하여 사용해도 됨.

package kr.co.values.persistence;

import org.apache.ibatis.annotations.Select;

public interface MainMapper {
	@Select("SELECT NOW()")
	public String getTime();
}

 

  • 컨트롤러 클래스 수정

- 매퍼 인터페이스 호출을 위한 코드 부분 추가

package kr.co.values.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import kr.co.values.persistence.MainMapper;

@Controller
public class MainController {
	
	@Autowired
	private MainMapper mainMapper;
	
	@RequestMapping("/main/home.do")
	public String home() {
		
		String test = mainMapper.getTime();
		System.out.println("test: " + test);
		
		return "main/home";
	}
}

 

ㄴ. xml 파일을 활용한 쿼리 조회 방법

  • Mapper.xml 파일 생성

- persistence 패키지 아래에 MainMapper.xml 파일을 생성한 후 아래와 같이 쿼리 메서드 1개를 추가함.

- 이후 컨트롤러 및 매퍼 인터페이스도 내용을 수정하여 준다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="kr.co.values.persistence.MainMapper">

	<select id="getTime2" resultType="string">
		SELECT NOW()
	</select>

</mapper>

 

  • 컨트롤러 클래스 수정
package kr.co.values.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import kr.co.values.persistence.MainMapper;

@Controller
public class MainController {
	
	@Autowired
	private MainMapper mainMapper;
	
	@RequestMapping("/main/home.do")
	public String home() {
		
		//어노테이션을 이용하여 현재시간 출력
		String test = mainMapper.getTime();
		System.out.println("test: " + test);
		
		//xml 매퍼를 호출하여 현재시간 출력
		String test2 = mainMapper.getTime2();
		System.out.println("test2: " + test2);
		
		return "main/home";
	}
}

 

  • Mapper 인터페이스 수정
package kr.co.values.persistence;

import org.apache.ibatis.annotations.Select;

public interface MainMapper {
	// 어노테이션을 이용하여 현재시간 출력
	@Select("SELECT NOW()")
	public String getTime();
	
	// xml 매퍼를 호출하여 현재시간 출력
	public String getTime2();
}

 

[최종 폴더 구성 확인 - 백앤드]

 

 

http://localhost:8082/main/home.do 로 접속 시 시스템 로그 확인!