데이터베이스 연동에 필요한 부분
테이블은 먼저 등록되어있어야함! 프로젝트에 맞게 테이블 작성 후 아레 repository 로직 참고 하여 작성
jdbc 주석 밑에 라이브러리 추가
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.1'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'spring'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
//jdbc
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.mysql:mysql-connector-j'
}
tasks.named('test') {
useJUnitPlatform()
}
application.properties에 db정보 추가
spring.application.name=mvc
logging.level.spring.mvc.controller=TRACE
# MySQL Database Configuration
spring.datasource.url=jdbc:mysql://woongjin-project.cr7vyj7mlhft.ap-northeast-2.rds.amazonaws.com/project_3
spring.datasource.username=project_3
spring.datasource.password=project_3
#spring.datasource.url=jdbc:mysql://localhost:3306/project_3
#spring.datasource.username=root
#spring.datasource.password=12341234
# HikariCP Configuration
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.pool-name=HikariPool
# Spring SQL 로그 관련
logging.level.org.springframework.jdbc.core=DEBUG
logging.level.org.springframework.jdbc.datasource=DEBUG
logging.level.org.springframework.jdbc.datasource.DataSourceTransactionManager=DEBUG
변경 전 repository
package spring.mvc.repository;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;
import spring.mvc.domain.User;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@Repository
//@Primary
public class UserRepositoryImpl implements UserRepository{
private static final ConcurrentHashMap<Long, User> userMap = new ConcurrentHashMap<>();
private static Long userIndex = 1L;
public static void init() {
userMap.clear();
}
@Override
public User save(User user) {
user.setUserIdx(userIndex++);
userMap.put(user.getUserIdx(), user);
return user;
}
@Override
public Optional<User> findByUserIdx(Long userIdx) {
return Optional.ofNullable(userMap.get(userIdx));
}
@Override
public Optional<User> findByUserId(String userId) {
return userMap.values().stream().filter(user -> user.getUserId().equals(userId)).findAny();
}
@Override
public List<User> findByUserName(String userName) {
return userMap.values().stream().filter(user -> user.getUserName().equals(userName)).collect(Collectors.toList());
}
@Override
public List<User> findAll() {
return new ArrayList<>(userMap.values());
}
@Override
public Optional<User> update(Long userIdx, User updatedUser) {
if(userMap.containsKey(userIdx)) {
updatedUser.setUserIdx(userIdx);
userMap.put(userIdx, updatedUser);
return Optional.of(updatedUser);
}
return Optional.empty();
}
@Override
public boolean delete(Long userIdx) {
return userMap.remove(userIdx) != null;
}
}
변경 후 repository
package spring.mvc.repository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import spring.mvc.domain.User;
import java.util.List;
import java.util.Optional;
@Repository
@Primary
public class JdbcUserRepository implements UserRepository {
private final JdbcTemplate jdbcTemplate;
@Autowired
public JdbcUserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public User save(User user) {
String sql = "INSERT INTO user (userId, userName) VALUES (?, ?)";
jdbcTemplate.update(sql, user.getUserId(), user.getUserName());
return user;
}
@Override
public Optional<User> findByUserIdx(Long userIdx) {
String sql = "SELECT * FROM user WHERE userIdx = ?";
return jdbcTemplate.query(sql, rs -> {
if (rs.next()) {
User user = new User();
user.setUserIdx(rs.getLong("userIdx"));
user.setUserId(rs.getString("userId"));
user.setUserName(rs.getString("userName"));
return Optional.of(user);
}
return Optional.empty();
}, userIdx);
}
@Override
public Optional<User> findByUserId(String userId) {
String sql = "SELECT * FROM user WHERE userId = ?";
return jdbcTemplate.query(sql, rs -> {
if (rs.next()) {
User user = new User();
user.setUserIdx(rs.getLong("userIdx"));
user.setUserId(rs.getString("userId"));
user.setUserName(rs.getString("userName"));
return Optional.of(user);
}
return Optional.empty();
}, userId);
}
@Override
public List<User> findByUserName(String userName) {
String sql = "SELECT * FROM user WHERE userName = ?";
return jdbcTemplate.query(sql, (rs, rowNum) -> {
User user = new User();
user.setUserIdx(rs.getLong("userIdx"));
user.setUserId(rs.getString("userId"));
user.setUserName(rs.getString("userName"));
return user;
}, userName);
}
@Override
public List<User> findAll() {
String sql = "SELECT * FROM user";
return jdbcTemplate.query(sql, (rs, rowNum) -> {
User user = new User();
user.setUserIdx(rs.getLong("userIdx"));
user.setUserId(rs.getString("userId"));
user.setUserName(rs.getString("userName"));
return user;
});
}
@Override
public Optional<User> update(Long userIdx, User updatedUser) {
String sql = "UPDATE user SET userName = ?, email = ? WHERE userIdx = ?";
int rowsUpdated = jdbcTemplate.update(sql, updatedUser.getUserName(), userIdx);
return rowsUpdated > 0 ? findByUserIdx(userIdx) : Optional.empty();
}
@Override
public boolean delete(Long userIdx) {
String sql = "DELETE FROM user WHERE userIdx = ?";
int rowsDeleted = jdbcTemplate.update(sql, userIdx);
return rowsDeleted > 0;
}
}
Last updated