프로필 페이지 7 - @JsonIgnoreProperties
회원정보를 수정해서 프로필 화면에 그 정보들이 나타나는지 확인해보겠다.
일단 아래와 같이 회원정보 변경 페이지로 이동한다.

이곳의 빈 칸에 자신이 변경하고 싶은 정보들을 입력한 뒤 제출 버튼을 누르면
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프로젝트 - 포토그램 만들기"