본문 바로가기

전체 글

(81)
Real MySQL 8장 인덱스 #2 (8.6~) 8.6 함수 기반 인덱스 일반적으로 인덱스는 칼럼의 값 일부 또는 전체에 대해서만 인덱스 생성이 허용된다. 하지만 때로는 칼럼의 값을 변형해서 만들어진 값에 대해 인덱스를 구축하는 것도 필요하다. 함수 기반 인덱스를 구현하는 방법은 다음 두 가지로 구분할 수 있다. 가상 칼럼을 이용한 인덱스 함수를 이용한 인덱스 함수 기반 인덱스는 인덱싱할 값을 계산하는 과정의 차이만 있을 뿐, 실제 인덱스의 내부적인 구조 및 유지관리 방법은 B-Tree 인덱스와 동일하다. 8.6.1 가상 칼럼을 이용한 인덱스 MySQL 8.0 버전 부터는 가상 칼럼을 추가하고 그 가상 칼럼에 인덱스를 생성할 수 있게 됐다. ALTER TABLE user ADD full_name VARCHAR(30) AS (CONCAT(first_na.. 더보기
스프링이 제공하는 프록시, 프록시 팩토리 spring 6. 스프링이 지원하는 프록시 프록시 팩토리 우리가 기존에 알아봤던 JDK 동적 프록시와 CGLIB을 사용한 프록시 구현(https://harrislee.tistory.com/95)은 각각 문제점이 있다. JDK 동적 프록시는 인터페이스가 있어야하고 CGLIB은 구체클래스가 있어야 구현이 가능하다. 인터페이스가 있을때는 JDK 동적 프록시를, 없을때는 CGLIB를 사용하도록 하려면 어떻게 해야할까? 또, 부가기능을 적용하기위해서 InvocationHandler, MethodInterceptor를 각각 만들었어야 했는데 이걸 공통으로 적용할 수는 없을까? 스프링에서는 동적프록시를 통합해주는 프록시 팩토리라는 기술을 제공한다. 프록시 팩토리가 알아서 인터페이스가 있을 때는 JDK 동적 프록시를,.. 더보기
Reflection, JDK 동적 프록시, CGLIB 리플렉션 자바 리플렉션은 우리가 컴파일 타임에 알 수 없는 정보들( 클래스, 인터페이스, 메서드, 필드 등)에 대해 런타임에 동적으로 접근하고 수정할 수 있게 해준다. 예제 리플렉션이 어떤 상황에서 필요한지를 살펴보자. 아래와 같이 Hello 라는 클래스가 있다. @Slf4j static class Hello{ public String callA(){ log.info("callA"); return "A"; } public String callB(){ log.info("callB"); return "B"; } } Hello 클래스의 메서드를 호출하기 전과 후에 log를 출력하고자 한다. 가장 쉽게 구현하는 방법은 호출하기 전과 후에 아래와 같이 로그를 남기는 것이다. @Test void Reflection.. 더보기
프록시, 프록시 패턴, 데코레이터 패턴 프록시 패턴과 데코레이터 패턴 Proxy 란? 클라이언트와 서버 관계는 컴퓨터 세상에서는 흔하게 볼 수 있는 구조다. 네트워크 상의 통신, 하나의 컴퓨터 내부의 프로세스간 통신, 심지어 애플리케이션 내부에서 객체간의 통신에서도 우리는 클라이언트 서버 관계를 쉽게 찾을 수 있다. 여기서는 객체간의 통신에서의 프록시에 대해 알아본다. 클라이언트는 서버에 필요한 것을 요청을 하고 서버는 그에 대한 처리를 하고 응답을 반환한다. 프록시는 이런 클라이언트와 서버 사이에서 요청에 대한 접근 제어, 부가기능 추가 등의 기능을 담당한다. 프록시는 컴퓨터 세상에 다양한 클라이언트 서버 관계들에서 존재할 수 있다. 그리고 클라이언트는 서버로 요청을 보냈지만 이를 처리하는 주체가 프록시인지 실제 서버인지 알 수는 없다. 프.. 더보기
Garbage Collector (정의와 종류) Garbage Collector ( 정의, 종류 ) GC란? 자바 언어로 프로그래밍을 할 때 우리는 인스턴스를 생성하고 사용한 이후에 이에 대한 메모리를 해제하지 않는다. 메모리를 직접적으로 관리해줘야 하는 언어와 달리 JVM 기반 언어는 Garbage Collector가 사용되지 않는 메모리 영역(Garbage)을 청소해주기 때문이다. 이렇게 Garbage Collector의 대상이 되는 영역은 JVM 메모리의 Heap 영역이다. Weak Generational Hypothesis (JVM의 GC는 두 가지 가설을 전제로 역할을 수행한다.) 대부분의 객체는 금방 접근할 수 없는(Unreachable) 상태가 된다. 오래된 객체에서 새로운 객체로의 참조는 매우 드물게 발생한다. 위의 그림을 보면 실제로 .. 더보기
커넥션풀과 데이터소스 이해 커넥션풀과 데이터소스 이해 커넥션풀이 왜 필요할까? 아래의 코드와 같이 데이터베이스에 접근하는 커넥션을 생성하여 가져올 때 DriverManager.getConnection()을 호출하면 된다. public static Connection getConnection(){ try { Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); log.info("get connection = {}, class = {}", connection, connection.getClass()); return connection; } catch (SQLException e) { throw new IllegalStateException(); } .. 더보기
Java String이란? (StringBuilder, StringBuffer, String Iterning, String pool) Java String 평소에 가장 많이 쓰는 타입 중 하나인 String에 대해 자세히 알고 있지 못했다. String의 특징에 대해 살펴보고 이를 보완하기 위해 나온 JVM에서 제공하는 메모리 관리와 여러 다른 객체들을 살펴보자. String 객체의 특징 String의 가장 큰 특징으로는 불변성(Immutability)을 꼽을 수 있다. String text = "abcd"; textAppend = text + "efg"; 위와 같은 코드를 작성했을 때 JVM 메모리의 변화를 예상해보자. String은 Heap 메모리에 저장되므로 Heap에 "abcd" 가 저장된 후에 "abcd" 뒤에 "efg" 가 붙어서 저장 될 것이라고 예상할 수 있을 것이다. 그러나 String은 불변성이라는 특징을 갖고 있기 .. 더보기
JDBC란? (SQL Mapper, ORM) JDBC 란 Spring 환경에서 개발을 하면서 JDBC라는 단어는 많이 들어봤지만 굳이 JDBC에 대해 알려고 하지 않았다. 그래서 지금까지 묻어두었던 JDBC를 한번 알아보려 한다. 우리는 알게 모르게 JDBC를 많이 사용하고 있다. 그치만 JDBC를 직접 사용하는 경우는 드물 것이다. 아마도 JPA나 MyBatis와 같은 ORM, Sql Mapper와 같은 기술들을 사용하면서 이 기술들에서 JDBC 인터페이스를 호출하는 경우가 많을 것이다. JDBC란 무엇이고 왜 필요한 것일까? 이전에는 서버와 데이터베이스 간의 통신, 쿼리 요청, 결과 응답을 수행하는 과정에 대해서 표준화된 인터페이스가 존재하지 않았다. 따라서 애플리케이션 개발자가 데이터베이스에 접속(TCP/IP)하는 코드, 쿼리를 요청하는 코드.. 더보기