서비스 개발에 필요한 JPA의 CrudRepository 기능들

jinhan han·2024년 7월 1일
0

spring과 java 개발

목록 보기
2/6
post-thumbnail

Spring Data JPA의 CrudRepository 사용법

CrudRepository 인터페이스는 Spring Data JPA에서 제공하는 기본적인 CRUD(Create, Read, Update, Delete) 작업을 위한 메서드들을 정의합니다.
이 인터페이스는 주로 spring boot api의 service 기능에서 다양한 CRUD 기능을 개발시에 사용 합니다. 이번 포스팅에서는 CrudRepository가 제공하는 메서드들과 그 사용 예제에 대해 설명하겠습니다.

CrudRepository 인터페이스 메서드 목록

save(S entity)

주어진 엔티티를 저장하거나 업데이트합니다.

예제:

User user = new User();
user.setName("John Doe");
user.setEmail("john.doe@example.com");
userRepository.save(user);

saveAll(Iterable <S> entities)

주어진 엔티티들의 컬렉션을 모두 저장하거나 업데이트합니다.

예제:

List<User> users = Arrays.asList(
    new User("Alice", "alice@example.com"),
    new User("Bob", "bob@example.com")
);
userRepository.saveAll(users);

findById(ID id)

주어진 ID를 가진 엔티티를 반환합니다. 존재하지 않으면 Optional.empty()를 반환합니다.

예제:

Optional<User> user = userRepository.findById(1L);
user.ifPresent(u -> System.out.println(u.getName()));

existsById(ID id)

주어진 ID를 가진 엔티티가 존재하는지 여부를 반환합니다.

예제:

boolean exists = userRepository.existsById(1L);
System.out.println("User exists: " + exists);

findAll()

모든 엔티티를 반환합니다.

예제:

Iterable<User> users = userRepository.findAll();
users.forEach(user -> System.out.println(user.getName()));

findAllById(Iterable<ID> ids)

주어진 ID들을 가진 모든 엔티티를 반환합니다.

예제:

List<Long> ids = Arrays.asList(1L, 2L, 3L);
Iterable<User> users = userRepository.findAllById(ids);
users.forEach(user -> System.out.println(user.getName()));

count()

총 엔티티의 수를 반환합니다.

예제:

long count = userRepository.count();
System.out.println("Total users: " + count);

deleteById(ID id)

주어진 ID를 가진 엔티티를 삭제합니다.

예제:

userRepository.deleteById(1L);

delete(T entity)

주어진 엔티티를 삭제합니다.

예제:

User user = userRepository.findById(1L).orElseThrow();
userRepository.delete(user);
deleteAllById(Iterable<? extends ID> ids)

주어진 ID들을 가진 모든 엔티티를 삭제합니다.

예제:

List<Long> ids = Arrays.asList(1L, 2L, 3L);
userRepository.deleteAllById(ids);

deleteAll(Iterable<? extends T> entities)

주어진 엔티티들의 컬렉션을 모두 삭제합니다.

예제:

List<User> users = userRepository.findAll();
userRepository.deleteAll(users);

deleteAll()

모든 엔티티를 삭제합니다.

예제:

userRepository.deleteAll();

예제 코드 및 설명

User 엔티티 클래스
먼저, User 엔티티 클래스를 정의합니다.

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    public User() {}

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    // Getters and setters
    // toString method
}
### UserRepository 인터페이스
CrudRepository를 확장하여 UserRepository 인터페이스를 정의합니다.
import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<User, Long> {
}

UserService 클래스

UserService 클래스는 UserRepository를 사용하여 비즈니스 로직을 구현합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User saveUser(User user) {
        return userRepository.save(user);
    }

    public Optional<User> getUserById(Long id) {
        return userRepository.findById(id);
    }

    public Iterable<User> getAllUsers() {
        return userRepository.findAll();
    }

    public void deleteUserById(Long id) {
        userRepository.deleteById(id);
    }
}

UserController 클래스

UserController 클래스는 HTTP 요청을 처리하며, 클라이언트와 서버 간의 인터페이스 역할을 합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User createdUser = userService.saveUser(user);
        return ResponseEntity.ok(createdUser);
    }

    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        Optional<User> user = userService.getUserById(id);
        return user.map(ResponseEntity::ok)
                   .orElseGet(() -> ResponseEntity.notFound().build());
    }

    @GetMapping
    public ResponseEntity<Iterable<User>> getAllUsers() {
        Iterable<User> users = userService.getAllUsers();
        return ResponseEntity.ok(users);
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUserById(@PathVariable Long id) {
        userService.deleteUserById(id);
        return ResponseEntity.noContent().build();
    }
}

전체 흐름 요약

User 엔티티 클래스: User 엔티티는 데이터베이스 테이블과 매핑됩니다.
UserRepository 인터페이스: CrudRepository를 확장하여 기본 CRUD 작업을 위한 메서드를 상속받습니다.
UserService 클래스: UserRepository를 사용하여 비즈니스 로직을 처리합니다.
UserController 클래스: HTTP 요청을 처리하고, 서비스 계층을 통해 데이터베이스와 상호작용합니다.

이 구조를 통해 User 엔티티의 CRUD 작업을 간단하고 효율적으로 처리할 수 있습니다. CrudRepository가 제공하는 기본 메서드를 사용하여 반복적인 데이터 접근 로직을 줄이고, 비즈니스 로직에 집중할 수 있습니다.

profile
개발자+분석가+BusinessStrategist

0개의 댓글