이전 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 관련 내용.
'개인 Project > 01. 꽃 관련 웹사이트 제작기' 카테고리의 다른 글
4-1. DB모델링 변화 (0) | 2022.04.07 |
---|---|
03. 새로 배워나가야 할 것들.. (0) | 2022.03.25 |
02. Servlet 에서 Spring Web MVC로 바꿔보자 (0) | 2022.03.09 |
01. 새로 시작하는 것이 오히려 좋을 수 있다. (0) | 2022.03.08 |