Techvu

    AllocationSize 를 통한 성능 최적화

    AllocationSize 를 통한 성능 최적화 TABLE 이나 SEQUENCE 전략을 사용할 때, @SequenceGenerator 에 allocationsize 옵션을 설정하여 INSERT 에 관한 성능 최적화를 할 수 있다. allocationsize 의 기본값은 50인데 왜 50으로 설정이 되었을지 테스트를 통해서 배워보자. Test @SequenceGenerator( name = "MEMBER_SEQ_GENERATOR", sequenceName = "MEMBER_SEQ", initialValue = 1, allocationSize = 50) @NoArgsConstructor @Getter @Setter @Entity public class Member { @Id @GeneratedValue(st..

    기본키 매핑 전략에 따른 INSERT QUERY 실행 시점

    기본키 매핑 전략에 따른 INSERT QUERY 실행 시점 JPA 의 기본키 생성 전략 중, IDENTITY 와 SEQUENCE 전략을 사용할 때, 실제 언제 INSERT QUERY 가 나가고 어떻게 영속성 엔티티에 들어가서 관리되는지 확인해보자. IDENTITY @DisplayName("IDENTITY 전략 테스트") @SpringBootTest class IdentityStrategyTest { @Value("${persistence.unitname}") private String persistenceUnitName; @DisplayName("em.persist() 시 INSERT 쿼리가 나가는지 테스트") @Test void insertQueryIsWorkAtPersist() throws Excep..

    EntityManager 를 쓰레드간 공유하면 안되는 이유

    EntityManager 를 쓰레드간 공유하면 안되는 이유 EntityManager 를 쓰레드간 공유하면 안되는 이유에 대해서 배워보자. Test 테스트할 주제는 EntityManager 를 하나로 사용하고 있는 상태에서 서로 다른 Thread 두 개를 생성하고 ThreadA 는 데이터베이스에서 데이터를 읽어와 1차 캐시에 저장하는 역할을 하고, ThreadB 에서는 데이터 조회와, 데이터 수정 작업을 담당하게끔 코드를 짜서 테스트할 것이다. 포인트는 ThreadB 에서 데이터를 읽어올 때, 1차 캐시에 존재하는 데이터를 읽어올지, 데이터베이스로부터 값을 조회해올지가 포인트다. @DisplayName("1차 캐시 테스트") @SpringBootTest class FirstCacheTest { @Value..

    JPA 는 과연 1차 캐시를 통해서 Repeatable Read 를 지원할까?

    JPA 는 과연 1차 캐시를 통해서 Repeatable Read 를 애플리케이션 레벨에서 지원할까 ? 이번 주제는 JPA 는 과연 1차 캐시를 통해서 Repeatable Read 를 애플리케이션 레벨에서 지원하는지에 대해 테스트한 결과를 정리한 내용이다. Repeatable Read Repeatable Read 는 트랜잭션 고립 레벨2(Transaction Isolation Level)에 속한다. MySQL InnoDB 에서 기본으로 채택하고 있는 격리 수준 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때가지 후행 트랜잭션이 갱신하거나 삭제하는 것은 불허함으로써 같은 데이터를 두 번 쿼리했을 때 일관성 있는 결과를 리턴 Insert 는 가능 Phantom Read 현상은 여전히 발생 위와 같은 특징을..

    트랜잭션이란?

    트랜잭션(Transacation) 정의 트랜잭션이란 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위라고 할 수 있으며, 트랜잭션에는 여러개의 연산이 수행될 수 있다. 특징 하나의 트랜잭션은 Commit 되거나 Rollback 된다. 트랜잭션을 사용하는 이유 트랜잭션은 하나의 논리적인 작업의 단위이기 때문에, 여러개의 작업을 하나의 논리적인 단위로 묶어서 반영과 복구를 조정할 수 있기 위해 사용한다. 따라서, 데이터의 부정합이 일어났을 경우 롤백을 하여 데이터의 부정합을 방지할 수 있다. Ex. A 계좌에서 출금 -> B 계좌로 입금 하는 것을 하나의 논리적인 작업의 단위로 묶어서 반영과 복구를 조정할 수 있다. ACID 트랜잭션의 성질에는 ACID 가 있다. Atomicity(원자성) 트랜잭션..

    JVM Archtiecture

    JVM Archtiecture 다양한 JVM 구현체 Execution of a Java Program 에서 자바는 플랫폼 독립적이며, JVM 은 플랫폼 종속적이라는 내용에 대해서 배웠다. 따라서, JVM 은 다양한 구현체 들이 존재한다. 예를들어 JPA 와 Hibernate 같은 경우를 생각하면 이해가 편한데, Oracle 에서 JVM 의 스펙과 표준을 정의하면, 공급업체 들이 JVM 을 구현하여 배포하게 된다. 이 공급업체를 Vendor 라고 한다. 즉, JVM 은 각 OS 환경에 맞게끔 여러가지 구현체가 존재한다고 보면된다. Hotspot JVM vs Open J9 JVM Hotspot JVM 은 가장 자주 사용되고, 검증이 잘된 JVM 이다. AdoptOpenJDK 에서는 HotSpot 과 Open..

    자바 프로그램 실행 과정

    Execution of Java Program 자바 프로그램 실행 과정 자바 프로그램이 실행되는 과정을 살펴보자. 프로그램(Program)이라는 의미를 정확히 모른다면, 해당 링크를 통해서 지식을 배울 수 있습니다. IDE(Ex. IntelliJ)를 사용하여 Program.java 코드를 작성한다. Java Compiler(javac) 가 자바 소스 코드를 참고하여 클래스 파일(Program.class)을 생성한다. 생성된 클래스 파일은 JVM 이 설치되어있는 환경이면 어디에서든지 실행 가능하다. JVM 은 바이트 코드를 Interpreter 를 사용하여 한 줄 씩 기계어로 번역한다. 따라서, 자바는 Compiler 와 Interpreter 를 사용한다는 것을 알 수 있다. 각각 어떤 특징이 있고, 자바..

    프록시와 데코레이터 패턴

    프록시와 데코레이터 패턴 이번에 배울 디자인 패턴은 프록시 패턴이다. GOF 의 디자인 패턴에서 프록시 패턴은 크게 프록시 패턴과 데코레이터 패턴으로 나뉜다. 자세히 배워보자. 프록시 패턴 프록시(Proxy)는 대리자라는 의미를 갖고 있다. 의미만 봤을때 어떤 일을 대신 해준다라는 느낌을 받을 수 있다. 요청하는 쪽이 Client, 응답하는 쪽이 Server 라고 하자. (보통 이렇게 부른다.) Proxy 가 없는 경우에는 Client 와 Server 의 관계가 다음과 같다. 위 경우를 직접 호출이라고 부른다. Proxy 가 도입되면 다음과 같다. 위 경우를 간접 호출이라고 부른다. 예시 프록시의 예시를 보자. 카페에 들어가서 손님이 캐셔에게 커피 주문을 한다. 캐셔는 바리스타에게 커피를 만들어 달라고 ..