반응형

ORM 9

[JPA] OneToOne

Order와 UserOrder는 1:1 식별관계다. MySQL의 Reverse Engineer로 테이블을 보면 1:N이 나와서 당황스러웠다. 🥹 결론은 코드에 문제 없다. MySQL Reverse Engineer의 문제라고 함,, orders 테이블 @Entity @Builder @AllArgsConstructor @Table(name = "orders") public class Order extends BaseTime { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "order_id") private Long id; @OneToOne(mappedBy = "order") private UserOrder userOrder; ..

ORM/JPA 2024.03.17

[MyBatis] 순서가 있는 답글

🟠 요구사항 답글은 최근에 등록된 것일수록 위에 있게 한다. 위의 이미지에서 18번 답글이 17번 답글보다 더 최신 답글이다. 16번 글은 18, 17번 답글의 부모 게시글이다. reboard 답글 테이블의 필드 article_no 답글이 달린 조상의 번호 depth 쉽게 생각하면, 들여쓰기 step 답글의 정렬 순서 parent_no 원글의 번호(누구의 답글인지?) => 내 바로 위 부모의 번호 🟢 MyBatis 및 서비스 1. 새 글을 작성했을 때 @Transactional @Override public void writeArticle(Reboard reboard) throws Exception { reboardMapper.writeArticle(reboard); reboardMapper.newRep..

ORM/MyBatis 2023.11.27

N+1 문제

N+1 문제 처음 실행한 SQL의 결과 수만큼 SQL을 더 실행한다. 즉시 로딩과 N+1 JPQL을 실행하면 JPA가 즉시 로딩/지연 로딩에 대해 신경쓰지 않고 SQL을 생성한다. 회원과 댓글이 1:N 양방향 연관관계라면, 회원을 조회했을 때 댓글도 조회된다. 조회하는 회원이 많으면 댓글도 그만큼 조회된다. SELECT * FROM MEMBER; SELECT * FROM COMMENTS WHERE MEMBER_ID=1; SELECT * FROM COMMENTS WHERE MEMBER_ID=2; SELECT * FROM COMMENTS WHERE MEMBER_ID=3; 지연 로딩과 N+1 즉시 로딩과 다르게 JPQL에서 N+1 문제가 발생하지 않는다. 회원과 댓글이 1:N 양방향 연관관계라면, 모든 회원에..

ORM/JPA 2022.10.27

@JoinColumn

@ManyToOne //@JoinColumn(name="id") @JoinColumn private Post post; @ManyToOne //@JoinColumn(name="id") @JoinColumn private User user; Comment 엔티티에 다음과 같이 조인을 했다. 댓글 엔티티 Comment는 게시글 엔티티 Post와 N:1관계 게시글 하나에 댓글을 여러 개 작성할 수 있다. 댓글 엔티티 Comment는 사용자 엔티티 User와 N:1 관계 한 사용자가 댓글을 여러 개 작성할 수 있다. @JoinColumn의 속성 name은 매핑할 외래 키 이름을 지정 기본값은 필드명 + _ + 참조하는 테이블의 기본 키 컬럼명 위의 경우는 post_id, user_id로 지정된다. 참고 👉 자바..

ORM/JPA 2022.05.19

변경 감지(Dirty Checking)

Entity를 수정할 때 데이터만 변경하면 된다. Entity의 변경사항을 데이터베이스에 자동으로 반영하는 기능을 Dirty Checking Dirty Checking은 영속성 컨텍스트가 관리하는 영속 상태의 Entity에만 적용됨 Entity의 모든 필드를 업데이트한다. 🤔 어떻게 Dirty Checking이 이루어질까? JPA는 Entity를 영속성 컨텍스트에 보관할 때, 최초의 상태를 복사해서 저장해둔다. 이를 '스냅샷'이라고 부른다. 플러시 시점에 스냅샷과 Entity를 비교해서 변경된 Entity를 찾는다. '플러시(flush)'는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것 ✨ Dirty Checking 적용 예시 public void update(String title, Stri..

ORM/JPA 2022.05.18

JPA를 이용한 데이터베이스 초기화

spring.jpa.generate-ddl = true 또는 false 실행 시 데이터베이스를 초기화하는 기능을 on/off spring.jpa.hibernate.ddl-auto none 아무것도 안함 create 기존 테이블은 삭제되고 새로 생성한다. validate 변경된 스키마가 있으면 변경된 점을 출력. DDL을 수정하지 않음. update 테이블과 엔티티를 비교해서 변경된 스키마 적용 create-drop 실행 시 테이블을 drop 및 생성, 종료 시 테이블을 drop 🟢 주의사항 개발 초기 단계는 create 또는 update를 쓴다. 테스트 서버는 update 또는 validate를 쓴다. 스테이징과 운영 서버는 validate 또는 none을 쓴다. 운영 서버에서 create, create..

ORM/JPA 2022.03.31

[Error] No default constructor for entity

✨ 해결 해당 entity에 lombok의 @NoArgsConstructor를 붙여줬다. @NoArgsConstructor를 클래스 위에 붙이면 기본 생성자를 lombok이 만들어준다. JPA를 쓰려면 default constructor가 필요 👇 참고 https://catchdream.tistory.com/128 No default constructor for entity jpa No default constructor for entity 계속해서 뜨는 에러 메시지이다. JPA 에서 Entity 는 기본 생성자를 가지고 있어야 한다는 제약조건이 있는 듯 하다. 아직 JPA 에서 기본 생성자나 어노테이션에 대한 개 catchdream.tistory.com https://tzara.tistory.com/7..

ORM/JPA 2022.01.25
반응형