지나공 : 지식을 나누는 공간

JPA 0 : JPA를 사용하는 이유, 용도 본문

Tech/JPA

JPA 0 : JPA를 사용하는 이유, 용도

해리리_ 2020. 9. 8. 01:38

김영한 님의 자바 orm 표준 jpa 프로그래밍 기본편 강의를 통해 공부한 내용입니다.

 

ORM이란, Object(객체)와 Relation(관계)를 Mapping(연결)한다는 개념으로, ORM을 이용한 개발은 객체와 데이터베이스 변형에 유연하게 대처할 수 있도록 한다. 객체 지향 프로그래밍 입장에서 관계형 데이터베이스의 제약을 받지 않으면서 관계형 데이터베이스 자체를 객체처럼 쉽게 표현하고 사용하기 위한 개념이다.

 

SQL 중심적인 개발의 문제점 : CRUD 의 무한한 반복으로 지루한 코드 생성

  • 객체와 관계형 데이터베이스의 차이 : 상속, 연관관계, 데이터타입, 데이터 식별 방법

    -> 객체는 FK로 참조가 불가능하지만 테이블은 연관관계를 통해 참조가 가능하다.

     

     

     

[jpa없이 java에서 sql을 직접 다루면 불편한 이유]

 

(1) 조회의 어려움

 

만약, 객체지향적으로 설계한다고 가정하고 Team과 Member 엔티티를 생각해보자.

객체지향적으로 하면 Member에 team_id를 넣을 때 Member 엔티티가 Team 객체 자체를 클래스 멤버로 가지는 방식으로 설계하게 되는데 이는 매우 불편함. 데이터 삽입 시에는 SQL문에서 INSERT INTO MEMBER(MEMBER_ID, TEAM_ID, USERNAME)으로 하면 되니까 객체 자체를 멤버로 갖게 되면 member.getTeam().getId()와 같은 방식으로 team_id를 얻어서 쿼리를 적용할 수 있지만, 조회할 때는 매우 불편함. memberId를 파라미터로 받아서 멤버 객체 하나 생성, 팀 객체 하나를 생성해서 member.setTeam(team)을 통해 연관관계를 설정해야 하므로 이는 매우 불편한 방식임

 

(2) 엔티티 신뢰 문제 발생

 

memberDAO에서 제대로 team과 order가 있을 지는 직접 눈으로 봐야 알기 때문에 신뢰의 문제 발생

 

 

(3) 컬렉션 사용이 좋음

 

memberDAO에서 같은 id로 두 번 조회를 하면, DAO의 함수에서 SQL을 실행한 뒤 새 객체를 생성해서 반환하므로 두 결과값의 참조값이 다르다. 하지만 자바 컬렉션에서 조회를 하면 같은 id이므로 두 번 조회를 했을 때 나오는 두 결과의 참조값이 같음.

 

 

결론적으로, 계층형 아키텍처에서 sql 중심으로 java에서 사용하면 진정한 의미의 계층 분할이 어려움. 객체 답게 모델링을 하면 할수록 매핑작업이 늘어나면서 더 힘들어짐. 

 

객체를 자바 컬렉션에 저장하듯이 DB에 저장하고 싶어서 나온 것이 JPA!!

728x90
Comments