서버를 재시작하면 데이터가 없어지는 것을 MySQL라는 데이터베이스를 배워보면서 Spring Boot와의 연동으로 해결을 했는데 다음과 같은 것을 배울수 있었다.
- 디스크와 메모리 차이를 이해하고, Database의 필요성을 이해
- SQL을 이용해 MySQL Database를 조작할줄암
- 스프링서버를 이용해 Database에 접근하고 데이터를 저장, 조회, 업데이트, 삭제할줄 알게 됨
- 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에서 모든 기능을 구현하면 안되는지와 스프링을 이용해 어떻게 해결하고 왜 해결하는지 알아보겠다.
'기록해보기' 카테고리의 다른 글
Controller를 3단 분리하기 -Service와 Repository (1) | 2023.06.05 |
---|---|
좋은 코드(Clean Code)는 왜 중요한가? (0) | 2023.06.05 |
유저 업데이트 API, 삭제 API 예외 처리하기 (0) | 2023.06.04 |
유저 업데이트 API, 삭제 API 개발과 테스트 (0) | 2023.06.04 |
Spring에서 Database 사용하기 (1) | 2023.06.03 |
댓글