SQL Mapper vs ORM Mapper
SQL Mapper
- SQL 문장으로 직접 데이터베이스를 다루므로 SQL을 직접 명시해줘야함
- SQL 문법에 종속적
- MyBatis, jdbcTemplates...
ORM Mapper
- DB 객체를 자바 객체로 매핑함으로써 객체 간의 관계를 바탕으로 SQL 자동 생성
- SQL문법에 종속되지 않음
- 객체와 관계형 DB의 데이터를 자동으로 매핑해주는 것
- 객체지향 프로그래밍 가능
- JPA, Hibernate...
Spring Data JPA
JPA는 인터페이스이므로 이 JPA를 사용하기 위해서는 구현체가 필요하다.
대표적으로 Hibernate, Eclipse Link 등이 있는데 Spring에서는 직접 다루지 않고 추상화한 Spring Data JPA를 통해서 개발을 진행
한마디로 Spring Data JPA는 Hibernate를 Spring에서 한 번 감싼 형태
Spring Data JPA를 사용하는 이유
1. Hibernate가 수명을 다해서 교체가 필요할 때 다른 구현체로 쉽게 교체 가능
2. 관계형 DB외의 저장소로 교체가 필요할 때 저장소 교체 용이
- Spring Data MongoDB로의 의존성만 교체하면 가능
☞ 기본적으로 Spring Data 하위 프로젝트는 CRUD의 인터페이스를 동일하게 구성되어 있다(save(), findOne()..)
그래서 Spring Data JPA, Spring Data Redis 등과 같은 Spring Data 프로젝트를 통해서 교체가 쉽게 이뤄질 수 있음
Dependency 추가
- spring-boot-starter-data-jpa : spring boot용 spring data JPA 라이브러리
- h2 : 인메모리 관계형 DB로 보통 테스트 용도로 많이 사용
- 실제 프로젝트에서는 runtimeOnly 'mysql:mysql-connector-java'를 통해서 mysql을 사용했다.
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.h2database:h2'
...
}
Entity 생성
- Domain
- SW에 대한 요구사항 혹은 문제의 영역
- 비즈니스 로직으로 주로 service 에서 사용
- Entity PK Type을 Long으로 지정하는 이유
- long 타입일 경우에는 값이 없을 경우 0으로 초기화 되는데, 만약 id가 0이라면 식별자가 0인지 값이 없어서 0 인지 알 수가 없음
- 그래서 Wrapper Type인 Long을 사용할 경우 값이 없다면 null값이 들어가게 되어 식별자와 null값을 구별할 수 있다.
- @Entity 클래스에서는 절대 Setter 메소드를 만들지 않음
- 해당 클래스의 인스턴스 값이 언제 변해야하는지 명확하게 구별이 되지 않기 때문에 목적과 의도를 정확하게 가진 메소드를 생성
- 보통 생성자를 통해서 최종값을 채운 후 DB에 삽입하는 형태로 사용(@Builder 등)
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Posts {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="post_id")
private Long Id;
@Column(length=100, nullable = false)
private String title;
@Column(columnDefinition = "TEXT", nullable = false)
private String content;
private String author;
@Builder
public Posts(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
}
Repository 생성
- 보통 Dao라고 불리는 DB Layer 접근자로 인터페이스로 새성한다.
- JpaRepository<Entity 클래스, PK 타입>을 상속받아 사용한다.
- Entity 클래스와 항상 같은 위치에 위치해야한다.
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostsRepository extends JpaRepository<Posts, Long> {
}
반응형
'Project > Study' 카테고리의 다른 글
[Spring Boot] Mustache (0) | 2021.08.04 |
---|---|
[Spring Boot] BaseTimeEntity (0) | 2021.08.03 |
[Spring Boot] Unit Test 코드 (0) | 2021.08.03 |
[Spring Boot] Lombok (0) | 2021.08.03 |
[Spring Boot] TDD, Unit Test (0) | 2021.08.03 |
댓글