개발일기장
DTO이용해서 entity 참조 된거 보내기 본문
728x90
이거는 JOIN한거 아님..
USER
package springJPAStudy.forStudy.domain;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@NoArgsConstructor
@Getter
public class User {
@Id
@Column(name = "user_id")
private String id;
@Column
private String password;
@Column
private String name;
@OneToMany(mappedBy = "user")
private List<Post> posts = new ArrayList<>();
@Builder
public User(String id, String password, String name) {
this.id = id;
this.password = password;
this.name = name;
}
public void updateName(String name){
this.name = name;
}
public void addPost(Post post){
this.posts.add(post);
}
}
POST
package springJPAStudy.forStudy.domain;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Getter
@NoArgsConstructor
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "post_ID")
private Long postID;
@Column(name = "title")
private String title;
@Column(name = "description",length=512)
private String description;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@Builder
public Post(User user,String title, String description) {
this.user = user;
this.title = title;
this.description = description;
}
}
대충 이렇게 있고
POST를 가지고 오면서 USER정보까지 JSON형식으로 오게 하려고 대충 이렇게
근대 이거는 USER(1) : POST(N) 라서 USER정보는 하나만 있게 하면 됨
package springJPAStudy.forStudy.controller.dto;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import springJPAStudy.forStudy.domain.Post;
@Getter
@NoArgsConstructor
public class PostResponseDto {
private Long postID;
private String title;
private String description;
private PostUser writer;
public PostResponseDto(Post post) {
this.postID = post.getPostID();
this.title = post.getTitle();
this.description = post.getDescription();
this.writer = PostUser.builder()
.user_id(post.getUser().getId())
.name(post.getUser().getName())
.build();
}
@Getter
static class PostUser{
private String user_id;
private String name;
@Builder
public PostUser(String user_id, String name){
this.user_id = user_id;
this.name = name;
}
}
}
이렇게 하면 결과가
그리고 반대로 USER(1)정보를 긁어올때 POST(N) 에 대한 대략적인 정보를 가지고 올때는
package springJPAStudy.forStudy.controller.dto;
import lombok.Getter;
import lombok.Setter;
import springJPAStudy.forStudy.domain.Post;
import springJPAStudy.forStudy.domain.User;
import java.util.ArrayList;
import java.util.List;
@Getter
public class AllUserResponseDto {
private String ID;
private String name;
private List<UserPost> posts;
public AllUserResponseDto(User user){
this.ID = user.getId();
this.name = user.getName();
this.posts = UserPost.userPostList(user.getPosts());
}
@Getter
static class UserPost{
private Long post_id;
private String title;
static List<UserPost> userPostList(List<Post> posts){
List<UserPost> list = new ArrayList<>();
posts.forEach(post -> {
list.add(new UserPost(post));
});
return list;
}
public UserPost(Post post){
this.post_id = post.getPostID();
this.title = post.getTitle();
}
}
}
이렇게 했음.. 밑에 UserPost에서 List<Post>를 그대로 사용하면 순환참조 일어나서 큰일나는데 이거 막는것도 따로 있긴함. 무슨 어노테이션 3종류 있던데 그거 잘 써라(카더라).
근대 Entity그 자체를 직접 API data로 사용하는거는 위험하다고 들어서(왜인지는 기억안남) ..
그리고 JAVA11에 stream으로 바로 mapping해주는게 있던데 그거 잘 몰라서 직접 add하는 방식으로 했음.
원하는 결과가 나온다.
728x90
'Spring Boot > JPA' 카테고리의 다른 글
ENUM type 관리 (0) | 2021.01.30 |
---|---|
embedded type 관리 (0) | 2021.01.30 |
일반적인 Entity (0) | 2021.01.30 |
Spring JPA강의들은거 기록 (0) | 2021.01.30 |
Comments