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를 통한 데이터 관리.

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

 

 

 

 

 

 

'Spring Boot & MySQL' 카테고리의 다른 글

1.9. 확장과 개선 방향  (0) 2024.12.26
1.10. 결론  (0) 2024.12.25
1.7. 자주 발생하는 문제와 해결 방법  (0) 2024.12.25
1.6. 데이터 타입 변환과 오류 처리  (0) 2024.12.25
1.5. REST API와 연동  (1) 2024.12.22