https://github.com/gihyeon6394/sample-spring-jdbc
java (spring) 에서 DB connection을 맺는 방법
https://github.com/gihyeon6394/sample-spring-jdbc
Last synced: 3 months ago
JSON representation
java (spring) 에서 DB connection을 맺는 방법
- Host: GitHub
- URL: https://github.com/gihyeon6394/sample-spring-jdbc
- Owner: gihyeon6394
- Created: 2023-11-28T03:14:30.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2024-01-05T02:47:19.000Z (over 1 year ago)
- Last Synced: 2025-01-14T03:42:56.351Z (4 months ago)
- Language: Java
- Size: 20.5 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
#### 개발환경
- Java 17
- Spring Boot 3.2
- Gradle 8.4
- MySQL 8.0.28
- lombok
- Spring Data JDBC 3.2.0
- Spring Data JPA 3.2.0## Java Web Application에서 DB 접근 방법
1. JDBC driver
2. Spring Data JDBC `org.springframework.jdbc.core.JdbcTemplate`
3. Spring Data JDBC `CRUDRepository`
4. Spring Data JPA `JpaRepository`### 1. JDBC driver
````bash
dependencies {
...
runtimeOnly 'com.mysql:mysql-connector-j'
}
````Java 예제
```java
import org.springframework.stereotype.Component;import java.sql.*;
import java.util.ArrayList;
import java.util.List;@Component
public class ConnectDB {public List getUserList() throws ClassNotFoundException, SQLException {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;List userDtoList = new ArrayList<>();
try {
// JDBC 드라이버 로딩
Class.forName("com.mysql.cj.jdbc.Driver");
// DB 연결 (가장 느린 부분, DB-WAS network delay)
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/example_jdbc?serverTimezone=Asia/Seoul", "root", "root");
// PreparedStatement 생성
statement = connection.prepareStatement("select id, name from user");
// 쿼리 실행
resultSet = statement.executeQuery();while (resultSet.next()) {
long id = resultSet.getLong("id");
String name = resultSet.getString("name");
UserDto userDto = new UserDto(id, name);
userDtoList.add(userDto);
}} catch (ClassNotFoundException e) {
System.out.println("드라이버 로딩 실패");
throw e;
} catch (SQLException e) {
System.out.println("SQL Error : "+ e.getMessage());
throw e;
} finally {
// 자원 반납
try {
resultSet.close();
} catch (Exception e) {
}
try {
statement.close();
} catch (Exception e) {
}
try {
connection.close();
} catch (Exception e) {
}
}
return userDtoList;
}}
````
#### 2. Spring Data JDBC `org.springframework.jdbc.core.JdbcTemplate`
````bash
dependencies {
...
runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
}
```````yaml
spring:
datasource: # JDBC DB 접속 정보
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/example_jdbc?serverTimezone=UTC&characterEncoding=UTF-8
username: root
password: root
```Java 예제
```java
import com.example.jdbc.dto.UserDto;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import java.util.List;
@Repository // 스프링 빈으로 등록
public class ConnectBySpringDataJdbc {private JdbcTemplate jdbcTemplate;
// Spring이 UserRepository 생성 시 JdbcTemplate을 주입
public ConnectBySpringDataJdbc(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}public List getUserList() {
return jdbcTemplate.query("select id, name from user"
, (rs, rowNum) -> new UserDto(rs.getLong("id"), rs.getString("name")));
}}
````### 3. Spring Data JDBC `org.springframework.data.repository.CrudRepository`
````bash
dependencies {
...
runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
}
````Java 예제
```java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.relational.core.mapping.Table;@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Table("User")
public class UserDto {private long id;
private String name;
}
``````java
import com.example.jdbc.dto.UserDto;
import org.springframework.data.repository.CrudRepository;public interface UserDtoRepository extends CrudRepository {
}
``````java
import com.example.jdbc.bySpringJdbc.UserDtoRepository;
import com.example.jdbc.dto.UserDto;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;@SpringBootTest
public class JdbcClientTest {@Autowired
private UserDtoRepository userDtoRepository;@Test
@DisplayName("Spring Data JDBCCrudRepository")
@Transactional
void db_connenct_with_spring_jdbc_crud_repository() {List userDtoList = (List) userDtoRepository.findAll();
userDtoList.stream().forEach(System.out::println);
assertThat(userDtoList.size(), is(notNullValue()));
assertThat(CollectionUtils.isEmpty(userDtoList), is(false));
}}
```
### 4. Spring Data JPA `org.springframework.data.jpa.repository.JpaRepository`
````bash
dependencies {
...
runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
```````yaml
spring:
datasource: # JDBC DB 접속 정보
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/example_jdbc?serverTimezone=UTC&characterEncoding=UTF-8
username: root
password: root
jpa: # JPA 설정
hibernate:
ddl-auto: validate
show-sql: true # 쿼리 보기
format-sql: true # 쿼리 포맷팅
use_sql_comments: true # 쿼리 주석
type:
descriptor:
sql: trace
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect # MySQL 버전에 맞는 dialect 설정```
Java 예제
```java
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
@Table(name = "User")
public class UserEntity {@Id
@GeneratedValue(strategy = jakarta.persistence.GenerationType.IDENTITY)
private long id;@Column(name = "name")
private String name;
}
``````java
import org.springframework.data.jpa.repository.JpaRepository;public interface UserEntityRepository extends JpaRepository {
}
``````java
import com.example.jdbc.bySpringJdbc.springDataJpa.UserEntity;
import com.example.jdbc.bySpringJdbc.springDataJpa.UserEntityRepository;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.CollectionUtils;import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;@SpringBootTest
public class JdbcClientTest {@Autowired
private UserEntityRepository userRepository;@Test
@DisplayName("Spring Data JPAJpaRepository")
void db_connenct_with_spring_jpa_jpa_repository() {List userEntityList = userRepository.findAll();
userEntityList.stream().forEach(System.out::println);
assertThat(userEntityList.size(), is(notNullValue()));
assertThat(CollectionUtils.isEmpty(userEntityList), is(false));
}}
```