드디어 Spring으로 CRUD를 만들었다.
[Create]
POST 매핑된 createCare()메서드. @RequestBody 어노테이션으로 body에 JSON형식으로 데이터를 받아온다.
@PostMapping("/create")
public CardResponseDto createCard(@RequestBody CardRequestDto cardRequestDto){
return cardService.createCard(cardRequestDto);
}
JpaRepository를 사용하면 간단히 save를 할 수 있다.
public CardResponseDto createCard(CardRequestDto cardRequestDto) {
Card reqCard = new Card(cardRequestDto);
Card resCard = cardRepository.save(reqCard);
return new CardResponseDto(resCard);
[Read]
저장된 카드의 데이터를 한개만 읽어오자.
GET 매핑된 getCard() 메서드. @PathVariable로 id값을 받아온다.
@GetMapping("/gets/{id}")
public CardResponseDto getCard(@PathVariable long id){
return cardService.getCard(id);
}
저장된 데이터의 ID가 8이다. ID를 8로 쿼리해보자.
데이터를 잘 뽑아 왔다. 생성시간도 잘 나왔다.
저장된 데이터를 여러개를 가져와보자.이때 Controller에서는 GET메서드를 이용했다.
public List<CardResponseDto> getAllCard() {
List<CardResponseDto> cardResponseDtoList = new ArrayList<>();
List<Card> cardList = cardRepository.findAll();
for(Card card: cardList){
CardResponseDto cardResponseDto = new CardResponseDto(card);
cardResponseDtoList.add(cardResponseDto);
}
return cardResponseDtoList;
}
JpaRepository의 findAll()메서드는 해당 Entity를 List형식으로 가져온다.
우리는 응답을 ResponseDto로 응답해야 하니 가져온 Entity를 ResponseDto로 변경해주자.
이 4개의 데이터를 모두 조회해보자.
모든 데이터를 가져 온다.
[UPDATE]
DB에 저장된 카드의 내용을 수정해보자. 데이터 수정에는 PUT 메서드와 PATCH 메서드가 있다고 한다.
PUT 메서드는 데이터의 전체 수정을 할 때 사용 되고, PATCH 메서드는 데이터의 특정 필드만 변경할 때 사용한다고 한다.
우리는 데이터를 얼만큼 바꿀지 정하지 않았기에 PUT 메서드를 이용하여 개발한다.
@PutMapping("/updates/{id}")
public CardResponseDto updateCard(@RequestBody CardRequestDto cardRequestDto,@PathVariable Long id){
return cardService.updateCard(cardRequestDto, id);
수정할 카드의 정보는 Body에 담아서 보내고, 수정할 카드의 id값은 PathVariable로 받았다. 8번 데이터를 수정해보자.
8번 데이터를 수정했고, 잘 수정 됐다는 응답을 받았다. 그럼 DB에 잘 반영됐는지 확인해보자.
DB에 수정된 값이 잘 반영됐다.
여기 메서드를 구현하는게 조금 이해가 되지 않았다. JpaRepository에서는 update 메서드를 지원하지 않기 때문!
그래서 공부를 해본 결과 @Transactional 어노테이션을 이용하여 수정을 하는 방식을 선택 했다. 이 방식은
Entity가 수정된 순간 JpaRepository에서 변경된 Entity값을 인지하고 반영 해준다. @Transactional은 정말 사기같은 어노테이션.
@Transactional
public CardResponseDto updateCard(CardRequestDto cardRequestDto,Long id){
Card card = searchCard(id);
card.update(cardRequestDto);
return new CardResponseDto(card);
}
트랜잭션을 걸고 카드내용을 변경만 해주면 된다.
[DELETE]
DB에 저장된 내용을 삭제해 보자.
RESTful하게 카드 삭제는 DELETE 메서드를 이용하자.
8번 ID의 데이터를 지워보자.
저장돼있던 8번 데이터가 삭제된 모습.
이를 통해 스프링으로 CRUD를 만들어봤다. 지난 과제에서 완성해야 했던 것을 지금에서야 했지만, 지금은 이 CRUD가 어떻게 동작하는지. 무슨 어노테이션이 어떻게 작동하는지 훨씬 자세하게 알게 되었다.
내일부터는 로그인/회원가입 기능을 추가할 예정이다. 지난주에 공부했던 내용이지만 정말 어려웠기에 쉽진 않겠지만, 그래도 열심히 구현해보자!