오늘로 주특기 심화 주가 마무리된다.
이번 주 학습 과제의 주요 포인트는 Spring Security, Oauth, AOP 세 가지 정도로 볼 수 있을 것 같다.
lv5 과제까지 모두 완료할 수 있었는데, 과제를 수행하면서 발생한 문제와 해결 과정에 대해서 회고해보고자 한다.
필드가 Null로 Insert 되는 경우
게시물에 좋아요 기능을 구현하기 위해서, 게시물 엔티티의 좋아요 숫자를 집계하는 필드를 생성하였다.
실행 결과, 필드 값이 내가 의도했던 값인 0이 아니라 Null로 들어가 있는 것을 확인했다.
구글링 해보니 JPA가 변경을 감지하여 update 쿼리를 날리게 되면, 수정된 컬럼만 수정하는 것이 아니라 전체 컬럼을 수정하는 쿼리문을 날리게 된다고 한다. likeCount 필드의 값을 지정해주지 않았으니, Null로 값이 들어가게 되는 것이였다.
위 현상은 @DynamicInsert 어노테이션을 엔티티에 적용해서 해결할 수 있었다.
이 어노테이션을 적용하면, Insert 쿼리를 날릴 때, Null인 값은 제외하고 쿼리문이 만들어지게 된다.
실행해보니, 의도했던 대로 Default 값이 0으로 들어오는 것이 확인되었다.
연관관계가 맺어진 엔티티 삭제 시 에러 발생
게시물과 게시물 내 댓글에는 각각 좋아요 기능이 구현 가능하도록 연관관계를 맺어두었다.
문제는 좋아요가 눌려있는 게시물이나 댓글을 삭제할 때, 에러가 발생했다.
분석해보니 외래키에 설정되어 있는 제약조건에 의해 오류가 발생한 것이였다.
별다른 설정없이 게시물 엔티티를 삭제하게 되면, Likes 엔티티는 그대로 남게되고 외래키로 값을 읽어올 부모 엔티티가 사라져 버리게되어 값을 참조할 수 없게 된다.
이러한 문제를 방지하기 위해서, 외래키를 생성할 때 자동적으로 부모 엔티티가 먼저 삭제될 수 없도록 제약조건이 설정된다.
에러 발생 원인은 위 제약조건을 위반하였기 때문이다. 따라서, 게시물 삭제 시, 좋아요 엔티티도 함께 삭제될 수 있도록 설정해주어야 했다.
Cascade 속성
부모 - 자식 관계에 있는 도메인에 적용할 수 있다.
부모 엔티티가 영속화될 때, 자식 엔티티도 함께 영속화된다. 예를 들어 부모 엔티티가 삭제될 시 자식엔티티도 같이 삭제되게 설정할 수 있다.
정리하면, 특정 엔티티에 대해 특정한 작업을 수행하면, 관련 엔티티에도 동일한 작업을 수행하는 것이다.
CascadeType.ALL : 모든 Cascade를 적용
CascadeType.PERSIST : 엔티티를 영속화할 때, 연관된 엔티티도 함께 유지
CascadeType.MERGE : 엔티티 상태를 병합(Merge)할 때, 연관된 엔티티도 모두 병합
CascadeType.REMOVE : 엔티티를 제거할 때, 연관된 엔티티도 모두 제거
CascadeType.DETACH : 부모 엔티티를 detach() 수행하면, 연관 엔티티도 detach()상태가 되어 변경 사항 반영 X
CascadeType.REFRESH : 상위 엔티티를 새로고침(Refresh)할 때, 연관된 엔티티도 모두 새로고침
orphanRemoval = true 속성
부모 엔티티와 연관관계가 끊어진 자식 엔티티(고아 객체)를 자동으로 삭제하는 기능이다.
CascadeType.REMOVE 와 동일하게 사용될 수 있으나, 특정 엔티티가 개인소유하는 엔티티에만 기능을 적용해야한다.
@OneToOne , @OneToMany에 사용한다.
게시물과 댓글에 위의 속성을 적용하여 문제를 해결할 수 있었다.
느낀 점
주특기 주차가 오늘로 끝나게 되었다. 3주 동안 스프링을 학습했는데, 별 탈없이 따라갈 수 있었다는 점에서 다행이라고 생각한다. 워낙 짧은 기간에 스프링, Security, JPA를 배우다보니 각 프레임워크의 작동 흐름에 대해서 집중적으로 알아보고자 했다. 결과적으로는 어느정도 코드에 익숙해질 수 있었다고 생각한다.
하지만, 좀 더 심화된 난이도의 코드나 이론적인 내용을 접할 때 기초가 부족하다는 것을 많이 체감할 수 있었다.
Spring Boot 나 Spring Data JPA 에 기대어 프로젝트를 진행했기 때문에 아직까지도 헷갈리는 것이 많고 속이 비어있다고 느꼈다. Security는 어느정도 틀이 있다보니 상관이 없지만, Spring 이나 JPA에 대해서는 반드시 책을 구매해서 다시 천천히 복습해야겠다는 생각이 든다.
'항해99' 카테고리의 다른 글
항해 99 - 2023.03.01 TIL (0) | 2023.03.01 |
---|---|
항해 99 - 2023.02.25 TIL (0) | 2023.02.25 |
항해 99 - 2023.02.18 TIL (0) | 2023.02.18 |
항해 99 - 2023.02.16 TIL (0) | 2023.02.16 |
항해 99 - 2023.02.15 TIL (0) | 2023.02.16 |