-
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 사용법 : postgresql 포스팅
- MySQL 사용법 : MySQL 포스팅
docker로 PostgreSQL 사용하기
docker로 PostgreSQL을 설치 및 실행하는 방법은 위 주소에서 설명했으니 생략하도록 하겠습니다.
docker를 통해 PostgreSQL을 접속합니다.
PostgreSQL 드라이버 의존성 추가
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.5</version> </dependency>
JDBC를 연결하려면 버가 필요하여 드라이버 의존성을 추가합니다.
이제 새로운 패키지와 클래스를 만들어 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); } } }
JDBC와 연동하는데는 총 3가지의 정보(Url, username, password)가 필요합니다.
PostgreSQL을 설치 및 실행할 때 위 정보를 가지고 실행했기 때문에 그 정보로 선언했고 Connection 객체를 통해 연동하였습니다.
결과적으로 잘 연동된 것을 확인할 수 있습니다.
그리고 try with resource 문법을 사용하여 괄호 안 로직이 실행되면 그 괄호에 해당되는 로직이 실행되게 구현합니다.try with resource 문법이 에러가 난다면?
Java 8 부터 도입된 문법이므로 프로젝트가 사용하는 JDK의 버전이 낮을 수도 있습니다. Intellij 기준 해결 방법입니다.
Modules의 언어 레벨을 바꾸고 적용합니다.
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(); } } } }
sql문을 DDL로 작성한 변수를 PreparedStatement 객체를 사용하여 execute합니다.
테이블을 조회해보면 방금 생성한 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(); } } } }
sql문을 DML로 변경하였습니다.
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