ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] SQL을 직접 작성 단점과 JPA사용으로 단점 극복
    프로그래밍/JPA 2021. 10. 8. 15:05
    반응형

    이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.

    틀리거나 잘못된 정보가 있을 수 있습니다.

    댓글로 알려주시면 수정하도록 하겠습니다.


    1. SQL을 직접 작성의 단점

    DB의 경우 데이터를 관리함에 있어 애플리케이션의 객체 구조와는 다른 데이터 중심의 구조로 되어 있다.

     

    개발자는 데이터를 조회 또는 저장 시 애플리케이션(객체)과 DB 사이에서의 변환 작업을 진행하여야 한다.

     

    즉 DB에서 애플리케이션으로 데이터를 가지고와 객체를 만들 때와 애플리케이션의 객체 정보를 DB에 저장할 때 변환작업을 진행하여야 한다. 

     

    Member Class

    public class Member{
    	String id;
    	String name;
    }

     

    MemberDAO

    public class MemberDAO{
    	public Member find(int id) {.....}
    	public void save(Member member) {.....}
    }

     

    DB에 저장된 Member객체 조회

    sql = SELECT id, name FROM MEMBER WHERE Id = ? //해당 SQL을 이용하여 조회
    
    ResultSet rs = stmt.executeQuery(sql);
    
    String memberId = rs.getString("id");
    String name = rs.getString("name");
    
    Member member = new Member();
    member.setId(memberId); //DB데이터를 객체에 맞게 변경
    member.setName(name); //DB데이터를 객체에 맞게 변경

    위 코드에서 보이 듯 memeber객체를 생성하고 member객체에 Id와 Name을 Set 하는 과정이 필요하게 된다.

     

    sql = INSERT INTO MEMBER(id, name) VALUES (?,?) //해당 SQL을 이용하여 저장
    
    pstmt.setString(1, member.getId()); //객체 데이터를 DB에 맞게 변경
    pstmt.setString(2, member.getName()); //객체 데이터를 DB에 맞게 변경

    이번에는 저장을 위해 위 코드에서 보이 듯 객체 데이터를 preparedstatement객체에 Id와 Name을 Set 하는 과정이 필요하다.

     

    만약 예시로 작성된 Member 객체에 특성 age라는 속성이 추가 된다고 가정한다면

     

    1. Member Class에 속성이 추가

    2. 조회 SQL의 조회 속성에 age가 추가

    3. DB에서 조회한 데이터를 객체로 변화는 하는 과정에 age속성 변환도 추가

    4. 저장 SQL에 age속성이 추가

    5. 저장 시 preparedstatement객체에 age 속성을 추가

     

    속성 1개를 추가 하기 위해서 많은 작업을 동반하게 됩니다.

     

    만약 저장에서 age속성에 대한 변경이 누락된 경우 age를 조회 시 항상 null 값이 출력될 것입니다.

     

    이렇듯 결국 SQL을 직접 작성하여 사용하는 경우 단점은

    1. DAO를 이용하더라도 진정한 계층 분할이 어렵다.

    ※ 물리적으로는 SQL, JDBC API를 통해 데이터 접근 계층을 숨기더라도 논리적으로는 엔티티와 강한 의존관계를 형성하고 있다.

     

    2. 엔티티의 신뢰도가 떨어진다.

    ※ 속성 추가 또는 참조 추가와 같은 변경 시 변경 누락에 의하여 변경점 미적용과 같은 문제들로 인해 엔티티의 신뢰도가 떨어진다.

     

    3. SQL에 의존적인 개발을 피하기 어렵다.

    ※ 어떠한 문제가 발생할 경우 어떤 SQL이 실행되고 어떤 객체들이 함께 조회되는지 모두 확인이 필요하다.

     

    2. JPA이용으로 단점 극복

    JPA를 사용하면 개발자가 직접 SQL을 작성하지 않고 JPA의 API를 이용하여 JPA가 적절하게 생성한 SQL을 DB에 전달한다.

     

    Member 객체가 참조하는 객체가 있는 경우 JPA는 참조 객체를 사용하는 시점(getTeam())에 적적할 SELECT SQL을 실행하여 필요한 참조 객체를 생성하여 이용 가능 하도록 하고있습니다.

     

    JPA는 개발자가 직접 SQL을 작성하여 발생할 수 있는 문제를 JPA가 대신 적적한 SQL을 만들어 실행 하는 것으로 SQL을 직접 작성하는 경우 발생하는 단점을 극복 하고자 하였습니다.

    반응형

    '프로그래밍 > JPA' 카테고리의 다른 글

    [JPA] 연관관계의 주인  (0) 2021.10.21
    [JPA] 연관관계  (0) 2021.10.20
    [JPA] Entity 매핑  (0) 2021.10.17
    [JPA] 영속성 컨텍스트  (0) 2021.10.14
    [JPA] 객체와 데이터베이스의 패러다임 불일치  (0) 2021.10.09

    댓글

Designed by Tistory.