TIL 2023/11/16 Java와 Database

YEONGDO·2023년 11월 16일

특강!

1. Java와 Database

1) JDBC(Java DataBase Connectivity)
자바 언어를 사용하여 DB와 상호 작용하기 위한 자바 표준 API(응용 프로그래밍 인터페이스) JDBC는 데이터베이스 관리 시스템(DBMS)과 통신하여 데이터를 삽입(C), 검색(R) , 수정(U) 및 삭제(D)할 수 있게 해주는 기술

Java 진영의 Database 연결 표준 인터페이스(JDBC)

JDBC의 주요 특징

  1. 표준 API
    1. 대부분의 RDBMS (관계형 데이터베이스 관리 시스템)에 대한 드라이버가 제공된다.
      이로써 여러 종류의 DB 대해 일관된 방식으로 상호 작용할 수 있다.
      ex) Database 종류가 바뀌어도 쿼리문이 실행되도록.
  2. 데터베이스 연결
  3. SQL 쿼리 실행
  4. Prepared Statement
  5. 결과 집합 처리
    1. 데이터베이스로부터 반환된 결과 집합을 처리할 수 있다.
      이를 통해 데이터를 조회하고 결과를 자바 객체로 매핑할 수 있다.
  6. 트랜잭션 관리
    1. JDBC를 사용하여 데이터베이스 트랜잭션을 시작, 커밋 또는 롤백하는 등의
      트랜잭션 관리 작업을 수행할 수 있다.

1) Statement

  • DB와 연결되어 있는 Connection 객체를 통해 SQL문을
    Database에 전달하여 실행하고, 결과를 반환받는 객체
  • SQL 쿼리는 실행 전에 문자열 형태로 전달되고, 실행 시점에 데이터베이스에 직접 파싱되고 실행된다.
  • 매번 실행할 때마다 SQL 문을 다시 파싱하므로 성능에 영향을 미칠 수 있고, 보안 취약점을 가질 수 있다.

2) Prepared Statement

  • SQL문을 Complie 단계에서 ? 를 사용하여 preCompile 하여 미리 준비해놓고
    Query문을 파라미터 바인딩 후 실행하고 결과를 반환받는다.
    미리 준비해놓았다(Pre)! 가 핵심
    • SQL 쿼리를 미리 컴파일하여 데이터베이스에 전송할 때 값만 바뀌는 형태로 전달
  • 쿼리가 한 번 컴파일되면 여러 번 실행할 수 있으며, 성능이 향상되고 보안 측면에서 더 안전
  • 동적인 입력값을 placeholder(?)로 대체한다.
    파라미터 바인딩을 통해 직접적으로 사용자 입력을 쿼리에 삽입하지 않는다.
  • 이스케이핑 : Escape 말그대로 탈출, 입력값이 자동으로 쿼리에 안전하게 이스케이핑된다.
    이스케이핑은 입력 데이터에서 잠재적인 SQL 쿼리 문자열을 무력화한다.

2. 웹 보안(SQL Injection, XSS)

1) SQL Injection

  • 악의적인 사용자가 애플리케이션에서 입력 데이터를 이용하여
    SQL 쿼리를 조작하고 데이터베이스에 무단 접근하거나 데이터를 변조하는 공격

SQL Injection 종류

  1. Error Based SQL Injection
    1. Database에 고의적으로 오류를 발생시켜 에러 출력을 통해 DB 구조를 파악하는 방법.
    2. 해결방법 : 클라이언트에게 에러 메세지 노출을 차단한다, 입력값을 Validation한다.
      Prepared Statements를 사용한다.
  2. Union Based SQL Injection
    1. 전제조건: 컬럼의 개수와 데이터 형식이 같아야 한다.
    2. DB의 UNION 연산자를 사용하여 쿼리 결과값의 조합을 통해 정보를 조회한다.
  3. Blind Based SQL Injection
  4. Stored Procedure SQL Injection
  5. Time Based SQL Injection

2) XSS

  • 악성 스크립트를 웹사이트에 주입하는 Code Injection 기법 중 하나
    공격자가 웹 어플리케이션에 보낸 악성 코드가 다른 사용자에게 전달될 때 발생한다.

  • XSS의 종류

    • Stored XSS
      • 공격자가 취약점이 있는 Web Application에 악성 스크립트를
        영구적으로 저장하여 다른 사용자에게 전달하는 방식
    • Reflected XSS
      • 외부 링크 페이지로 이동시킨다. ex) 메일 내 첨부된 링크 → 가짜 사이트로 연결
  • DOM based XSS

3. JDBC의 한계와 발전

  1. 간단한 SQL을 실행하는 경우에도 중복된 코드가 너무 많았다.
  2. DB에 따라 일관성 없는 정보를 가진 채로 Checked Exception(SQL Exception) 처리를 한다.
  3. Connection과 같은 공유 자원을 제대로 반환하지 않으면 한정된 시스템 자원(CPU, Memory)에 의해 문제가 발생한다.
  4. SQL Query를 일일히 작성하여야 한다.

