나의개발일지
Spring) Spring Data JPA 본문
728x90
ORM (Object-Relational Mapping)
ORM?
- 객체와 관계형 데이터베이스의 데이터(table)을 자동으로 매핑
- 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용
- 객체 모델과 관계형 모델 간에 불일치가 존재하는데, ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결
- 프로그램 복잡도를 줄이고 자바 객체와 쿼리를 분리할 수 있으며 트랜잭션 처리나 기타 데이터베이스 관련 작업들을 좀 더 편하게 처리 할 수 있음
- Object의 field와 DB의 data를 매핑하여 객체를 통해 간접적으로 데이터베이스의 데이터를 조작
- SQL Query가 아닌 직관적인 코드(Object의 method)로 데이터를 조작
- Persistence API 라고도 함 ex) JPA, Hibernate
JPA 장.단점
장점
- 생산성
- SQL문을 직접 사용하는 것이 아닌 Method 호출만으로 DB를 조작
- 개발자는 SQL에 종속적이지 않은 객체 지향적으로 코드를 작성
- 유지보수
- 테이블 컬럼 등의 변경 시 모든 Query문을 수정해야 했으나 매핑하는 정보가 class로 명시되어 있기에 리팩토링에 유리
- vendor 비종속성
- DB의 종류가 바뀌더라도 각 DB에 종속적인 문법을 신경 쓸 필요가 없음
단점
- 프로젝트 규모가 커지면서 복잡도가 높아지게 되면, 속도저하 및 일관성이 무너지는 문제점이 있음
- method 호출로 Query가 실행된다는 것은 내부적으로 처리된는 동작이 많다는 의미이며, 그로 인해 SQL을 직접 호출하는 것보다 성능 저하가 올 수 있음
- 테이블 간의 연관성이 높아지면 튜닝 등의 별도의 작업을 하기 위해 SQL문을 작성할 수도 있음
- JPA문법을 학습할 Learning curve 높음
Repository Interface
JpaRepository Interface
- Spring Data JPA에서는 JpaRepository interface를 상속하는 interface 생성
- JpaRepository interface의 Generic에 Entity class와 Entity class가 사용하는 식별자 타입 (@Id’s Type)을 지정
<UserRepository Class>
public interface UserRepository extends JpaRepository<User, String> {
// 유저아이디의 카운트값 반환
int countByUserId(String userId);
}
<User Class> => Entity
@Entity(name = users) // 테이블명이 users 에 연결
@NoArgsConstructor // JPA는 public, protected로 되어있는 default 생성자가 반드시 필요 (롬복)
@Getter // (롬복)
public class User {
@Id //기본키
private String userId;
@Column(name = "user_name", nullable = false) // 이렇게 해도 되지만 카멜케이스로 자동 변환
private String userName;
private String password;
private String email;
private String joinTime;
@ColumnDefault("0") // 기본값 0
private int role;
}
위의 UserRepository 클래스의 countByUserId를 호출하면 JPA가 자동으로 Query를 생성하여 DB에 접근해서 결과값을 반환해 준다.
728x90
반응형
'Back-End > Spring' 카테고리의 다른 글
Spring) RestAPI (0) | 2024.04.24 |
---|---|
Spring) Mybatis (2) | 2024.04.23 |
Spring) Interceptor (0) | 2024.04.19 |
Spring) AOP (0) | 2024.04.17 |
Spring) DI 의존성 주입 (0) | 2024.04.15 |