스프링부트

[DB] [Spring] Spring에서 Database 사용하기

민석삼 2025. 3. 5. 10:51

스프링 부트가 데이터베이스(MySQL)에 접근할 수 있도록 해주는 방법

프로젝트파일/src/main/resources에 application.yml이라는 파일을 생성

해당 파일 내에 스프링부트가 데이터베이스에 붙을 수 있게 설정해 줄 것이다.

spring:
	datasource:
            url: "jdbc:mysql://localhost/library"
            username: "root"
            password: ""
            driver-class-name: com.mysql.cj.jdbc.Driver

 

 

  • spring:
    • spring boot의 설정을 정의하는 루트 키
  • datasource:
    • 스프링부트가 어떤 데이터를 가리키게 할 것인지 설정하는 부분
    • 데이터베이스 연결과 관련된 설정
    • SpringBoot에서 JDBC(Java Database Connectivity)를 이용해 DB에 접근할 때 필요한 정보를 설정
  • url: "jdbc:mysql://localhost/library"
    • Spring이 붙을 데이터베이스의 주소(URL)을 지정
    • jdbc(java-database-connector) -> 자바와 데이터베이스를 연결해주는 프로그램을 사용할 건데,
    • mysql:// -> 이때 데이터베이스 종류는 mysql이고
    • localhost -> 현재 로컬 컴퓨터에서 실행 중인 MySQL 서버를 연결할거야
    • /library -> 연결할 데이터베이스 이름은 library야
    • 즉, 로컬 MySQL 서버에 있는 library 데이터베이스에 연결하는 설정
  • username, password
    • 데이터베이스에 접속할 때 사용할 사용자 계정과 비밀번호
    • MySQL에서 본인이 사용하는 username과 password를 설정하면 됨
  • driver-class-name: com.mysql.cj.jdbc.Driver
    • 데이터베이스에 접근할 때 사용할 프로그램 지정
    • JDBC 드라이버 클래스의 이름을 설정
    • com.mysql.cj.jdbc.Driver -> MySQL 8.x 버전 이상에서 사용하는 공식 JDBC 드라이버

POST API를 사용했을 때, 데이터를 메모리에 저장하지 않고 MySQL에 저장하도록 해주자

 

controller 클래스에 JdbcTemplate을 선언해준다.

jdbcTemplate을 사용해서 데이터베이스에 접근할 수 있는 것

JdbcTemplate을 이용해서 SQL을 날릴 수 있음

private final JdbcTemplate jdbcTemplate;

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

JdbcTemplate 선언 및 생성자 생성

생성자를 만들어두면, jdbcTemplate이 자동으로 파라미터를 통해 들어와서 설정된다.

new UserController(new JdbcTemplate(...))이런 식으로 우리가 직접 JdbcTemplate을 넣어주지 않아도, 스프링이 자동으로 jdbcTemplate을 넣어줌

 

유저 정보를 저장하고 조회하는 API로 실습

 

PostAPI (저장)

    @PostMapping("/user") // POST /user
    public void saveUser(@RequestBody UserCreateRequest request) {
        String sql = "insert into user (name, age) values (?, ?)";
        jdbcTemplate.update(sql, request.getName(), request.getAge());
    }

문자열 변수 sql에 MySQL에서 사용할 명령어를 저장. 이때 값을 '?'로 처리하면, jdbcTemplate의 함수를 사용할 때 매개변수로 값을 넣어줄 수 있음.

 

jdbcTemplate.update(...)는 INSERT, UPDATE, DELETE 쿼리에 사용할 수 있다.

여기서 update는 UPDATE SQL을 의미하는 게 아니라, 데이터의 변경이 일어난다는 것을 의미하기 때문에, 생성, 수정, ㅅ가제 쿼리에 모두 사용할 수 있따.

첫 파라미터로 sql을 받고, '?'를 대신할 값을 차례로 넣어주면 됨.

 

GET API (조회)

@GetMapping("/user")
    public List<UserResponse> getUsers() {
        String sql = "select * from user";
        return jdbcTemplate.query(sql, new RowMapper<UserResponse>() {
        	@Override
            public UserResponse mapRow(ResultSet rs, int rowNum) throws SQLException {
                long id = rs.getLong("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                return new UserResponse(id, name, age);
        });
    }

한 줄 씩..

        String sql = "select * from user";

String 변수 sql에 user 테이블의 정보를 모두 가져오는 SQL을 저장

        return jdbcTemplate.query(sql, new RowMapper<UserResponse>() {

jdbcTemplate.query의 반환 결과(유저 정보 리스트)를 GET API 함수의 결과값으로 리턴해줄 것

jdbcTemplate.query에, 매개변수로 명령어로 사용할 sql과 RowMapper 클래스를 넣어줌

        	@Override
            public UserResponse mapRow(ResultSet rs, int rowNum) throws SQLException {

RowMapper클래스의 mapRow함수를 오버라이드하여 작성해줄 것.

mapRow의 역할은, jdbcTepmlate의 query가, 들어온 sql을 수행한 결과로 나오는 유저 정보를 우리가 선언한 타입인 UserResponse(유저의 id, name, age 정보를 포함하는 응답 객체)로 바꿔주는 역할을 수행하는 함수이다.

            public UserResponse mapRow(ResultSet rs, int rowNum) throws SQLException {
                long id = rs.getLong("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                return new UserResponse(id, name, age);
        });

mapRow의 매개변수인 ResultSet: 주어진 sql(select * from user)를 수행해서 나온 결과

ResultSet에서 getLong/String/Int("필드 이름") 함수를 통해 각 값을 가져오고 새로운 변수에 각 값을 저장하여, 받아온 값들을 넣고 새로운 UserResponse를 생성하여 return

더보기

UserResponse 클래스

package com.group.libraryapp.dto.user.response;

import com.group.libraryapp.domain.user.User;

public class UserResponse {

    private long id;
    private String name;
    private Integer age;

    public UserResponse(long id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}

복잡한 코드니까.. 정리

RowMapper는 쿼리의 결과(ResultSet)를 받아 원하는 객체를 반환해주는 역할

ResultSet에 getType("필드 이름")을 통해 실제 값을 가져오고,

UserResponse 생성자에 해당 값들을 넣어,

최종적으로 모든 유저 정보를 하나씩 UserResponse로 바꾸어 리턴하면, getUsers함수의 반환값인 UserResponse 리스트가 나옴

'스프링부트' 카테고리의 다른 글

[SpringBoot] Spring Container  (0) 2025.03.09
[SpringBoot] Layered Architecture: Controller, Service, Repository  (0) 2025.03.08
JSON 문법  (0) 2025.03.04
HTTP, API  (0) 2025.03.02
서버, 네트워크의 기본 개념  (0) 2025.02.27