1) Persistence Framework

  • JDBC 처럼 복잡함이나 번거로움 없이
    간단한 작업만으로 Database와 연동되는 시스템을 개발하게 되었다.
    이것을 Persistence Framework 라고 한다.

2) JDBC, SQL Mapper, ORM의 공통점

  • 영속성(Persistence)
    데이터를 생성한 프로그램의 실행이 종료되더라도
    사라지지 않는 데이터의 특성, 영구히 저장

4. SQL Mapper

  • 직접 작성한 SQL 문의 실행 결과와 객체(Object)의 필드를 Mapping하여
    데이터를 객체화한다.

1) Spring JDBC Template

  • Spring Framework에서 제공하는 JDBC 작업을 단순화하고 개선한 유틸리티 클래스

JDBC Template의 장점

  1. 간편한 데이터베이스 연결 → 손수 적었던 연결 코드들을 yml, properties
  2. PreparedStatementCallableStatement를 처리한다.
  3. 예외 처리와 리소스 관리 - DB Connection을 자동으로 처리하여 리소스 누수 방지
  4. 결과 집합 처리 - 데이터를 자바 객체로 변환할 수 있도록 돕는다.
  5. 배치 처리 작업을 지원한다. - Spring Batch → 매일 동일한 시간에 수행되는 쿼리

2) Mybatis

  • 반복적인 JDBC 프로그래밍을 단순화 시켜줌, SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL을 분리하여 관리되도록 한다. SQL과 Java Code의 분리가 핵심

Query를 JAVA에서 XML로

  • 복잡한 JDBC 코드가 사라짐
  • ResultSet과 같이 결과값을 맵핑하는 객체가 없다.
  • 설정이 간단
  • 관심사를 분리
  • SQL을 Java의 메소드에 매핑해준다.

MyBatis 장점

  1. 자동으로 Connection 관리를 해주면서 JDBC 사용할 때의 중복 작업 대부분을 없애준다.
  2. DB 결과 집합을 자바 객체로 매핑할 수 있다.
  3. 복잡한 쿼리나 다이나믹하게(동적쿼리) 변경되는 쿼리 작성이 쉽다.
  4. 관심사 분리 - DAO로부터 SQL문을 분리하여 코드의 간결성 및 유지보수성이 향상된다.
  5. 쿼리 결과를 캐싱하여 성능을 향상시킬 수 있다.

Mybatis는 동적 쿼리를 지원한다.
동적 쿼리(Dynamic SQL)란?
상황에 따라 분기처리(IF)를 통해 쿼리를 동적으로 만들어주는것.

SQL Mapper의 한계

  1. SQL을 직접 다룬다.

  2. 특정 DB에 종속적으로 사용하기 쉽다.
    (DB마다 Query문이 조금씩 다름, 함수도 다름)

  3. 테이블마다 비슷한 CRUD SQL = DAO 개발이 반복된다. → 코드 중복

  4. 테이블 필드가 변경될 시 이와 관련된 모든 DAO의 SQL문, 객체의 필드 등을 수정해야 한다.
    코드상으로 SQL과 JDBC API를 분리했지만 논리적으로 강한 의존성을 가지고 있다.

  5. 객체와의 관계는 사라지고 DB에 대한 처리에 집중하게 된다.
    SQL 의존적인 개발

  6. ORM(Object Relational Mapping)

  • 객체와 관계형 DB를 매핑한다.
    SQL Query가 아닌 메서드로 데이터 조작
    ex) SELECT * FROM USER;→ user.findAll();

ORM의 장점과 단점

장점

  1. 패러다임 불일치 문제 해결 - 객체지향 언어가 가진 장점을 활용 가능
  2. 생산성 - 반복적인 CRUD SQL을 개발자가 직접 작성하지 않아도 된다
  3. 데이터 접근(DB 종속성) 추상화 - DB마다 조금씩 다른 타입, SQL Query 문법을 손쉽게 해결한다.
    ex) MySQL, ORACLE 바뀌어도 코드는 일치하기 때문에 상관없음.
  4. 유지보수성 - 필드 추가, 삭제 시 관련된 SQL 쿼리를 직접 수정하지 않고 Entity만 수정하면 된다.
  5. SQL Mapper나 JDBC와 다르게 컴파일 단계에 쿼리에 대한 에러를 알 수 있다.

단점

  1. 복잡한 쿼리 사용이 아주 어렵다.
    → JPQL을 지원한다.
    → QueryDSL 을 함께 사용한다.

6. JPA

  • JPA는 JAVA ORM에 대한 API 표준 명세이다.
    인터페이스로 구성되어 있으며 사용하려면 ORM 프레임워크를 사용하여야 한다.


JPA에는 HIBERNATE, EclipseLink, DataNucleus라는 구현체가 있다.
여기서 가장 대표적인 프레임워크가 하이버네이트

profile
개발 블로그

0개의 댓글