이 글은 코드로 배우는 스프링 웹 프로젝트(남가람북스, 구멍가게 코딩단)을 읽고 공부한 내용을 바탕으로 정리한 글입니다.
책에서는 oracle을 쓰고 있는데, M1에서는 오라클을 도커 위에 올려서 사용해야해서,, 저는 MySQL을 사용하겠습니다..
1. MySQL 설치
https://dev.mysql.com/downloads/mysql/ 에 들어가서 MySQL을 다운로드해줍니다.
2. pom.xml
수정
pom.xml
에 MySQL 관련 dependency를 추가해줍니다.
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
3. JDBC 연결
(참고: https://yoon990.tistory.com/58)
JDBC(Java Database Connectivity)란 자바와 DB를 연결해주는 표준 API입니다. 데이터베이스를 자료를 쿼리하거나 업데이트 하는 방법을 제공합니다.
전체적인 구조는 아래와 같이 DBMS의 종류에 관계없이 제공되는 JDBC API와 DBMS에 따라 다르게 다운로드해줘야 하는 JDBC Driver 두 단계를 거쳐서 DBMS에 연결합니다.
JDBC API는 JDK에 이미 포함이 되어있기 때문에 따로 다운로드하거나 설치할 필요는 없습니다. JDBC Driver는 DBMS에 따라 다르게 다운로드 받아주어야 하는데 저는 위의 maven에서 추가해주었기 때문에 따로 다운로드 하지 않았습니다.(mysql-connector-java
)
테스트 코드를 작성하여 JDBC 연결을 확인해보겠습니다.
import lombok.extern.log4j.Log4j;
import org.junit.Test;
import static org.junit.Assert.fail;
import java.sql.Connection;
import java.sql.DriverManager;
@Log4j
public class JDBCTests {
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testConnection() {
try(Connection connection =
DriverManager.getConnection(
"jdbc:mysql://localhost:3306/SpringWeb?serverTimezone=Asia/Seoul",
"root",
"P@ssw0rd")){
log.info(connection);
Statement stmt = connection.createStatement();
String sql = "select * from tbl_board";
ResultSet resultSet = stmt.executeQuery(sql);
while(resultSet.next()) {
System.out.println(resultSet.getInt(1) + "\t" + resultSet.getString(2));
}
} catch (Exception e) {
fail(e.getMessage());
}
}
}
DriverManger.getConnection()
으로 드라이버를 로드하고 Connection 객체를 얻습니다.connection.createStatement()
로Statement
객체를 생성합니다.statement.executeQuery()
로 sql문을 날립니다.executeQuery()
의 리턴은ResultSet
타입입니다.
정상적으로 연결되고 있음을 확인할 수 있습니다.
4. 커넥션 풀 - HikariCP
일반적으로 여러 명의 사용자를 동시에 처리해야 하는 웹 애플리케이션의 경우 데이터 베이스 연결을 이용할 때는 커넥션 풀(Connection Pool)을 이용합니다.
일반적인 데이터 연동은 웹 어플리케이션이 필요할 때마다 데이터베이스에 연결해야 작업하는 방식인데, 이렇게 할 경우, 데이터베이스 연결 시간이 많이 걸립니다. (동시에 많은 사용자가 매번 데이터베이스와 커넥션을 맺고 푸는 작업은 매우 비효율적입니다.) 따라서 미리 데이터베이스와 연결시킨 상태를 유지하는 기술인 커넥션 풀을 이용합니다. 따라서 웹 어플리케이션이 실행됨과 동시에 연동할 데이터베이스와의 연결을 미리 설정해둡니다.
커넥션 풀은 여러 종류가 있고, spring-jdbc
라이브러리를 이용하는 방식도 있지만, 최근에 다른 커넥션풀 관리 프로임워크보다 빠른 성능을 보여 스프링부트 2.0에서 기본으로 채택하고 있는 HikariCP를 사용하도록 하겠습니다.
1. pom.xml
을 수정해서 HikariCP
를 추가합니다.
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.7.4</version>
</dependency>
2. applicationContext.xml에서 설정은 직접 <bean> 태그를 정의해서 작성합니다.
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/SpringWeb"></property>
<property name="username" value="root"></property>
<property name="password" value="P@ssw0rd"></property>
</bean>
<!--HikariCP Configuration-->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
destroy-method="close">
<constructor-arg ref="hikariConfig" />
</bean>
아래와 같이 스프링이 시작되면 id가 dataSource
인 객체가 처리됩니다.
3. DataSourceTests
테스트 코드
import static org.junit.Assert.fail;
import lombok.Data;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import javax.sql.DataSource;
import java.sql.Connection;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring-config/applicationContext.xml")
@Log4j
public class DataSourceTests {
@Setter(onMethod_ = { @Autowired })
private DataSource dataSource;
@Test
public void testConnection() {
try (Connection con = dataSource.getConnection()) {
log.info(con);
} catch (Exception e) {
fail(e.getMessage());
}
}
}
코드를 실행해보면 HikariCP가 시작되고, 종료되는 로그를 확인할 수 있습니다!
'Java > Spring' 카테고리의 다른 글
[Spring MVC] Controller (0) | 2023.01.03 |
---|---|
[Spring MVC] 기본 구조 (0) | 2023.01.02 |
[Spring] MyBatis와 스프링 연동 (+log4jdbc) (0) | 2023.01.02 |
[Spring] 의존성 주입(DI) (1) | 2022.12.30 |
[Spring MVC] IntelliJ에서 Project 생성하기 (0) | 2022.12.29 |
댓글