Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

작은 지식주머니

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

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

 

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

 

 

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

Comments