기존 코드는 다음과 같다.
기존 컨트롤러 코드의 문제점은 작성자의 “기본키”를 URL이나 DTO에서 얻어내야 한다는 점이다.
@RestController
public class DiarySaveRestController {
private final SaveDiaryService saveDiaryService;
public DiarySaveRestController(SaveDiaryService saveDiaryService) {
this.saveDiaryService = saveDiaryService;
}
@PostMapping("api/diary/diabetes-diary")
public ApiResult<DiabetesDiaryResponseDTO> postDiary(@RequestBody DiabetesDiaryRequestDTO dto) {
String date = dto.getYear() + "-" + dto.getMonth() + "-" + dto.getDay() + " " + dto.getHour() + ":" + dto.getMinute() + ":" + dto.getSecond();
LocalDateTime writtenTime = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
logger.info("writtenTime : " + writtenTime);
return ApiResult.OK(new DiabetesDiaryResponseDTO(saveDiaryService.saveDiaryOfWriterById(EntityId.of(Writer.class, dto.getWriterId()), dto.getFastingPlasmaGlucose(), dto.getRemark(), writtenTime)));
}
}
DTO 코드를 뜯어보면 다음과 같다.
public class DiabetesDiaryRequestDTO {
private final Long writerId;
private final int fastingPlasmaGlucose;
private final String remark;
private final String year;
private final String month;
private final String day;
private final String hour;
private final String minute;
private final String second;
public DiabetesDiaryRequestDTO(Long writerId, int fastingPlasmaGlucose, String remark, String year, String month, String day, String hour, String minute, String second) {
this.writerId = writerId;
this.fastingPlasmaGlucose = fastingPlasmaGlucose;
this.remark = remark;
this.year = year;
this.month = month;
this.day = day;
this.hour = hour;
this.minute = minute;
this.second = second;
}
...
}
테스트코드에서도 알 수 있듯이, DTO의 작성자 id를 넣어준다.
하지만 스프링 시큐리티에선 세션 내에 이미 정보를 갖고 있다.
따라서 해당 정보를 넣어줄 필요가 없다.
f12로 소스 보기하면 작성자의 기본키가 노출이 된다.
http only 쿠키인 jsessionid 는 자바스크립트에서도 가져올 수 없다.
새로운 url 매핑할 수 있는 컨트롤러를 만든 후, Authentication을 얻어오는 로직이 추가로 필요하다.
예를 들어 기존 url api/diary/owner/{writerId}/diabetes-diary/{diaryId}/diet/{dietId}
이 있다고 한다면, api/diary/user/diabetes-diary/{diaryId}/diet/{dietId}
로 바꿔야 한다.
writerId는 굳이 dto로 받을 필요가 없다. 왜냐하면 시큐리티를 적용했기 때문에 세션 정보를 받아오면 되기 때문이다.