온 코딩

[게시판] 게시판 관련 ENTITY, 기본 프로젝트 구조 본문

FINAL PROJECT

[게시판] 게시판 관련 ENTITY, 기본 프로젝트 구조

SummerON 2021. 7. 16. 17:02

1. ERD

 

2. 프로젝트 구조

 

3. ENTITY 클래스 

User.java

package com.finalproject.ildoduk.entity.user;

import lombok.*;
import org.hibernate.annotations.*;

import javax.persistence.*;
import javax.persistence.Entity;

@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
public class User {

    @Id
    private String id;


    private char isHelper;

}

AuctionList.java

package com.finalproject.ildoduk.entity.action;

import com.finalproject.ildoduk.entity.user.*;
import lombok.*;
import org.hibernate.annotations.*;
import org.springframework.data.annotation.*;

import javax.persistence.*;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.sql.*;
import java.time.*;

@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = "address") //스택 오버플로 방지
@DynamicInsert
public class AuctionList {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long aucSeq;

    @OneToOne(mappedBy = "aucSeq") //Address 테이블과 1:1 관계
    private Address address;

    @ManyToOne(fetch = FetchType.LAZY) //성능향상을 위해 지연로딩, 필요할 때만 아우터조인 사용
    private User id;

    @Column(nullable = false)
    private int category;

    private LocalDateTime doDateTime;

    @Column(length = 30,nullable = false)
    private String predictHour;

    @Column(nullable = false)
    private int level;

    @Column(nullable = false)
    private int startPrice;

    @Column(nullable = false)
    private int auctionGap;

    @Column(length = 1000,nullable = false)
    private String title;

    @Column(length = 3000,nullable = false)
    private String content;

    @CreatedDate
    private LocalDateTime regDate;

    @ColumnDefault(value = "0")
    private int driverLicense;
    @ColumnDefault(value = "0")
    private int gender;
    @ColumnDefault(value = "0")
    private int age;

    @ColumnDefault(value = "0")
    private int state;
}

Address.java

package com.finalproject.ildoduk.entity.action;

import lombok.*;
import org.hibernate.annotations.*;

import javax.persistence.*;
import javax.persistence.Entity;

@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString(exclude = "aucSeq")
@DynamicInsert
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long addSeq;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn
    private AuctionList aucSeq;

    @Column(length = 300,nullable = false)
    private String address;
    @Column(length = 30,nullable = false)
    private String sido;
    @Column(length = 30,nullable = false)
    private String sigungu;
}

BiddingList.java

package com.finalproject.ildoduk.entity.action;

import com.finalproject.ildoduk.entity.user.*;
import lombok.*;
import org.hibernate.annotations.*;

import javax.persistence.*;
import javax.persistence.Entity;

@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString(exclude = {"aucSeq","id"})
@DynamicInsert
public class BiddingList {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long bidSeq;

    @ManyToOne(fetch = FetchType.LAZY)
    private AuctionList aucSeq;

    @ManyToOne(fetch = FetchType.LAZY)
    private User id;

    @Column(nullable = false)
    private int offerPrice;

    @ColumnDefault(value="0")
    private int chosen;
}

 

FK 처리 힘들었다..

우선 다 LAZY LOADING처리 해놓고 나중에 필요에 따라 EAGAR로 바꿀 예정

Lazy Loading 단점 : 필요한 순간에 쿼리를 실행하기 때문에 연관관계가 복잡할 경우 여러번의 쿼리가 실행 됨 

 

작성 시 주의점 

@ToString 어노테이션의 경우, 모든 항목을 다 출력하기 때문에 관계가 있는 테이블의 경우 ToString 때문에 스택오버플로가 발생할 수 있다 (특히 1:1 대응에서 서로 호출할 경우...!)

=> @ToString(exclude="") 하기! 보통 설정함 

 

Comments