본문 바로가기

728x90
반응형
SMALL

JPA

(11)
p6spy를 활용하여 JPA 쿼리로그 value 보기 JPA를 사용하다보면 show_sql, format_sql 옵션으로 쿼리 로그를 남기곤 함.. 근데 왠걸 value에 어떠한 값이 들어있는지 확인할 수가 없음. 이런 느낌으로 물음표로 대체됌. 이렇게 되면 로그 보는 의미가 없으니, 물음표말고 내가 무슨 값을 넣었는지 확인할 수 있게 해주겠음. 우선 의존성 주입 ㄱㄱ implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' 사실 이것만 해줘도 쿼리에 제대로 값이 찍혀나온다.. 근데 너무 안이쁘니 포맷팅을 해주자 @Component public class MultiLineFormat extends JdbcEventListener implements MessageFormattingSt..
JPA 와 Mybatis 같이 사용하기 안녕하세요. JPA 는 ORM 으로 단순 CRUD 처리에 대해 편리하게 해주는데요. 실무에서 정산 쿼리나, 복잡한 여러 조인이 필요한 쿼리들이 있을 때에는, JPA 보단 mybatis를 혼용해서 쓴다고 합니다. 그래서 지금 JPA 와 MyBatis 를 혼용하여 쓰고, 한 트랜잭션 안에 잘 묶여있는지 확인 테스트 까지 해보겠습니다. 데이터베이스는 h2 database 를 사용하겠습니다. (경량용 디비로 테스트 하기에 적합함.) h2사용법 H2 Database 란? 그리고 사용법? H2 Database 란? H2는 자바로 작성된 관계형 데이터베이스 관리 시스템이다. 장점 따로 설치가 필요없다 용량이 매우 가볍다 웹용 콘솔(쿼리툴) 제공하여 개발용 로컬DB로 사용 용이 특징 JAVA로 작성 yjkim-dev...
변경된 칼럼만 update 하기. Dirty Checking으로 생성되는 update 쿼리는 기본적으로 모든 필드를 업데이트한다. 또한 JPA는 전체 필드를 업데이트하는 방식을 기본값으로 사용한다. 필드가 20~30개 이상인 경우에 전체 필드 update가 부담스러운 경우 (이런 경우 정규화가 잘못된 확률이 높다.) @DynamicUpdate로 변경 필드만 반영되도록 할 수 있다. 엔티티 최상단에 @DynamicUpdate를 선언해준다. @Entity @Getter @DynamicUpdate //변경된 데이터만 업데이트 public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String teamName; } 끝
Dirty Checking(더티 체킹) 이란. JPA는 조회, 저장, 삭제에 대한 기능을 제공하지만, 수정에 대한 기능이 따로 존재하지않는다. 그래서 Dirty Checking 이란 것을 제공한다. JPA에서는 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 데이터베이스에 자동으로 반영해준다. 변화의 기준은 최초 조회 상태이다. 이런 JPA 에서는 수정에 대한 기능이 따로 존재하지 않기 때문에, Dirty Checking 을 제공해주는데. Dirty Checking은 Transaction 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베이스에 반영하는 JPA 특징이다. 이해를 위해 예시를 보자. Member라는 테이블에 ID=5 에 해당하는 데이터가 들어있다. [Controller] @PutMapping("/test") pub..
QueryDSL 연산자 비교식 정보 //Standard Alternative expr isNotNull expr is not(null) expr isNull expr is null expr eq "Ben" expr === "Ben" expr ne "Ben" expr !== "Ben" expr append "X" expr + "X" expr isEmpty expr is empty expr isNotEmpoty expr not empty // boolean left and right left && right left or right left || right expr not !expr // comparison expr lt 5 expr = 5 expr notBetween(2,..
Insert Query 줄이기(성능개선) Member.java public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; } Team.java public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String teamName; @OneToMany(mappedBy = "team") private List memberList; }..
N+1 문제 Member.java public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @JsonBackReference @ManyToOne @JoinColumn(name = "team_id") private Team team; } Team.java public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String teamName; @JsonManagedReference @OneToMany(mappedBy = "team") private L..
JPQL 사용 시 DTO Mapping 하는 법 예를 들어 테이블명 User 칼럼 id name age height nickname address 있다고 가정 해본다. 프론트는 서버로 요청할 것이다. ([ex] id 값이 5인 사람의 주소를 줘) 서버는 데이터베이스에 있는 자료를 찾아서 id값이 5인 사람의 주소(address)를 반환 해줘야 한다. 프론트로부터 받은, 파라미터 id = 5 가지고, 우리는 spring data jpa 를 이용하여 쿼리를 날린다. id = 5 라고 가정. userRepository.findById(id); 위의 메소드를 이용을 하면, jpa 에서는 자동적으로 쿼리를 만들어 데이터베이스의 데이터들을 조회해온다. 이때 발생되는 쿼리는 select id,name,age,height,nickname,address from us..

728x90
반응형
LIST