728x90

1년 전 진행했던 마실가실 프로젝트를 🛠️리팩토링하며 정리한 내용입니다.

 

Table을 만드는 방법은 크게 2가지입니다.

* Database에서 직접 CREATE TABLE 하기

* JPA의 DDL 생성 기능 활용하기

 

원래도 JPA의 DDL문 생성 기능을 활용했으므로 Column만 먼저 바꿔볼 예정입니다.

관계에 의한 Mapping도 변경을 해줘야하는데, 그건.. 차근차근 해보겠습니다🫠.

 

+ 리팩토링

  • UserEntity.java → User.java
    • 의미없는 Annotation 정리(사용하지 않는 값, Default값 사용 등)
    • PK값 데이터 타입을 조회 성능을 고려하여 varchar → Integer 변경 
    • 데이터 입력 자동화
      • @CreatedDate, @LastModifiedDate

 

+ 리팩토링

  • TripSchedule.java → Trip.java
  • 의미없는 Annotation 정리
    • @Buider와 @NoArgsConstructor
      • 상황
        • Trip Entity는 기본 생성자가 필요한 상황이나 모든 필드를 대상으로 하는 AllArgsConstructor는 필요 없는 상황
      • 문제
        • @Buider, @NoArgsConstructor만 사용 시, 'constructor Trip in class Trip cannot be applied to given types' 오류 발생
      • 원인
        • 클래스 레벨 @Builder
          • 생성자가 없는 경우, @Builder는 클래스의 모든 멤버 변수를 파라미터로 받는 생성자를 생성
          • 생성자가 이미 있는 경우, @Builder는 기존의 생성자를 활용하며 새로운 생성자를 생성하지 않음
        • @NoArgsConstructor에 의해 기본 생성자 생성 → @Builder 추가적인 생성자 생성 X
        • 이후, @Builder에 의해 생성된 빌더 클래스 내부에서 해당 타입의 인스턴스를 생성할 때 모든 멤버 변수를 초기화하는 생성자 호출 시도
          • required: no arguments
          • found: all arguments
      • 해결 방법
        • @Builder 어노테이션을 생성자 레벨에서 사용
        • @AllArgsConstructor 추가 사용

 

+ 리팩토링

  • TripDailySchedule.java → TripDay.java
    • ERD에 맞춰서 수정

 

+ 리팩토링

  • TripDatailSchedule.java → DayDestination.java
    • ERD에 맞춰서 수정

 

+ 리팩토링

(2024.08.04)

  1. 복합키 설정
    • 일정 테이블과 리뷰 사진 테이블에 복합키 설정 추가
    • @IdClass 사용
    • 연관 관계 매핑 시, @JoinColumns로 변경
  2. 양방향 연관 관계 매핑 → 단방향 연관 관계 매핑
    • 양방향 참조 관계 설정으로 인한 toString()의 무한 루프 오류를 줄이기 위해 초기 단방향 참조 관계 설정 후, 필요시 양방향 참조 관계로 변경 예정
    • 양방향 연관 관계 설정 시 유의 사항
      • 주인 = 외래키를 보유하고 있는 곳, 1:N 관계에서 N에 해당하는 곳, @ManyToOne 어노테이션을 사용하는 곳

 

 

 

🙋‍♀️

본 포스트는 공부 목적으로 작성하였습니다.
보시는 도중 잘못된 부분이나 개선할 부분이 있다면 댓글로 알려주시면 수정하도록 하겠습니다.

 

📑

참고 자료

 

[JPA_Basic] ERD를 기반으로 한 Entity 작성

이 글은 김영한의 [자바 ORM 표준 JPA 프로그래밍 - 기본편]을 수강하며 정리한 글입니다. 👉 기본 환경 - Language: Java - DB: H2 Database - IDE: IntelliJ ERD Member Entity 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2

hj0216.tistory.com

 

JPA @CreatedDate @LastModifiedDate 생성 시간, 수정 시간이 저장되는 원리

@CreatedDate, @LastModifiedDate 데이터를 저장할 때 '생성된 시간 정보'와 '수정된 시간 정보'는 여러모로 많이 사용되고 또 중요합니다. JPA를 사용하면서 @CreatedDate, @LastModifiedDate를 사용하여 생성된 시

wildeveloperetrain.tistory.com

 

Lombok - @Builder와 @NoArgsConstructor 함께 사용시 발생하는 오류와 해결법

Lombok 라이브러리는 Java에서 반복적인 코드를 줄이기 위한 유용한 도구 중 하나이다.그 중에서도 @Builder와 @NoArgsConstructor는 자주 사용되는 어노테이션들이다.그러나 두 어노테이션을 함께 사용하

velog.io

 

[JPA 프로그래밍] 복합키와 비식별&식별 관계 매핑

