Programming/Spring

Spring (4) - MySQL과 연결하기

코딩하는 포메라니안 2022. 4. 25. 18:35

0. DB 관련 library 불러오기

아래 사이트에서 코드를 복사해서 설정파일(application.xml 또는 pom.xml)에 붙여넣고 저장한다.

 

1) MySQL이 제공하는 connector

https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.28

 

 

2) jdbc

https://mvnrepository.com/artifact/org.springframework/spring-jdbc/5.3.19

 

 

 

1. DB 테이블과 DTO(데이터 객체) 만들기

 

Workbench를 열어, 이름과 나이 정보를 담을 테이블을 만든다.

DB에서 값을 읽어와서 출력하는 기능 구현이 목표라서 값을 미리 넣어준다.

create database testdb;
use testdb;

drop table if exists data;

create table data(
    name varchar(40) NOT NULL PRIMARY KEY,
    age int NOT NULL
);

--test용 = 데이터가 잘 들어갔는지 확인
insert into data values("스프링", 20);
select * from data;

 

값을 담을 DTO는 사용자라는 의미로 User라고 지었으며, 코드는 아래와 같다.

//User.java
package com.test.di1.dto;

public class User {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}
}

 

 

 

2. DB의 값 받아오기

DB에서 테이블의 내용을 읽어와서 User에 담은 후, 리스트에 넣어 반환하는 코드이다.

//TestDaoImpl.java
package com.test.di1.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.test.di1.dto.User;

@Repository
public class TestDaoImpl implements TestDao {

	@Autowired
	private DataSource dataSource; //DB객체 받아오기

	@Override
	public LinkedList<User> getUserInfo() throws SQLException {
		LinkedList<User> users = new LinkedList<>();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			conn = dataSource.getConnection();
			pstmt = conn.prepareStatement("select * from data");
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				User user = new User();
				user.setName(rs.getString("name"));
				user.setAge(rs.getInt("age"));
				users.add(user);
			}
		}
		finally {
			rs.close();
			pstmt.close();
			conn.close();
		}
		return users;
	}
}

 

 

 

3. DB와 연결하기

 

방법1. XML

Application.xml을 만들어 사용했으며, 설정 파일과 관련된 자세한 내용은

2022.04.23 - [웹프로그래밍/Spring] - Spring (3) - Container에 객체(Bean) 설정하기3 : Annotation

 이 글을 참고하면 된다.

*xml문법에 따라 주소에서 &는 &amp;로 작성해야 한다.

<!-- application.xml -->
<?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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<context:component-scan base-package="com.test.di1"></context:component-scan>

	<bean id="ds" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=UTC&amp;useUniCode=yes&amp;characterEncoding=UTF-8"/>
		<property name="username" value="dbId"/>
		<property name="password" value="dbPw"/>
	</bean>
</beans>

 

 

방법2. Java

ApplicationConfig.java를 만들어 사용했으며, 설정 파일과 관련된 자세한 내용은

2022.04.23 - [웹프로그래밍/Spring] - Spring (3) - Container에 객체(Bean) 설정하기4 : Java

이 글을 참고하면 된다.

 

//ApplicationConfig.java
package com.test.di1.config;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;

@Configuration
@ComponentScan("com.test.di1")
public class ApplicationConfig {
	
	@Bean //객체 등록
	public DataSource dataSource() {
		SimpleDriverDataSource sdds = new SimpleDriverDataSource();
		sdds.setDriverClass(com.mysql.cj.jdbc.Driver.class);
		sdds.setUrl("jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8");
		sdds.setUsername("dbId");
		sdds.setPassword("dbPw");
		return sdds;
	}
}

 

 

방법3. DB Connection Pool

2022.04.27 - [웹프로그래밍/Spring] - Spring (5) - Spring MVC 프로젝트 생성하기

위의 발행글에서 MVC 프로젝트를 생성한 후, src/main/webapp 에 META-INF/context.xml을 생성한다.

 

 

 

1) context.xml에 Connection Pool을 생성

connection pool 자원의 이름은" jdbc/test"이다.

 

마지막 줄에 <WatchedResource>태그는 이제 web.xml을 보러가라는 뜻이다.

 

원래 context.xml이 없었을 땐, 어떻게 web.xml을 볼 수 있었을까?

Server에 있는 server.xml에 의해  META-INF 폴더를 먼저 보는데, 폴더가 없으면 web.xml을 보도록 되어있다.

 

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource" 
	maxTotal="100" maxIdle="30" maxWaitMillis="10000" 
	username="dbId" password="dbPw" driverClassName="com.mysql.cj.jdbc.Driver" 
	url="jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=UTC&amp;useUniCode=yes&amp;characterEncoding=UTF-8"/>
	
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

 

2) root-context.xml에서 DB 등록하기

앞서 만들어 놓은 pool을 우리가 만든 웹어플리케이션에 등록해야 한다.

<beans>태그 사이에 아래 코드를 넣어준다.

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/test"></property>
</bean>