ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로필 페이지 7 - @JsonIgnoreProperties
    Spring 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

    댓글

Designed by Tistory.