spring boot main 프로젝트 해결

[JPA ERROR] Entity Patch(수정)하는 과정 오류

_DoYun 2022. 9. 15. 16:52

문제가 되는 부분은 main Entity인 teacher Entity의 일부를 patch api로 수정하는 과정에서 발생하였습니다. 다른 부분은 모두 수정이 원활하게 이루어 졌는데 teacher과 jpa mapping 된 skillTable이라는 Entity가 teacher Entity를 save를 통해 저장해도 함께 저장이 안되는 상황입니다.

 

@Entity
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long teacherId;

    @Column
    private String name;

    @Column
    private String password;

    @Column(nullable = false, unique = true)
    private String email;

    @Column
    private String roles;

    @Column
    private long reputation;

    @Column(columnDefinition = "Text")
    private String career;

    @Column(columnDefinition = "Text")
    private String aboutMe;

    @Column
    private String nickName;

    @OneToMany(mappedBy = "teacher", cascade = {CascadeType.PERSIST,CascadeType.REMOVE})
    private List<SkillTable> skillTableList = new ArrayList<>();

    @OneToMany(mappedBy = "teacher")
    private List<Tutoring> tutoringList = new ArrayList<>();

    @OneToMany(mappedBy = "teacher")
    private List<Review> reviewList = new ArrayList<>();

    /*@JsonManagedReference
    @OneToOne(mappedBy = "teacher", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
    private Images image;*/

    public void addReview(Review review){
        this.reviewList.add(review);
        if(review.getTeacher() != this){
            review.setTeacher(this);
        }
    }

    public void addTutoring(Tutoring tutoring){
        this.tutoringList.add(tutoring);
        if(tutoring.getTeacher() != this){
            tutoring.setTeacher(this);
        }
    }

    public void addSkillTable(SkillTable skillTable){
        this.skillTableList.add(skillTable);
        if(skillTable.getTeacher() != this){
            skillTable.setTeacher(this);
        }
    }

    public List<String> getRoleList() {
        if(this.roles.length() > 0) {
            return Arrays.asList(this.roles.split(","));
        }
        return new ArrayList<>();
    }
}

위 Entity의 skillTableList가 SkillTable Entity를 저장하는 공간입니다. Teacher Controller에서 수정에 필요한 Dto Entity를 가져오고 해당 부분을 service 로직을 통해 Teacher DB에 저장 및 SkillTableList 또한 DB에 저장하려고 했지만

다음 사진과 같이 분명 필드 값들을 넣어 줬는데 teacer Entity만 save하면 내용들이 모두 사라지고 null값이 되는 것을 확인할 수 있었습니다. 

 

해결방법은 다음과 같습니다. 

CascadeType.Persist 부분을 Merge로 바꿔주었습니다. Entity를 수정하는 repository save는 CascadeType.Merge가 필요한 것 같습니다. 

 

더불어 patch api를 여러번 클릭하면 DB에 똑같은 SkillTable이 여러개 저장되는 오류도 있었는데, Persist 부분을 제거하는 것으로 해결할 수 있었습니다.