spring

개인 토이 프로젝트 (1) JPA, JWT를 이용한 간단한 RESTful 백엔드 API만들어보기

우히힝 2022. 2. 20. 13:59

개인적으로 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데이터베이스에 접속해보아 확인해 보았습니다.

 

확인을 하고 다음 게시물로 넘어가겠습니다.

 

 

개인 공부용 자료이기 떄문에 세세한 설정은 누락되어 있습니다.