꾸물꾸물 졔의 개발공부
[Spring JPA] 패러다임의 불일치 본문
JPA를 사용하는 이유 중 하나인, 객체지향과 관계형 데이터베이스 간의 패러다임 불일치
객체와 관계형 데이터베이스
객체지향 프로그래밍은 추상화, 캡슐화, 상속, 다형성 등 다양한 장점을 가지고 있지만 무언가를 저장할 때에 문제가 발생할 수 있다. 특정 객체를 저장하기 위해서는 단순히 메모리가 아닌 어떤 저장소에 '영구적' 으로 보관해야 하는데, 그 중 대표적인 것이 데이터베이스이다.
객체에는 속성과 기능, 즉 필드와 메소드가 있다. 또한 객체지향 프로그래밍은 추상화, 상속 등의 개념이 있다. 하지만 저장소인 데이터베이스에는 이러한 개념들이 없다. 서로가 지향하는 목적이 다르므로 둘의 기능과 표현 방법이 모두 다르다. 이것을 객체-관계형 데이터베이스의 패러다임 불일치 라고 한다.
✔️객체 지향 - 필드와 메소드를 캡슐화하여 상속, 정보은닉, 다형성 등을 잘 하는 것이 목표
✔️RDB(관계형 데이터베이스) - 데이터를 정규화해서 관계를 통해 잘 보관하는 것이 목표
패러다임 불일치 문제는 개발자가 중간에서 해결해야 한다. 하지만 문제를 해결하는데에는 복잡한 코드와 많은 시간이 소요된다.
SQL 중심적인 개발
//추상클래스
abstract class Item {
Long id;
String name;
int price;
}
class Album extends Item {
String artist;
}
class Movie extends Item {
String director;
String actor;
}
class Book extends Item {
String author;
String isbn;
}
다양한 객체들을 코드로 구현한 것이다. 코드에서는 Album 객체가 Item이라는 추상 클래스를 상속받아 하나의 객체로 구현되었지만, 데이터베이스에 저장하기 위해서는 두 객체를 분해해서 두 문장의 SQL문을 만들어야 한다.
1. INSERT INTO ITEM ~
2. INSERT INTO ALBUM ~
👍JPA와 상속
JPA는 이러한 패러다임의 불일치 문제를 개발자 대신 해결해준다. 개발자는 복잡한 코드를 구현할 필요 없이 객체만 넘겨주면 된다.
Album 객체를 저장하기 위해서는 (위와 같이 두개의 SQL문을 실행할 필요 x) 자바 컬렉션에 객체를 저장하듯이 객체만 JPA에게 저장하면 된다.
- Album 객체 저장
jpa.persist(album);
Album이 Item 을 상속받은 것은 개발자가 코드로 신경 쓸 필요가 없다. Album만 persist() 로 저장하면 JPA에서 알아서 처리해준다.
- Album 객체 조회
String albumId = "jihye_album";
Album album = jpa.find(Album.class, albumId);
albumid 값이 "jihye_album" 인 Album 객체를 찾아서 반환
✔️JPA의 CRUD
1. 저장 - persist()
jpa.persist(member);
2. 조회 - find()
String memberId="jihye";
Member member = jpa.find(Member.class, memberId); // Member객체에서 memberId인 것 조회
3. 삭제 - delete()
jpa.delete(member);
4. 수정
JPA는 별도의 수정 메소드가 없다. 수정을 위해서는, 객체를 조회(find) 후, 값을 변경하면 트랜잭션을 commit할 때 알아서 update SQL이 전달되어진다.
String memberId = "jihye";
Member member = jpa.find(Member.class, memberId); //memberId와 일치하는 객체 조회
member.setName("변경이름"); //commit시 수정
'SPRING' 카테고리의 다른 글
[Spring] WebFlux란 / Spring MVC와 간단 비교 (0) | 2023.05.02 |
---|---|
[Spring] Spring vs Springboot 차이점 (0) | 2023.03.29 |
[Spring JPA] JPA란 (0) | 2023.03.23 |
[Spring] 스프링 IOC (Inversion of Control) (0) | 2023.03.14 |
[Spring] 스프링 DI (Dependency Injection) (0) | 2023.03.14 |