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) 으로 이루어짐
- domain 패키지 생성 (com.review.review03 -> domain)
- 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{
@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;
}
}
- Timestamped 클래스 생성 (domain ->Timestamped.java)
1) @MappedSuperclass: 상속받은 Entity가 자동으로 컬럼으로 인식
2) @EntityListeners(AuditingEntityListener.class): 생성/변경 시간을 자동으로 업데이트
3) @CreatedDate: 생성시간 자동 저장
4) @LastModifiedDate: 수정시간 자동 저장
5) @Getter: Getter 메소드 생성
- 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
@EntityListeners(AuditingEntityListener.class)
@Getter
public abstract class Timestamped {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime modifiedAt;
}
- 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;
}
}
MemoRepository 인터페이스 만들기
- 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)
- 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;
}
- 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;
}
public Memo(MemoRequestDto requestDto) {
this.username = requestDto.getUsername();
this.contents = requestDto.getContents();
}
}
Application 만들기
- @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
@SpringBootApplication
public class BlogApplication {
public static void main(String[] args) {
SpringApplication.run(BlogApplication.class, args);
}
}