728x90
ORM
- ORM(Object Relational Mapping)이란 RDB 테이블을 객체지향적으로 사용하기 위한 기술이다.
- RDB 테이블은 객체지향적 특징이 없고 자바와 같은 언어로 접근하기 쉽지 않기 때문에 ORM을 사용해 오브젝트와 RDB사이에 존재하는 개념과 접근을 객체지향적으로 다루기 위한 기술임
- 즉 ORM은 객체 관계를 매핑해주는 것이고 객체는 객체대로, RDB는 RDB대로 설계하여 ORM 프레임워크가 중간에서 매핑해주는 것이다.
- 대중적인 언어에는 대부분 ORM 기술이 존재(Ex. node의 sequelize)
- ORM 은 객체와 RDB 두 기둥 위에 있는 기술이다
MyBatis, iBatis는 ORM이 아님. SQL Mapper임
ORM은 객체를 매핑하는 것이고 SQL Mapper는 쿼리를 매핑하는 것
특히 ORM을 사용하면 쿼리 대신 자바 코드로 작성할 수 있는 장점이 있다. 가령
select * from User Where user_id < 10;
이런 쿼리를
userRepository.findUserByUserIdLessThan(10);
이런 메소드 하나로 바꿀 수 있다.
솔직히 코드 양이 줄었다기 보다는 SQL 문법을 배우지 않아도 쉽게 이해하고 사용할 수 있는 장점이 있다.
특히 DB 종류에 상관 없이 일관된 코드를 유지할 수 있어 프로그램 유지 보수에 용이하다.
또한 내부적으로 안전한 SQL쿼리를 자동으로 생성해주어 개발자가 달라도 동일한 쿼리를 작성할 수 있고 오류 발생률도 줄일 수 있다.
하지만 매우 복잡한 쿼리나 방대한 양을 다루는 쿼리는 그렇지 않은 경우도 있었다.
JPA
- JPA는 ORM표준 기술로 Hibernate, OpenJPA,EclipseLink, TopLink Essentials와 같은 구현체가 있고 자바에서 ORM의 기술 표준 인터페이스가 JPA다
- JPA는 인터페이스 이므로 이를 구현하는 실제 클래스가 필요하다. 대표적인 실제 클래스에는 Hibernate가 있다.
장점
- 객체지향적으로 데이터를 관리할 수 있기 떄문에 비즈니스로직에 집중할 수 있으며 객체 지향 개발이 가능하다.
- 테이블 생성,변경,관리가 쉽다. ( 단 JPA를 잘 이해하고 있는 경우만 해당한다.)
- 로직을 쿼리에 집중하기 보다는 객체자체에 집중할 수 있다.
- 빠른 개발이 가능하다.
단점
- 어렵다 → 배워야 할 것이 많다.
- 잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있다.
- 성능상 문제가 있을 수 있다. → 직접 최적화 시키며 쿼리 짜는 것이 아니라 알아서 해줘서 그럼
Spring Data JPA 적용하기
- build.gradle에 org.springframework.boot:spring-boot-stater-data-jpa와 com.h2database:h2 의존성들을 등록한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-stater-data-jpa'
}
설명
- spring-boot-stater-data-jpa
- spring boot용 Spring Data JPA 추상화 라이브러리
- spring boot 버전에 맞춰 자동으로 JPA관련 라이브러리들의 버전을 관리해 준다
compile, implementation 차이
- compile은 연결된 API 모두가 프로젝트에 의해 노출이 되고 implementation은 노출되지 않는다
- API가 노출이 되면 API로직에서 유효성 검사 및 기타 원하지 않는 형태의 데이터가 들어와 보안의 위협이 돼서 골치 아파짐
- compile은 A가 수정되면 B,C와 같이 의존하고 있는 오브젝트들이 모두 다시 빌드되어야 함
- implementation은 A수정 시, 직접 의존하는 B만 다시 빌드를 하기 떄문에 속도적인 측면에서 더 유리함
- 프로젝트의 구조가 복잡할수록, 커질수록 더욱 많은 퍼포먼스상의 차이가 보임
쿼리 로그 추가
application.properties 에 spring.jpa.show-sql = true 추가
728x90
'Java > Spring(Boot)' 카테고리의 다른 글
Transactional 몰랐던 부분(신기해서 적어봄) + Transaction과 아닌 부분 나누기 (0) | 2023.03.21 |
---|---|
이해 안돼서 다시 정리하는 IoC/DI (0) | 2023.02.07 |
Spring Annotation 정리 (0) | 2023.02.03 |
Spring Framework 개념 정리 (0) | 2023.02.02 |