본 포스팅은 인프러의 JPA 기본편을 수강하고 정리하는 내용입니다.
요구사항 추가
- 상품의 종류는 음반, 도서, 영화가 있고 이후 더 확장될 수 있다.
- 모든 데이터는 등록일과 수정일이 필수다.
도메인 모델
도메인 모델 상세
테이블 설계
실습 코드
BaseEntity.java
1
2
3
4
5
6
7
8
9
@MappedSuperclass
public abstract class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
...
}
Item.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public abstract class Item extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
private int stockQuantity;
@ManyToMany(mappedBy = "items")
private List<Category> categories = new ArrayList<>();
...
}
Album.java
1
2
3
4
5
6
7
@Entity
public class Album extends Item {
private String artist;
private String etc;
...
}
Movie.java
1
2
3
4
5
6
7
@Entity
public class Movie extends Item {
private String director;
private String actor;
...
}
Book.java
1
2
3
4
5
6
7
@Entity
public class Book extends Item {
private String author;
private String isbn;
...
}
정리
애플리케이션이 사용자도 많지 않고 그럴땐 상속관계가 잘 동작한다. 하지만 애플리케이션이 커져 데이터가 엄청 많아지면 고민거리가 확늘어난다. 그러면 테이블을 단순하게 유지해야 된다. 정답은 없지만 우선 처음부터 모든 애플리케이션이 크지 않기에 객체지향적으로 가다가 나중에 필요할때 구조를 변경해주면 된다.