-
프로필 페이지 7 - @JsonIgnorePropertiesSpring Boot/프로필 페이지 만들기 2021. 12. 18. 13:08
회원정보를 수정해서 프로필 화면에 그 정보들이 나타나는지 확인해보겠다.
일단 아래와 같이 회원정보 변경 페이지로 이동한다.
이곳의 빈 칸에 자신이 변경하고 싶은 정보들을 입력한 뒤 제출 버튼을 누르면
sts(이클립스) 콘솔창에 에러가 뜬다.
그 이유는 다음과 같다.
UserApiController.java 파일에서
회원정보 수정하는 update 메서드에
@RequiredArgsConstructor @RestController public class UserApiController { private final UserService userService; @PutMapping("/api/user/{id}") public CMRespDto<?> update( @PathVariable int id, @Valid UserUpdateDto userUpdateDto, BindingResult bindingResult, @AuthenticationPrincipal PrincipalDetails principalDetails) { if (bindingResult.hasErrors()) { Map<String, String> errorMap = new HashMap<>(); for (FieldError error : bindingResult.getFieldErrors()) { errorMap.put(error.getField(), error.getDefaultMessage()); } throw new CustomValidationApiException("유효성 검사 실패함", errorMap); }else { User userEntity = userService.회원수정(id, userUpdateDto.toEntity()); principalDetails.setUser(userEntity); return new CMRespDto<>(1, "회원수정완료", userEntity); } } }
리턴 되는 부분을 보면 다음과 같다.
return new CMRespDto<>(1, "회원수정완료", userEntity);
그런데, 이 때 userEntity 의 모든 getter 함수가 호출되고 JSON으로 파싱하여 응답한다.
그런데, User.java 파일을 보면
@Builder @AllArgsConstructor @NoArgsConstructor @Data @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(length = 100, unique = true) private String username; @Column(nullable = false) private String password; @Column(nullable = false) private String name; private String website; private String bio; @Column(nullable = false) private String email; private String phone; private String gender; private String role; private String profileImageUrl; @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) private List<Image> images; private LocalDateTime createDate; @PrePersist public void createDate() { this.createDate = LocalDateTime.now(); } }
getImages() 가 호출되게 된다.
그러면 또 Image.java 파일의 변수들에 대해 getter가 호출되는데,
@Builder @AllArgsConstructor @NoArgsConstructor @Data @Entity public class Image { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String caption; private String postImageUrl; @JoinColumn(name = "userId") @ManyToOne(fetch = FetchType.EAGER) private User user; private LocalDateTime createDate; @PrePersist public void createDate() { this.createDate = LocalDateTime.now(); } }
여기에 보면, 또
private User user; 이렇게,
User.java 파일 모든 변수에 getter 함수가 호출된다.
즉 무한반복
그래서 우리가 원하는 것은,
return new CMRespDto<>(1, "회원수정완료", userEntity);
이 코드가 실행될 때,
User.java 파일의 images 까지는 getter가 호출되어 JSON으로 파싱되도,
Image.java 파일의 user 변수는 JSON으로 파싱되는 것을 막으면 된다.
이때, User.java 파일의 images 변수 위에
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY) @JsonIgnoreProperties({"user"}) private List<Image> images;
즉, 아래의 코드를 추가해주면 된다.
@JsonIgnoreProperties({"user"})
이뜻은 Image.java 파일의
user 변수는 무시하고 파싱하라는 뜻. 즉 user 변수에 대한 getter 호출 안 됨
더보기<Image.java> 파일의 user 변수
@JoinColumn(name = "userId") @ManyToOne(fetch = FetchType.EAGER) private User user;
이렇게 설정한 다음 사이트에서 회원정보 수정시,
오류없이 잘 실행됨.
즉, 변경 사항이 프로필화면에 반영되어 표시됨.
안녕하세요, 안녕으로 변경을 시켰더니 잘 반영되었음.
더보기왜냐하면, 프로필 화면을 나타내는 profile.jsp 파일에 회원정보 변경 사항이 아래처럼
<h2>${user.name}</h2>
반영되도록 코드를 만들었으니깐.
참고자료 : 이지업 강의 사이트 "스프링부트 SNS프로젝트 - 포토그램 만들기"
'Spring Boot > 프로필 페이지 만들기' 카테고리의 다른 글
프로필 페이지 9 (0) 2021.12.18 프로필 페이지 8 (0) 2021.12.18 프로필 페이지 5 (0) 2021.12.16 프로필 페이지 4 (0) 2021.12.16 프로필 페이지 3 (0) 2021.12.15