Backend

[RBF] 2주차

해로몬 2024. 11. 7. 09:34
  • 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에 드는 비용'이 크기 때문

  1. handshake 비용
  2. 프로세스나 스레드 생성/삭제 비용
  3. 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으로 인한 오버헤드가 더 많이 발생하기 때문에 성능적인 한계가 존재한다.

 

참고

https://steady-coding.tistory.com/564

'Backend' 카테고리의 다른 글

MSA에 대해 알고가기  (0) 2025.02.13
AJAX(Asynchronous JavaScript and XML)  (0) 2024.11.29
[RBF] 1주차  (1) 2024.10.30