현의 개발 블로그

JDBC를 활용해 API 개발하기3 - 역할 분리 본문

스프링부트 실습/도서관리 웹 개발

JDBC를 활용해 API 개발하기3 - 역할 분리

hyun2371 2023. 4. 15. 19:16

역할 분리의 필요성

 

앞에서는 Controller에서 모든 기능을 구현하였다.

 

예를 들어,  updateUser()는 3가지의 역할을 수행한다.

 

@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 updateSql = "UPDATE user SET name = ? WHERE id = ?";

   jdbcTemplate.update(sql, request.getName(), requestId());

 

 

[1] API 진입 지점으로, HTTP Body를 객체로 변환한다.

[2] 유저 유무를 확인해 없다면 예외 처리를 한다.

[3] SQL을 사용해 실제 DB와의 통신을 담당한다.

 

 

 

이는 좋지 못한 코드이다. Controller가 여러 역할을 수행하면, 가독성이 떨어지고 유지 보수가 어려워진다.

안 좋은 코드가 쌓이면, 시간이 지날수록 생산성이 낮아질 것이다.

 

따라서 함수는 최대한 작게 만들고, 한 가지 일만 수행하는 것이 좋다.

 

 

 

역할 분리

Controller에 있던 3가지 기능을 Controller, Service, Repository로 분리하자

 

- API의 진입 지점으로, HTTP Body 객체를 변환 -> Controller

-  현재 유저 유무 확인하고 예외 처리 -> Service

- SQL 사용해 실제 DB와의 통신 담당 -> Repository

 

 

 

UserController

private final UserService = userService;
public UserController(UserService userService){
   this.userService = userService);
}

@PustMapping("/user")
public void updateUser(@RequestBody UserUpdateRequest request){
   userService.updateUser(request);
}

userService를 생성자로 주입받는다.

 

 

UserService

private final UserRepository userRepository;

public UserService(UserRepository userRepository){
    this.userRepository = userRepository;
}

public void updateUser(UserUpdateRequest request){

    if (userRepository.isUserNotExist(request.getId())) {
        throw new IllegalArgumentException();
    }

    userRepository.updateUserName(request.getName(), request.getId());
}

userRepository를 생성자로 주입받는다.

 

 

UserRepository

public boolean isUserNotExist(Long id){
    String readSql = "SELECT * FROM user WHERE id =?";
    return jdbcTemplate.query(readSql, (rs, rowNum) -> 0, id).isEmpty();

 }

  public void updateUserName(String name, long id){
      String sql = "UPDATE user SET name = ? WHERE id = ?";
      jdbcTemplate.update(sql, name, id);
  }

 

Service와 Repository에 각각 @Service, @Repository 를 붙여 스프링빈으로 등록시켰다.

그 결과 UserRepository에서 JdbcTemplate을 가져올 수 있다.

 

 

 

JDBC의 한계

JDBC는 SQL 코드를 직접 작성하기 때문에 DB에 종속적이고, 잘못 작성할 가능성이 크다.

다음 글에서는 이러한 한계점을 극복한 JPA 방식으로 User CRUD를 개발할 것이다.

 

 

JPA 활용한 User CRUD 개발

JDBC의 한계 앞에서는 SQL을 직접 사용해 DB에 접근하였다. 이러한 방식은 다음과 같은 한계점이 존재한다. 1. SQL문을 직접 작성하기 때문에 오타가 생길 수 있다. 2. 반복 작업이 많아진다. 매번 INSE

hyun-keepdeving.tistory.com

 


참고 

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%84%9C%EB%B2%84%EA%B0%9C%EB%B0%9C-%EC%98%AC%EC%9D%B8%EC%9B%90/dashboard

 

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인

Java와 Spring Boot, JPA, MySQL, AWS를 이용해 서버를 개발하고 배포합니다. 웹 애플리케이션을 개발하며 서버 개발에 필요한 배경지식과 이론, 다양한 기술들을 모두 학습할 뿐 아니라, 다양한 옵션들

www.inflearn.com

 

Comments