티스토리 뷰

Backend/Spring

#13 Spring - MySQL 연동

RadderNepa 2023. 8. 16. 01:59

application.yml

- application.yml 설정 파일을 만들어 Spring 서버가 MySQL DB에 접근할 수 있도록 해보자

src/resources/application.yml

spring:
  datasource:
    url: "jdbc:mysql://localhost/library"
    username: "root"
    password: "1234"
    driver-class-name: com.mysql.cj.jdbc.Driver
==========================================================
datasource : Spring이 가리키는 DB
url : Spring이 붙을 DB 주소
username : 접속 계정 아이디
password : 접속 계정 비번
driver-class-name : DB에 접근할 때 사용할 프로그램

● CREATE TABLE USER

CREATE TABLE USER (
    ID BIGINT AUTO_INCREMENT,
    NAME VARCHAR(25),
    AGE INT,
    PRIMARY KEY(ID)
);

● POST API, GET API  변경

- 메모리를 사용하지말고 MySQL을 이용하도록 변경해보자

 

[기존]

@RestController
public class UserController {
    private final List<User> users = new ArrayList<User>();

    @PostMapping("/user")
    public void saveUser(@RequestBody UserCreateRequest request) {
        users.add(new User(request.getName(), request.getAge()));
    }
    
    @GetMapping("/user")
    public List<UserResponse> getUsers() {
        List<UserResponse> responses = new ArrayList<>();
        for (int i = 0; i < this.users.size(); i++) {
            responses.add(new UserResponse((i + 1), users.get(i)));
        }
        return responses;
    }
}

[변경]

- jdbcTemplate을 이용해 SQL을 날릴 수 있게 됐다.

- UserController의 생성자를 통해 jdbcTemplate을 parameter로 넣어주면 자동으로 들어온다. by Spring(자세한건 나중에)

 

1. POST API 참고사항

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

- jdbcTemplate.update의 update는 SQL의 UPDATE를 의미하는게 아니라 데이터의 변경을 의미한다.
- 그래서 INSERT, UPDATE, DELETE 쿼리에 모두 사용할 수 있다.

2. GET API 참고사항

jdbcTemplate.query(sql, RowMapper 구현 익명클래스)

- RowMapper는 쿼리의 결과를 받아 객체를 반환한다.

- ResultSet의 getType(“필드이름”)을 사용해 실제 값을 가져올 수 있다.

cf) 익명클래스 = 프로그램에서 일시적으로 사용되고 버려지는 객체

 

[최종]

@RestController
public class UserController {
    // JdbcTemplate를 이용해 DB에 접근한다.
    private final JdbcTemplate jdbcTemplate;

    // jdbcTemplate을 생성자에 직접 넣어주지 않아도 spring이 알아서 jdbcTemplate을 넣어준다.
    public UserController(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @PostMapping("/user")
    public void saveUser(@RequestBody UserCreateRequest request) {
        String sql = "INSERT INTO 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, new RowMapper<UserResponse>() {
            // mapRow : SELECT 쿼리를 통해 가져온 유저 데이터를 UserResponse로 바꿔주는 함수
            @Override
            public UserResponse mapRow(ResultSet rs, int rowNum) throws SQLException {
                // ResultSet = 결과
                long id = rs.getLong("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                return new UserResponse(id, name, age);
            }
        });
    }
}
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 UserResponse(long id, User user) {
        this.id = id;
        this.name = user.getName();
        this.age = user.getAge();
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}

cf) lambda를 이용해 더 간결하게 작성할 수 있다.

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

- 잘 됨

 

cf)

https://limkydev.tistory.com/226

 

[Java] 익명객체(익명클래스)란? (이 글 하나로 한방에 정리!)

익명객체(익명클래스) 란? 이번시간에는 자바 익명객체(익명클래스)에 대해서 알아보도록 하겠습니다. 익명객체(익명클래스) 말그대로.. 이름이 없는 객체? 클래스?,,,그래서 무명클래스라고도

limkydev.tistory.com

'Backend > Spring' 카테고리의 다른 글

#15 MySQL - UPDATE API, DELETE API  (0) 2023.08.19
#14 application.yml 설정 시 주의사항  (0) 2023.08.17
#12 MySQL - CRUD with DML  (0) 2023.08.14
#11 MySQL - CREATE TABLE  (0) 2023.08.13
#10 유저 조회 API  (0) 2023.08.12
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함