개발자 성장 일지

2022.03.31 죽어라 DB야

NEWDODORIPYO 2022. 3. 31. 22:41

close의 중요성!!!!

⭐⭐close( ) 란?

네트워크 즉 입출력 과정에서 내가 끝났다는 신호를 보내는 것

close( )를 안 해주면 반대쪽에서 끝났는지 안 끝났는지 모르는 상황이 생긴다

 

close( ) 없이 DB를 반복 호출하기 <여러 명이서 동시에 돌린 상황입니다>

public static void main(String[] args) throws Exception{
System.out.println("test1.........");

        Class.forName("oracle.jdbc.driver.OracleDriver");

       // String url ="jdbc:oracle:thin:@IP:1521:XE";

        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
            try {
                   Connection con =
                   DriverManager.getConnection(url, "teamspring", "teamspring");

                   System.out.println(con);

}catch(Exception e){
                e.printStackTrace();
            }
            }).start();
        }//end for
}
}

실행 자체를 거부하는 에러가 뜬다

close( ); 추가해서 DB에 접속해보기

public static void main(String[] args) throws Exception{
System.out.println("test1.........");

        Class.forName("oracle.jdbc.driver.OracleDriver");

       // String url ="jdbc:oracle:thin:@IP:1521:XE";

        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
            try {
                   Connection con =
                   DriverManager.getConnection(url, "teamspring", "teamspring");

                   System.out.println(con);
                   con.close();
                   
}catch(Exception e){
                e.printStackTrace();
            }
            }).start();
        }//end for
}
}

정상적으로 접속하는 걸 볼 수 있다

close( ); 코드 하나 없을 뿐인데 DB에는 치명적으로 작용했다

 

close( ); 를 해주는 3가지 방법

  1. try~catch finall
  2. try with resource
  3. @Cleanup

예외 처리 부분할 때 한번 설명했던 방법들인 3가지 방법들 이 중에서 오늘은 @Cleanup을 사용할 예정이지만 2번째인 try with resource 가 가장 안정적인 방법이긴 하다 lombok은 정말 편하고 좋은 기술이지만 익명 클래스 쪽에서는 문제가 생길 수 있기 때문에 사용할 때는 조심해야 한다

기존에 socket의 역할을 Connection 이 대신하다 Connection을 세션이라고 부르기도 한다

 

Connection 맺을 때 주의할 점 <안 지키면 DB가 죽어요~>

  • 반드시 close( )를 해줘야 한다
  • 로컬 변수로 잡아줘야 안전하다

ConnectionPool =CP

웹 컨테이너(WAS)가 실행되면서 DB와 미리 connection(연결)을 해놓은 객체들을 pool에 저장해두었다가.

클라이언트 요청이 오면 connection을 빌려주고, 처리가 끝나면 다시 connection을 반납받아 pool에 저장하는 방식을 말합니다.

<DB와 Pool의 연결은 지속되고 있기 때문에 성능이 올라가는 것>

<인터페이스의 사용목적과 느낌이 비슷하다> <실체를 몰라도 쓰기 위해서>

ConnectionPool종류

DBCP , C3PO , HikariCP 등등

HikariCP 가 압도적인 성능을 보이기에 HikariCP를 대부분 사용한다

Connectionpool 사용하지 않고 DB로 연결할 때와 onnectionpool의 한 종류인 HikariCP를 사용했을 때 성능의 차이는 어마어마한 차이가 있었다

그때그때 연결하는 것이 아닌 연결을 해두는 방식이기에 속도면에서 압도적이었습니다

 

DAO와 DTO

DAO

Data Access Object의 약자로, 데이터베이스의 데이터에 접근하기 위해 생성하는 객체이다.

데이터베이스에 접근하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용한다.

간단하게, DB에 접속하여 데이터의 CRUD(생성, 읽기, 갱신, 삭제) 작업을 시행하는 클래스이다.

JSP 및 Servlet 페이지 내에 로직을 기술하여 사용할 수 있지만, 코드의 간결화 및 모듈화, 유지보수 등의 목적을 위해 별도의 DAO 클래스를 생성하여 사용하는 것이 좋다.

한 줄 요약 : DAO는 DB를 사용하여 데이터의 조회 및 조작하는 기능을 전담하는 오브젝트이다.

출처:https://iri-kang.tistory.com/5 이리의 개발 이야기

DTO

Data Transfer Object의 약자로, 계층 간 데이터 교환을 위한 자바 빈즈를 뜻한다.

또한 DTO는 VO(Value Object)와 용어를 혼용해서 많이 사용하는데, VO는 읽기만 가능한 read only 속성을 가져 DTO와의 차이점이 존재한다.

일반적으로 DTO는 로직을 가지고 있지 않은 순수한 데이터의 객체이며 객체의 속성과 그 속성의 접근을 위한 getter 및 setter 메서드만을 가지고 있다.

한 줄 요약 : DTO는 VO와 혼용하여 사용하며, 순수한 데이터의 객체이다.

출처:https://iri-kang.tistory.com/5 이리의 개발 이야기

JSP 자바 빈즈란?

자바 코드로 작성된 컴포넌트들로 jsp페이지에서 비즈니스 로직을 제거하기 위한 방법으로 사용하는 기술이다. 즉, jsp페이지에서 화면을 표현하기 위한 계산식이나 자료들의 처리를 담당하는 자바 코드를 따로 분리하여 작성한 것이 자바 빈즈이다..

출처: https://velog.io/@always/자바-빈즈-Java-Beans