데이터베이스 연동에 필요한 부분

테이블은 먼저 등록되어있어야함! 프로젝트에 맞게 테이블 작성 후 아레 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