[JAVA/Spring] Database 연결하기 (JDBC, DBMS, DBCP)

yurinnn·2024년 1월 7일
0

Java/Spring

목록 보기
10/13

데이터를 영구적으로 저장할 수 있는 저장소로, 서로 다른 시스템 간에 데이터 공유가 가능하다.

  • DBMS (Data Base Management System) : Data Base 를 관리하는 시스템

JDBC (Java Database Connectivity) framework

JAVA 와 Database 를 연결해주는 라이브러리 - 표준 SQL 인터페이스 API

  • JDBC 라이브러리 추가 방법

    • 추가 위치 : pom.xml -> dependencies 태그의 Spring 아래에 추가
    • 크롬에 maven repository 검색 -> MariaDB Java Client 2.7.3 -> maven 복사 -> pom.xml에 붙여넣기
  • DB 종류 별로 JDBC 를 다운 받아서 사용이 가능하다.
    (DBMS 의 종류가 바뀔 경우 JDBC 만 변경해주면 된다)

  • JDBC 는 DB 에서 정보를 가져올 때마다 매번 DB 연결을 열고 닫는다.
    매우 비효율적이기 때문에 상용 어플에는 JDBC 방식을 사용하는 경우가 거의 없다.

  • Connection 객체란❓
    네트워크 상의 연결 자체를 의미한다.
    DB 에서 하는 모든 일을 대신 DB 에 접속해서 수행해준다.
    close( ) : 사용한 자원 반납 - connection pool 에 반납한다.
    DriverManager.getConnection( ) : 실제 자바 프로그램과 데이터베이스를 네트워크 상에서 연결을 해주는 메서드

예제) DAO 에서 JDBC 활용하여 DBMS 와 연결

public class HomeDAO {
	Logger logger = LoggerFactory.getLogger(HomeDAO.class);
	public boolean dbconnect() {
		logger.info("DAO 접근 완료");
		// DB 접근을 위한 순서
		// 1. DB 접근을 위한 정보 준비
		String username = "web_user";
		String pw = "pass";
		String url = "jdbc:mariadb://localhost:3306/gdj70";
		String driver = "org.mariadb.jdbc.Driver";
		boolean success = false;
		
		try {
			// 2. DriverManager 에게 내용을 전달 한다.
			Class.forName(driver); // DB 접속시 사용할 라이브러리 클래스를 알려준다.			
			// 3. 데이터베이스를 다룰 권한을 가져온다.
			Connection conn = DriverManager.getConnection(url,username,pw);
			// 접속 성공 : Connection 객체를 얻어온다.
			if(conn != null) {
				success = true;
				logger.info("접속 성공 : "+conn);
				// 4. 할 일을 다 하면 자원을 반납한다.
				conn.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
			// 접속 실패 : 예외 발생시 콘솔에 출력
		}

		return success; // service 에서 받는 내용
	}

}

DBCP (DataBase Connection Pool)

DB Connection 객체를 미리 Connection Pool 에 생성해두고 필요할 때 가져오고 다 쓰면 반납한다. JDBC 의 단점을 보완하여 Connection 을 조금 더 효율적으로 사용할 수 있다.

  • WAS(Web Application Server)가 실행되면 일정량의 DB Connection 객체를 Pool에 저장해두고, HTTP Request에 따라 필요할 때마다 Pool에서 Connection 객체를 가져다 쓰고 반환하는 것이다.
  • DBCP 라이브러리 추가 + context.xml 설정 방법
    • JDBC 연결과 같지만 connection-pool 라이브러리를 추가하고, context.xml 에 MariaDB 정보를 추가한다.
    1. DBCP 라이브러리 추가
    2. context.xml 에 DB 정보 추가
      • servers - tomcat - context.xml 의 맨 마지막에 추가
        <Resource
            	name="jdbc/MariaDB"
            	auth="Container"
            	type="javax.sql.DataSource"
            	driverClassName="org.mariadb.jdbc.Driver"
            	url="jdbc:mariadb://localhost:3306/gdj70"
            	username="web_user"
            	password="pass"
        />
  • POST 방식으로 데이터 전송 시 한글 깨짐 방지 설정 방법 (web.xml)
    • web.xml 에서 <filter><filter-mapping>부분을 추가해서 설정해준다.

       	<servlet>
      		<servlet-name>appServlet</servlet-name>
      		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      		<init-param>
      			<param-name>contextConfigLocation</param-name>
      			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
      		</init-param>
      		<load-on-startup>1</load-on-startup>
      	</servlet>
      		
      	<!-- "/" 요청이 오면 appServlet 이라는 이름의 servlet-name 의 내용을 실행해라  -->
      	<servlet-mapping>
      		<servlet-name>appServlet</servlet-name>
      		<url-pattern>/</url-pattern>
      	</servlet-mapping>
      
      	<!-- 한글 깨짐 방지 : 특정한 내용이 오면 걸러서 특정한 처리를 해준다.-->
      	<filter>
      		<filter-name>encodingFilter</filter-name>
      		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      		<!-- 사용할 인코딩 -->
      		<init-param>
      			<param-name>encoding</param-name>
      			<param-value>UTF-8</param-value>
      		</init-param>
      		<!-- 강제인코딩 -->
      		<init-param>
      			<param-name>forceEncoding</param-name>
      			<param-value>true</param-value>
      		</init-param>
      	</filter>
      
      	<!-- 언제 (어떤 요청에서) 어떤 필터를 사용할건지? -->
      	<!-- /* : / 뒤에 뭐가 붙던지 다 받아준다 -->
      	<filter-mapping>
      		<filter-name>encodingFilter</filter-name>
      		<url-pattern>/*</url-pattern>
      	</filter-mapping>
  • DataSource 객체란❓ Connection Pool 을 관리 하는 인터페이스로, 이걸 통해 Connection 을 얻어오고 반납한다.
  • DB 접속 과정 (homeDAO)
    // 1. context.xml 자체를 자바 객체로 변환
    Context ctx = new InitialContext();
    // 2. 이름을 통해 <Resource/> 태그를 가져와 DataSource 에 담는다. 
    // java 로 compile 한 환경(env)에서 사용할 jdbc/MariaDB
    DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MariaDB");
    // 3. 그걸로 DB 접속 요청(커텍션 가져오기)
    Connection conn = ds.getConnection();
    // 4. 자원 반납
    conn.close();
profile
슬기로운 개발 생활

0개의 댓글