Multi Programming, Processing, Tasking, Threading
·
📂 computer-science
1. CPU, Process, Memory(1) CPU, Process, Memory 프로세스(Process) 는 컴퓨터에서 실행 중인 프로그램을 말하며 각 프로세스는 독립된 메모리(Memory) 공간을 할당받아 실행되기 위해 대기하고 있다. 프로세스는 명령어와 데이터 집합을 가지고 있는데, 이 때 프로세스의 명령어를 CPU(Central Process Unit) 에서 실행시킨다. (2) I/O (Input/Output) 프로세스 는 CPU 연산 외에도 네트워크 또는 입출력 장치를 통해 데이터를 주고 받는다. 이와 같은 행위를 I/O(Input/Output) 라고 한다. I/O 는 외부에서 응답이 완료될 때까지 기다리는 blocking I/O, 응답이 올 때까지 기다리지 않고 다른 작업을 하는 Non-B..
thread type & model
·
📂 computer-science
1. 쓰레드 타입 (Thread Type)[1] 싱글-코어, 싱글 쓰레드(single-core,single-thread) 예전의 CPU 는 하나의 코어와 하나의 물리 쓰레드(H/W thread) 를 매핑해 관리했다. 하지만 프로세스의 동기 작업으로 인해 쓰레드가 대기하거나 프로그램을 메모리에 데이터를 적재하는 시간에는 CPU core 를 활용하지 못하는 문제가 있었다. 이와 같은 문제를 개선하고자 도입된 방법이 하이퍼 쓰레드(hyper thread) 이다. 하이퍼 쓰레드(hyper thread) 는 하나의 코어에 두 개의 물리 쓰레드(H/W thread) 를 할당해 core 의 효율을 높히는 방법이 도입된다. [2] 하드웨어 쓰레드(hardware thread)물리 쓰레드(H/W thread) 는 OS..
[JPA] 코드로 보는 OSIV 와 고찰
·
📂 backend/spring
1. OSIV(Open Session In View) 란?? OSIV(Open Session In View)은 영속성 컨텍스트 관리 영역을 뷰(View)까지 확장하는 기능이다. Open Session In View라 불리는 이유는 JPA의 구현체인 Hibernate 에서 EntityManager의 구현체로 Session 을 사용한다. JPA에서는 OEIV(Open-EntityManager-In-View) 로 부르지만 통상적으로 Open-Session-In-View 로 부른다. 2. Spring-Boot 의 프로퍼티 기반 OSIV 설정 과정Spring-Boot 는 프로퍼티를 기반으로 한 자동 설정을 지원한다. JpaBaseconfiguration 추상 클래스의 nested static class 인 J..
QueryDSL transform() 에서 꼭 @Transactional 을 사용해야 하는 이유
·
📂 backend/spring
1. Background 이전 참여했던 프로젝트 중에 transform() 을 사용하는 로직에서 발생했던 내용 기록용 글이다.예시 코드의 프로젝트 환경은 Spring Boot 2.7.15, QueryDSL 5.0 이다. (1) 샘플 코드를 확인해보자. 문제는 querydsl 에서 제공하는 transform() 메서드를 사용하는 과정에서 connection leak 이 발생했다. connection pool 은 DB에 쿼리 요청이 완료된 connection 을 다시 회수하지만 반환되지 않는 문제가 발생하며 JDBC ConnectionException 을 반환하였다. 아래는 쿼리 예시이다. (실제 코드 대신 유사한 코드를 작성한 샘플이다.)@Repository@RequiredArgsConstructorp..
가상 메모리 (Virtual Memory)
·
📂 computer-science
1. 스왑 영역(swap area) 스왑 영역이 도입되기 이전에는 한정된 물리 메모리 공간으로 인해 많은 프로세스를 관리할 수 없었다. 이를 해결하기 위한 방법으로 보조기억장치 공간을 활용하는 방법이었고 이 공간을 스왑영역(swap area) 이라 부른다. 스왑영역은 사용하지 않는 프로세스를 보조기억장치 일부 영역에 임시로 저장하는 공간이며, 오랜 기간 사용하지 않는 프로세스는 스왑 아웃(swap out) 하여 보조기억장치로 프로세스 정보를 보내고, 프로세스 정보를 가져올 경우 스왑 인(swap in) 하여 메모리(RAM) 로 프로세스 정보를 가져온다. 스왑 영역을 활용하면 운영체제(OS)가 한정된 물리 메모리 공간 보다 더욱 많은 프로세스를 관리할 수 있어 더욱 많은 프로세스의 동시 실행이 가능하다...
테스트에서 @Sql 로 테스트 데이터가 들어가지 않았던 이유 (with. custom TestExecutionListener)
·
📂 backend/spring
1. 문제 상황 친구와 토이 프로젝트를 하며 테스트를 위한 데이터를 추가하고자 @Sql annotation 을 적용하고자 했다. 하지만 테스트 데이터가 들어가지 않는 이유를 찾기 위한 삽질 로그를 기록하고자 한다. 2. Background[1] SpringBootTest.WebEnvironment.RANDOM_PORT 사용 실제 개발 환경과 유사한 환경을 위해 RANDOM_PORT 를 설정했다. 해당 옵션을 설정하면 클라이언트와 서버가 분리되어 멀티 스레드 환경이 된다. 그러므로 Thread Local 기반으로 동작하는 @Transactional 을 사용하여 롤백 처리를 할 수 없다.롤백을 해야 하는 이유는 테스트 격리(Isolated Test) 을 위함이다. 테스트 격리는 공유 자원을 사용하는 여러 테..