2021-03-23-TIL
2021-03-23-TIL
@Transactional(readOnly = true)
@Transaction READONLY 를 붙이면 기본적으로 flush를 안해서 성능이 좋아진다.
Spring Data JPA 문서가 이 동작을 설명한다. readOnly 플래그는 JDBC 드라이버에 성능 최적화 힌트로 전달되고, Hibernate를 쓸 때는 Spring이 플러시 모드를 MANUAL로 바꾼다. 그러면 Hibernate가 트랜잭션 커밋 시점에 변경 감지(dirty checking)를 건너뛰어서, 큰 객체 그래프를 조회할 때 이득이 크다. 다만 문서는 이 플래그가 수정 쿼리를 막는 검사 장치는 아니라고 덧붙인다. 일부 DB만 읽기 전용 트랜잭션에서 INSERT/UPDATE를 거부한다.
https://2ham-s.tistory.com/184
이전 커밋에 파일 추가하기
방금 한 커밋에 파일을 빠뜨렸다면 파일을 스테이징하고 git commit --amend --no-edit로 마지막 커밋을 고친다. 더 이전 커밋이라면 git rebase -i에서 해당 커밋을 edit으로 표시하고, 리베이스가 그 커밋에서 멈추면 파일을 스테이징해 git commit --amend 후 git rebase --continue를 실행한다. 두 방법 모두 커밋 해시가 바뀌므로 이미 푸시한 커밋이라면 강제 푸시가 필요하다.
https://stackoverflow.com/questions/14096721/how-to-add-file-to-a-previous-commit/14096773#:~:text=Stage%20your%20files%20to%20add,run%20git%20rebase%20%2D%2Dcontinue%20.
양방향 연관관계
DB 테이블은 외래 키 하나로 양쪽 조인이 모두 되지만, 객체는 참조가 있는 쪽으로만 이동할 수 있다. 그래서 양쪽에서 서로를 탐색하려면 양쪽에 참조를 두는 양방향 매핑을 쓴다. 이때 외래 키를 실제로 관리하는 쪽을 연관관계의 주인으로 정한다. 보통 외래 키가 있는 테이블에 매핑되는 @ManyToOne 쪽이 주인이고, 반대편 @OneToMany에는 mappedBy를 지정해 읽기 전용임을 표시한다. 주인이 아닌 쪽에만 값을 넣으면 외래 키가 저장되지 않으므로, 양쪽 참조를 함께 설정하는 연관관계 편의 메서드를 두는 것이 일반적이다.
1
2
3
4
5
6
7
8
9
10
@Entity
public class Question {
@OneToMany(mappedBy = "question")
private List<Answer> answers = new ArrayList<>();
public void addAnswer(Answer answer) {
answers.add(answer);
answer.setQuestion(this); // 주인 쪽도 함께 설정
}
}
- https://velog.io/@conatuseus/%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91-%EA%B8%B0%EC%B4%88-2-%EC%96%91%EB%B0%A9%ED%96%A5-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84%EC%99%80-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84%EC%9D%98-%EC%A3%BC%EC%9D%B8
- https://stackoverflow.com/questions/5360795/what-is-the-difference-between-unidirectional-and-bidirectional-jpa-and-hibernat
- https://www.javaguides.net/2019/08/jpa-hibernate-one-to-many-bidirectional-mapping-example.html
- https://www.baeldung.com/jpa-many-to-many
- https://ict-nroo.tistory.com/122
- https://github.com/codesquad-members-2021/spring-boot-qna/pull/84
JPA Cascade
영속성 전이(cascade)는 부모 엔티티에 대한 영속성 작업을 연관된 자식에게도 적용하는 설정이다. CascadeType에는 PERSIST, MERGE, REMOVE, REFRESH, DETACH와 이를 모두 포함하는 ALL이 있고, 기본값은 아무것도 전이하지 않는 것이다. 질문을 지우면 답변도 지워지는 것처럼 자식의 생명주기가 부모에 완전히 종속될 때만 쓰는 것이 좋다. 여러 부모가 공유하는 엔티티에 REMOVE를 걸면 다른 곳에서 쓰는 데이터까지 지워진다.
- https://howtodoinjava.com/hibernate/hibernate-jpa-cascade-types/
Soft Deletes
소프트 삭제는 행을 실제로 지우지 않고 deleted 플래그나 삭제 시각 컬럼만 바꿔 삭제된 것으로 표시하는 방식이다. 복구와 감사 기록에 유리하지만, 모든 조회에서 삭제된 행을 빼야 한다. Hibernate에서는 @SQLDelete로 DELETE 대신 실행할 UPDATE 문을 지정하고, @Where(clause = "deleted = false")로 조회 조건을 자동으로 붙이는 방법이 링크된 질문의 답변이다. 유니크 제약이 삭제된 행과 충돌할 수 있다는 점도 설계할 때 고려해야 한다.
- https://stackoverflow.com/questions/19323557/handling-soft-deletes-with-spring-jpa
공부할 책
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788960777330&orderClick=LAG&Kc=
댓글
아직 댓글이 없습니다