Spring Boot
@JsonIgnoreProperties
have a good time
2021. 11. 11. 15:14
mariadb 에
SELECT * FROM image WHERE userId IN (SELECT toUserId FROM subscribe WHERE fromUSerId = 2);
쿼리를 작성하면,
2번이 구독하는 1,3 번의 image로부터 정보를 얻어낸다.
Image.java는 아래와 같다.
import java.time.LocalDateTime;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PrePersist;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@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();
}
}
따라서 id, caption, postImageUrl, user 등의 정보를 얻을 수 있다.
그런데, 여기에 private User user;이 있어서,
User.java를 보니, 다음과 같다.
import java.time.LocalDateTime;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.PrePersist;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@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 profileImageUrl;
private String role;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
@JsonIgnoreProperties({"user"})
private List<Image> images;
private LocalDateTime createDate;
@PrePersist
public void createDate() {
this.createDate = LocalDateTime.now();
}
}
여기에, private List<Image> images;가 있다.
그런데 mariadb 쿼리에서
SELECT * FROM image WHERE userId IN (SELECT toUserId FROM subscribe WHERE fromUSerId = 2);
이렇게 이미 image로부터 정보를 불러오는 것이기 때문에,
User.java에서 또 image 정보들을 불러올 필요가 없다.
그래서 이를 무시하도록, Image.java에서
@JsonIgnoreProperties({"images"})
private User user;
이렇게 해주면 된다.
import java.time.LocalDateTime;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PrePersist;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Image {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String caption;
private String postImageUrl;
// 이 부분 추가
@JsonIgnoreProperties({"images"})
@JoinColumn(name = "userId")
@ManyToOne(fetch = FetchType.EAGER)
private User user;
private LocalDateTime createDate;
@PrePersist
public void createDate() {
this.createDate = LocalDateTime.now();
}
}