SpringBoot/TOgether

postman post시 데이터의 id값이 null이 생기는 이유

kangchaewon 2024. 1. 17. 18:07
package com.backend.together.domain.post.dto;

import com.backend.together.domain.category.Category;
import com.backend.together.domain.enums.Gender;
import com.backend.together.domain.enums.PostStatus;
import com.backend.together.domain.mapping.PostHashtag;
import com.backend.together.domain.post.Hashtag;
//import com.backend.domain.post.PostImage;
import com.backend.together.domain.post.Post;
import com.backend.together.domain.post.PostImage;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import org.hibernate.Hibernate;

import java.util.ArrayList;
import java.util.List;
@Data
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class PostRequestDTO {


        @NotNull
         Long id;
        @NotNull
         Long memberId;
        @NotNull
         String title;
        @NotNull
        Gender gender;
        @NotNull
         Integer personNum;
        @NotNull
         String content;
        @NotNull
        PostStatus status;

        Long view;
//        @JsonIgnore // 무한 루프 방지
//        List<PostImage> postImageList;

        @NotNull // 바꿔야함
         Category category;
//    @JsonIgnore
//        List<PostHashtag> postHashtagList;


    public PostRequestDTO(Post post) {
        this.id = post.getId();
        this.memberId = post.getMemberId();
        this.title = post.getTitle();
        this.gender = post.getGender(); // enum
        this.personNum = post.getPersonNum();
        this.content = post.getContent();
        this.status = post.getStatus(); // enum
        this.view = post.getView();

        // Load the category to avoid Hibernate proxy issues
        Hibernate.initialize(post.getCategory());
        this.category = post.getCategory();

        ////    this.postImageList = post.getPostImageList();
//        this.postImageList = postImageList != null ? new ArrayList<>(postImageList) : null;
        this.category = post.getCategory(); //enum
////    this.postHashtagList = post.getPostHashtagList();
//        this.postHashtagList = postHashtagList != null ? new ArrayList<>(postHashtagList) : null;

    }

    // member

    public static Post toEntity(final PostRequestDTO dto) {
        return Post.builder()
                .id(dto.getId())
                .memberId(dto.getMemberId())
                .title(dto.getTitle())
                .gender(dto.getGender()) // enum
                .personNum(dto.getPersonNum())
                .content(dto.getContent())
                .status(dto.getStatus()) // enum
                .view(dto.getView())
//                .postImageList(dto.getPostImageList())
                .category(dto.getCategory()) // enum
//                .postHashtagList(dto.getPostHashtagList())
                .build();
    }

//    public Post toPost
}

 

 @PostMapping("/") // gender, memberid, category 해결해야함
    public ResponseEntity<?> createPost(@RequestBody PostRequestDTO requestDTO) {
        Post newPost = PostRequestDTO.toEntity(requestDTO);
        service.createPost(newPost);
        PostRequestDTO returnPostDTO = newPost

        return ResponseEntity.ok().body(requestDTO);
    }

원인 1: controller에서 id값이 설정되지 않은 dto값을 return해서 id값이 null로 뜬 것이었다.

@PostMapping("/") // gender, memberid, category 해결해야함
public ResponseEntity<?> createPost(@RequestBody PostRequestDTO requestDTO) {
    Post newPost = PostRequestDTO.toEntity(requestDTO);
    service.createPost(newPost);
    // 다시 조회하여 반환
    Optional<Post> savedPost = service.retrievePostById(newPost.getId()); // 예시로 findById 메서드를 사용했으며, 실제 사용하는 메서드에 따라 다를 수 있습니다.
    if(savedPost.isEmpty()) {
        return ResponseEntity.badRequest().body(savedPost);
    }
    return ResponseEntity.ok().body(savedPost);

}

-> 저장된 entity를 다시 조회하는 방식으로 수정

해결되었다.