728x90
반응형
SMALL
(1)JPA의 등장배경
웹 서비스 개발하고 운영시 피할 수 없는 문제가 데이터베이스를 다루는 일이다.
옛날에 스프링을 공부할 때는 iBatis와 같은 SQL매퍼를 이용해서 DB쿼리를 작성했다고 한다.
그러다보니 개발보다 SQL을 다루는 시간이 더 많아졌다. 그래서 JPA라는 자바 표주 ORM(object relational Mapping)
※ORM이란?
객체와 관계형 DB의 데이터를 자동으로 매핑해주는 것을 말한다.
- 객체지향은 클래스를 사용, 관계형 DB는 테이블을 사용하는 객체 모델이랑 관계형 모델간의 불일치가 발생한다.
- ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결해준다.
- DB 데이터 <- Mapping -> 객체 필드
- 객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.
- Persistant API라고도 불린다.
- Ex) JPA(Java Persistance API), Hibernate
(2) 프로젝트에 Spring Data Jpa 적용하기
먼저 build.gradle의 의존성 영역에
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('com.h2database:h2')
위 코드를 추가하여 의존성 다운을 받는다.
- spring-boot-starter-data-jpa
- 스프링 부트용 Spring Data Jpa 추상화 라이브러리이다.
- 스프링 부트 버전에 맞춰 자동으로 JPA관련 라이브러리들의 버전을 관리해 준다.
- h2
- 인메모리 관계형 DB이다. 별도 설치 필요없이 프로젝트 의존성만으로 관리 가능
- 메모리에서 실행되기때문에 애플리케이션을 재시작할 때마다 초기화된다는 점을 이용하여 테스트 용도로 많이 사용
의존성이 등록되었으면
domain패키지 -> posts패키지 -> Posts클래스를 순서대로 만든다.
※BaseTimeEntity는 나중에 나올 내용
(2)-1 Posts클래스 생성
그 후 Posts클래스에 다음과 같이 코드를 추가한다.
package com.jojoldu.book.springboot.domain.posts;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Getter
@NoArgsConstructor
@Entity
public class Posts {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 500, 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;
}
여기서 Posts클래스는 실제 DB와 매칭될 클래스이며 Entity클래스라고도 한다.
JPA 사용시 DB 데이터에 작업할 경우 실제 쿼리를 날리기 보단 Entity클래스의 수정을 통해 작업할 수 있다.
- @Entity
- 테이블과 링크될 클래스임을 나타낸다.
- 기본값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍으로 테이블 이름을 매칭한다.
- Ex) SalesManager.java -> Sales_manager table
- @Id
- 해당 테이블의 PK필드를 나타낸다.
- @GeneratedValue
- PK의 생성규칙을 나타낸다.
- GenerationType.IDENTITY 코드를 추가해야지만 auto_increment가 가능해진다.
- @Column
- 테이블의 칼럼을 나타내며 굳이 선언하지 않아도 해당 클래스의 필드는 모두 칼럼이 된다
- 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용한다.
Setter메소드가 없다?
Entity클래스에서는 절대 Setter메소드를 만들지 않는다.
해당 클래스의 인스턴스 값들이 언제 어디서 변해야 하는지 모르기때문에 차후 변경 시 정말 복잡해진다.
(2)-2 JpaRepository생성
이렇게 Posts클래스 생성이 끝났으면 ,Posts 클래스로 DB에 접근하게 해줄 JpaRepository를 생성해준다.
package com.jojoldu.book.springboot.domain.posts;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostsRepository extends JpaRepository<Posts, Long> {
}
- ibatis나 MyBatis등에서 Dao라고 불리는 DB Layer 접근자이다.
- JPA에서는 Repository라고 부르며 인터페이스를 생성한다.
- 인터페이스 생성 후 JpaRepository<Entity클래스, PK 타입>을 상속하면 기본적인 CRUD 메소드가 자동으로 생성된다.
- Entity 클래스와 기본 Entity Repository는 함께 위치해야 한다. Entity클래스는 기본 Repository없이는 제대로 역할을 할 수가 없다.
- 도메인별로 프로젝트를 분리할 때 Entity 클래스와 기본 Repository는 함께 움직어야 하므로 도메인 패키지에서 함께 관리를 해야한다.
728x90
반응형
LIST
'Spring' 카테고리의 다른 글
[Spring] - 스프링 빈(bean)이란? (0) | 2025.02.12 |
---|---|
[Spring] - Spring Data JPA 테스트코드 작성하기 (1) | 2025.02.06 |
[Spring] - 롬복 알아보기 및 설치하기 (1) | 2025.02.04 |
[Spring] - 스프링부트에서 테스트코드 작성하기 (1) | 2025.02.03 |
[Spring] Hello Controller 테스트 코드 작성하기 (2) | 2025.01.31 |