본문 바로가기
Spring/JPA + Security

[Spring Data JPA] 게시판 띄우는 로직 만들기 1-1 무한 참조 오류

by pyogowoon 2023. 1. 10.

 

* 오류가 뜬 경우 아마 무한 참조 오류가 발생했을것입니다. 발생하지않은 경우

로직 만들기 2 로 가도 무방합니다.

 

 

public void 사진업로드(ImageUploadDto imageUploadDto, PrincipalDetails principalDetails){
   UUID uuid = UUID.randomUUID(); //uuid 하는 이유 = 만약 같은이름의 파일이 uuid 없이 올라온다면 덮어씌워지기 때문에
    String imageFileName= uuid+"_"+ imageUploadDto.getFile().getOriginalFilename(); //1.jpg
    System.out.println("이미지 파일 이름  =" + imageFileName);

    Path imageFilePath = Paths.get(uploadFolder+imageFileName); //실제 경로 적어야함

    //통신 , I/O 일어날때는 예외가 발생할 수 있기때문에 예외처리 해야함
    try{
        Files.write(imageFilePath,imageUploadDto.getFile().getBytes());
                    //첫번째로 경로,2. 실제 파일을 byte화 해서 넣어야함, 3.옵션값인데 생략가능
    }catch(Exception e){
            e.printStackTrace();
    }
    Image image = imageUploadDto.toEntity(imageFileName,principalDetails.getUser());
    Image imageEntity = imageRepository.save(image);

    System.out.println(imageEntity);
}

 imageService에서 사진업로드() 메서드의 맨마지막 

Sysout   imageEntity 떄문에 오류가 발생하는데.

 그 이유는 sysout 메소드가 실행되면서 imageEntity에 대한 각 데이터(필드)들을 읽어올때

toString이 실행된다 (toString은 롬복의 @Data에 의해 자동으로 생성됨) 결과적으로

 image 도메인의 내부를 하나씩 실행하다가 image 의 User 필드를 만나서

User가서 또 실행하다가 <List>image를 만나고 무한 반복되기 때문에 오류가 발생하는 것이다.

 

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class Image {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String caption;
    private String postImageUrl;  // 사진을 전송받아서 그 사진을 서버에
    // 폴더에 저장하게될것 - DB에는 경로를 인서트

    @JoinColumn(name="userId") //foreign 키 이름 지정
    @ManyToOne // 한명이 많은 이미지를 올릴 수 있고 이미지는 하나의 이미지가 여럿일수없으니
    private User user; // db에 오브젝트 자체를 저장할 순 없고 이대로면 foreign key로 저장됨

    //이미지 좋아요

    //이미지 댓글

    private LocalDateTime createDate;

    @PrePersist
    public void createDate() {
        this.createDate = LocalDateTime.now();
    }

    @Override
    public String toString() {
        return "Image{" +
                "id=" + id +
                ", caption='" + caption + '\'' +
                ", postImageUrl='" + postImageUrl + '\'' +
                ", createDate=" + createDate +
                '}';
    }
}

 그렇기 때문에 image 도메인에서 toString을 따로 호출한 후 User에 대한 부분을 지워주면 오류가 해결된다.

댓글