본문 바로가기

JPA8

FullCalender 성능 최적화(& 리팩토링) FullCaleder 오픈소스를 이용한 스케줄 관리 졸업작품 프로젝트를 진행하는 도중 다양한 문제가 계속해서 발생했고 차근차근 수정하려 하는 중인데, 현재 직면한 가장 큰 문제는 쿼리 성능 최적화이다!.. 전체 스케줄 페이지를 클릭하는 경우 , DB 에 스케줄 데이터가 100개도 안됨에도 불구하고 버벅이며 페이지가 열리는 현상이 발견됐고, 로그를 확인해보니 어마어마한 쿼리문이 찍히고 있었다. (단 한번의 클릭만으로 어마어마한 스크롤 길이..) 다른 문제들보다 가장 시급한 문제라고 생각됐고, 최근 들었던 강의(쿼리 성능 최적화)를 활용할 수 있는 좋은 기회라 생각돼서 실제 프로젝트에 적용해보려 한다. 쿼리문을 분석해보니 다음과 같은 코드가 스케줄의 개수만큼 반복되고 있음을 확인할 수 있었다. 양방향 연관관.. 2022. 5. 6.
지연 로딩 & 조회 @JsonIgnore 스프링 부트 활용 강의 중, @JsonIgnore 에 관한 내용이 존재한다. @JsonIgnore 는 무한 루프 조인을 막기 위해서 쓰는 어노테이션인데, 예를 들면 다음과 같다. (위의 예에서 @JsonIgnore 는 무시) Order 를 조회하는 경우, XtoOne 관계로 이어진 Member 와 Delivery 가 문제가 된다. Order 에서 Member 를 조회하면 위와 같은 Member 에서 조회를 하게 되는데 이 때, List orders 가 조회되게 된다. 그렇게 되면 또 다시 Order 테이블로 들어가서 조회를 하다가 다시 Member 를 조회하고 이게 무한 루프로 조회하며 장애를 일으킨다. 이렇듯 양방향 연관관계가 걸린 경우, 한쪽은 반드시 @JsonIgnore 처리를.. 2022. 3. 23.
변경 감지(Dirty Checking) & 병합(Merge) JPA 에는 따로 Update 에 관한 쿼리문이 존재하지 않고 ( @Query로 만드려면 만들겠지만 ) Update 를 변경 감지와 병합 두 방법을 통해서 실행하게 된다. 변경 감지(Dirty Checking) 과 병합(merge) 에 대해서 알기 전에 영속 컨텍스트와 준영속 엔티티 두 개념에 대해서 알아야 한다. 영속성 컨텍스트란 ? JPA 에 존재하는 엔티티 매니저를 통해 쿼리문을 날리면 자동으로 해당 엔티티는 영속성 컨텍스트에 들어가서 트랜잭션이 끝나는 시점까지 따로 관리하게 된다. 앞선 JPA 포스팅에서 다룬적이 있는데, Member member = new Member(); 로 객체만 생성한 경우 비영속 상태 memberService.save(member) 처럼 DB에 쿼리를 날린 경우 영속 상태.. 2022. 3. 21.
스프링 게시판 만들기 - 1 (초기 설정) 회원 가입, 로그인 , 기본적인 게시판 CRUD 를 구현 해보는 간단한 토이 프로젝트를 구현해보고자 한다. (추가적으로 페이징 처리, 댓글, spring-validation , spring-security 도 구현&사용해 보고자 하나 천천히 수정해나가는걸로..) 기본 설정 사용 언어 : Java Spring , JPA , Thymeleaf DB : H2 https://start.spring.io/ 에서 기본 세팅. Spring 을 사용할 예정이기에 Spring Web 추가 , 사용의 편리를 위한 Lombok DB 를 위해 H2 Database 를 추가 , JPA 추가 템플릿 엔진으로는 Thymeleaf 추가 Lombok 사용을 위해 설정 -> Annotation Processors 검색 -> Enable.. 2022. 1. 11.
JPA Basic - 4 연관관계 매핑 객체와 테이블 연관관계의 차이를 이해하고 , 객체의 참조와 테이블의 외래키를 매핑하는 것에 대해 알아본다. @Entity public class Members { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Teams teams; @Entity public class Teams { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; 다음과 같은 .. 2021. 12. 28.
JPA Basic - 3 객체와 테이블 매핑 @Entity : JPA 가 관리하는 클래스를 뜻한다. 주의할 점으로는 1. 기본 생성자 필수(파라미터 없는 public 또는 protected 생성자) 2. final, enum , interface , inner 클래스 사용 불가 3. 저장할 필드에 fianl 사용 불가 @Table : 엔티티와 매핑할 테이블을 지정한다. 데이터베이스 스키마 자동 생성 @Entity 가 붙어있으면 알아서 테이블을 Create 해서 생성해준다. persistence.xml 파일의 hibernate 설정을 다음과 같이 바꿔줄 수도 있다. 필드와 컬럼 매핑 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package hellojpa; im.. 2021. 11. 18.