우당탕탕 개발일지

[SpringBoot] 2. MySQL 연결하기 본문

Server

[SpringBoot] 2. MySQL 연결하기

devchop 2025. 1. 4. 22:47

Database 기본

mysql 에 접속한다. 터미널을 열고,

mysql -u root -p

사용가능한 명령어들을 알아보자.
아래 언어들은 DDL (Data Definition Language) 라고한다.

create database [name];  ##데이터베이스 생성
show databases; ##데이터베이스 목록보기
drop database [name]; ##데이터베이스 삭제
use [database-name]; ## 데이터베이스 접속

## 데이터베이스 안으로 들어왔음.
show tables; ##테이블 조회
create table [테이블 이름](
 [필드이름] [타입] [부가조건],
 ...
 primary key ([필드이름])
);
]

drop table [테이블이름]; ##테이블 제거

SQL 을 알아보자
CRUD (Create, Read, Update, Delete) : 특정데이터를 생성,조회,갱신,삭제하는 데이터 관리 관련된 명령어들이다.

insert into [테이블이름] (필드1,필드2,...) values (값1, 값2); ## 순서가 중요함 필드1-값1 이 매칭된다.

select * from [테이블이름]
select 필드1,필드2 from [테이블이름]
select * from [테이블이름] where 필드1 = 값1;
select * from 테이블 where 필드1 = 값1 and 필드2 != 값2;
select * from 테이블 where 필드1 = 값1 or 필드1 <= 값2;
select * from 테이블 where 필드1 between 값1  and 값2;  ##값1<=필드1 <=값2 인 조건만 찾음  
select * from 테이블 where 필드1 in (값1, 값2) ##값1,값2 에 포함되는 것만
select * from 테이블 where 필드1 not in (값1, 값2) ##값1,값2 에 포함되지 않는  것만 


## 조건이 없으면 모든 데이터의 값이 변경됨. 주의할것
update 테이블 set 필드1=값1, 필드2=값2 where 조건
update 테이블 set 가격 = 1500 where name = '사과';  ##사과를 1500원으로 변경

## 조건이 없으면 모든 데이터가 삭제됨. 주의할것
delete from 테이블 where 조건;
delete from 테이블 where 가격 =1500; 

Spring 에서 Database 사용하기

build.gradle에 다음 파일을 추가 및 sync

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'org.springframework:spring-jdbc:5.3.30' // Spring JDBC

main>resources>application.yaml 파일제작

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database_name
    username: your_username
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver

UserController에서 db에 접근하기 위해서는 jdbcTemplate을 사용한다. 컨트롤러 생성자에 jdbcTemplate을 넣으면 자동으로 들어와진다. 다음은 UserController 전문이다.

생성자로부터 jdbcTemplate을 가져와서 query, update 등의 함수를 호출하는 것을 볼 수 있다.

@RestController
public class UserController {

    private  final JdbcTemplate jdbcTemplate;

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

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

    @GetMapping("/user")
    public List<UserResponse> getUsers(){
       String sql = "select * from user";

       return jdbcTemplate.query(sql, (rs, rowNum) -> {
        long id = rs.getLong("id");
        String name = rs.getString("name");
        int age = rs.getInt("age");
        return new UserResponse(id,name,age);
        });      
    }

    @PutMapping("/user")
    public void updateUser(@RequestBody UserUpdateRequest request){
        String querySQL = "select * from user where id = ?";
        boolean isUserNotExist = jdbcTemplate.query(querySQL, (res,rowNum)->0,request.getId()).isEmpty(); 
        if(!isUserNotExist) throw new IllegalArgumentException("invalid id");

        String sql = "update user set name = ? where id= ?";
        jdbcTemplate.update(sql,request.getName(), request.getId());
    }

    @DeleteMapping("/user")
    public void deleteUser(@RequestParam String name){

        String querySQL = "select * from user where name = ?";
        boolean isUserNotExist = jdbcTemplate.query(querySQL, (res,rowNum)->0,name).isEmpty(); 
        if(!isUserNotExist) throw new IllegalArgumentException("invalid id");


        String sql = "delete from user where name = ?";
        jdbcTemplate.update(sql,name );
    }
}

 

getUsers() API에서, query를 이용해 모든 유저의 리스트를 가져오는 부분을 볼 수 있다. 반복적으로 돌면서 원하는 작업을 할 수 있고, 결과물은 List<> 형태로 반환한다. 위 코드에서는 람다식으로 적혀있다.

jdbcTemplate.query(sql, (rs, rowNum) -> {
        long id = rs.getLong("id");
        String name = rs.getString("name");
        int age = rs.getInt("age");
        return new UserResponse(id,name,age);

 

일반식으로 변경할 경우 아래처럼 된다.

 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);
        }
       });

 

다음엔 이 UserController를 3가지 파일로 분리하여 리팩토링 하는 방법을 알아보자.

https://journal-devchop.tistory.com/59

 

[SpringBoot] 스프링 컨테이너

리팩토링하기이전에 UserController 에서 유저생성, 조회, 수정,삭제 API를 구현하였다. 이것을 리팩토링 해보고, 스프링컨테이너에 대해 알아보자. 컨트롤러에서 하던 작업들은 다음 3개로 분리될것

journal-devchop.tistory.com