본문 바로가기

개인 Project/01. 꽃 관련 웹사이트 제작기

4-2 설계한대로 만들어보자!

이전 Post에서 해결하지 못한 객체 모델링과 DB모델링에서 오는 괴리감. 을 해결해보자

 

이전 모델링을 통해서

 

다음과 같이 구성할 수 있었습니다.

Flower_name과 color를 복합키로 하는 Flower가 이제 어떠한 값타입으로 특성들을 가질 수 있게 되었습니다.

Flower는 List로 자신의 특성인 season과 keyword들을 가질 수 있게 구성할 수 있습니다.

@Data
@Entity
@NoArgsConstructor
public class Flower {

    @EmbeddedId
    private FlowerId id;

    private String symbol;
    private String imageUrl;

    @OneToMany(mappedBy = "flower", cascade = CascadeType.ALL)
    List<FlowerKeyword> keywords = new ArrayList<>();

    @OneToMany(mappedBy = "flower", cascade = CascadeType.ALL)
    List<Seasons> seasons = new ArrayList<>();
}

==================== Flower ID 복합키 =======================
@Data
@Embeddable
@NoArgsConstructor
public class FlowerId implements Serializable {

    @Column(name = "flower_id")
    private String flowerName;

    @Column(name="color")
    @Enumerated(EnumType.STRING)
    private Color color;

    public FlowerId(String flowerName, Color color) {
        this.flowerName = flowerName;
        this.color = color;
    }
}

==================== Color Enum =======================
public enum Color {
    RED, BLACK, WHITE, BLUE, YELLOW
}

Keyword와 Season의 경우에도

package flowershop.flowerSearch.domain;

import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.MapsId;

import static javax.persistence.FetchType.LAZY;


@Entity
@NoArgsConstructor
@Data
public class FlowerKeyword {

    @EmbeddedId
    private FlowerKeywordId id;

    @MapsId(value = "flowerId")
    @ManyToOne(fetch = LAZY)
    private Flower flower;

    public FlowerKeyword(Flower flower, Keyword keyword) {
        this.id = new FlowerKeywordId(flower.getId(), keyword);
        this.flower = flower;
    }
}

@Entity
@NoArgsConstructor
@Getter
public class Seasons {
    @EmbeddedId
    private SeasonId id;

    @MapsId(value = "flowerId")
    @ManyToOne(fetch = LAZY)
    private Flower flower;

    public Seasons(Flower flower, Season seasons) {
        this.id = new SeasonId(flower.getId(), seasons);
        this.flower = flower;
    }
}


==================== Season ID 복합키 =======================
@Embeddable
@Data
@NoArgsConstructor
public class SeasonId implements Serializable {
    FlowerId flowerId;
    Season season;

    public SeasonId(FlowerId flowerId, Season season) {
        this.flowerId = flowerId;
        this.season = season;
    }
}

==================== Keyword ID 복합키 =======================
@Embeddable
@NoArgsConstructor
@Data
public class FlowerKeywordId implements Serializable {

    private FlowerId flowerId;

    @Enumerated(EnumType.STRING)
    private Keyword keyword;

    public FlowerKeywordId(FlowerId flowerId, Keyword keyword) {
        this.flowerId = flowerId;
        this.keyword = keyword;
    }
}

==================== Enums Season & Keyword =======================
public enum Season {
    Spring("봄"),
    Summer("여름"),
    Fall("가을"),
    Winter("겨울");


    private String koSeason;

    Season(String koSeason) {
        this.koSeason = koSeason;
    }
}

public enum Keyword {
    keyword1, keyword2, keyword3, keyword4, keyword5
}

꽃이 가지는 특성들은 결국 꽃을 부모로하는 테이블이라고 생각하고, 삭제, 삽입 등이 일어날 때

연쇄적으로 삭제 또는 삽입이 일어나도록 CASCADE로 설정합니다. 

 

이후 학습하고 구현하면서 학습한 것, 정리할 것의 기록 

- 식별관계와 비식별관계

- 역정규화의 장점.  https://owlyr.tistory.com/20

- 인덱스

 복합키 인덱스 지정 (컬럼 지정과 검색 시 하나의 키만 사용했을 때 사용 가능할까?) 

 Clustered Index vs non Clustered Index

 인덱스 지정 컬럼 기준( cardinality etc.)

 

- DB 설계 관점에서 고려한 것 

RDBMS vs noSQL

그냥 noSQL 사용하면 쉽게 되지 않을까 라는 생각을 많이 했다.

 

- Join의 성능

 이전에는 단순히 같은 것 매번 해야하는 join이 많으니까 싫다. 

 join할 테이블이 크지도 않은데 라는 생각에서 시작했었는데

join시 일어나는 행동과 join의 성능에 대해 알아보자.

- JPA 복합키 구현

 

이후 프로젝트 진행할 것

- sql 바꾸기

- JPA test

- 통합 검색 구현

- 꽃 insert 화면 구성 및 web 테스트

 

출처 

JPA 구현

https://techblog.woowahan.com/2595/

https://realrain.net/post/enum-convertor​   Enum convertor

https://umbum.dev/904​   Enum 관련 내용.

https://ict-nroo.tistory.com/116​ JPQL

https://developer-ping9.tistory.com/296​  MapsId