내가 신청을 받아서 작업을 끝냈다면 상태를 변경해야 한다.
원래는 url에 insert, update 등의 키워드 일일이 붙이고 그랬는데 요즘은 그냥 HTTP Method로 분기처리하고 있다.
수정이니까 PUT으로 간다.
CmsApplyController.java
@PutMapping("/{id}")
public Map<Integer, String> updateStatus (@PathVariable String id, String status) {
Map<Integer, String> map = new HashMap<>();
if (service.updateStatus(id, status) == GlobalStatus.EXECUTE_SUCCESS.getStatus()) {
map.put(GlobalStatus.SUCCESS.getStatus(), GlobalStatus.SUCCESS.getMsg());
} else {
map.put(GlobalStatus.INTERNAL_SERVER_ERR.getStatus(), GlobalStatus.INTERNAL_SERVER_ERR.getMsg());
}
return map;
}
내가 @Transactional
을 잘 모르는데, @Test
때랑 app 실행이랑 달라서 황당함.
아래는 test 폴더의 테스트 파일임.
Test.java
@Test
public void updateStatus () { //커미션 신청 상태 변경
String cms_uuid = "f0a532ba-81ae-4cc5-add7-531708a4e470";
CmsApplyDto dto2 = repository.findById(cms_uuid).get();
dto2.setCmsType(GlobalCode.TYPE_SINGLE.getCode());
dto2.setContent("수정 요청 드립니다.");
dto2.setStatus(GlobalCode.CMS_REQ_EDITING.getCode());
repository.save(dto2);
System.out.println("dto2 = " + dto2);
}
여기서는 @Transactional
어노테이션 추가하면 수정 안되고, repository.save(dto2)
안 하면 수정 안된다.
근데? 실제 service 단 코드는 이렇게 해도 돌아간다.
CmsApplyService.java
@Transactional
public int updateStatus (String id, String status) {
try {
CmsApplyDto dto = repository.findById(id).get();
dto.setStatus(status);
return GlobalStatus.EXECUTE_SUCCESS.getStatus();
} catch (Exception e) {
return GlobalStatus.EXECUTE_FAILED.getStatus();
}
}
jpa는 update 메서드가 따로 없고 save()가 그 역할을 한다.
그래서 객체의 변경이 감지되면 알아서 객체를 업데이트 치기에 가능한 것이다. (인터넷에서 더티 체크라고 하더라.)
성공~
그냥 똑같은 crud인데 커미션 신청/상태 변경시 로그 추가 메서드를 넣었다;; 너무 crud라서 테스트샷만 남기겠다.
성공~
보니까 @ManyToOne
을 썼더니 로그마다 커미션 신청 정보를 객체로 들고 오네..