// Aggregate root @GetMapping("/account") public List<Account> all(){ return accountRepository.findAll(); }
// Single item @GetMapping("/account/{id}") public Account getAccount(@PathVariable Long id){ return accountRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("illegal argument :" + id)); }
@DeleteMapping("/{id}") publicvoiddeleteAccount(@PathVariable Long id){ accountRepository.deleteById(id); }
@RestController : @Controller + @ResponseBody 입니다. 기존의 @Controller는 return 값을 ViewResolverName을 통해서 View단의 이름이랑 매핑했습니다. 하지만, RESTful API는 응답형태를 (보통은 Json) 으로 내보내야 하기 때문에 간편하게 @RestController를 통해서 API관련 코드를 작성할 수 있습니다. 이름에서도 AccountApiController라고 지었습니다.
@AllArgsConstructor: 롬복의 애노테이션으로, 모든 필드에 대한 클래스 생성자를 자동으로 해줍니다. 이것을 사용하는 이유는 보통은 @Autowired 를 통해서 AccountRepository 빈을 주입 받아서 사용하는데, 스프링에서는, IntelliJ에서도 Field Injection은 추천하지 않습니다. 여러 가지 이유가 있지만 Circular dependencies(빈 순환 참조) 이슈가 발생할 수 있기 때문입니다. 나중에 자세한 포스팅은 따로 하겠습니다. 그런 이유에서 필드 주입이 아닌, 생성자 주입을 통해서 빈을 사용합니다. 롬복은 그것을 조금 더 쉽게 만들어 줍니다.
POST Account 는 @RequestBody를 메서드 파라미터에 붙여주고, save()메서드를 호출합니다. 보통은 저장한 엔티티 그 자체를 return 받아서 ResponseEntity의 body에 담아서 응답을 합니다.
6. PostMan API 테스트
PostMan으로 POST요청을 날리면 Status 200 과 저장에 성공한 Account정보를 Body에 담아서 보내줍니다. 요청을 보낼때는 Id에 값을 따로 입력하지 않습니다. 자동으로 @GeneratedValue 를 통해서 자동증감으로 값을 할당해 줍니다. 반면에 ResponseBody에는 해당 Id값이 1로 할당되어 돌아오는 것을 확인했습니다.
정리
지금까지 Spring, JPA, H2 셋팅을 통한, 간단한 RESTful API를 만드는 방법에 대해서 알아봤습니다.