Spring

    동시성 이슈(Concurrency Issue)

    Concurrency 주말에(2022-03-19. Sat) [OKKY - 스프링 쓰레드 ...] 에 관한 질문에 답변을 하면서, Spring 을 사용하면서 꼭 알아야할 동시성 이슈에 대해서 공유하고자 합니다. 동시성 이슈란? 동시성 이슈란 여러 스레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제를 의미합니다. 핵심은 멀티 스레드와 변경 입니다. WAS 와 멀티 스레드 Tomcat 과 같은 서블릿을 지원하는 WAS 는 Servlet Container 이며, 멀티 스레드와 관련된 처리를 지원합니다. 따라서, 개발자는 멀티 스레드 관련 코드를 신경 쓰지 않고, Single Thread Programming 을 하듯 코드를 작성하면 됩니다. 하지만, 멀티 스레드 환경에서 주의 하면서 코딩해야하는..

    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 현상은 여전히 발생 위와 같은 특징을..

    프로세스와 쓰레드

    프로세스(Process)와 쓰레드(Thread) 프로세스와 쓰레드는 정말 중요한 개념이다. 프로세스와 쓰레드를 정확히 이해해야 스프링의 멀티 쓰레드 환경에서 왜 상태값을 갖도록 설계하면 안되는지에 대해 알 수 있다. 특히 프로세스의 메모리 영역(Stack, Heap, Data, Text)과 쓰레드가 프로세스와 공유하지 않는 영역(Stack) 에 대해서 제대로 알아야 한다. 프로그램 명령어, 코드 및 정적인 데이터의 묶음이며 아직 실행되지 않은 상태를 의미 프로세스 실행 중인 프로그램 운영체제로부터 시스템 자원을 할당 받는 작업의 단위 자, 먼저 Operating System 에서의 프로세스와 쓰레드가 어떤 것인지에 대해서 배우고, 그 개념을 자바와 스프링에 접목시켜서 현업에서 동시성 이슈를 어떤식으로 피..

    Checked, Unchecked Exception

    Checked, Unchecked Exception Checked Exception 은 예외 처리가 필요한 예외를 뜻하고, Unchecked Exception 은 예외 처리를 하지 않아도 되는 예외를 뜻한다. Error 는 시스템이 비정상적인 상황에서 발생한다. 개발자가 로직 구현 단계에서 미리 예측할 수 없기 때문에 따로 처리할 방안도 존재하지 않는다. 애플리케이션단 에서는 Error 에 대한 처리를 신경쓰지 않아도 된다. OOM(OutOfMemory) 나 ThreadDeath 같은 에러는 예외 처리로 잡아도 할 수 있는 것이 없기 때문이다. 따라서, Checked 와 Unchecked Exception 에 대한 예외처리가 중요해진다. Checked, Unchecked Exception 의 특징을 살펴..