아카이브

[스프링 데이터 JPA] 핵심 개념 이해 본문

Spring/스프링 데이터 JPA

[스프링 데이터 JPA] 핵심 개념 이해

주멘이 2021. 1. 10. 20:24

RDBMS와 JAVA

  • Persistence(영속성)이란 어떤 정보를 어딘가에 저장하고 애플리케이션을 껐다가 켜도 그 데이터는 유지가 됨

 

JDBC

  • (관계형) 데이터베이스와 자바의 연결 고리
  • DataSource / DriverManager
  • Connection
  • PreparedStatement

SQL

  • DDL
  • DML

무엇이 문제인가?

  • SQL을 실행하는 비용이 비싸다.
  • SQL이 데이터베이스마다 다르다.
  • 스키마를 바꿨더니 코드가 너무 많이 바뀌네...
  • 반복적인 코드가 너무 많아.
  • 당장은 필요가 없는데 언제 쓸 줄 모르니까 미리다 읽어와야 하나...

 

Postgresql Driver 의존성 추가하기

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

 

PostgreSQL 설치 및 서버 실행 (Docker)

/* Docker를 이용한 postgreSQL 설치 및 서버 실행 */

1. 설치
docker run -p 5432:5432 -e POSTGRES_PASSWORD=pass -e

POSTGRES_USER=jumen -e POSTGRES_DB=springboot --jumen postgres_boot -d
postgres

2. 접속
docker exec -i -t postgres_boot bash

3. change user
su - postgres

4. db 접속
psql springdata

5. 데이터베이스 조회
\list

6. 테이블 조회
\dt

7. Query
SELECT * FROM account;

-e : 환경변수
-d : daemon 명
-name: docker 프로세스 명
-i: 인터렉티브 모드
-t: target 이 되는 container
bash: 실행할 명령어

/* Docker 명령어 */

docker ps: docker 프로세스 보기
docker ps -a: 동작하지 않는 docker container 까지 보기
docker rm: docker 컨테이너 삭제
docker stop: docker container stop
docker start: docker container start

 

문제점

  • 테이블 생성이 번거롭다.
  • 테이블 데이터와 도메인 객체와의 맵핑이 번거롭다.
  • Connection cost가 비싸다. (DBCP - Hikari)
  • 각 DB마다 SQL이 조금씩 달라서 재작성하는 경우도 발생한다.
  • 반복적인 코드가 많다.
  • 한 번에 모두 읽어오는 경우가 많다.
public class Application {

    public static void main(String[] args) throws SQLException {
        String url = "jdbc:postgresql://localhost:5432/springboot";
        String username = "freelife";
        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));";
            sql = "INSERT INTO ACCOUNT VALUES(1, 'freelife', 'pass');";
            try(PreparedStatement statement = connection.prepareStatement(sql)){
                statement.execute();
            }
        }
    }
}