jongviet

May 24, 2021 - JSP 3일차(DBCP, JSP encoding) 본문

Spring legacy

May 24, 2021 - JSP 3일차(DBCP, JSP encoding)

jongviet 2021. 5. 24. 23:18

*5월24일

-그동안 JDBC를 사용 시 단편적으로 클라이언트 측에서 요청이 올 때 마다 새로운 conn을 따서 DB에 연결하는 방식으로 실습을 진행했다. 이는 공부하는 주니어 개발자가 철저히 연습하는 환경에서 수행해본 방법이고, 실제 서비스에 있어서는 사용량을 철저하게 고려하여 설계가 이루어져야하기에 DBCP 활용이 중요하다.

-오늘은 DBCP가 무엇인지 왜 쓰는지 간략하게 정리해보고자 한다. 

 

*DBCP : Database Connection Pool 

-기존에는 접속 할 때마다 'Driver Load' -> 'conn에 getConnection' 받아오는 과정으로 실습함. DBCP는 그것을 보완하기 위한 기술임.
-실제 서비스에서는 커넥션 풀 사용하지 않을 시 과부하 걸림.. '클라이언트 -> 커넥션풀 -> DB'
-DBCP 기술은 현재 톰캣에 내장되어 있음! 톰캣꺼 쓰면됨 걍!!
->Spring넘어가면 톰캣꺼 안쓰고 자체 라이브러리에 제공되는 기술을 씀!
-JNDI(Java Naming and Directory Interface)는 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup)하기 위한 자바 API다. 인터페이스나 클래스 이름을 그대로 xml과 매핑시키는 기술이라고 볼 수 있음.

 

-프로젝트 web.xml 내부에 설정

  <resource-ref>

    <description>DB Connection</description> //자체이름지정

    <res-ref-name>jdbc/mysql</res-ref-name> //자체이름지정, name

    <res-type>javax.sql.DataSource</res-type> //java extension의 sql내, type

    <res-auth>Container</res-auth>  //하나의 데이터 소스를 가지고 있는 박스라는 느낌~, auth

  </resource-ref>

 

-DBCP 설정값 / mysql버전, Servers/Tomcat/context.xml내에 저장

<Resource name="jdbc/mysql" auth="Container"  type="javax.sql.DataSource"

    maxTotal="100" maxIdle="30"  maxWaitMillis="10000" username="root"  password="*****"   driverClassName="com.mysql.jdbc.Driver"  url="jdbc:mysql://localhost:3306/sqlex/> 

 

//maxWaitMillis는 주로 6000~10000 6~10초로 커넥션 얻기 전 대기시간; 해당 시간 초과 시 예외처리됨. -1로 세팅 시 무한정 대기 가능.

//maxTotal은 동시에 사용할 수 있는 최대 커넥션 개수, -1로 지정하면 제한없이 사용가능. mysqld max_connections 설정값을 맞춰줘야함!

//maxidle은 커넥션풀에 미사용상태로 최대한 보관 될 수 있는 커넥션의 수!

 

-maxWaitMillis 관련

한국의 인터넷 사용자는 2~3초내에 페이지가 로딩되거나 반응이 오지 않을 시 바로 나감. 만약 maxWaitMillis를 10초로 지정한다면 실제 10초가 지났을 때 남아있는 사용자는 거의 없을 것... 반대로 너무 짧게 설정하면 수 많은 사람들에게 오류가 리턴되어 난장판이 될 것임. 사용서비스의 특성, 타겟 사용자의 특성을 고려해서 설계해야 하는 중요한 부분임!

 

-Transaction per seconds(TPS) : 초당 처리할 수 있는 요청의 수

 

Source: Tomcat.apache.org/JNDI Datasource How-To

 

-DBCP = DBManager class 내부 코드

package model;

import java.sql.Connection;

import java.sql.SQLException;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

import javax.sql.DataSource;

 

public class DBManager {

    public static Connection getConnection() {

        Connection conn = null;  //connection =  getConnection(url, id, pwd);

        

        try {

 

            //tomcat context.xml에 설정한 리소스 찾아서 가져옴

            Context initCtx = new  InitialContext(); //Context는 하나의  박스(인터페이스), key:value로 구성된 내부값들

 

            //자바 컴파일러 환경 설정

            Context envCtx = (Context)  initCtx.lookup("java:/comp/env");  //자바컴파일러환경, 설정된코드

 

            //DataSource 설정, DataSource형태는 Spring까지 감! DB 커넥 전에 필요한 사전 작업을 하는게 DataSource;

            DataSource ds = (DataSource)  envCtx.lookup("jdbc/mysql"); //DataSource =  context.xml의 name

            try { 

                conn = ds.getConnection();

            } catch (SQLException e) {

                System.out.println("DB 커넥션  오류");

                e.printStackTrace();

            }

        } catch (NamingException e) {

            System.out.println("DBCP 설정  오류");

            e.printStackTrace();

            return null;

        }

        return conn;

    }

}

 

 

*JSP request & response encoding

 

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("UTF-8");

Comments