충분히 쌓여가는
ORM 본문
SQL(Structured Query Language)
- 데이터베이스와 대화할 때 사용하는 언어
- 정보를 얻고 싶거나 데이터베이스 작업할 때 사용
- 이때 콘솔에 작성하는 것은 SQL statement라고 함
- SQL database = relational databases
- PostgreSQL = relational databases
예시(유저 찾기)
- 부산에서 온 유저를 찾고 싶음
- 해당 유저들이 가입한 순서대로 정렬하고 싶음
SELECT * FROM users WHERE country="busan" ORDER BY created_date
- 이 정도까진 쉽지만, 나중엔 코드가 복잡해질 수 있음
- 좋은 개발자가 되려면 한 프로젝트에 최대한 적은 수의 언어로 개발하는 것이 좋음
- 본인이 엄청난 천재가 아닌 이상 여러 언어를 통달하는 것은 어려움,,
- 이때 장고 ORM이 필요함
장고 ORM
- 파이썬과 SQL 사이의 통역사
파이썬
User.objects.filter(country="busan").order_by('created_date')
장고 ORM
SELECT * FROM users WHERE country="busan" ORDER BY created_date
- 장고는 위의 파이썬 코드를 아래의 SQL로 변환시켜 줌 -> DB(데이터베이스)는 SQL을 이해할 수 있음
- 직접 바꿔주는 것이 아닌 자동으로 변환시켜주기 때문에 편함(SQL을 따로 공부할 필요가 없다는 의미이기도 함)
- 즉, 파이썬으로 코드를 작성하고, 장고는 SQL로 번역을 해줌
Object Relational Mapping(ORM)
- 객체와 관계형 데이터베이스를 매핑한다는 뜻(오브젝트를 DB에 연결하는 방법론)
- 모델링: 추상적인 개념을 현실세계로 뽑아냄
- 자바는 Team 테이블과 같은 데이터 Type를 가지지 않음 -> class를 통해 DB에 있는 Table을 모델링 해야함
- 그런데 여기서 ORM은 객체를 통해 Relation을 매핑하는데 Table을 통해 매핑하지 않음, TRM이 아닌 ORM임
DB 세상에 있는 데이터를 Java 세상에 모델링함
Class Team {
int id;
String name;
String year;
}
- DB 세상에 있는 데이터를 Java 세상에 모델링하는 과정을 통해 DB를 자동생성할 수 있음
- 1번을 먼저 만들고 1번을 통해 2번(DB)를 자동생성할 수 있음(이때 JPA가 가지고 있는 인터페이스 필요함)
- 즉, 자바에서 클래스를 만들어 실행하면 DB에 Table가 자동생성되는 기법이 ORM
JPA(Java Persistence API)
- ORM 기술
- 반복적인 CURD 작업 생략
- 영속성 컨텍스트 가짐
- DB와 OOP(Object Oriented Programming)의 불일치성을 해결하기 위한 방법론 제공(DB 객체저장 불가능)
- OOP(객체지향 프로그래밍)의 관점에서 모델링을 할 수 있게 해줌(상속, 컴포지션, 연관관계)
- 방언 처리 용이(연결할 수 있는 DB의 종류가 다양하다는 뜻)하여 Migrations와 유지보수하기 좋음
- Java에서 DB에 connection 첫 번째 요청
- DB에서 신분 확인 후 세션 열어줌
- 자바에서 Connection 가짐
- 두 번째 요청시 쿼리 전송 가능
- 쿼리를 전송하면 DB는 쿼리를 통해 테이블에 있는 데이터를 만들어냄
- 만들어낸 데이터를 자바에 다시 응답
- DB의 데이터 Type와 Java의 데이터 Type가 다르기 때문에 해당 데이터를 받아 Java Object로 변경해야함
- (자바랑 파이썬이 Object를 교환할때 JSON 사용하는 것과 마찬가지)
- JPA는 변경해야하는 것이 단순 반복작업이고 이를 줄일 수 있음
- JPA는 이런 작업들을 함수로 제공해줌(CRUD 작업을 JPA가 단순하게 처리해줌)
참고자료
메타코딩, 스프링부트 개념정리 with JPA 5강 - ORM이란 무엇인가요?
SEOUL G-캠프, [T27] 장고(Django) 04강_데이터베이스(ORM)
노마드코더, Django ORM은 뭐고 SQL은 뭘까요?
'IT > Computer Science' 카테고리의 다른 글
네이티브 앱 / 웹앱 / 하이브리드 앱 (0) | 2023.01.19 |
---|---|
Process / Thread (1) | 2023.01.18 |
추상 클래스 / 인터페이스 (0) | 2023.01.16 |
Git / GitHub (1) | 2023.01.13 |
Transaction 트랜잭션 (0) | 2023.01.12 |