ABOUT ME

-

오늘
-
어제
-
-
  • JPA - 관계형 데이터베이스와 자바
    Back-end/JPA 2020. 6. 30. 16:14

    관계형 데이터베이스와 자바

    JPA를 공부하기 전 데이터베이스와 자바의 관계를 알아보며 JPA가 탄생한 배경에 대해서 알아보겠습니다.

    JDBC

    JDBC는 데이터베이스와 자바를 연결하는 고리의 역할을 합니다.
    JDBC를 활용하여 아래와 같은 기능을 통해 연결합니다.

    • DataSource / DriverManager
    • Connection
    • PreparedStatement

    JDBC 연동하기

    저는 postgresql를 Docker를 활용해 실행하고 연동하겠습니다. 만약 다른 DB를 사용하셔도 상관은 없지만 sql문법과 Docker 명령어가 조금 다를 수 있습니다.

    docker로 PostgreSQL 사용하기

    docker로 PostgreSQL을 설치 및 실행하는 방법은 위 주소에서 설명했으니 생략하도록 하겠습니다.

    RDS

    docker를 통해 PostgreSQL을 접속합니다.

    PostgreSQL 드라이버 의존성 추가

            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <version>42.2.5</version>
            </dependency>

     

    RDS

    JDBC를 연결하려면 버가 필요하여 드라이버 의존성을 추가합니다.

    RDS

    이제 새로운 패키지와 클래스를 만들어 main 메소드에 연동을 해보겠습니다.

    연동 로직 구현

    public class Application {
    
        public static void main(String[] args) throws SQLException {
            String url = "jdbc:postgresql://localhost:5432/springboot";
            String username = "junjang";
            String password = "pass";
    
            try(Connection connection = DriverManager.getConnection(url, username, password)){
                System.out.println("Connection created: "+ connection);
            }
        }
    }

     

    RDS

    JDBC와 연동하는데는 총 3가지의 정보(Url, username, password)가 필요합니다.
    PostgreSQL을 설치 및 실행할 때 위 정보를 가지고 실행했기 때문에 그 정보로 선언했고 Connection 객체를 통해 연동하였습니다.
    결과적으로 잘 연동된 것을 확인할 수 있습니다.

    그리고 try with resource 문법을 사용하여 괄호 안 로직이 실행되면 그 괄호에 해당되는 로직이 실행되게 구현합니다.

    try with resource 문법이 에러가 난다면?

    Java 8 부터 도입된 문법이므로 프로젝트가 사용하는 JDK의 버전이 낮을 수도 있습니다. Intellij 기준 해결 방법입니다.

    RDS

    Modules의 언어 레벨을 바꾸고 적용합니다.

    RDS

    Java Compiler의 박스 세 부분을 8버전 이상으로 통일시킵니다.
    위 두가지 부분을 수정하면 정상적으로 컴파일이 될 것입니다.

    테이블 넣어보기

    RDS와 연동이 되었으니 DB에 테이블 넣어보겠습니다.

    public class Application {
    
        public static void main(String[] args) throws SQLException {
            String url = "jdbc:postgresql://localhost:5432/springboot";
            String username = "junjang";
            String password = "pass";
    
            try(Connection connection = DriverManager.getConnection(url, username, password)){
                System.out.println("Connection created: "+ connection);
                String sql = "CREATE TABLE ACCOUNT (id int, username varchar(255), password varchar(255));";
    
                try(PreparedStatement statement = connection.prepareStatement(sql)){
                    statement.execute();
                }
            }
        }
    }

     

    RDS

    sql문을 DDL로 작성한 변수를 PreparedStatement 객체를 사용하여 execute합니다.

    RDS

    테이블을 조회해보면 방금 생성한 ACCOUNT 스키마가 추가된 것을 볼 수 있습니다.


    데이터 넣어보기

    이번엔 생성된 테이블에 데이터를 넣어보겠습니다.

    public class Application {
    
        public static void main(String[] args) throws SQLException {
            String url = "jdbc:postgresql://localhost:5432/springboot";
            String username = "junjang";
            String password = "pass";
    
            try(Connection connection = DriverManager.getConnection(url, username, password)){
                System.out.println("Connection created: "+ connection);
                String sql = "INSERT INTO ACCOUNT VALUES(1, 'junjang', 'pass');";
    
                try(PreparedStatement statement = connection.prepareStatement(sql)){
                    statement.execute();
                }
            }
        }
    }

     

    RDS

    sql문을 DML로 변경하였습니다.

    RDS

    insert된 데이터를 볼 수 있습니다.

    JDBC를 사용시 문제점

    위에서 예제코드는 정말 단순하게 작성하였지만 실제 프로젝트에서는 여러가지 제약사항이 많습니다.

    • SQL을 실행하는 비용이 비쌉니다.(생산 및 유지보수 비용)
    • SQL이 데이터베이스 마다 다릅니다.(하나의 DB에 맞는 문법을 사용)
    • 스키마를 바꾸면 해당 스키마 코드가 전체 바뀝니다.
    • 반복적인 코드가 너무 많습니다.
    • 많은 도메인 객체가 필요합니다.

     

    이러한 문제점들이 많아 개발하는데에 시간이 많이 소요됩니다.
    그래서 JPA를 활용하면 개발자는 개발에 좀 더 집중할 수 있게 됩니다.

    'Back-end > JPA' 카테고리의 다른 글

    JPA - Relation Mapping(관계 매핑)  (0) 2020.06.30
    JPA - Value Mapping(밸류 매핑)  (0) 2020.06.30
    JPA - Entity Mapping(엔티티 매핑)  (0) 2020.06.30
    JPA - 프로젝트 세팅방법  (0) 2020.06.30
    JPA - ORM  (0) 2020.06.30

    댓글