Spring(기초)-3주차-1-Repository

Jonguk Kim·2021년 11월 16일
0

Spring

목록 보기
4/16

0. 프로젝트 설정 및 API 설계

프로젝트 초기 설정

  • Language: Java
  • Type: Gradle
  • Group: com.review (서비스 주소, 거꾸로)
  • Artifact: review03 (프로젝트 제목)
  • Java: 8

라이브러리 임포트 설정

  • Lombok
  • Spring Web
  • Spring Data JPA
  • H2 Database
  • MySQL Driver

API 설계하기 (CRUD)

1. Repository 만들기

  • 조회, 생성, 삭제

Memo 클래스 만들기

  • 메모는 1) 익명의 작성자 이름(username), 2) 메모 내용(contents) 으로 이루어짐
  1. domain 패키지 생성 (com.review.review03 -> domain)
  2. Memo 클래스 생성 (domain -> Memo.java)
    1) @NoArgsConstructor: 기본 생성자 생성
    2) @Getter: Getter 메소드 생성
    3) @Entity: 테이블과 연계됨을 스프링에게 알림
    4) @Id: Primary Key 로 사용
    5) @GeneratedValue(strategy = GenerationType.AUTO): 자동 증가
    6) @Column(nullable = false): 컬럼값, 반드시 값이 존재
package com.review.review03.domain;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@NoArgsConstructor // 기본생성자를 만듭니다.
@Getter
@Entity // 테이블과 연계됨을 스프링에게 알려줍니다.
public class Memo{
//public class Memo extends Timestamped { // 생성,수정 시간을 자동으로 만들어줍니다.
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String contents;

    public Memo(String username, String contents) {
        this.username = username;
        this.contents = contents;
    }

//    public Memo(MemoRequestDto requestDto) {
//        this.username = requestDto.getUsername();
//        this.contents = requestDto.getContents();
//    }
    
}
  1. Timestamped 클래스 생성 (domain ->Timestamped.java)
    1) @MappedSuperclass: 상속받은 Entity가 자동으로 컬럼으로 인식
    2) @EntityListeners(AuditingEntityListener.class): 생성/변경 시간을 자동으로 업데이트
    3) @CreatedDate: 생성시간 자동 저장
    4) @LastModifiedDate: 수정시간 자동 저장
    5) @Getter: Getter 메소드 생성
  2. Timestamped 클래스 abstract 추가: 상속 받은 클래스만 생성 가능
package com.review.review03.domain;

import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@MappedSuperclass // 상속받은 Entity가 자동으로 컬럼으로 인식합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/변경 시간을 자동으로 업데이트합니다.
@Getter
public abstract class Timestamped {

    @CreatedDate    // 생성시간
    private LocalDateTime createdAt;

    @LastModifiedDate   // 수정시간
    private LocalDateTime modifiedAt;
}
  1. Memo 클래스 extends 추가
package com.review.review03.domain;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@NoArgsConstructor // 기본생성자를 만듭니다.
@Getter
@Entity // 테이블과 연계됨을 스프링에게 알려줍니다.
public class Memo extends Timestamped { // 생성,수정 시간을 자동으로 만들어줍니다.
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String contents;

    public Memo(String username, String contents) {
        this.username = username;
        this.contents = contents;
    }

//    public Memo(MemoRequestDto requestDto) {
//        this.username = requestDto.getUsername();
//        this.contents = requestDto.getContents();
//    }

}

MemoRepository 인터페이스 만들기

  • ID가 Long 타입
  1. MemoRepository 인터페이스 생성 (domain ->MemoRepository.java)
    1) MemoRepository가 JPA를 가져다 쓴다는 의미
    2) <>: 대상 넣음, 클래스: Memo, 아이디: Long
    3) JPA 공식 홈페이지
    4) 조건 키워드 참고하여 넣음
    5) findAllByOrderByModifiedAtDesc: 모두 조회, 정렬, 수정시간, 내림차순 => 최신순으로 정렬!
public interface MemoRepository extends JpaRepository<Memo, Long> {
	List<Memo> findAllByOrderByModifiedAtDesc();
}

MemoRequestDto 클래스 만들기

  • 필요한 정보를 들고 다님 (username, contents)
  1. MemoRequestDto 클래스 생성 (domain ->MemoRequestDto.java)
    1) @Getter: Getter 메소드 생성
package com.review.review03.domain;

import lombok.Getter;

@Getter
public class MemoRequestDto {
    private String  username;
    private String contents;
}
  1. Memo 클래스 MemoRequestDto 메소드 추가
package com.review.review03.domain;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@NoArgsConstructor // 기본생성자를 만듭니다.
@Getter
@Entity // 테이블과 연계됨을 스프링에게 알려줍니다.
public class Memo extends Timestamped { // 생성,수정 시간을 자동으로 만들어줍니다.
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String contents;

    public Memo(String username, String contents) {
        this.username = username;
        this.contents = contents;
    }
    
    // MemoRequestDto 메소드 추가
    public Memo(MemoRequestDto requestDto) {
        this.username = requestDto.getUsername();
        this.contents = requestDto.getContents();
    }

}

Application 만들기

  1. @EnableJpaAuditing: 데이터 변동이 있으면 JPA가 알아서 반영
package com.project.blog;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing // 데이터 변동이 있으면 JPA가 알아서 반영
@SpringBootApplication
public class BlogApplication {

    public static void main(String[] args) {
        SpringApplication.run(BlogApplication.class, args);
    }

}
profile
개발일지

0개의 댓글