[LG CNS AM Inspire Camp 1기] BE - DAL (Data Access Layer)

이슬아·2025년 1월 31일

LG CNS AM Inspire Camp 1기

목록 보기
15/20

DAL (Data Access Layer)

DAL은 데이터베이스와 애플리케이션 사이의 연결을 담당하는 계층(Layer)으로,데이터베이스와의 직접적인 연동을 캡슐화하여 비즈니스 로직과 분리하는 역할을 한다.

📍 DAO (Data Access Object)

DAO는 데이터베이스와 상호작용하는 객체이다.
애플리케이션에서 직접 SQL을 다루지 않고, DAO를 통해 데이터를 읽고, 쓰고, 수정하고, 삭제하는 역할을 한다.

🤔 DAO를 사용하는 이유

1️⃣ 객체-관계 불일치(O/R Impedance Mismatch)
Java에서는 객체(Object) 중심으로 데이터를 관리하고 DB에서는 테이블(Table) 중심으로 데이터를 저장하기 때문에
애플리케이션에서 사용하는 객체(Object)와 데이터베이스의 레코드(Record) 가 완전히 일치하지 않는 경우가 많다.

예) JAVA의 Date 라는 데이터 타입은 DB에서 그대로 인식할 수 없음
-> SQL문을 이용한 CRUD로 불일치 해결

이런 차이를 해결하기 위해 DAO에서 변환 로직을 추가해야한다.

2️⃣ 비즈니스 로직과 데이터베이스 코드 분리
DAO 없이 직접 SQL을 실행하는 경우 비즈니스 로직(Service)와 데이터 접근 로직이 섞여 있어 데이터베이스 변경 시 로직 변경 필요해진다.

3️⃣ 코드 재사용성과 유지보수성 향상
DAO를 사용하면 데이터베이스 로직을 한 곳에 모아서 관리할 수 있어
여러 곳에서 같은 SQL을 반복해서 작성할 필요 없이 DAO만 수정하면 된다.

📍 JDBC (Java Database Connectivity)

JDBC는 데이터베이스에 접근할 수 있도록 자바에서 제공하는 API

❗️ Plain JDBC API의 문제점

  • 쿼리 실행 전후에 많은 코드를 작성해야 함 (ex. 연결 생성, 명령문, ResultSet 닫기, 연결 등)
  • 예외 및 트랜젝션 처리
  • 매번 쿼리를 실행할 때 마다 수행
 public class SelectExample {
 // DB 연결: DriverManager.getConnection("DB 주소", "ID", "PW")
   static final String DB_URL = "jdbc:mysql://localhost/TUTORIALSPOINT";
   static final String USER = "guest";
   static final String PASS = "guest123";
   static final String QUERY = "SELECT id, first, last, age FROM Employees";

   public static void main(String[] args) {
      // Open a connection
      try(Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
      // SQL 실행: Statement 또는 PreparedStatement 사용
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(QUERY);) {    
         // Extract data from result set
         while (rs.next()) {
            // Retrieve by column name
            System.out.print("ID: " + rs.getInt("id"));
            System.out.print(", Age: " + rs.getInt("age"));
            System.out.print(", First: " + rs.getString("first"));
            System.out.println(", Last: " + rs.getString("last"));
         }
      } catch (SQLException e) {
         e.printStackTrace();
      } 
   }
}

Plain JDBC란?
➡ Plain JDBC(순수 JDBC) 는 추가적인 라이브러리나 프레임워크 없이 Java의 기본 JDBC API만 사용하여 데이터베이스와 직접 연결하고 SQL을 실행하는 방식으로 직접 Connection, Statement, ResultSet 등을 관리하는 방식이다.

📍 Data Source

DB와 관련된 연결(Connection) 정보를 담고 있으며, 빈(bean)으로 등록해 인자로 넘겨준다.
✔️ 빈으로 등록되어야 JDBC 내부에서 DB 연결이 필요한 곳에서 @AutoWired해서 갖다 쓸 수 있음.
( Spring Boot에서는 DataSource를 자동으로 빈(Bean)으로 등록 됨)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb"); // connectionURL
        dataSource.setUsername("root"); // username
        dataSource.setPassword("password"); // password
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); // jdbcDriver
        return dataSource; // 커넥션 풀 없이 새로운 연결을 반환
    }
}
  • JDBC 드라이버 벤더 별로 여러 가지가 존재
    (= 각 DBMS(MySQL, PostgreSQL, Oracle, MSSQL 등)마다 JDBC 드라이버가 다름)
    ⇒ 일반적으로 connectionURL, username, password, jdbcDriver 등으로 구성

@Autowired를 사용하여 DataSource 자동 주입

public UserDAO(@Autowired DataSource dataSource) {
      this.dataSource = dataSource;
  }

이 과정을 통해 Spring은 DataSource로 DB와의 연결을 획득한다.

🤔 DataSource를 사용하는 이유

Plain JDBC는 기본적으로 데이터베이스 연결 관리로 DriverManager 사용한다.
1️⃣ 하지만 ! JDBC의 DriverManager는 매번 새로운 연결을 생성함 → 비효율적
2️⃣ DataSource는 커넥션 풀(Connection Pool)을 사용하여 기존 연결을 재사용 → 성능 최적화
3️⃣ 트랜잭션 관리 및 보안 강화

커넥션 풀(Connection Pool)이란?
미리 DB 연결을 생성해두고, 필요할 때 재사용하는 기술
➡️ Spring Boot 기본 커넥션 풀 HikariCP

커넥션 풀(Connection Pool 사용 예제

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb"); // connectionURL
        config.setUsername("root"); // username
        config.setPassword("password"); // password
        config.setDriverClassName("com.mysql.cj.jdbc.Driver"); // jdbcDriver
        config.setMaximumPoolSize(10); // 최대 10개의 커넥션 유지
        return new HikariDataSource(config); // HikariCP 커넥션 풀 사용
    }
}

➡️ 매번 새로운 연결을 생성할 필요 없이 연결을 재사용 가능하다

📍 JDBC Template

Plain JDBC API의 문제점을 해결하기 위해 스프링에서 제공하는 Spring JDBC 접근 방법 중 하나이다.
✅ 커넥션 풀(DataSource)과 함께 사용 가능

📍 JDBC Driver

JDBC Driver는 Java 애플리케이션과 데이터베이스(DBMS)를 연결해주는 소프트웨어로
자바 프로그램의 요청을 DBMS가 이해할 수 있는 프로토콜로 변환해주는 클라이언트 사이드 어댑터이다.

  • DB 마다 Driver가 존재하고, 자신이 사용하는 DB에 맞는 JDBC Driver를 사용한다.
  • DataSource를 JDBC Template에 주입 ➡️ JDBC Template은 JDBC Driver를 이용해서 DB에 접근

최종 정리

  • DAO는 JDBC API를 통해 DB에 접근하며, 기본적으로 Plain JDBC 방식으로 사용되지만, 코드가 복잡하고 비효율적이다.
  • 이를 해결하기 위해 DAO는 DataSource, 커넥션 풀, JDBC Template을 사용하여 성능을 최적화하고 코드 중복을 줄인다.
  • DataSource는 DB 연결 정보를 관리하며, 커넥션 풀을 활용해 기존 연결을 재사용하여 성능을 향상시킨다.
  • JDBC Template은 JDBC API를 간소화하고 예외 처리를 개선하여 효율적인 DB 접근을 지원한다.
  • 각 DBMS마다 JDBC Driver가 다르기 때문에, JDBC Template은 해당 JDBC Driver를 이용해 특정 DB에 접근한다.

0개의 댓글