SQL 중심적인 개발의 문제점과 JPA 발생 배경에 대해 이해한다.

인프런 강의 참고

Goal

  • SQL에 의존적인 개발을 하게 된 배경
  • SQL 중심적인 개발의 문제점
    • 지루한 코드의 무한 반복
    • 객체 지향과 관계형 데이터베이스 간의 패러다임 불일치
    • 객체(Object)와 관계형 데이터베이스(RDB)의 차이
    • 모델링 과정에서의 문제
    • 객체 그래프 탐색에서의 문제
    • “비교하기” 에서의 차이

배경

SQL 중심적인 개발의 문제점

1. 지루한 코드의 무한 반복

2. 객체 지향과 관계형 데이터베이스 간의 패러다임 불일치

3. 객체(Object)와 관계형 데이터베이스(RDB)의 차이

1) 상속

2) 연관 관계

3) 데이터 타입

4) 데이터 식별 방법

4. 모델링 과정에서의 문제

# 객체를 테이블에 맞추어 모델링

class Member { 
    String id;       // MEMBER_ID 컬럼 사용
    Long teamId;     // TEAM_ID FK 컬럼 사용 //**
    String username; // USERNAME 컬럼 사용
}
class Team { 
    Long id;         // TEAM_ID PK 사용
    String name;     // NAME 컬럼 사용
}

# 객체다운 모델링

class Member { 
    String id;        // MEMBER_ID 컬럼 사용 
    Team team;        // 참조로 연관관계를 맺는다. //** 
    String username;  // USERNAME 컬럼 사용 
                     
    Team getTeam() { 
        return team; 
    } 
}
class Team { 
    Long id;         // TEAM_ID PK 사용 
    String name;     // NAME 컬럼 사용 
}

5. 객체 그래프 탐색에서의 문제

문제점

해결책?

6. “비교하기” 에서의 차이

# 일반적인 SQL을 사용하는 경우

String memberId = "100"; 
Member member1 = memberDAO.getMember(memberId); 
Member member2 = memberDAO.getMember(memberId);

member1 == member2; // 다르다!!!

class MemberDAO { 
    public Member getMember(String memberId) { 
        String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID = ?"; 
        ... 
        // JDBC API, SQL 실행 
        return new Member(...); 
    }
}

# 자바 컬렉션에서 조회하는 경우

String memberId = "100";
Member member1 = list.get(memberId);
Member member2 = list.get(memberId);
member1 == member2; // 같다!!! (참조값이 같다.)

마무리

관련된 Post

Reference