Java 32

Thread Pool과 병렬 처리(ForkJoinPool, ParellelStream)

멀티 스레딩과 병렬 처리는 성능 최적화와 좌원 사용에 있어서 중요한 요소입니다. 이를 효율적으로 관리하기 위해서 자바에서는 Thread Pool, ForkJoinPool, ExecutorService, parallelStream과 같은 다양한 병렬 처리 기법을 제공합니다.  🚩 이번 글에서는 각각의 개념과 내부 동작 방식, 그리고 상황에 따라 어떤 방식을 선택할지에 대해서 공부해보겠습니다. 멀티스레딩 vs. 병렬 처리 멀티 스레딩은 동시성을 구현하는 방식 중 하나로, 하나의 CPU에서 여러 작업을 번갈아가며 실행합니다.  속도가 빨라 여러 스레드가 동시에 실행되는 것처럼 보이지만, 실제로는 운영체제가 컨텍스트 스위칭을 통해 교대로 실행합니다. 병렬 처리는 여러 CPU 코어에서 여러 작업이  동시에 실행..

Java 2025.02.09

🙋‍♂️ 왜 enum 생성자는 자동으로 private로 설정될까?

enum을 사용하여 에러 코드를 관리하는 중에 enum의 생성자는 private로 강제되며, 명시적으로 private을 적지 않아도 된다는 부분에 궁금증을 느꼈습니다.   문제@Getterpublic enum ErrorCode { INVALID_USERNAME(100, "not found username", HttpStatus.NOT_FOUND), INVALID_PASSWORD(101, "not found Password", HttpStatus.NOT_FOUND), INVALID_AUTHENTICATION(102, "not found username and paassword", HttpStatus.NOT_FOUND), NOT_AUTHORIZED(103, "Authorization i..

Java 2025.02.07

Stack 사용을 왜 지양해야 할까?

Stack을 지양해야 한다는 말을 들었으나, 그 이유를 정확히 몰라서 학습하고자 이 글을 작성하였다.들어가기 전 스택의 구조는 모두 알고 있겠지만 한 번 더 보자!스택 스택의 가장 큰 특징은 LIFO 후입 선출구조로 가장 최근(마지막)에 들어간 값이 제일 먼저 나온다.Stack을 지양해야 하는 이유로는 총 4가지로 구성해 보았다.스택을 왜 지양해야 할까?1. Stack 클래스는 Vector 클래스를 상속한다Stack은 상위 클래스로 Vector를 상속받는다.Vector는 동적 배열로 설게되었으며, 특정 인덱스를 기반으로 삽입, 삭제하는 기능을 지원한다. 하지만 스택은 후입선출 구조로 요소를 추가, 삭제하 할 때 마지막 요소를 기준을 동작한다.따라서 Vector의 get(), set() 메서드, inser..

Java 2025.01.20

GC(Garbage Collection)에 대하여

Garbage Collector 이란 무엇일까? automatically manages the application's dynamic memory allocation requests. 애플리케이션의 동적 메모리 할당을 자동으로 관리해주는 JVM의 구성 요소이다.   동작 방식1. 운영체제로부터 메모리를 할당 받고, 반환한다.2. 애플리케이션이 요청할 때 메모리를 제공한다.3. 애플리케이션에서 메모리의 어떤 부분이 사용되고 있는지 확인한다.4. 사용되지 않는 메모리를 반환한다.    자바에서 자동으로 메모리를 관리하는 기능으로, 사용하지 않는 객체들을 자동으로 메모리에서 제거해,  메모리 누수를 방지한다.따라서 개발자가 메모리를 수동으로 관리할 필요없이, 메모리 누수와 이중 해제 등 메모리 관련 버그를 줄..

Java 2025.01.09

자바의 실행과 JIT(Just-In-Time) 컴파일러

자바 컴파일러를 통해 자바 소스 파일을 JVM이 이해할 수 있는 클래스 파일(.class/바이트코드)로 변환한다. 자바 바이트 코드JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1 바이트여서 자바 바이트 코드라 한다. 자바 바이트 코드는 자바 가상 머신만 설치되어 있으면, 어떤 운영체제에서도 실행될 수 있다.   그 후에는 어떻게 할까?JVM의 Excution Engine 안에 있는 인터프리터를 통해 바이트 코드를 특정 환경의 기계어로 번역하고 실행한다.  컴파일러와 인터프리터컴파일러와 인터프리터 모두 고수준 언어를 기계어로 변환시킨다.컴파일러는 소스코드 전체를 한 번에 번역하여 중간 코드로 만들어 메모리에 적재하는 방식이다.인터프리터는 소스코..

Java 2025.01.08

JVM 내부 동작 원리

JVM (Java Virtual Machine)Write once, Run everyWhereJava 프로그램 실행을 담당하는 가상의 컴퓨터로, Java 바이트 코드 실행, 메모리 관리, 가비지 컬렉션 등을 담당한다.자바와 운영체제 사이에서 중계자 역할을 하며, 자바가 운영체제에 구애받지 않고 프로그램을 실행할 수 있도록 도와준다.JRE (Java Runtime Environment)Java 프로그램 실행을 위한 환경을 제공하며, JVM과 Java 클래스 라이브러리가 포함된다.JRE만 있으면 Java 프로그램을 실행할 수 있지만, Java 프로그램을 개발하기 위해서는 JDK가 필요하다.JDK 를 설치하면 JRE도 같이 설치된다. (JDK = JRE + a)JDK (Java Development Kit)J..

Java 2025.01.08

SQL Injection

SQL Injection공격자가 악의적인 SQL문을 입력하여 데이터베이스가 비정상적으로 동작하도록 하는 공격이 공격을 통해 데이터를 유출하거나, 데이터를 조작할 수 있다.언제?사용자가 입력한 데이터를 SQL쿼리에 직접 삽일할 때사용자의 이름과 비밀번호를 확인하는 쿼리에서 입력 값이 제대로 검증되지 않은 경우사용자의 입력에 대한 검증이 부족한 경우로, 문자열의 길이나 형식에 대한 검증이 없으면 발생할 수 있다.예를 들어공격자가 로그인 폼에 다음과 같이 입력한다면?admin' OR '1'='1'; -- 이 입력은 아래와 같은 쿼리가 된다.SELECT * FROM users WHERE userId = 'admin' OR '1'='1'; -- AND password = '';​1=1 조건은 항상 참으로, 사용자..

Java 2025.01.07

HashMap의 구조

키-값의 쌍으로 데이터를 저장하는 자료구조각 키를 해시 함수로 변환하여 배열의 인덱스에 저장하여 데이터 추가, 검색, 삭제 등의 작업을 수행한다. 키의 중복을 허용하지 않으며, 하나의 키에 하나의 값이 매핑된다. 해시 함수는 키를 해시 코드로 변환하여 HashMap의 버킷 인덱스를 정하는데, 서로 다른 두 개의 키가 같은 해시 값을 갖는 경우가 발생한다. 이 현상을 해시 충돌이라고 한다.HashMap에서는 해시 충돌을 방지하기 위해 Chaining, Open Addressing을 이용한다. Chaining충돌이 발생한 버킷 안에서 연결리스트, 트리 구조로 여러 키-값을 저장하는 방식Open addressing다른 빈 버킷을 찾아 데이터를 저장하는 방식자바의 HashMap은 hashCode() 메서드를 이..

Java 2025.01.07

Statement와 PreparedStatement

Statement와 PreparedStatementStatement와 PreparedStatement는 둘 다 JDBC API 에서 제공하는 인터페이스이다.데이터베이스에서 쿼리를 실행할 때 쿼리를 효율적으로 실행하기 위해서 쿼리 캐싱을 시행한다. 쿼리 캐싱쿼리를 파싱하고최적의 실행계획을 세운 뒤실행하는 과정 Statement는 쿼리를 실행할 때마다 매번 쿼리를 파싱하고 실행계획을 세우는 과정을 반복한다.PreparedStatement는 한 번 쿼리가 실행된 후에는 실행계획을 따로 세우지 않고 이전의 실행계획에 파라미터만 변경하여 쿼리를 날린다.따라서 처음 실행된 실행계획을 재사용하기 때문에 성능 측면에서 좋다. 보안 측면에서는 Statement는 입력값을 실제 쿼리에 문자열의 형태로 이어 붙이다. 만약 ..

Java 2025.01.07

try-catch와 try-with-resources

try-catch-finallytry-catch-finally 문은 자바7 이전에 나온 예외 처리 구문으로 모든 객체를 포함할 수 있다. 사횽 후 반납을 해주어야 하는 자원은 Closeable 인터페이스를 구현하는데, 사용 후 close 메서드를 직접 호출하여 반납해야 한다. 자원 반납이 이루어지지 않는 경우, 메모리 누수가 발생할 수 있고 다른 프로세스, 스레드에 영향을 줄 수 있다.따라서 finally 블록 내에서 자원 해제를 꼭!! 해주어야 한다.try { BufferedReader br = new BufferedReader(new FileReader("file.txt")); // 생략} catch (IOException e) { System.err.println("IOExcepti..

Java 2025.01.07