분류 전체보기 (374) 썸네일형 리스트형 [JAVA] happens-before 관계 자바 메모리 모델(Java Memory Model) Java Memory Model(JMM)은 자바 프로그램이 어떻게 메모리에 접근하고 수정할 수 있는지를 규정하며, 특히 멀티 스레드 프로그래밍에서 스레드 간의 상호작용을 정의 한다. JMM에 여러가지 내용이 있지만, 핵심은 여러 스레드들의 작업 순서를 보장하는 happens-before 관계에 대한 정의다. ✏️ happens-beforehappens-before 관계는 자바 메모리 모델에서 스레드 간의 작업 순서를 정의하는 개념이다. 만약 A 작업이 B 작업보다 happens-before 관계에 있다면, A 작업에서의 모든 메모리 변경 사항은 B 작업에서 볼 수 있다. 즉, A 작업에서 변경된 내용은 B 작업이 시작되기 전에 모두 메모리에 반영된다.h.. [JAVA] volatile과 메모리 가시성 👀 메모리 가시성동시에 여러 스레드가 동작하는 멀티스레드 환경에서는 하나의 변수를 여러 스레드가 읽고 쓰는 일이 자주 발생한다.그런데 간단해 보이는 코드에서도, 특정 스레드가 변경한 값이 다른 스레드에서는 반영되지 않는 이상한 현상을 겪은 적이 있을 것이다.이런 상황은 단순한 코드 실수가 아니라 "메모리 가시성(Memory Visibility)" 문제에서 비롯되는 경우가 많다.자바에서는 이런 문제를 해결하기 위한 도구로 volatile 키워드를 제공한다.그렇다면 과연 volatile은 어떤 역할을 하며, 언제 사용해야 할까?public class VolatileFlagMain { public static void main(String[] args) { MyTask task = new .. [JAVA] 스레드 제어와 생명 주기 Thread 클래스Thread 클래스는 스레드를 생성하고 관리하는 기능을 제공한다.Thread 클래스가 제공하는 메서드를 이용해 main 스레드의 정보들을 확인해보자.1. 스레드 객체 정보Thread mainThread = Thread.currentThread();System.out.println("mainThread = " + mainThread);Thread 클래스의 toString() 메서드는 스레드 ID, 스레드 이름, 우선순위, 스레드 그룹을 포함하는 문자열을 반환한다.출력: Thread[#1,main,5,main]2. 스레드 ID System.out.println("mainThread.getId() = " + mainThread.getId());threadId(): 스레드의 고유 식별자를 반환.. [JAVA] 스레드 생성과 실행 방법 자바 메모리 구조Java에서 스레드를 이해하려면, 먼저 자바의 메모리 구조를 간단히 짚고 넘어갈 필요가 있습니다.자바 프로그램이 실행되면 JVM은 여러 영역으로 메모리를 나누어 각기 다른 역할을 수행합니다.이 구조는 스레드가 어떤 메모리를 공유하고, 어떤 메모리를 개별적으로 갖는지를 이해하는 데 중요한 기반이 됩니다.이제 자바의 기본적인 메모리 구성부터 살펴보겠습니다.메서드 영역(Method Area): JVM이 프로그램에 필요한 클래스 정보를 모아두는 공간으로, 모든 스레드가 공유합니다.클래스 정보: 클래스 이름, 상속 관계, 메서드 및 필드 정보 등바이트코드: 메서드 및 생성자의 실행 코드static 변수: 모든 인스턴스가 공유하는 static 필드런타임 상수 풀: 문자열 리터럴 및 컴파일 시 생성된.. [CS] 프로세스와 스레드 프로세스란?프로그램은 실제 실행하기 전까지는 단순한 파일에 불과합니다. 프로그램을 실행하면 그제서야 프로세스가 만들어지고 프로그램이 실행됩니다.이렇게 운영체제 안에서 실행중인 프로그램을 프로세스라고 합니다.즉, 프로세스는 실행 중인 프로그램의 인스턴스입니다.프로세스는 실행 중인 프로그램의 인스턴스이다. 각 프로세스는 독립적인 메모리 공간을 갖고 있으며, 운영체제에서 별도의 작업 단위로 분리해서 관리된다. 각 프로세스는 별도의 메모리 공간을 갖고 있기 때문에 서로 간섭하지 않는다. 그리고 프로세스가 서로의 메모리에 직접 접근할 수 없다. 프로세스는 이렇듯 서로 격리되어 관리되기 때문에, 하나의 프로세스가 충돌해도 다른 프로세스에는 영향을 미치지 않는다. 쉽게 이야기해서 특정 프로세스(프로그램)에 심각한 문.. [프로젝트 이슈] N+1 문제 원인 및 해결 0. 들어가기 전현재 진행 중인 프로젝트에서는 친구 관계를 맺고 소통하는 기능이 포함되어 있으며, 이에 따라 다음과 같은 요구사항이 존재합니다.사용자는 내가 보낸 친구 요청 목록을 확인할 수 있어야 한다.사용자는 내가 받은 친구 요청 목록을 확인할 수 있어야 한다.사용자는 친구 요청이 서로 수락되어 친구 관계가 성립된 사용자 목록, 즉 나의 친구 목록을 확인할 수 있어야 한다. 이러한 기능을 구현하기 위해 JPA 기반의 연관 관계 설정과 조회 로직을 구성했으며, 실제 운영 환경과 유사한 스테이징 환경에서 실제 데이터를 넣고 운영 테스트를 진행하던 중, 특정 API의 응답 속도가 비정상적으로 느려지는 현상이 발생했습니다. 초기에는 데이터가 적어 문제를 인지하지 못했지만, 충분한 양의 데이터를 투입해 테스.. [Jacoco] Test Coverage 🔍 테스트 커버리지란?내가 작성한 테스트 코드가 실제 코드에서 얼마나 많은 부분을 실행했는가"를 숫자로 보여주는 지표이다. 예시 코드public class Calculator { public int add(int a, int b) { return a + b; } public int subtract(int a, int b) { return a - b; }} 테스트 코드@Testvoid testAdd() { Calculator c = new Calculator(); assertEquals(5, c.add(2, 3));}이 경우 add()는 테스트로 실행됨하지만 subtract()는 실행 안 됨 → 테스트 커버리지에는 포함되지 않음결과적으로 전체 10.. [Spring] 프로파일(profiles) 로딩 우선순위 👤 프로파일이란?Spring 프로파일은 같은 애플리케이션이라도 실행 환경에 따라 다른 설정 파일이나 빈(Bean)을 사용할 수 있도록 해주는 기능이다. 사용 예시개발환경(dev): 로컬 DB 사용테스트환경(test): H2 메모리 DB 사용운영환경(prod): 실제 운영용 DB 사용프로파일을 설정하는 방법// 폴더 구조src/├── main/│ └── resources/│ ├── application.yml # 공통 설정│ ├── application-dev.yml # 개발용│ └── application-prod.yml # 운영용└── test/ └── resources/ └── ap.. [Spring] 단위 테스트 작성 with (JUnit5, Mockito) 🤔 단위 테스트(Unit Test)란?단위 테스트(Unit Test) 는 소프트웨어 개발에서 가장 기본적인 테스트 기법으로, 특정 기능 단위(보통 메서드)의 동작을 검증한다 🤔 Mockito란?Mockito는 테스트 대상 객체의 의존성을 모방(mock)하는 가짜 객체를 쉽게 생성해 주는 라이브러리이다.실제 복잡한 의존성(DB, 네트워크, 외부 API)을 대신해, 테스트 환경을 단순화하고 빠르게 만들어 준다. 소프트웨어 개발 시 단위 테스트는 필수지만, 우리가 테스트하려는 클래스(예: MemberService)는 보통 이런 특징이 있다.테스트 대상 클래스가 다른 객체에 강하게 의존 (예: MemberRepository)의존 객체는 복잡하거나 무거움 (DB 연결, 네트워크 호출, 외부 API 등)실제 객.. [DB] 클러스터드 vs 넌클러스터드 인덱스 📌 클러스터드 인덱스 (Clustered Index)실제 데이터가 인덱스 순서대로 정렬되어 저장됩니다.즉, 인덱스 자체가 데이터입니다.한 테이블에 하나만 존재 가능 (정렬이 하나 기준이니까)✅ 장점범위 조회에 빠름 (BETWEEN, ORDER BY)접근 시 디스크 I/O가 줄어듦❌ 단점데이터 삽입/삭제 시 정렬 유지해야 하므로 성능 저하 가능한 테이블당 하나만 가능 📌 넌클러스터드 인덱스 (Non-Clustered Index)인덱스와 실제 데이터가 분리되어 있음인덱스에는 데이터의 포인터만 저장되어 있고, 필요한 값은 본문에서 추가로 읽음 (lookup)✅ 장점다양한 컬럼에 여러 개 생성 가능클러스터드 인덱스 외 다른 조건도 최적화 가능❌ 단점인덱스로 찾고 → 다시 테이블 접근 (lookup) 필요해서.. 이전 1 2 3 4 ··· 38 다음