본문 바로가기

JAVA/- Spring

JPA는 ORM, 반복적인 CRUD 작업을 생략, 영속성 컨텍스트가짐, DB와 OOP의 불일치성을 해결하기 위한 방법론 제공

JPA는 ORM 기술이다.

ORM은 Object Relational Mapping 오브젝트를 데이터베이스에 연결하는 방법론, 하인같은 존재(?)

Model 클래스는 모델링을 하는 것입니다. 추상적인 계념을 현실세계로 뽑아 냅니다. Java에서 DB에 테이블에 값을 넣는 것은 DML(DELETE, UPDATE, INSERT)를 사용하고, 뽑아올 때는 SELECT를 사용합니다.

하지만 Java에서는 DB에서 쓰는 int형이나 varchar같은 것을 쓰지 않씁니다. 그래서 데이터베이스 테이블을 모델링 해야 합니다. 먼저 테이블을 만들고 Java 클래스를 만들었죠

ORM은 Java 클래스를 만들고 테이블을 만들 수 있습니다. 어떻게? JPA의 인터페이스를 통해

JPA는 반복적인 CRUD 작업을 생략하게 합니다.

  • 기본적으로 java가 DB에 connection을 요청합니다.
  • DB가 확인하고 권한이 있다면 세션을 오픈하고 Java는 Connection을 가집니다.
  • 이제 Java는 DB에 쿼리를 전송할 수 있습니다.
  • DB는 쿼리를 받고 Data를 만들어냅니다. 하지만 이 Data는 Java에서 사용하는 방식이 아닙니다. Java Object로 변환을 해줘야죠
  • 끝으로 세션을 끊고,Connection을 끊는 과정이 됩니다.

이 과정을 JPA가 함수하나로 해결해줍니다.

JPA는 영속성 컨텍스트를 가지고 있다.

영속성: 데이터를 영구적으로 저장
컨텍스트(context): 대상의 모든 정보를 가지고 있는 것

영속성컨텍스트는 DB의 정보와 동기화되어있습니다. DB에 저장될 정보를 모두 다 아는 친구이죠. java가 DB에 데이터를 불러올 때 먼저 영속성컨텍스트에 가서 "데이터를 줘!" 라고 합니다. 만약 영속성컨텍스트에 있다면 주겠지만 없다면 DB에서 가져와서 java Object로 변환한 후에 Java에게 줍니다.

java에서도 데이터를 변경하면 영속성컨텍스트에 넘겨줍니다. DB는 영속성컨텍스트와 동기화 돼서 insert가 아닌 update를 하게 됩니다.

마치 cpu와 ram사이에 있는 캐쉬 메모리 같은 느낌입니다.

JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다.(DB는 객체저장 불가능)

Class Team{
    int id;
    String name;
}
Class Player{
    int Id;
    String name;
    int teamid;
}

이렇게 DB에 있는 것을 모델링 했을 때 teamid부분을 그냥 Team객체로 바꿨으면 좋겠습니다. 그렇지만 treamid를 Team으로 바꾸면 DB와 모양이 달라지기 때문에 안됩니다. teamid를 한번 더 select하는 방법join을 이용하는 방법이 있습니다. 하지만 ORM을 사용하면

Class Player{
    int Id;
    String name;
    Team team;
}

자동으로 Java Object형태로 바꿔여서 오게됩니다. 반대로 DB에 넣을 때면 Foreign key를 집어넣어 줄것입니다.

728x90