개발 프로젝트

Spring JPA으로 서버 프로젝트 ERD만드는 법 2023-09-13

최동훈1 2023. 9. 13. 21:44

여태까지 2번의 프로젝트를 경험하면서 서버가 어떻게 만들어지고 Spring 과 JPA를 이용하여서 빠르게 개발하는지 나의 경험을 바탕으로 서술하려고 한다.

우선적으로 피그마를 보고 어떤 화면에 어떤 데이터가 들어갈지, 정의해야한다. 예를들어 만약 아래와 같은 화면이 있다면 그 화면에서 "어떤 Data" 를  화면상에 제공해줘야 할까 ? 라는 생각에서 출발하면 쉽게 ERD를 작성할수 있다. 

피그마 예시

이런 화면을 보고 맨 처음 생각해야 할 것은 어떤 data를 제공해야 되지? 이다. 우선 눈에 보이는 "흡연장소 지도" 라는 엔티티가 보인다. 즉, 지도 라는 엔티티를 만들고, 그 안의 프로퍼티로는 "장소" 들을 제공해주는 것이다. 또한 두번째로 중요한 개념은 어떤 엔티티가 필요한지 정했다면, 하나의 엔티티와 다른 엔티티간의 "관계" 를 생각하여서 만들면 된다. 즉 위와 같은 경우 "하나"의 "지도"는 여러 "장소"를 갖는다. 즉, 지도와 장소 엔티티의 관계는 일대 다 관계인 것이다. 이 관계를 통해 만든 최종적인 ERD는 아래와 같다.

위의 피그마 화면을 보고 만든 최종 Entity

 위의 ERD는 JPA 를 이용하여서 인텔리제이에 코드를 짠 다음에, 바로 yml로 연동된 MySQL DB를 Datagrip의 툴로 본 것이다. 바로 Entity가 생성되는 이유는 ddl auto-created 옵션을 사용했기 때문이다. 

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.util.List;


@Entity
@Getter
@Setter
public class Map {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "map_id")
    private Long id;

    private String title;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;


    @OneToMany(mappedBy = "map")
    private List<Spot> spots;

}

Map Entity 생성

package com.example.CustomMap.Domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
public class Spot {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "spot_id")
    private Long id;

    private String title;

    private String address;

    @ManyToOne
    @JoinColumn(name = "map_id")
    private Map map;


}

Spot Entity 생성

package com.example.CustomMap.Domain;


import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Entity
@Getter
@Setter
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Long id;

    private String email;

    private String password;

    private String squidname;


    @OneToMany(mappedBy = "user")
    private List<Map> maps;

}

User Entity 생성

 

실제 프로젝트 내, application.yml 내용. 아래의 내용으로 로컬에 직접 접속 가능한 mysql 형식이다.(아래에 mysql 설정을 재대로 안해서 다시 설치하느라 엄청 고생했다..) 그리고 만약 오랫동안 프로젝트를 열지 않다가 열었을 경우 com.mysql.cj.jdbc. 이부분이나 다른 자바의 라이브러리 함수들이 "Cannot resolve ~"이런 오류를 내며 빨간색으로 뜨는 경우가 있다. 이때는 터미널의 ./gradlew clean build 를 이용해서 모든 기존의 빌드 파일을 지우고 다시 빌드하는 방법을 사용하면 오류를 해결 할 수 있다.

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/custommap?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: root
    password: vdongv1620


  jpa:
    open-in-view: true
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

    show-sql: true
    properties:
      hibernate.format_sql: true
      dialect: org.hibernate.dialect.MySQL8InnoDBDialect


logging:
  level:
    org.hibernate.SQL: debug