본문 바로가기
내생각들/개념정리

Spring Boot - Mybatis연결하기(Hikaricp)

by 코딩마스터^^ 2023. 3. 17.

DB 커넥션 풀(Connection pool)이란?

https://code-lab1.tistory.com/209

 

DB 커넥션 풀(Connection pool)이란? HikariCP란?

커넥션 비용 WAS(Web Application Server)와 데이터베이스 사이의 연결에는 많은 비용이 든다. MySQL 8.0을 기준으로 INSERT 문을 수행할 때 필요한 비용의 비율은 다음과 같다. 괄호 안의 숫자가 비율을 의

code-lab1.tistory.com

WAS(Web Application Server)와 데이터베이스 사이의 연결에는 많은 비용이 든다. 

이를 보완하기 위해서 커넥션풀을 사용한다.

 

커넥션 풀

데이터베이스와 연결된 커넥션을 미리 만들어 놓고 이를 pool로 관리하는 것이다. 즉, 필요할 때마다 커넥션 풀의 커넥션을 이용하고 반환하는 기법이다. 이처럼 미리 만들어 놓은 커넥션을 이용하면 Connection에 필요한 비용을 줄일 수 있다. 따라서 DB에 빠르게 접속할 수 있다.

 

또한 커넥션 풀을 사용하면 커넥션 수를 제한할 수 있어서 과도한 접속으로 인한 서버 자원 고갈을 방지할 수 있으며 DB 접속 모듈을 공통화해 DB 서버의 환경이 바뀔 경우 유지보수를 쉽게 할 수 있다.

 

나는 톰캣 WAS를 사용중이다.

HikariCP 무료이고 좋다고 한다.

빠르다고 하네요...

 

히카리씨피 지원하는 API사용하겠다.

 

커넥션 풀이란?

유저 요청이 들어올때마다 스레드가 하나씩 할당이 된다.

 

자바가 설치가 되어있고 그 위에 톰캣이 있다.

톰캣에서는 멀티 스레드를 관리해준다.

모든 사람에게 공평하게 서비스를 제공 해 준다.

 

http에는 JSP,Servlet을 사용한다.

화면을 html로 그렸다. 그러나 이제 프로젝트에서 React를 쓸 예정이다. - 클라이언트쪽 UI

사용자들이 UI에 쓰기를 하고 요청을 한다.

쓰는 요청localhost:3000

스프링 수업은 8000번을 사용 할 예정

3000번과 8000번과 통신을 한다.

그런데 CORS이슈가 있다.

 

CORS(Cross-Origin Resource Sharing)

웹 브라우저에서 보안 상의 이유로, 다른 출처(Origin)의 리소스에 접근하는 것을 제한하는 보안 정책입니다.

웹 브라우저는 보안상의 이유로, 한 출처(origin)의 리소스에만 접근할 수 있습니다. 출처는 프로토콜, 호스트, 포트 번호의 조합으로 구성되며, 예를 들어 http://example.com:80https://example.com:443은 서로 다른 출처로 간주됩니다.

따라서, 웹 브라우저에서 다른 출처의 리소스에 접근하려면, 해당 출처에서 CORS를 허용해야 합니다. CORS를 허용하는 출처는 다음과 같은 방법으로 지정할 수 있습니다.

  1. HTTP 응답 헤더를 설정하는 방법
  • 서버에서 Access-Control-Allow-Origin 헤더를 설정하여 다른 출처에서의 접근을 허용합니다.
  1. 프록시 서버를 사용하는 방법
  • 클라이언트에서 요청을 보낼 때 프록시 서버를 거쳐서 요청을 보내면, 프록시 서버는 요청을 받은 후 서버에서 다른 출처의 리소스에 접근한 후 클라이언트에 응답을 반환합니다. 이 방법은 서버에서 CORS를 설정하지 않아도 되는 장점이 있습니다.

CORS를 설정하지 않은 경우, 웹 브라우저에서는 다른 출처의 리소스에 접근하는 요청을 차단하게 됩니다. 이로 인해, 웹 애플리케이션에서 API 요청 등 다른 출처의 리소스에 접근해야 하는 경우에는 반드시 CORS를 설정해주어야 합니다.

 

 

useState->Dataset->JSON

첫번째 API는 stringify 두번째는 parse이다?

 

 

사람의 제약을 두지 않아서 놀이기구 5시간 기다린다...?

그래서 connection pool을 적정한 갯수로 관리를 한다.

사용자가 오면 즉시 오라클 서버에 요청한다.

데이터 베이스 서버에 아주 빠르게 접속 할 수 있다.

3초 안에 접속이 되어야한다.

지연되면 사과 안내 해야됨...

 

HikariCP란?

HikariCP는 가벼운 용량과 빠른 속도를 가지는 JDBC의 커넥션 풀 프레임워크이다. SpringBoot를 사용해 본 사람이라면 한 번쯤은 이름을 들어본 적이 있을 것이다. SpringBoot는 커넥션 풀 관리를 위해 HikariCP를 사용한다. 

 

내 프로젝트의 pom.xml에 우선 JDBC dependency를 추가해준다.

depedency 잘 등록되었다.

 

Maven Repository 에서 Hikaricp검색한다.

메이븐방식 코드 복사해서 pom.xml에 넣어준다.

 

mybatis넣어주기

오라클에 한글 깨짐 문제가 있기때문에 메이븐에서Orai18n파일을 다운받아준다. 

****의존성 주입으로 하지 않는다. 그럼 터진다.

webapp안에WEB-INF안에 lib파일을 만들고 거기에 넣어서

Build Path해준다.

DataConfiguration클래스 생성

package com.example.demo;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
 @Configuration
@PropertySource("classpath:/application.properties")
//@PropertySource("classpath:/application.yml")
//@MapperScan(basePackages = "com.example.demo.mapper")
public class DatabaseConfiguration {
private static final Logger logger = LogManager.getLogger(DatabaseConfiguration.class);
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariConfig hikariConfig() {
return new HikariConfig();
}
@Bean
public DataSource dataSource() {
DataSource dataSource = new HikariDataSource(hikariConfig());
logger.info("datasource : {}", dataSource);
return dataSource;
}
@Autowired
private ApplicationContext applicationContext;
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:/mapper/**/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

member.xml추가

<?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="com.example.demo">
<select id="getToday" resultType="string" parameterType="string">
SELECT to_char(sysdate, 'YYYY-MM-DD') FROM dual
</select>
<select id="login" parameterType="map" resultType="string">
select mem_name from member
<where>
<if test='mem_id!=null and mem_id.length()>0'>
AND mem_id = #{mem_id}
</if>
<if test='mem_pw!=null and mem_pw.length()>0'>
AND mem_pw = #{mem_pw}
</if>
</where>
</select>
<select id="memberList" parameterType="map" resultType="map">
select mem_id, mem_name from member
<where>
<if test='mem_id!=null and mem_id.length()>0'>
AND mem_id = #{mem_id}
</if>
</where>
</select>
</mapper>

 

 

이제 스프링 서버 돌리면 Hikaricp가 잘 뜬다.

 

댓글