0110 - 0116


# 0110 - 0116

# 0110 - Arrays.asList()와 List.of()의 차이

Arrays.asList와 List.of 둘 다 고정된 크기의 리스트를 제공하기 때문에 새 요소를 추가하거나 삭제하려고 하면 UnsupportedOperationException이 발생한다. 그렇다면 둘의 차이점은 무엇일까?

  1. List.of는 set으로 값 변경이 불가능하다.
List<Integer> asList = Arrays.asList(1, 2, 3);
List<Integer> listOf = List.of(1, 2, 3);

asList.set(0, 10);
listOf.set(0, 10);        //UnsupportedOperationException

List.of는 set으로 값 변경을 시도하면 컴파일 에러가 발생하게 된다.

  1. List.of는 null을 허용하지 않는다.
List<Integer> asList = Arrays.asList(1, 2, null);
List<Integer> listOf = List.of(1, 2, null);        //NPE

null을 받아들이는 Arrays.asList와 달리 List.of는 거부한다.

  1. List.of는 null 여부를 contains 확인도 못하게 한다.
List<Integer> asList = Arrays.asList(1, 2, 3);
List<Integer> listOf = List.of(1, 2, 3);

boolean asListResult = asList.contains(null);
boolean listOfResult = listOf.contains(null);        //NPE
  1. Arrays.asList는 원본의 배열의 변화에 반응한다.
Integer[] arr = {1, 2, 3};

List<Integer> asList = Arrays.asList(arr);
List<Integer> listOf = List.of(arr);

arr[0] = 10;

System.out.println(asList);
System.out.println(listOf);
/*
[10, 2, 3]
[1, 2, 3]
 */

arr의 값이 변하면 asList의 값 또한 변한다.


# 0112 - Database Connection Pool이란

DB Connection Pool에 대해 알아보기 전에 우선 JDBC에 대해 알아보면 기본적으로 JDBC는 다음과 같은 과정을 거친다.

1. DB벤더에 맞는 드라이버 로드
2. DB서버의 IP, ID, PW등을 DriverManager 클래스의 getConnection 메소드를 사용하여 Connection 객체 생성
3. Connection으로 부터 PreparedStatement 객체를 받음
4. executeQurey를 수행하고 ResultSet객체를 받아 데이터를 처리
5. 사용했던 ResultSet, PreparedStatedment, Connection을 close 

이러한 일련의 과정을 거쳐 Java 어플리케이션과 Database가 연동이 되어 원하는 데이터를 처리할 수 있다. 이 과정중에서 가장 오래 걸리는 부분을 예상한다면 2번 과정의 Connection 객체를 얻는 부분이다. 이유는 DB서버와 애플리케이션 서버 사이의 통신이기에 같은 장비에 둘다 존재하더라도 시간이 걸리기 때문이다. 만일 사용자가 급증한다면 서버 환경에선 반복적으로 Connection 객체를 얻기 위해 엄청난 시간을 소모할 것이다.

만약에 이러한 필요한 양만큼 Connection 객체를 미리 얻어놓는다면 Connection 객체를 생성하는 부분에서 발생하는 대기 시간을 줄이고 네트워크의 부담을 줄일 수 있다. 이때 등장한 개념이 DB Connection Pool이다.

# DBCP(DataBase Connection Pool)

DBCP는 Database Connection Pool의 약자로 DB와 커넥션을 맺고 있는 객체를 관리하는 역할을 한다. DBCP를 사용하게 되면, WAS 실행 시 미리 일정량의 DB Connection 객체를 생성하고 Pool이라는 공간에 저장해 둔다. 그리고 DB 연결 요청이 있을 시, Pool에서 Connection 객체를 가져다 쓰고 반환하도록 한다. DBCP를 사용하는 가장 큰 이유는 효율성이다.

# HikariCP란?

HikariCP란 Springboot 2.0부터 default로 설정되어 있는 DB Connection Pool로써 Zero-Overhead가 특징으로 높은 성능을 자랑하는 DBCP이다. 미리 정해놓은 만큼 Connection을 Connection Pool에 담아 놓고 요청이 들어오면 Thread가 Connection을 요청하고, Hikari는 Connection Pool내에 있는 Connection을 연결해주는 역할을 한다.

Last update: September 13, 2022 21:44
Contributors: ahnjs