Spring Boot & MySQL

1.8. 전체 코드 예제

backend 따라쟁이 2024. 12. 25. 18:01

이제까지 배운 내용을 바탕으로, Spring Boot와 MySQL을 연동하여 데이터베이스 CRUD 작업과 RESTful API를 구현한 전체 코드를 정리하겠습니다. 이 코드는 실습 및 프로젝트 개발의 참고 자료로 사용할 수 있습니다.


8.1 프로젝트 구조

Spring Boot 프로젝트의 디렉토리 구조는 다음과 같습니다:

 

8.2 application.properties

MySQL과의 연결 설정과 기본 옵션을 추가합니다.

# MySQL 데이터베이스 연결 설정
spring.datasource.url=jdbc:mysql://localhost:3306/my_database
spring.datasource.username=app_user
spring.datasource.password=password123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# Hibernate 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

# UTF-8 설정 (한글 처리)
spring.datasource.hikari.connection-init-sql=SET NAMES utf8mb4

 

8.3 AppConfig.java

JdbcTemplate과 데이터 소스를 설정합니다.

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

@Configuration
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/my_database");
        dataSource.setUsername("app_user");
        dataSource.setPassword("password123");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

8.4 User.java

사용자 데이터를 나타내는 모델 클래스입니다.

package com.example.demo.model;

import java.time.LocalDateTime;

public class User {
    private Long id;
    private String name;
    private String email;
    private LocalDateTime createdAt;

    // Getter & Setter
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

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

    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }

    public LocalDateTime getCreatedAt() { return createdAt; }
    public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; }
}

 

8.5 UserRepository.java

데이터베이스와의 상호작용을 담당합니다.

package com.example.demo.repository;

import com.example.demo.model.User;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@Repository
public class UserRepository {

    private final JdbcTemplate jdbcTemplate;

    public UserRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public int addUser(String name, String email) {
        String sql = "INSERT INTO user (name, email) VALUES (?, ?)";
        return jdbcTemplate.update(sql, name, email);
    }

    public List<User> getAllUsers() {
        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, new RowMapper<User>() {
            @Override
            public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                User user = new User();
                user.setId(rs.getLong("id"));
                user.setName(rs.getString("name"));
                user.setEmail(rs.getString("email"));
                user.setCreatedAt(rs.getTimestamp("created_at").toLocalDateTime());
                return user;
            }
        });
    }

    public int updateUser(Long id, String name, String email) {
        String sql = "UPDATE user SET name = ?, email = ? WHERE id = ?";
        return jdbcTemplate.update(sql, name, email, id);
    }

    public int deleteUser(Long id) {
        String sql = "DELETE FROM user WHERE id = ?";
        return jdbcTemplate.update(sql, id);
    }
}

 

8.6 UserService.java

비즈니스 로직을 처리하는 서비스 계층입니다.

package com.example.demo.service;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public int addUser(String name, String email) {
        return userRepository.addUser(name, email);
    }

    public List<User> getAllUsers() {
        return userRepository.getAllUsers();
    }

    public int updateUser(Long id, String name, String email) {
        return userRepository.updateUser(id, name, email);
    }

    public int deleteUser(Long id) {
        return userRepository.deleteUser(id);
    }
}

 

8.7 UserController.java

RESTful API를 제공하는 컨트롤러 계층입니다.

package com.example.demo.controller;

import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getAllUsers().stream()
                .filter(user -> user.getId().equals(id))
                .findFirst()
                .orElse(null);
    }

    @PostMapping
    public String addUser(@RequestBody User user) {
        userService.addUser(user.getName(), user.getEmail());
        return "User added successfully";
    }

    @PutMapping("/{id}")
    public String updateUser(@PathVariable Long id, @RequestBody User user) {
        userService.updateUser(id, user.getName(), user.getEmail());
        return "User updated successfully";
    }

    @DeleteMapping("/{id}")
    public String deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
        return "User deleted successfully";
    }
}

 


결론

이 코드는 Spring Boot와 MySQL을 연동하여 데이터베이스 CRUD 작업과 RESTful API를 구현한 완전한 예제입니다. 다음과 같은 작업을 학습할 수 있습니다:

  1. 데이터베이스와 연결 설정.
  2. JdbcTemplate을 사용한 데이터 처리.
  3. RESTful API를 통한 데이터 관리.

이 예제를 참고하여 더 복잡한 비즈니스 로직과 기능을 구현해보세요.