목록Framework/JPA (6)
코딩하는 오징어
JPA는 잘 알고 사용하면 굉장히 좋은 framework이지만 잘 모르고 사용한다면 여러가지 문제가 발생하는 어려운 친구이다. 여기서 다루는 문제외에도 N+1문제등 몇 가지 주의해야할 부분들이 있지만 해당 내용들은 다른 글에서 다루어 보겠다. 이번 글에서는 영속성 컨텍스트의 동작 방식에 의해 트랜잭션의 격리 수준이 정상적으로 동작하지 않는 것 처럼 보이는 것에 대해 공유하려한다. 먼저 트랜잭션 격리 수준에 대해 잘 모르겠다면 다음 글을 한번 보고 나서 해당 글을 읽으면 도움이 될 것 같다. 2018/03/09 - [Database/MySQL] - 데이터베이스 Transaction Isolation Level 데이터베이스 Isolation Level 오늘은 데이터베이스의 isolation level이 무엇..
클래스 정의 제약 사항 JPA를 사용하게 되면 대부분 Hibernate를 구현체로 사용하게 된다. Hibernate를 구현체로 사용하게 되면 Entity로 사용할 클래스에 몇 가지 제약사항이 존재한다. https://docs.oracle.com/javaee/5/tutorial/doc/bnbqa.html 위의 문서를 보면 다음과 같은 글이 있다. Requirements for Entity Classes An entity class must follow these requirements: The class must not be declared final. No methods or persistent instance variables must be declared final. Entity의 해당하는 클래스는 ..
Kotlin으로 JPA를 이용해 개발할 때 주의할 점인자없는 기본생성자JPA의 Entity들은 기본적으로 인자없는 기본생성자가 필요하다. 하지만 코틀린에서 주생성자가 있다면 기본생성자가 없다. 디폴트 파라미터를 통해 기본생성자가 생성되게 할 수 있지만 프로퍼티가 많아지면 모든 Entity에 디폴트 파라미터를 넣기 힘들어진다. 다음과 같이 해결 할 수 있다.dependencies { ... // JPA entity들은 기본적으로 기본생성자가 필요하다. 하지만 주 생성자가 존재하면 기본생성자가 없다. // @Entity가 붙은 클래스들에 한해서 자동으로 인자없는 생성자를 추가해준다. classpath("org.jetbrains.kotlin:kotlin-noarg:${kotlinVersion}") } // @..
JPA 기본EntityManagerFactory & EntityManagerEntityManagerFactory: EntityManager를 만드는 공장Datasource하나당 하나의 EntityManagerFactory를 만들어 사용EntityManagerFactory를 생성하는 작업은 비용이 크기 때문에 싱글톤으로 만들어 사용Thread-safeEntityManagerFactory emf = Persistence.createEntityManagerFactory("kakaopay"); EntityManager: entity를 생성, 수정, 삭제, 조회하는 등 entity와 관련된 일들을 처리EntityManagerFactory를 이용하여 EntityManager를 생성하는 비용은 거의 들지 않음.Thr..
JPA에서의 Isolation With LockJPA는 데이터베이스 트랜잭션 격리 수준을 READ COMMITTED 정도로 가정한다. 일부 로직에 더 높은 격리 수준이 필요하면 낙관적 락과 비관적 중 하나를 사용하면 된다.Optimistic Lock(낙관적 락)버전정보를 이용하여 업데이트를 처리하는 방법버전정보로 사용할 컬럼에 @Version 애너테이션을 부여해야함optimistic locking is based on detecting changes on entities by checking their version attributeUPDATE {TABLE_NAME} SET {COL_A} = ?, VERSION = ? (버전 + 1 증가) WHERE ID = ? AND VERSION = ? (버전 비교)..
QueryDsl이란?JPQL의 빌더(Criteria)클래스QueryDsl 사용전 설정dependency 추가dependencies { compile("com.querydsl:querydsl-core:4.2.1") compile("com.querydsl:querydsl-apt:4.2.1") compile("com.querydsl:querydsl-jpa:4.2.1") compile("com.querydsl:querydsl-collections:4.2.1") ... } Q클래스를 먼저 생성 후 컴파일 되어야 하므로 task를 먼저 실행시켜야함def queryDslOutput = file("src-gen/main/java") sourceSets { main { java { srcDir "src-gen/main/..