시뻘건 개발 도전기

DB 연동 시 유의할 점 #1 본문

API/JPA

DB 연동 시 유의할 점 #1

시뻘건볼때기 2020. 9. 18. 21:56
반응형

  현대시대에는 자바로 개발되는 애플리케이션을 보면 대부분 관계형 데이터베이스를 사용하고 있다. 이 데이터베이스에서 데이터를 관리하려면 SQL을 사용해야한다. 자바 애플리케이션은 JDBC를 사용해서 DB에 접근한다.

자바 애플리케이션의 JDBC를 사용한 DB 접근 방법

다음 코드를 보자. 우리는 JDBC에게 SQL문을 전달하여 실행하도록 하면서 데이터를 관리한다.

String sql = "SELECT NAME FROM MEMBER WHEHERE ID = ?";
ResultSet resultSet = stmt.executeQuery(sql);
String name = resultSet.getString("NAME");

Member member = new Member();
member.setName(name);

logger.info(member.getName());

// ...

여기서 문제점이 발견될 수 있다.

1. SQL문의 반복 정의

  조회 뿐만 아니라 CRUD(생성, 수정, 삭제, 조회)를 할 때마다 SQL을 명시해야하고 실행해야한다. 그렇게 우린 서버에 SQL문을 명시하는 String 변수가 엄청 날 것이다.

2. 테이블 변경에 대한 대가

  만약 테이블에 컬럼 하나가 추가된다면 우린 어떻게 해야 하는가? 테이블과 맵핑되는 클래스(이하 엔티티)에도 해당 컬럼을 추가하여 관리하여 사용해야한다. 뿐만 아니라, 대부분의 SQL query를 수정 또는 새롭게 정의해야할 수도 있다. 예를 들어서 INSERT문 같은 경우를 보자.

// as-is
String sql = "INSERT INTO MEMBER(ID, NAME) VALUES(?,?)";

// to-be
String sql = "INSERT INTO MEMBER(ID, NAME, EMAIL) VALUES(?,?,?)";

EMAIL이라는 컬럼이 추가되어 SQL문도 바뀌었다. 만약 SQL문이 수십개, 수백개라면 어쩌겠는가..? 하나 하나 확인해서 수정할 쿼리(CRUD 모든 쿼리)를 수정또는 새롭게 정의해야한다. (뜻밖에 노동) 그렇다는 이야기는 모든 쿼리에 대해 테스트를 해야한다는 이야기가된다...(헬게이트 오픈) 여기서 끝이 아니다. 컬럼이 새로 들어왔기 때문에 NULL이 허용될 수 있다. 따라서 SELECT 후 EMAIL을 사용하거나 특정 로직을 태우면 NullPointerException이 터질 수도 있다.

3. JOIN을 부르는 객체 추가

  다음 예를 보자.

// as-is
Class Member {
	private String name;
	private String teamId;
}

// to=be
Class Member {
	private String id;
	private String name;
	private String email;
	private String teamId;
	private Team team;
}

엔티티에 Team이라고 하는 녀석이 들어왔다. 특정 인원의 소속 팀 명을 알고 싶다고 할 때, 우리는 JOIN을 해야한다. 어떻게? 이렇게.

// as-is
String sql = "SELECT NAME FROM MEMBER WHEHERE ID = ?";

// to-be
String sql = "SELECT A.ID FROM MEMBER A JOIN TEAM J ON A.ID = J.ID";

결국 또 쿼리를 수정또는 새롭게 정의해야하는 녀석들을 찾아서 수정하고 테스트해야한다는 이야기다.

 

  추가로 개인적으로 SQL문을 String으로 정의하다보니 SQL syntax를 잡지 못하고 공백, 콤마(,) 등 잘못 입력되면 찾기가 너무 어렵다...핳핳

 

  JDBC API를 사용한 자바 애플리케이션은 반복의 늪에 빠지기 쉽다. JPA를 사용하면 이러한 문제점을 해결 할 수 있다. JPA가 SQL을 직접 정의하고 실행함으로써 개발자가 SQL에 의존하여 개발하지 않아도 된다는 강점이 있다. JPA가 제공해주는 기능들은 나중에 알아보겠지만 대부분의 SQL은 메소드로 제공한다.

반응형

'API > JPA' 카테고리의 다른 글

Entity와 영속성 #2  (0) 2020.11.29
Entity와 영속성 #1  (0) 2020.11.29
JPA를 사용하기 위한 설정과 동작 원리  (0) 2020.09.29
JPA란?  (0) 2020.09.24
DB 연동 시 유의할 점 #2  (0) 2020.09.18
Comments