해당 글은 김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 을 스터디 하면서 정리하는 글 입니다 !👨‍💻

velog.io

 

[JPA] 식별 관계 & 복합 키

DB에서 두 테이블간에 관계를 나타낼때는 총 2가지로 분류할 수 있다 1. 상대방의 PK를 자신의 PK이자 FK로 사용 = 식별관계 2. 상대방의 PK를 자신의 FK로 사용 = 비식별관계 필수적 비식별 관계(Mandat

cs-ssupport.tistory.com

 

[JPA] 단방향 연관관계와 양방향 연관관계 - 엔티티 매핑(Entity Mapping) - 5

본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다. '자바 ORM 표준 JPA 프로그래밍 - 기본편' 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의 JPA를 처음 접

ittrue.tistory.com

 

 

728x90
728x90

1년 전 진행했던 마실가실 프로젝트를 🛠️리팩토링하며 정리한 내용입니다.

 

기존에는 네이버 클라우드에 DB 연결되어있었는데, 기간 만료의 문제로 Local로 변경하여 연결을 해 볼 예정입니다.

 

Database: 🐬 MySQL

 

 

  • build.gradle
dependencies {
	runtimeOnly 'com.mysql:mysql-connector-j'
}
  • application.yml
spring:
  datasource:
  driver-class-name: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Seoul
  username: DB 생성 시, 작성한 username
  password: DB 생성 시, 작성한 password

 

+ 리팩토링

spring:
  datasource:
  driver-class-name: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Seoul
  username: DB 생성 시, 작성한 username
  password: DB 생성 시, 작성한 password
  • useSSL=false

Establishing SSL connection without server's identity verification is not recommended
최신 mysql버전을 사용 시, SSL연결을 기본으로 사용
SSL을 사용하지 않을 경우, 명시하지 않으면 경고가 발생하므로 이를 제거하기 위해 추가

 

 

 

기존 JPA 관련 설정은 다음과 같습니다.

application.yml

  jpa:
    # Application 구동할 때마다, Entity로 정의된 테이블을 생성
    generate-ddl: true
    hibernate:
      # 스키마 생성, 테이블 존재 시 변경된 부분만 반영
      ddl-auto: update
    show-sql: true
    database: mysql
    database-platform: org.hibernate.dialect.MySQL8Dialect
  • generate-ddl: true

데이터베이스 스키마를 자동으로 생성하거나 업데이트하는 기능을 활성화하는 설정

🚨 개발 및 테스트 환경에서 유용할 수 있지만, 운영 환경에서는 주의해서 사용

 

+ 리팩토링

  jpa:
    # Application 구동할 때마다, Entity로 정의된 테이블을 생성
    generate-ddl: true
    hibernate:
      # 스키마 생성, 애플리케이션 실행 시 모든 table trop 후 create
      ddl-auto: create
    # 실행 sql문 콘솔에서 확인
    show-sql: true
    # formatter
    properties:
      hibernate:
        format_sql: true
        use_sql_comments: true
        highlight_sql: true
    # using database
    database: mysql
    # mysql 상세 지정
    database-platform: org.hibernate.dialect.MySQL8Dialect

 

  • ddl-auto: update → create

개발 초기 단계이고, Entity 수정 예정이기에 애플리케이션 실행 시마다 table을 새롭게 만들고자 변경

  • formatter 추가

 

DDL이 출력된 모습이 다음과 같이 변경됩니다.

Hibernate: create table trip_schedule (schedule_id integer not null auto_increment, mod_date datetime(6), reg_date datetime(6) not null, user_id varchar(20) not null, city_name varchar(30), date_list varchar(500), primary key (schedule_id)) engine=InnoDB

 

+ 리팩토링

[Hibernate] 
    create table trip_schedule (
        schedule_id integer not null auto_increment,
        mod_date datetime(6),
        reg_date datetime(6) not null,
        user_id varchar(20) not null,
        city_name varchar(30),
        date_list varchar(500),
        primary key (schedule_id)
    ) engine=InnoDB

 

 

 

🙋‍♀️

본 포스트는 공부 목적으로 작성하였습니다.
보시는 도중 잘못된 부분이나 개선할 부분이 있다면 댓글로 알려주시면 수정하도록 하겠습니다.

 

📑

참고 자료

 

[SpringBoot] 스프링 부트 프로젝트 생성

👉 기본 환경 - Language: Java - DB: MySQL - IDE: IntelliJ 1. Spring Initializer에서 기본 설정 구축 https://start.spring.io/ - Project - Gradle - Groovy: 환경 설정 파일 build.gradle - Gradle - Kotlin: JVM에서 실행되는 다목적 프

hj0216.tistory.com

 

1.5 JDBC

1) JDBC란? JDBC 개요 JDBC(Java Database Connectivity)의 정의 - 자바를 이용한 데이터베이스 접속과 SQL 문장의 실행, 그리고 실행 결과로 얻어진 데이터의 핸들링을 제공하는 방법과 절차에 관한 규약 - 자

