본문 바로가기
기록해보기

다시 한번 정리!

by titlejjk 2023. 6. 4.

서버를 재시작하면 데이터가 없어지는 것을 MySQL라는 데이터베이스를 배워보면서 Spring Boot와의 연동으로 해결을 했는데 다음과 같은 것을 배울수 있었다.

  1. 디스크와 메모리 차이를 이해하고, Database의 필요성을 이해
  2. SQL을 이용해 MySQL Database를 조작할줄암
  3. 스프링서버를 이용해 Database에 접근하고 데이터를 저장, 조회, 업데이트, 삭제할줄 알게 됨
  4. API의 예외 상황을 알아보고 예외처리를 할줄 알게 됨

그.치.만! 전체적으로 보자면 한가지 클래스인 Controller에서 너무 많은 역할을 하고있다는 문제가 있다.(사실 배우는 중이라 이게 왜 문제인지는 모르겠다..)

 

package com.group.libraryapp.controller.user;

import com.group.libraryapp.dto.user.request.UserCreateRequest;
import com.group.libraryapp.domain.user.User;
import com.group.libraryapp.dto.user.request.UserUpdateRequest;
import com.group.libraryapp.dto.user.response.UserResponse;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.web.bind.annotation.*;

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

@RestController
public class UserController {

    private final JdbcTemplate jdbcTemplate;

    public UserController(JdbcTemplate jdbcTemplate){
        this.jdbcTemplate = jdbcTemplate;
    }
    @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());
    }

    @GetMapping("/user")
    public List<UserResponse> getUser(){
        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 readSql = "SELECT * FROM user WHERE id = ?";
        boolean isUserNotExist = jdbcTemplate.query(readSql, (rs,rowNum) -> 0, request.getId()).isEmpty();
        if(isUserNotExist){
            throw new IllegalArgumentException();
        }
        String sql = "UPDATE user SET name = ? WHERE id = ?";
        jdbcTemplate.update(sql, request.getName(), request.getId());
    }

    @DeleteMapping("/user")
    public void deleteUser(@RequestParam String name){
        String readSql = "SELECT * FROM user WHERE name = ?";
        boolean isUserNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty();
        if(isUserNotExist){
            throw new IllegalArgumentException();
        }
        String sql = "DELETE FROM user WHERE name =?";
        jdbcTemplate.update(sql, name);
    }

}

학원에서 배우던 Dao에 비하면 엄청 적어보인다..

 

아무튼 강의에서 한 API에서 무려 10개의 Table을 사용해야 한다면?!

으앙

이 다음으로는 왜 한 Class에서 모든 기능을 구현하면 안되는지와 스프링을 이용해 어떻게 해결하고 왜 해결하는지 알아보겠다.

댓글