Spring Boot/프로필 페이지 만들기

프로필 페이지 7 - @JsonIgnoreProperties

have a good time 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프로젝트 - 포토그램 만들기"