티스토리 뷰

반응형

@OnDelete(action = OnDeleteAction.CASCADE) 설정

엔티티를 삭제할 때, FK로 연관 되어져 있는 엔티티가 있다면 삭제 시에 Constrain 에러가 발생한다. 해당 되는 엔티티를 직접 삭제 하는 방법도 생각해봤지만, (Result - Question - BookContent - Book) 이런식으로 연쇄적으로 연관 되어 있는 엔티티를 모두 삭제하는 것은 비효율적이라고 생각되어서 DB 테이블 상의 CASCADE 옵션을 고려 해봤다. 그러던 중, 테이블을 직접 설정하지 않고 JPA로만 설정 하는 방법을 찾으보니 역시 가능했다!! @OnDelete 설정으로 마치 DB 테이블상의 옵션처럼 FK로 연관되어져 있는 열을 삭제할때 같이 삭제되도록 설정이 가능했다.

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "book_id")
@OnDelete(action = OnDeleteAction.CASCADE)
private Book book;

@Builder 설정

기존에 생성자를 자동 생성하기 위해서 @RequiredArgsConstructor 애노테이션과 원하는 필드위에 @NonNull 애노테이션을 사용했지만 2가지 불편한 점이 있었다.


  1. 필드마다 @NonNull 설정을 하게 되어 불필요한 코드가 길어졌다. (차라리 생성자를 그냥 만드는게 효율적으로 보일 정도)
  2. 생성자로 Domain 객체를 생성시에 많은 필드명으로 어떤 값을 넣는지 모호하다. (같이 협업하던 친구도 이 부분을 생각해 Setter로 넣는 방법을 제안 했지만, 명시적이되 코드가 너무 길어지게 되어 생성자 방식을 선택했었다.)

그러던 중 Builder라는 객체 생성 방식을 알게 되었다. 원래는 Builder를 객체로써 직접 생성해야 하지만 롬복의 @Builder 설정만으로도 사용 가능했다. (롬복 짱짱ㅋㅋ)

//기존 생성자 이용방식 (어떤 필드에 어떤 값이 설정되는지 모호함)
QuestionCategory questionCategory = new QuestionCategory("어법", 1L, "apt");

//Builder를 이용한 객체생성 (어떤 필드를 쓰는지 명시적이고, Setter만큼 길지도 않다.)
QuestionCategory questionCategory = QuestionCategory.builder()
                .name("어법").parentId(1L).type("apt").build();

기본형에서 참조형으로

굳이 참조형을 쓰지 않아도 된다고 생각하는 필드의 타입을 기본형으로 설정했지만, 실제 view단에서 값을 넘겨 받는 과정을 하다보니 null이 설정 가능한 참조형 타입이 편하다는 것을 느껴서 가능한 모든 필드의 타입을 참조형 타입으로 변경했다. (이게 맞는 방법인지에 대한 확신은 아직 없다. 계속 사용해보고 장단점을 느껴봐야 알 것 같다.)

@Column(nullable = false)
private Boolean isMockTest; 

@Column
private Integer recommendTime;

@Column(nullable = false, columnDefinition = "int default 0")
private Integer questionCount;

☞해당 Domain github주소

반응형
댓글