개인 토이 프로젝트 (1) JPA, JWT를 이용한 간단한 RESTful 백엔드 API만들어보기
개인적으로 JPA를 공부하고 활용하기 위해서 만들기 시작한 프로그램이며 아직 테스트 단계임을 알립니다.
코드 리팩토링도 하찮고 뭔가 하찮긴 합니다.
https://start.spring.io/ 해당 사이트에서 프로젝트를 생성하였고
의존관계는 일단 위에있는 다섯 개만 주입하였습니다.
기타 설정들 입니다.
초기 설정이 끝나고 실행을 하기 위해서 application.yml의 세팅을 변경하였습니다.
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/todop
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
format_sql: true
default_batch_fetch_size: 100
logging.level:
org.hibernate.SQL: debug
server:
port: 9002
H2데이터 베이스에 연결을 하였고 ddl-auto는 create로 설정해놓았습니다.
또한 쿼리에 대한 자세한 설명을 위하여 build.gradle에 추가로 의존성을 주입하였습니다.
implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6")
해당 사진처럼 무엇을 넣었는지 자세히 알 수 있습니다.
우선 Entity를 설정으로 들어가서
천천히 테이블을 늘린다 생각하고 우선 [Member, Team, Todo]을 설정하였습니다.
일단 Member와 Team을 중심으로 매핑을 하였습니다.
다만 Member와 Team은 ManyToOne 이 아닌 ManyToMany 형식으로 작성을 하였습니다.
한명의 Member가 여러개의 Team에 소속될 수 있다는 것을 가정하고 만들었습니다.
@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
public class Member extends BasicEntity{
@Id @GeneratedValue(strategy = IDENTITY)
@Column(name = "MEMBER_ID")
private Long id;
private String name;
private String email;
private String password;
// @JsonIgnore
// @OneToMany(mappedBy = "member")
// private List<Todo> todos = new ArrayList<>();
@JsonIgnore
@OneToMany(mappedBy = "member")
private List<Member_Team_Parent> parent = new ArrayList<>();
//=생성 메서드=//
public Member(String name) {
this.name = name;
}
public Member(String name, String password) {
this.name = name;
this.password = password;
}
public Member(String name, String password, String email) {
this.name = name;
this.password = password;
this.email = email;
}
}
Member Entity의 기본 설정은 Id, name, email, password를 기본으로 들고 가도록 하였습니다.
하지만 방금전 Team과 Member는 ManyToMany라고 하였는데 ManyToMany는 사용하는걸 추천하지 않습니다.
그렇기 떄문에 Team과 Member를 이어주는 Member_Team_Parent라는 엔티티를 따로 만들어 관리 하도록 하였습니다.
생성 메서드는 따로 삭제하시고 Builder 패턴을 사용하는게 더 나을수도있지만 개인적으로 보기 편해서 사용하였습니다.
package com.todo.todoP.Entity;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.time.LocalDateTime;
import static javax.persistence.FetchType.LAZY;
@Entity
@Setter @Getter
public class Member_Team_Parent extends BasicEntity{
@Id @GeneratedValue
@Column(name = "Parent_ID")
private Long id;
@ManyToOne(fetch = LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "MEMBER_ID")
private Member member;
@ManyToOne(fetch = LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "TEAM_ID")
private Team team;
//=생성 메서드=//
public static Member_Team_Parent joinMember(Member member, Team team, LocalDateTime date){
Member_Team_Parent x = new Member_Team_Parent();
x.setMember(member);
x.setTeam(team);
return x;
}
}
Member_Team_Parent Entity입니다. 기본적으로 id, member, team을 가지고있는데
해당 메서드에 필요한 개체가 있다면 추가하여 사용할 수 있도록 설계하였습니다. EX) count 등등
package com.todo.todoP.Entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.*;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter @Setter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class Team extends BasicEntity{
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TEAM_ID")
private Long id;
private String title;
private String category;
@JsonIgnore
@OneToMany(mappedBy = "team")
private List<Member_Team_Parent> parent = new ArrayList<>();
}
또한 생성과 수정시의 시간을 기록하기위한 BasicEntitiy를 @MappedSuperClass를 사용하여 주입하였습니다.
package com.todo.todoP.Entity;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import java.time.LocalDateTime;
@MappedSuperclass
public class BasicEntity {
@Column(updatable = false)
private LocalDateTime createDate;
private LocalDateTime modifiedDate;
@PrePersist
public void prePersist(){
LocalDateTime now = LocalDateTime.now();
createDate = now;
modifiedDate = now;
}
@PreUpdate
public void preUpdate(){
modifiedDate = LocalDateTime.now();
}
}
팀은 id, title, category(변경 예정)이 들어있습니다.
위에있는 Entity를 생성 후 spring을 실행
해당 테이블이 있는지 전부 삭제한 후
테이블이 만들어지는 것을 확인 하였습니다. H2데이터베이스에 접속해보아 확인해 보았습니다.
확인을 하고 다음 게시물로 넘어가겠습니다.
개인 공부용 자료이기 떄문에 세세한 설정은 누락되어 있습니다.