개발공부/JPA 스터디(9)
-
[JPA] 생성키 전략
생성키 전략 IDENTITY는 auto increment를 뜻하는데, mysql 외 DB 벤더들은 이를 지원하지 않기 때문에 SEQUENCE를 사용합니다. Identity sequencing DB에 있는 IDENTITY 컬럼을 이용해 객체에 자동으로 id를 부여하는 방법입니다. MySQL, Postgres에서 지원하며, Oracle은 지원하지 않습니다. 장점만 있는 것은 아니며, DB에 insert 되기 전에 id가 부여되지 않기 때문에 flush가 돼야만 id를 획득할 수 있습니다. Sequence objects DB 객체들을 사용해 id를 생성합니다. Oracle, Postgres에서 지원합니다. INCREMENT를 DB의 시퀀스 객체에 설정해놓기 때문에 id 선할당(preallocation)이 가능..
2022.06.01 -
[ORM 표준 JPA] 16장(완결) 2차 캐시와 락
트랜잭션과 락, 2차 캐시 1) 트랜잭션과 락 트랜잭션은 ACID를 보장해야합니다. A(Atomicity) 원자성: 트랜잭션 내 실행한 작업들을 마치 하나인 것처럼 모두 실패하거나 성공해야 합니다. C(Consistency) 일관성: 모든 트랜잭션은 일관된 DB를 만족해야 합니다. 데이터 무결성 I(Isolation) 격리성: 동시에 실행되는 트랜잭션은 서로에 영향을 미치지 않도록 격리합니다. 격리성은 동시성과 관련된 성능 이슈 로 격리 수준을 선택할 수 있습니다. D(Durability) 지속성: 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 생겨도 DB 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 합니다. 참고로 트랜잭션은 원자성, 일관성, 지속성을 보장..
2021.09.05 -
[ORM 표준 JPA] 15장 고급주제와 프록시, 성능개선
예외 처리 JPA를 사용할 때 발생하는 다양한 예외와 예외에 따른 주의점 트랜잭션 롤백 시 주의사항* Spring 프레임워크 처리: OSIV처럼 영속성 컨텍스트 범위를 트랜잭션보다 크게 사용할 때 문제가 발생한 트랜잭션을 롤백하더라도 다른 트랜잭션에서 영속성 컨텍스트를 사용할 가능성이 있습니다. 하지만 이럴 경우 롤백이 영속성 컨텍스트를 포함하도록 범위를 지정해주기 때문에 예방해줍니다. 엔티티 비교 엔티티를 비교할 때 주의점과 해결 방법을 설명 애플리케이션 수준의 반복 가능한 읽기* 엔티티 조회 시 항상 같은 엔티티 인스턴스 반환(동등성;equals 비교 수준이 아닌 정말 주소값이 같은 동일성 인스턴스를 반환합니다.)Member member1 = em.find(Member.class, "1L"); Mem..
2021.09.05 -
[ORM 표준 JPA] 14장 컬렉션과 부가기능
컬렉션 persist, 엔티티를 영속성 상태로 변경하면 하이버네이트가 제공하는 PersistentBag로 전환됩니다. 컬렉션 종류 Collection, List Set: 중복 허용 X equals() + hashcode()로 검증합니다. Set은 엔티티를 추가할 때 중복 엔티티가 있는지 확인해야하기 때문에 지연 로딩된 컬렉션을 초기화 합니다. List + @OrderColumn List로 받을 때 순서가 정해진 상태로 리턴됩니다. 하지만 @OrderColumn은 연관 엔티티 중 FK가 있는 엔티티에만 종속적이고 제한적인 부분이 있기 때문에 @OrderBy를 권장합니다. @Converter 컨버터를 사용하면 엔티티의 데이터 타입을 변환해서 테이블에 저장할 수 있습니다. 그 반대도 가능합니다. 글로벌 설정 ..
2021.08.30 -
[ORM 표준 JPA] 15장 프록시 심화
어느새 스터디가 한 주를 남기고 있습니다. 넥스트 스텝 교육을 병행하기가 이렇게 힘들줄은 생각못한 자신에게 반성시키고 싶지만 그래도 고생한만큼 마무리까지 잘하도록 하겠습니다. JPA 프록시 심화 우선 프록시는 실제 DB에 접근하지 않아도 된다는 성능에 있어 강점을 가진 엔티티 호출 방식입니다. JPA는 지연 로딩을 통해 원본 엔티티 대신 프록시를 참조하며 프록시는 원본 엔티티를 상속받아 객체의 참조를 보관하고 있습니다. 때문에 메서드 호출을 프록시로 할 경우 프록시는 실제 엔티티에 호출을 전달하게 됩니다. 프록시 테스트 중 member 엔티티에서 Spring Data JPA 프록시 호출 메서드인 getById를 사용해도 프록시가 생성되지 않는 오류가 있었는데 원인은 엔티티 구조상 있는 것으로 보여서 찾고..
2021.08.30 -
[실무 JPA] 엔티티 생성
회사 어드민 서버가 C# .NET으로 이루어져 있는데 이번에 범용성이 넓고 저한테 익숙한 Java Spring으로 이전하는 작업을 맡게 되었습니다. 그리고 SQL 처리를 MyBatis가 아닌 JPA를 사용하기로 했습니다. :) 소스코드 파악이 어느정도 되면 이관하는 작업을 진행하려 했습니다. 다만 Spring으로 이루어진 앱 서버의 DB는 파악하고 있기 때문에 우선 엔티티 이전 작업을 시작했습니다. 그 후 API 단위로 Controller, Service 단의 코드를 이전하려 합니다. JPA 엔티티 생성 IntelliJ의 Database Tool을 사용하면 IDE에서 DB 데이터를 볼 수 있어 편합니다. 엔티티 생성도 Database 연결 POJO Groovy 사용해 엔티티 생성 설정값 지정 Genera..
2021.08.04