데이터베이스에 저장/조회 하기위해서는 sql을 통해야한다.
jpa를 적용하지않는다면 테이블마다 객체마다 crud sql을 매번 생성해야된다.
패러다임 불일치 : 다양한 객체 모델링을 데이터베이스로 구현하기 힘들다.
jpa는 인터페이스로서 자바 표준명세서이다.
jpa->hibernate->Spring data JPA
순으로 추상화 되어있다.
구현체 교체 용이:
spring data JPA내부에서 구현체 매핑을 지원해준다.
저장소 교체 용이:
Spring data 하위 프로젝트는 crud의 인터페이스가 동일하다
그렇기 때문에 mysql->mongodb 로 저장소가 교체 되어도 기본적인 기능을 변경할 필요가 없다.
객체지향적 프로그래밍:
데이터베이스와 객체간 패러다임을 일치 시켜준다.
즉 객체지향적 개발이 가능해져서 생산성,유지보수 향상된다.
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.h2database:h2'
적용
@Entity
@Getter
@NoArgConstructor
public class Posts extends BaseTimeEntity {
@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.author=author;
this.content=content;
}
public void update(String title,String content){
this.title=title;
this.content=content;
}
}
@Entity
-> 테이블과 링크될 클래스임을 나타낸다.
@NoArgsConstructor
-> 클래스 기본 (빈)생성자 생성
@Getter
->필드마다 get필드()함수 생성
@Id
-> 테이블의 기본키라고 나타냄
@GeneratedValue(strategy=GenerationType.IDENTITY)
->기본값 설정으로 pk인 id 자동생성된다.(auto_incremnet)
@Column(length = 500, nullable = false, columnDefinition = "text")
->
length=최대길이,
nullable = null 가능여부,
columnDefinition = db에서 컬럼타입설정
@Builder
->생성자를 대신한다. 여기에 포함된 필드만 빌더에 포함된다.
@Repository
public interface PostsRepository extends JpaRepository<Posts,Long> {
}
@Repository
-> 레파지토리로 사용할 클래스라고 명시
extens jpaRepository<Posts,Long>
->
레파지토리에 jparepository를 상속해서 jpa메서드를 사용할수 있게한다.
Posts
-> 레파지토리와 매칭되는 엔티티클래스
Long
-> 매칭되는 엔티티클래스의 기본키타입
API는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다.
스프링부트에서 crud를 활용한 rust api를 만들기 위해서는
model(DTO,domain,service)
view(html)
controller(controller)
가 필요하다.
post 엔티티클래스:
Long id
String content
String title
String author
public void update(String title,String content){
this.content=conntent;
this.title=title;
}
로 되어있을 때
String content
String title
String author
public Post toEntity(){
return Posts.builder()
.content(content)
.title(title)
.author(author)
.build();
}
public Long 등록(등록Dto 등록dto){
return post레파지토리.save(등록dto.toEntity()).getId();
}
@postmaping("user/posts")
public Long 등록(@requestbody 등록Dto 등록dto){
return postservice.등록(등록dto);
}
String content
String title
public 수정dto(post entity){
this.content=entity.getContent();
this.title=entity.getTitle();
}
public Long 수정(수정Dto dto,String id){
Post post=post레파지토리.findById(id);
post.update(dto.getTitle(),dto.getcontent());
return id;
}
@putmapping("user/posts/{id}")
public long 수정(@requstparam String Id,수정Dto dto){
return post서비스.수정(dto,id);
}
Long id
String content
String title
String author
public 조회dto(Post post){
this.id=post.getcontent;
this.content=post.getContent;
this.title=post.getTitle;
this.author=post.getAuthor;
}
public 조회dto 조회(Long id){
Post post =post레파지토리.findById(id);
return 조회dto(post);
}
@GetMapping("user/post/{id})
public 조회dto 조회(@requstParam Long id){
return post서비스.조회(id);
}
Audit은 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능입니다.
도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후에 update를 하는 경우 매번 시간 데이터를 입력하여 주어야 하는데, audit을 이용하면 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어주게 됩니다.
데이터베이스에서 누가, 언제하였는지 기록을 잘 남겨놓아야 합니다. 그렇기 때문에 생성일, 수정일 컬럼은 중요한 데이터 입니다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
@MappedSuperclass
->
공통적이 매핑정보가 필요할때 사용,
MappedSuperclass이 적용된 클래스를
엔티티클래스에 상속 함으로써 공통속성(생성,수정시간)을 사용할 수 있다.
@CreatedDate
-> 생성시간을 나타낸다.
@LastMdifedDate
-> 수정시간을 나타낸다.
Localdatetime
-> 날짜-시간 타입