일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- M8200
- 데이터 전달
- self-signed ssl
- ClickOnce
- .net
- Font
- php
- net
- phpmailer
- PDA
- GDI
- VS2008
- C#
- crashlog
- 설치제거
- docker
- 와이브로
- JavaScript
- 블루투스 헤드셋
- 한 번만 실행
- API
- protobuf-c
- 기념일관리
- EUC-KR
- MFC
- 자바스크립트
- plcrashreporter
- Antialiasing
- C/C++
- 크래시로그
- Today
- Total
~☆~ 우하하!!~ 개발블로그
[연재] SpringBoot diary - 객체의 사용 본문
오늘은 주고받을 데이터에 객체를 사용하는 방법에 대해서 알아볼까 해.
Spring Boot: study.diary : json 형식으로 Rest API 에게 전송 포스트에서는 클라이언트에서 올린 json 형식의 데이터를 Map<String, Object> 형식으로 수신받았어.
DiaryController.java
// Update
@PutMapping(value = "/diary/{id}")
public void UpdateDiary(@PathVariable("id") Integer id, @RequestBody Map<String, Object> map) {
System.out.println("id=" + id);
System.out.println(map);
diaryService.UpdateDiary(id, map.get("diary_date").toString(), map.get("diary_content").toString());
}
클라이언트에서 올린 json 데이터가 일기 수정 폼의 모든 필드 항목을 뽑아내어 json 으로 만들었기 때문에 아래와 같은 값이었다고 해볼께.
{
"_csrf": "9f9cbd32-63e9-48eb-85f0-07a4acedf4dd",
"_method": "PUT",
"diary_date": "2024-03-05",
"diary_content": "4444\r\n1\r\n2\r\n3\r\n4\r\n"
}
Rest API 에서 이 데이터를 Map<String, Object> 형식으로 받게 되면 아래와 같이 모든 항목이 key, value 형식으로 매핑될것이야.
{_csrf=655b4b14-930f-418b-9ec1-cde22b8d4a29, _method=PUT, diary_date=2024-03-05, diary_content=4444
1
2
3
4
}
그런데 사실은 diary_date, diary_content 이외의 다른 필드값에 대해서는 관리될 필요가 없지. ajax 함수를 사용하면서 _csrf 도 별도로 헤더에 포함시키는 방식으로 변경하였고, 더 이상 _method=PUT 이라는 값도 불필요해졌어(실제로 이 값을 제외시키고 테스트하는 과정은 살펴보지 않았지만, Form 에서 이 필드를 제거하더라도 동작은 제대로 하거든. 단, _csrf 필드는 자동으로 생성되는 필드라서 일부러 제거시킬 방법은 없어).
일찌감치 spring boot 학습 : mybatis : study.diary 포스트에서 Diary 도메인 클래스를 만들어본 바가 있어.
@Data
public class Diary {
private Integer id;
private LocalDate diary_date;
private String diary_content;
private String email;
}
이번에는 불필요한 데이터는 제외하고 꼭 필요한 데이터만 받아볼 수 있도록 도메인 객체를 사용하는 방법에 대해서 알아볼께.
Map<String, Object> 형식 대신 객체 형식으로 데이터를 받도록 수정하는 방법은 의외로 간단해.
DiaryController.java
// Update
@PutMapping(value = "/diary/{id}")
public void UpdateDiary(@PathVariable("id") Integer id, @RequestBody Diary diary) {
System.out.println("id=" + id);
System.out.println(diary);
//diaryService.UpdateDiary(id, map.get("diary_date").toString(), map.get("diary_content").toString());
}
@RequestBody 애노테이션을 붙인 파라미터 형식을 Map<String, Object> 에서 Diary 로 수정만 해주면 되지(변수명도 수정해줬어). 맨 마지막에 diaryService.UpdateDiary 함수 호출 부분은 일부러 주석으로 처리를 해놨어.
이렇게 변경하고 프로그램을 실행시켜보면 아래와 같이 로그가 남지.
클라이언트에서 올라온 데이터 중에 diary_date 와 diary_content 데이터만 Diary 도메인 클래스 멤버에 적용되었어.
적용되지 않은 id 와 email 은 클라이언트에서 또는 서버에서 필요할 때 설정해주면 문제없을 것 같아.
이제 UpdateDiary 함수의 마지막을 수정해볼께.
@PutMapping(value = "/diary/{id}")
public void UpdateDiary(@PathVariable("id") Integer id, @RequestBody Diary diary) {
System.out.println("id=" + id);
System.out.println(diary);
diaryService.UpdateDiary(id, diary);
}
기존에는 DiaryService 로 날짜와 일기내용을 나누어서 넘기고 있었는데, 이번에는 Diary 객체를 통째로 넘기는 것으로 바꿔봤어. DiaryService 클래스의 UpdateDiary 함수도 바꿔줘야지.
DiaryService.java
public void UpdateDiary(Integer id, Diary diaryUpdate) {
String email = SecurityContextHolder.getContext().getAuthentication().getName();
Diary diary = diaryMapper.GetDiary(id);
if (!diary.getEmail().equals(email)) {
throw new DiaryException("작성자가 아닙니다.");
}
diaryUpdate.setId(id);
diaryUpdate.setEmail(diary.getEmail());
diaryMapper.UpdateDiary(diaryUpdate);
}
DiaryUpdate 인터페이스의 UpdateDiary 를 호출할 때 Diary 객체의 비어있는 값 id 와 email 을 설정해주고 Diary 객체를 통째로 넘기도록 수정했어.
DiaryMapper 인터페이스의 UpdateDiary 는 Diary 객체 파라미터만 받는 것으로 변경했어.
DiaryMapper.java
//public void UpdateDiary(Integer id, String diary_date, String diary_content); // 기존 코드
public void UpdateDiary(Diary diary);
마지막으로 mybatis 의 DiaryMapper.xml 이 어떻게 수정되면 되는지를 살펴볼께.
DiaryMapper.xml
<update id="UpdateDiary" parameterType="com.woohahaapps.study.diary.domain.Diary">
update diary
set
diary_date = DATE(#{diary_date})
, diary_content = #{diary_content}
where
id = #{id};
</update>
parameterType 속성을 추가하고, Diary 객체의 패키지명을 적어줬어. 파라미터로 객체를 받는 경우에 설정하는 방법이야. 쿼리문에 대입할 파라미터명은 객체의 속성값을 그대로 사용해주고 있어.
이제 객체를 전달하는 방법으로 수정이 완료되었지.
추가 수정 (필요)
새로운 일기를 작성하는 CreateDiary 는 아직 날짜와 일기내용을 따로 나누어서 받고 있어. 이것도 객체를 받는 방법으로 변경을 해야 해.
그리고 GetAllDiaries 역시 List<Map<String, Object>> 형식의 데이터를 리턴하고 있는데, List<Diary> 형식의 데이터를 리턴하는 것으로 변경하면 모든 코드에서 객체를 사용하는 것으로 변경되는거지.
'SpringBoot' 카테고리의 다른 글
[연재] SpringBoot diary - 역할(ROLE) 관리 기능 추가 (0) | 2024.11.15 |
---|---|
[연재] SpringBoot diary - RestController 에서 ResponseEntity 를 리턴하자. (0) | 2024.11.15 |
[연재] SpringBoot diary - json 형식으로 Rest API 에게 전송 (1) | 2024.11.15 |
[연재] SpringBoot diary - ajax를 이용한 Rest API 호출로 view 와 data 분리 (0) | 2024.11.15 |
[연재] SpringBoot diary - 로그인 실패 사유 표시하기 (0) | 2024.11.15 |