개발일기장

DTO이용해서 entity 참조 된거 보내기 본문

Spring Boot/JPA

DTO이용해서 entity 참조 된거 보내기

게슬 2021. 2. 6. 12:18
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