SpringBoot

[Spring Boot] JPA를 왜 써야할까??

데브킹덕 2024. 6. 27. 17:33

자바에서는 데이터의 영속성(프로그램이 종료되어도 사라지지 않고 어떤곳에 저장되는 것)을 위하여 JDBC를 지원해줌

 

 

JDBC에서 DB에 접근하여 SQL을 수행하고 결과를 다시 데이터타입으로 매핑시켜주는 작업을 개발자가 일일히 수행해야한다....

/*
참고) JDBC이용 영화관람 과제코드....
*/

Connection conn = null;
try {
    // JDBC 드라이버 등록
    Class.forName("oracle.jdbc.OracleDriver");

    // 데이터베이스에 연결하기
    conn = DriverManager.getConnection(
        "jdbc:oracle:thin:@localhost:1521/xe", // 데이터베이스 URL
        "bituser", // 계정 이름
        "1004" // 계정 비밀번호
    );

    System.out.println("연결 성공");

    // SQL 쿼리를 준비하기
    PreparedStatement pstmt = conn.prepareStatement("select * from boards");
    ResultSet rs = pstmt.executeQuery();
    boolean bExistData = false;

    // 쿼리 결과를 반복하면서 처리하기
    while (rs.next()) {
        bExistData = true;

        // 각 열의 데이터를 읽기
        String bno = rs.getString("bno");
        String btitle = rs.getString("btitle");
        String bcontent = rs.getString("bcontent");
        String bwriter = rs.getString("bwriter");
        String bdate = rs.getString("bdate");

        // 데이터를 출력하기
        System.out.println("bno : " + bno);
        System.out.println("btitle : " + btitle);
        System.out.println("bcontent : " + bcontent);
        System.out.println("bwriter : " + bwriter);
        System.out.println("bdate : " + bdate);
        System.out.println("====================\n");
    }

    // 데이터가 존재하지 않을 때의 처리
    if (!bExistData) {
        System.out.println("게시물의 자료가 존재하지 않습니다");
    }

    // 리소스 정리
    rs.close();
    pstmt.close();

} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    if (conn != null) {
        try {
            // 연결 끊기
            conn.close();
            System.out.println("연결 끊기");
        } catch (SQLException e) {
            // 예외 무시
        }
    }
}
mainMenu();
}

 

 

매우매우 번거로움.... 

 

그래서 JDBC Programming을 하지 않도록 기능들을 제공해 주는 Persistence Framework가 있다.

 

 

1.  SQL Mapper

SQL Mapper는 쿼리를 매핑함

ex) Mybatis, JDBC Template

- 자세하게는 객체와 테이블간의 관계를 매핑하는 것이 아니라,

SQL문을 직접 작성하고  쿼리 수행결과를 어떠한 객체에 매핑 하여 줄지 바인딩하는 방법임

- 매우매우 SQL에 의존적인 방법

 

Mybatis

- SQL을 xml 파일로 분리하여 관리

- SQL결과와 객체 인스턴스의 매핑을 도와주는 역할을 수행

- 동적쿼리를 지원하여 다이나믹하게 변경되는 쿼리 작성가능

 

xml파일로 분리한 예제

 

 

2. ORM(Object Relational Mapper)

객체를 매핑함

Object와  DB테이블을 매핑하여 데이터를 객체화 하는 기술

CRUD 관련 메소드를 사용하면 자동으로 SQL이 만들어져 개발자가 반복적인 SQL을 직접 작성하지 않아도 되고, 

DBMS에 종속적이지 않다. 또한 복잡한 쿼리의 경우 JPQL을 사용하거나 SQL Mapper를 혼용하여 사용할 수 있다.

 

Java ORM 기술에 대한 인터페이스 표준을 JPA라고 하고, 이를 구현한 가장 대표적인 기술이 Hibernate이다.

ex) Hibernate, EclipseLink, DataNucleus

 

 

 

그래서 왜 JPA를 쓰면 좋은가?

관계형 데이터 베이스는 어떻게 데이터를 저장할지에 초점이 맞춰진 기술이고

객체지향 프로그래밍언어는 메시지를 기반으로 기능과 속성을 한곳에서 관리하는 기술이다

서로 패러다임이 다르다 보니 SQL Mapper 를 이용하다보면 데이터 베이스 모델링에만 집중하게 됨

개발자는 객체지향적으로 프로그래밍을 하고 JPA가 관계형 데이터 베이스 에 맞게 SQL을 대신 생성해서 실행하도록 하기 위함임

 

 

 

- JPA는 인터페이스이다

- 자바 표준 명세서임

- 인터페이스이니까 구현체가 필요하겠지?

- 대표적으로 구현체로 ex) Hibernate, EclipseLink, DataNucleus 가 있음

- 하지만 스프링에서는 구현체를 직접 다루지 않아

- 구현체를 좀더 쉽게 사용하려고 SpringData JPA라는 모듈로 추상화를 시켰거든

- But 막상 Hibernate,SpringData JPA  는 큰 차이가 없대 

- 근데도 왜  한단계 감싸놓은 SpringData JPA를 써야할까?

- 이유는 구현체를 교체하고 저장소를 교체하는 데 용이하다는 이점이 있어서야

 

- SpringDataJPA는 내부에서 구현체 매핑을 지원해주기 때문에  Hibernate 외에 다른 구현체로 대체가 가능함

- 저장소 교체가 용이하다는 뜻은 관계형 데이터 베이스 외에 다른 저장소로 쉽게 교체할 수 있다는 뜻인데

- 트래픽(네트워크 일정시간 동안 흐르는 데이터 양)이 많아지거나 하면

- 관계형 데이터 베이스로는 도저히 감당히 안돼

- 이럴 경우 Spring Data의 하위 프로젝트들의 

- 기본적인 CRUD의 인터페이스가 같기 때문에 의존성만 교체하면 됨

ex) SpringDataJPA,SpringDataRedis,SpringDataMongoDB등 save(),findAll,findOne() 등을 인터페이스로 갖고 있어서야

 

'SpringBoot' 카테고리의 다른 글

Model1 -> Model2 -> SpringMVC  (0) 2024.11.22
WAS란?  (0) 2024.09.03
SQL Mapper - Mybatis  (4) 2024.09.02
[SpringBoot] Gradle 이란? (Build Tool)  (0) 2024.06.26