- Enum
- Connection pool
Enum
Enum이란?
관련 상수들의 집합
<Enum 활용기>
public class Java {
public String Value(String originValue){
if("y".equals(originValue)){
return "1";
}else{
return "0";
}
}
public boolean Value(String originValue){
if("y".equals(originValue)){
return true;
}else {
return false;
}
}
}
>>"Y", "1", true는 모두 같은 의미라는 것을 알 수 없음.
>>불필요한 코드량이 많음
//ENUM으로 추출
public enum Table{
Y("1",true);
N("0",false);
private String Value1;
private boolean Value2;
Table(String Value1,boolean Value2){
this.Value1 = Value1;
this.Value2 = Value2;
}
public String getValue1(){return Value1;}
public boolean getValue2(){return Value2;}
}
>>깔끔한 표현 가능
Enum을 통해 얻는 장점
- 문자열과 비교해, IDE의 적극적인 지원을 받을 수 있습니다.
- 자동완성, 오타검증, 텍스트 리팩토링 등등
- 허용 가능한 값들을 제한할 수 있습니다.
- 리팩토링시 변경 범위가 최소화 됩니다.
- 내용의 추가가 필요하더라도, Enum 코드외에 수정할 필요가 없습니다.
- 코드 단순 + 가독성이 좋아집니다.
- 인스턴스 생성과 상속을 방지합니다.
Enum의 단점
- 상속 불가
- 고정된 집합만 사용 가능 => 코드를 추가하거나 변경해야 하는 일이 어렵다.
- 유연성 부족
enum은 미리 정의된 고정된 상태나 상수를 다룰 때 유용하지만, 동적으로 값이 추가되거나 변해야 하는 경우나 상속을 통해 구조를 확장해야 하는 경우에는 적합하지 않습니다
Enum 생성자는 왜 private인가?
enum의 생성자를 private으로 지정하는 이유는 enum이 인스턴스화되는 방식을 제한하기 위함입니다. Java에서 enum은 특정한 상수 집합을 정의하는 데 사용되며, 이 상수 값들은 미리 정해진 고정된 객체들입니다. enum 생성자가 private이기 때문에 개발자는 new 키워드를 사용해 추가적으로 객체를 생성할 수 없습니다.
다시 말해, enum은 자체적으로 제공하는 값 이외의 값이 생성되지 않도록 private 생성자를 통해 인스턴스화가 외부에서 제한되는 거죠. 만약 enum 생성자가 public이나 protected였다면, 외부에서 enum 인스턴스를 직접 생성할 수 있게 되어 enum의 고유한 상수 집합의 개념이 깨지게 됩니다.
Java는 enum 생성자를 private으로 강제하기 때문에 직접 지정하지 않더라도 자동으로 private으로 설정됩니다.
<참고>
https://techblog.woowahan.com/2527/
https://www.nextree.co.kr/p11686/
Connection pool
웹 컨테이너(WAS)가 실행되면서 DB와 미리 connection(연결)을 해놓은 객체들을 pool에 저장해두었다가.
클라이언트 요청이 오면 connection을 빌려주고, 처리가 끝나면 다시 connection을 반납받아 pool에 저장하는 방식을 말합니다

사용하는 이유: 'Connection에 드는 비용'이 크기 때문
- handshake 비용
- 프로세스나 스레드 생성/삭제 비용
- Connection Pool을 사용해 절약할 수 있다.
참고
https://devkly.com/db/db-connection-pool/
커넥션 풀 (DBCP)특징
- 웹 컨테이너(WAS)가 실행되면서 connection 객체를 미리 pool에 생성해 둡니다.
- HTTP 요청에 따라 pool에서 connection객체를 가져다 쓰고 반환한다.
- 이와 같은 방식으로 물리적인 데이터베이스 connection(연결) 부하를 줄이고 연결 관리 한다.
- pool에 미리 connection이 생성되어 있기 때문에 connection을 생성하는 데 드는 요정 마다 연결 시간이 소비되지 않는다.
- 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수를 제한적으로 설정함
유의사항 :
동시 접속자가 많을 경우 너무 많은 DB 접근이 발생할 경우에는 커넥션은 한정되어 있기 때문에 쓸 수 있는 커넥션이 발납될 때까지 기다려야 한다. 너무 많은 커넥션을 생성할 시에는 커넥션 또한 객체이므로 많은 메모리를 차지하게 되고, 프로그램의 성능을 떨어뜨리는 원인이 된다.
즉, WAS에서 커넥션 풀을 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 대기 시간이 줄어 들고, 반대로 커넥션 풀을 작게 설정하면 그 만큼 대기 시간이 길어진다. 따라서 사용량에 따라 적정량의 커넥션 객체를 생성해 두어야 한다.
그렇다면 Connection Pool이 커지면 성능이 무조건적으로 좋아질까?
=>❌
- Thread Pool 크기 < Connection Pool 크기
- Thread Pool에서 트랜잭션을 처리하는 Thread가 사용하는 Connection 외에 남는 Connection은 실질적으로 메모리 공간만 차지하게 된다.
- Thread Pool 크기와 Connection Pool 모두 크기 증가
- Thread 증가로 인해 더 많은 Context Switching이 발생한다.
- Disk 경합 측면에서 성능 한계가 발생한다.
- 데이터베이스는 하드 디스크 하나 당 하나의 I/O를 처리하므로 블로킹이 발생한다.
- 즉, 특정 시점부터는 성능적인 증가가 Disk 병목으로 인해 미비해진다.
Thread와 함께 고려해야 한다.
Connection이 많다는 의미는 데이터베이스 서버가 Thread를 많이 사용한다는 것을 의미하고, 이에 따라 Context Switching으로 인한 오버헤드가 더 많이 발생하기 때문에 성능적인 한계가 존재한다.
참고
'Backend' 카테고리의 다른 글
| MSA에 대해 알고가기 (0) | 2025.02.13 |
|---|---|
| AJAX(Asynchronous JavaScript and XML) (0) | 2024.11.29 |
| [RBF] 1주차 (1) | 2024.10.30 |