메소드 구현체를 만들어 놓은 것으로 CRUD를 적용해보자
전체 데이터의 Entity를 가지고 있는 user를 만들어야 하니 유저가 가질 UserEntity가 필요하다.
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserEntity extends Entity {
private String name;
private int score;
}
유저가 가지는 DTO를 선언하고 이를 관리할 저장공간을 정의한다.
@Service
public class UserRepository extends SimpleDataRepository<UserEntity, Long> {
}
이는 SimpleDataRepository를 상속해서 구현해뒀던 메소드를 호출할 수 있다.
@Service
@RequiredArgsConstructor
public class UserService {
public final UserRepository userRepository;
public UserEntity save(UserEntity user){
//save
return userRepository.save(user);
}
public List<UserEntity> findAll(){
return userRepository.findAll();
}
public void delete(Long id){
userRepository.delete(id);
}
public Optional<UserEntity> findById (Long id){
return userRepository.findById(id);
}
}
@Service 어노테이션으로 이 클래스가 서비스 레이어라는 것을 명시해주면 서비스 컴포넌트로 관리된다.
@RequiredArgsConstructor에 대해서 얘기하면 좋을 것 같은데 따로 정리해놓겠다.
아무튼 SimpleDataRepository를 상속받은 UserRepository 객체를 호출하도록 구현돼있다.
그런데 SimpleDataRepository는 UserEntity를 가지고 동작하므로 Controller부분에서 UserService를 이용해 DB까지 도달할 수 있는 것이다.
@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
public class UserApiController {
private final UserService userService;
@PutMapping("")
public UserEntity create(
@RequestBody UserEntity userEntity
){
return userService.save(userEntity);
}
@GetMapping("/all")
public List<UserEntity> findAll(){
return userService.findAll();
}
@DeleteMapping(path = "/id/{id}")
public void delete(
@PathVariable Long id
){
userService.delete(id);
}
@GetMapping("/id/{id}")
public UserEntity findOne(
@PathVariable Long id
){
var response = userService.findById(id);
return response.get();
}
}
상술했듯이 UserService 객체를 이용해 함수를 호출하면 SimpleDataRepository에 존재하는 함수를 호출할 수 있다.
유저의 Entity를 Controller에서 받으면 안되지만, 레이어를 분리하는 것은 나중으로 미루겠다.
create : body를 통해 유저의 Entity를 받아서 PUT 매핑을 요청한다.
findAll : GET 매핑을 통해서 데이터리스트 전체를 응답 받도록 한다.
findOne : PathVariable을 통해 찾고자 하는 id를 받아서 응답을 내리도록 한다.
delete : PathVariable을 통해서 지우고자 하는 id를 찾아 삭제한다.
이 것이 가장 간단한 CRUD를 적용한 모습이다 !