JDBC 드라이버 로딩으로 알아보는 Class.forName
·
💻 Dev/Java & OOP
Class.forName("com.mysql.cj.jdbc.Driver");// 데이터베이스 연결 Connection connection = DriverManager.getConnection( "jdbc:mysql://localhost:3306/mydatabase", "root", "password" );JDBC 드라이버를 로딩할 때 Class.forName 이라는 메서드를 사용하는데 이 메서드는 어떤 역할을 하는 메서드일까?Java Reflection에서 제공하는 기능 중에 하나기도 하고, 클래스 로더랑도 관련이 있으니 알아보자. Class.forName()란?Class.forName 메서드는 Java에서 클래스 이름을 문자열로 제공하여 해당 클래스를 로드하고 초기화하는 역할을 한다. JDBC 드라이버..
스레드 로컬(Thread Local)이란?
·
💻 Dev/Java & OOP
스레드 로컬이란?ThreadLocal은 멀티스레드 환경에서 각 스레드가 독립적인 데이터를 저장하고 관리할 수 있도록 지원하는 메커니즘이다. 여러 스레드가 동시에 실행되는 애플리케이션에서는 공유 데이터로 인해 경쟁 상태(race condition)가 발생할 수 있다.이러한 문제를 방지하기 위해 데이터를 스레드 간에 독립적으로 관리해야 할 때 ThreadLocal을 사용할 수 있다.  스레드 로컬이 필요한 이유1. 스레드 간 데이터 충돌 방지멀티스레드 환경에서 동일한 데이터를 여러 스레드가 동시에 접근하면, 의도치 않은 결과가 발생할 수 있다.(ex. race condition) ThreadLocal은 각 스레드가 독립적인 데이터를 유지할 수 있도록 하여 이런 충돌을 방지한다. 2. 세션 및 사용자 정보 관..
자바 직렬화(Java Serializable)
·
💻 Dev/Java & OOP
자바 직렬화란?자바 직렬화(Java Serialization)는 자바 객체를 바이트 스트림으로 변환하여 저장하거나 네트워크로 전송한 후 다시 복원할 수 있도록 하는 기술이다.주로 외부 파일이나 네트워크를 통해 객체 데이터를 주고받을 때 사용된다.JSON은 웹(Web) 뿐만 아니라 게임 쪽에서도 설정 파일로 쓰이거나 데이터를 교환할 때 범용적으로 사용된다.그리고 직렬화는 오로지 자바 프로그램에서만 사용이 가능하지만, JSON 형태로 객체 데이터를 저장해 두면 파이썬, 자바스크립트에서도 범용적으로 사용이 가능하다. 문득 이런 생각이 들 것이다. CSV, JSON 이라는 훌륭한 데이터 포맷이 있는데 굳이 자바 직렬화가 필요할까? 자바 직렬화를 왜 사용할까?1. 자바 환경에서만 객체를 저장하거나 전송해야 할 때..
자바는 왜 Lambda&Stream을 도입했을까? feat.함수형 프로그래밍
·
💻 Dev/Java & OOP
자바는 8 버전부터 람다(Lambda)와 스트림(Stream)을 도입하며 기존의 객체 지향 프로그래밍 언어로서의 한계를 극복하고 함수형 프로그래밍 패러다임을 지원하기 시작하였다. 왜! 람다와 스트림을 도입한 건지, 이들이 함수형 프로그래밍과 어떤 연관이 있는지 araboza 기존에는 어땠을까?자바 7까지는 반복적인 데이터 처리를 위해 명령형 프로그래밍(Imperative Programming)을 주로 사용했다.이 방식은 코드가 길고 복잡해지는 문제가 있었으며 간단한 작업조차도 반복문과 조건문을 결합해야 하는 번거로움이 있었다.예를 들어 리스트에서 특정 조건을 만족하는 데이터를 필터링하려면 다음과 같은 절차적 접근 방식을 사용해야 했다.List names = Arrays.asList("Alice", "Bo..
리플렉션(Reflection)으로 DI 구현해보기 +단점
·
💻 Dev/Java & OOP
자바 기본서를 읽던 중 리플렉션 파트가 나왔다.특히 스프링 프레임워크의 DI(Dependency Injection)나 어노테이션 처리에 사용되고, 자사 라이브러리를 만들 때 사용한다고 한다.아직 한 번도 사용해 본 적은 없어서 DI 구현을 통해 이해해보고자 한다! @TestAutowired 구현하기리플렉션의 활용을 이해하기 위해 간단한 @TestAutowired 어노테이션을 만들어보자. 이 어노테이션은 클래스의 필드에 붙여 의존성을 자동으로 주입하는 기능을 한다. 1. @TestAutowired 어노테이션 정의먼저 @TestAutowired 어노테이션을 정의한다.이 어노테이션은 필드에만 사용할 수 있고, 런타임에도 유지되어야 하므로 @Retention과 @Target을 설정한다.@Target(Elemen..
Stack은 왜 상속의 실패 사례일까?
·
💻 Dev/Java & OOP
Java에서 Stack 클래스는 종종 "상속의 실패 사례"나 "디자인이 망가진 클래스"로 언급된다.뭐 때문인지 알아보자! Vector를 잘못 상속받았다.Stack 클래스의 가장 큰 문제는 Vector 클래스를 상속받았다는 점이다.Stack의 선언을 보면 다음과 같다.public class Stack extends Vector {Stack은 LIFO(Last In, First Out) 방식의 스택 자료구조를 구현하기 위해 설계되었지만, Vector는 일반적인 동적 배열을 나타낸다. 근데 뭐가 문제라는걸까? 🤔Stack이 Vector를 상속받았다는 것은 Vector의 모든 메서드를 사용할 수 있다는 것을 말한다. `Vector`는 일반적인 동적 배열 자료구조기 때문에 원래 스택에서는 허용되지 않을 중간에 ..