이 글은 '스프링 부트 핵심 가이드 - 스프링 부트를 활용한 애플리케이션 개발 실무' 책을 통해 학습한 내용을 정리한 글입니다. 08장. Spring Data JPA 활용 JPQL (JPA Query Language) JPQL = JPA에서 사용할 수 있는 쿼리 문법은 SQL과 매우 비슷하지만 SQL에서는 칼럼의 이름을 사용하는 것과 달리 JPQL은 매핑된 엔티티의 이름과 필드의 이름을 사용한다. SELECT p FROM Product p WHERE p.number = ?1; 쿼리 메서드 리포지토리는 JpaRepository를 상속받는 것만으로도 기본적인 CRUD 메서드를 제공하지만 별도의 메서드를 정의해서 사용하는 경우가 많다. 쿼리 메서드 생성 쿼리 메서드는 동작을 결정하는 주제(Subject)와 서..
페이지 교체 알고리즘 페이지 교체 알고리즘은 가상 메모리에서 페이지 부재(page fault)가 발생했을 때 어떤 페이지를 메모리에서 제거하고 새로운 페이지를 적재할지를 결정하는 알고리즘이다. 페이지 교체 알고리즘의 목표는 페이지 부재가 최소화되고 시스템의 성능이 최적화되도록 하는 것이다. 페이지 교체 알고리즘 page-out : 메모리에 있는 페이지를 내리는 것 page-in : 새로운 페이지를 올리는 것 victim page(희생양 페이지) : 교체되는 페이지 최적(Optimal) 알고리즘 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체한다. 페이지 부재율을 최소화할 수 있지만, 앞으로 어떤 페이지가 사용될 지 미리 예측할 수 없기 때문에 실제로 구현하기 어렵다. FIFO(First-In, Firs..
페이징과 세그멘테이션은 메모리 관리 기법으로, 가상 메모리를 물리 메모리에 매핑하는 방식이다. 이 두 가지 기법은 주소 공간을 분할하고 관리하는 방법에 차이가 있다. 페이징 (Paging) 페이징은 가상 메모리와 물리 메모리를 일정한 크기의 고정된 블록인 페이지(page)로 분할한다. 가상 메모리 주소 공간은 페이지로, 물리 메모리 주소 공간은 프레임(frame)으로 나뉜다. 페이지와 프레임은 동일한 크기로 분할되며, 페이지와 프레임은 일대일로 매핑된다. 페이징 동작 방식 가상 주소를 페이지 번호와 오프셋(offset)으로 분할한다. 페이지 테이블(page table)이라는 데이터 구조를 사용하여 가상 페이지와 물리 프레임 간의 매핑 정보를 유지한다. 페이지 테이블에는 페이지 번호와 해당 페이지에 대응되..
세마포어 (Semaphore) 상호 배제(mutual exclusion)를 위한 동기화 기법 중 하나로, 공유 자원에 대한 접근을 제어하는 데 사용된다. 세마포어는 동시에 여러 개의 스레드나 프로세스가 접근할 수 있는 임계 영역(critical section)의 동시 접근을 제어하고 조절하는 역할을 한다. Java에서는 'java.util.concurrent.Semaphore' 클래스를 사용하여 세마포어를 구현할 수 있다. 세마포어의 연산 세마포어는 일반적으로 정수형 변수로 표현되며, 세마포어 값은 0이상의 값을 가진다. 1. P (Proberen 또는 Wait Operation) 세마포어 값을 1감소시키고, 만약 값이 음수가 되면 해당 스레드나 프로세스를 대기 상태로 전환한다. 이 연산은 세마포어에 대..
삽입 정렬 (Insertion Sort) 앞의 데이터를 정렬 해가면서 삽입 위치를 찾아 정렬하는 방식 시간복잡도 : (n-1) + (n-2) + (n-3) + ... + 2 + 1 -> n(n-1)/2 즉, O(n^2) 하지만, 모두 정렬되어 있는 경우 한 번씩 밖에 비교를 안하므로 O(n)의 시간복잡도를 가진다. 공간복잡도 : O(n) 장점 구현이 간단하고 이해하기 쉽다. 원소를 적절한 위치에 삽입하는 과정을 반복하는 간단한 알고리즘으로 구현하기가 비교적 간단하고, 알고리즘의 동작 방식도 직관적이다. 작은 규모의 배열에서 효율적이다. 삽입 정렬은 이미 정렬된 부분 배열에 새로운 원소를 삽입하는 방식으로 정렬을 수행한다. 따라서 입력 배열이 거의 정렬되어 있는 경우, 다른 알고리즘보다 효율적일 수 있다...
선택 정렬 (Selection Sort) 최소 또는 최대 값을 찾아서 가장 앞 또는 뒤와 교환하며 정렬하는 방식 시간복잡도 : (n-1) + (n-2) + ... + 2 + 1 -> n(n-1)/2 즉, O(n^2) 공간복잡도 : O(n) 장점 구현이 간단하고 이해하기 쉽다. 기본적인 비교와 교환 과정으로 이루어져 있어서 이해하기 쉽고 구현하기도 간단하다. 추가적인 메모리 공간을 사용하지 않는다. 버블 정렬과 동일하게 주어진 배열 안에서 비교와 교환을 수행하므로, 정렬을위한 추가적인 메모리 공간이 필요하지 않다. 단점 성능이 비효율적이다. 비교와 교환을 인접한 두 원소에 대해 반복적으로 수행하기 때문에 성능이 비효율적이다. 배열의 킉가 커질수록 비교과 교환의 횟수가 증가하여 실행 시간이 길어진다. 불안정..
버블 정렬 (Bubble Sort) 인접한 데이터를 비교하며 필요한 경우 자리를 바꾸는 정렬 방식 시간복잡도 : (n-1) + (n-2) + (n-3) + ... + 2 + 1 -> n(n-1)/2 즉, O(n^2) 공간복잡도 : O(n) 장점 구현이 간단하고 이해하기 쉽다. 기본적인 비교와 교환 과정으로 이루어져 있어 구현하기가 간단하다. 알고리즘의 동작 방식도 직관적이어서 이해하기 쉽다. 추가적인 메모리 공간이 필요하지 않다. 주어진 배열 안에서 비교와 교환을 수행하므로, 정렬을 위한 추가적인 메모리 공간이 필요하지 않다. 안정적인 정렬 알고리즘이다. (Stable Sort) 동일한 값에 대해서는 상대적인 순서가 변하지 않는다. 단점 성능이 비효율적이다. 시간 복잡도가 O(n^2)으로 배열의 크기가 ..
이 글은 '스프링 부트 핵심 가이드 - 스프링 부트를 활용한 애플리케이션 개발 실무' 책을 통해 학습한 내용을 정리한 글입니다. 06장. 데이터베이스 연동 ORM (Object-Relational Mapping) 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 데이터를 변환하고 연결하는 기술 ORM은 개발자가 관계형 데이터베이스와 상호 작용하기 위해 SQL 쿼리를 직접 작성하는 대신, 객체 지향 프로그래밍 언어에서 사용하는 클래스와 객체를 활용하여 데이터베이스를 조작할 수 있도록 도와준다. ORM의 장점과 단점 장점 데이터베이스 쿼리를 객체지향적으로 조작할 수 있다. 재사용 및 유지보수가 편리하다. 데이터베이스에 대한 종속성이 줄어든다. 단점 ORM만으로 온전한 서비스를 구현하기에는 한계가 있다. ..
경쟁 상태 (Race Condition) 여러 개의 프로세스 또는 스레드가 공유된 자원/데이터에 접근하고 조작할 때, 실행 순서나 타이밍 등에 따라 예상치 못한 결과가 발생하는 상황 경쟁 상태가 발생하는 경우 동시성 접근 : 여러 프로세스나 스레드가 공유 변수에 동시에 접근하는 경우 두 개의 스레드가 동시에 공유 변수를 증가시키는 연산을 수행한다면, 스레드 간에 연산의 순서가 불확실해지고 일관성 없는 결과가 발생할 수 있다. 상호 배제(Mutual Exclusion)를 통해 해결 : 공유 변수에 대한 접근을 동시에 하지 못하도록 잠그는 메커니즘이다. 예를 들어, 임계 영역(Critical Section)을 설정하여 한 번에 하나의 프로세스/스레드만 접근 할 수 있도록 한다. 커널 작업을 수행하는 도중에 ..
데드락 (Deadlock) 여러 개의 프로세스나 스레드가 서로 자원을 점유하고 있어, 다음 단계를 진행하지 못하고 무한정 대기 상태에 빠지는 상황 즉, 각 프로세스나 스레드가 다른 프로세스나 스레드가 점유한 자원을 요청하면서 서로 자원을 점유한 상태에서 다음 단계로 진행하지 못하게 되는 것 데드락 조건 아래 4가지 조건이 모두 성립해야 데드락이 발생한다. 즉, 하나라도 성립하지 않으면 데드락 문제를 해결할 수 있다. 상호배제 (Mutual exclusion) : 자원은 한 번에 하나의 프로세스나 스레드에 의해서만 사용될 수 있다. 점유 대기(Hold and wait) : 최소한 하나의 자원을 점유한 상태에서 다른 자원을 요청하고 대기하는 프로세스나 스레드가 존재 한다. 비선점(No preemption) ..