본문 바로가기
기록해보기

Spring Data JPA를 이용해 다양한 쿼리 작성하기

by titlejjk 2023. 6. 18.

User관련 기능에 생성/ 조회/ 수정 기능을 SQL문을 사용하지 않고 사용되도록 해보았는데 이번에는 삭제 기능을 Spring Data JPA로 변경해보겠다. 저장하거나 업데이트하거나 전체조회를 하거나 기본적인 기능외에 다양한 기능도 만들어 보겠다.

 

삭제 기능같은 경우에는 User의 이름을 기준으로 삭제를 하기로 했었는데 이 User의 name이 있는지 없는지 조회를 한 후에 삭제를 하기로 했었다.

먼저 함수먼저 작성해보겠다.

public void deleteUser(String name){
        userRepository.findByName
    }

name으로 찾는다고 하긴 했지만 name으로 찾을 수 있는 방법은 아직까지 없다.

SQL로는 SELECT * FROM user WHERE name = ? 이걸 어떻게 만들 수 있을까?

먼저 UserRepository 인터페이스로 간다.

여기에 함수를 하나 작성해준다.

package com.group.libraryapp.domain.user;

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    
    User findByName(String name);
}

User를 반환하는 함수인데 @Entity되어있는 User객체이다.

완성시키면

public void deleteUser(String name){
        //SELECT * FROM user WHERE name = ?
        User user = userRepository.findByName(name);
        if(user == null){
        	throw new IllegalArgumentException();
        }
        userRepository.delete(user);
    }

 

에 대해 살펴보자면

findByName에 찾아들어갈 이름 (String name)을 넣어주면 이름을 찾아 들어가는 SQL을 작성해준다.

반환 타입은 User. 유저가 없다면, null이 반환된다.

이 때 함수이름이 중요하다. findByName이라고 해줘야 알아서 SQL이 조립되는 방식이다. find라고  작성하면, 1개의 데이터만 가져온다. By뒤에 붙는 필드이름으로 SELECT 쿼리의 WHERE문이 작성된다. By Age라 했으면 나이를 기준으로 찾아주었을 것이다.

userRepository.delete(user);에서 delete는 함수를 따로 만들어주지 않아도 원래 존재하는 기능이다.

 

이제 새로 작성한 Service Class로 Controller를 바꿔주고 테스트해보겠다.

package com.group.libraryapp.controller.user;

import com.group.libraryapp.dto.user.request.UserCreateRequest;
import com.group.libraryapp.dto.user.request.UserUpdateRequest;
import com.group.libraryapp.dto.user.response.UserResponse;
import com.group.libraryapp.service.user.UserServiceV1;
import com.group.libraryapp.service.user.UserServiceV2;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class UserController {

    private final UserServiceV2 userService;

    public UserController(UserServiceV2 userService) {
        this.userService = userService;
    }

    @PostMapping("/user") //POST /user
    public void saveUser(@RequestBody UserCreateRequest request){
        userService.saveUser(request);
    }

    @GetMapping("/user")
    public List<UserResponse> getUser(){
        return userService.getUsers();
    }

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

    @DeleteMapping("/user")
    public void deleteUser(@RequestParam String name){
        userService.deleteUser(name);
    }

}

 

댓글