hoit1302.tistory.com

 

[Spring] hibernate 설정 정보

hibernate 설정 정보에 대해서

velog.io

 

 

728x90
728x90

1년 전 진행했던 마실가실 프로젝트를 🛠️리팩토링하며 정리한 내용입니다.

 

마실가실 ERD (좌-리팩토링 전 / 우 - 리팩토링 후)

 

MSGS_REFACTORING_ERD

담당했던 테이블입니다.

사용자 테이블은 담당이 아니지만, 여행 일정 생성을 위해서는 필수 테이블이기에 같이 정리했습니다.

 

 

🏗️ ERD에서 다음 내역이 개선되었습니다.

 

공통

  • ID 타입을 VARCHAR → INT로 변경
    • 인덱스 생성 및 조회 성능 향상
    • AUTO_INCREMENT 활용을 통한 데이터베이스 입력 자동화 → 입력 실수 방지
  • 등록일, 수정일 등 일자 관련 데이터 형식을 DATE → TIMESTAMP로 변경
    • 시간 정보 추가
    • CURRENT_TIMESTAMP 활용을 통한 데이터베이스 입력 자동화 → 입력 실수 방지
  • 일부 데이터 크기 VARCHAR(255)로 조정
    • VARCHAR: 데이터 byte + 데이터 길이 byte
      VARCHAR의 스키마가 255 이하일 때 1 Byte를 예약하고, 255를 초과할 때 2 Byte를 예약
      데이터 크기가 255를 초과할 필요가 없을 경우, 255로 조정
  • 길이가 고정된 데이터의 경우 VARCHAR → CHAR로 변경
    • CHAR는 길이가 고정되어 있어 데이터 저장 및 조회 시 일관된 성능을 보임
    • 길이 정보를 저장하는 바이트로 인한 오버 헤드가 없음

 

여행 일자 테이블

  • 여행 일자 테이블에 날짜 및 일차 컬럼 추가
    • 자주 사용되는 데이터를 컬럼에 저장하여 성능 개선

 

+ 3차 리팩토링

(2024.08.04)

 

전에 알던 내가 아냐 Brand New Sound...

 

ERD 2차 리팩토링을 하다가 그런 생각이 들었습니다.

나 무슨 기준으로 테이블을 만들고 있는 걸까.. 🤔

기존 테이블 구조에 의하면 여행지가 중복된 데이터로 하염없이 쌓이기 시작하는데, 이래도 되는걸까..🤔

DB 설계가 잘못되었다..🫡

 

그래서 고쳤습니다.

 

기존 테이블은 페이지/동작을 기준으로 작성하였습니다.

  * 예: 사용자 / 일정생성 / 일정후기 등

 

  1. 변경 테이블은 엔티티를 기준으로 작성하였습니다.
    • 예: 사용자 / 일정 / 여행지 등
  2. 다중 필드를 제거하였습니다.
    • 기존 테이블 구조의 경우, 목적지와 관련된 내용이 중복되어 기록됩니다.
    • 중복 데이터가 반복될 수있는 부분을 제거하였습니다.
  3. 계산 필드를 제거하였습니다.
    • 기존 여행 일정에 1일차, 2일차를 계산하는 필드를 제거하였습니다.
    • 원본 데이터가 변경될 경우 계산된 필드가 올바르게 갱신되지 않으면 잘못된 정보를 제공할 수 있는 가능성을 제거하였습니다.
  4. 식별 관계를 줄였습니다.
    • 식별 관계는 간단히 외래키가 자식 테이블의 PK 역할도 수행하는 관계를 의미합니다.
    • 복합키 사용으로 인한 복잡성 증가나 성능 저하의 문제를 고려하여 식별 관계를 줄였습니다.

 

 

 

🙋‍♀️

본 포스트는 공부 목적으로 작성하였습니다.
보시는 도중 잘못된 부분이나 개선할 부분이 있다면 댓글로 알려주시면 수정하도록 하겠습니다.

 

📑

참고 자료

 

MySQL varchar(255)를 사용하는 이유?

이유 MySQL에서 테이블을 만들 때 varchar(255)를 자주 사용했다. varchar가 가변길이 타입으로 char에 비해 실제 저장한 데이터의 크기만큼 저장한다고 알고 있었다. 그런데 왜 하필 255인지는 생각해본

velog.io

 

DB 설계는 어떻게 해야 할까?

도대체 어떻게 설계해야 할까? 😂

velog.io

 

 

728x90