CrudRepository 인터페이스는 Spring Data JPA에서 제공하는 기본적인 CRUD(Create, Read, Update, Delete) 작업을 위한 메서드들을 정의합니다.
이 인터페이스는 주로 spring boot api의 service 기능에서 다양한 CRUD 기능을 개발시에 사용 합니다. 이번 포스팅에서는 CrudRepository가 제공하는 메서드들과 그 사용 예제에 대해 설명하겠습니다.
주어진 엔티티를 저장하거나 업데이트합니다.
예제:
User user = new User();
user.setName("John Doe");
user.setEmail("john.doe@example.com");
userRepository.save(user);
주어진 엔티티들의 컬렉션을 모두 저장하거나 업데이트합니다.
예제:
List<User> users = Arrays.asList(
new User("Alice", "alice@example.com"),
new User("Bob", "bob@example.com")
);
userRepository.saveAll(users);
주어진 ID를 가진 엔티티를 반환합니다. 존재하지 않으면 Optional.empty()를 반환합니다.
예제:
Optional<User> user = userRepository.findById(1L);
user.ifPresent(u -> System.out.println(u.getName()));
주어진 ID를 가진 엔티티가 존재하는지 여부를 반환합니다.
예제:
boolean exists = userRepository.existsById(1L);
System.out.println("User exists: " + exists);
모든 엔티티를 반환합니다.
예제:
Iterable<User> users = userRepository.findAll();
users.forEach(user -> System.out.println(user.getName()));
주어진 ID들을 가진 모든 엔티티를 반환합니다.
예제:
List<Long> ids = Arrays.asList(1L, 2L, 3L);
Iterable<User> users = userRepository.findAllById(ids);
users.forEach(user -> System.out.println(user.getName()));
총 엔티티의 수를 반환합니다.
예제:
long count = userRepository.count();
System.out.println("Total users: " + count);
주어진 ID를 가진 엔티티를 삭제합니다.
예제:
userRepository.deleteById(1L);
주어진 엔티티를 삭제합니다.
예제:
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);
주어진 엔티티들의 컬렉션을 모두 삭제합니다.
예제:
List<User> users = userRepository.findAll();
userRepository.deleteAll(users);
모든 엔티티를 삭제합니다.
예제:
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 클래스는 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 클래스는 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가 제공하는 기본 메서드를 사용하여 반복적인 데이터 접근 로직을 줄이고, 비즈니스 로직에 집중할 수 있습니다.