📒 [실전! 스프링 부트와 JPA 활용 - 김영한] 프로젝트를 완성한 후 부족한 기능을 개선한 후 정리하는 글입니다.
Item
은 부모 클래스로 Album
, Book
, Movie
클래스를 자식 클래스로 갖는다.Item
Entity를 수정하기 위해서는 JPA를 활용하여 해당 Entity를 영속성 상태로 정의한 후 Entity의 속성 값을 변경해주면 더티 체킹(dirty checking
)을 통해 변경된 값을 수정할 수 있다.Item
Entity의 자식 클래스(Album
, Book
, Movie
)의 속성을 변경할 때 다운 캐스팅(down casting
)을 적용해야 하는데 적용하는 방식에서 불필요해 보이는 반복적인 코드가 눈에 밟혔다.if(item instanceof Album){
Album album = (Album) item;
album.updateAlbum(form.getName(), form.getPrice(), form.getStockQuantity(), form.getArtist(), form.getEtc());
} else if (item instanceof Book) {
Book book = (Book) item;
book.updateBook(form.getName(), form.getPrice(), form.getStockQuantity(), form.getAuthor(), form.getIsbn());
} else if (item instanceof Movie) {
Movie movie = (Movie) item;
movie.updateMovie(form.getName(), form.getPrice(), form.getStockQuantity(), form.getDirector(), form.getActor());
}
Item
Entity의 클래스 타입을 확인하기 위해 모든 경우에 instanceof
를 이용한 조건문을 만들고 해당 클래스로 다운 캐스팅을 적용하였다.Polymorphism
) 사용이었다./** 하위 객체 업데이트 **/
public abstract void updateItem(ItemForm form);
public void updateBaseItem(String name, int price, int stockQuantity){
this.name = name;
this.price = price;
this.stockQuantity = stockQuantity;
}
@Override
public void updateItem(ItemForm form) {
super.updateBaseItem(form.getName(), form.getPrice(), form.getStockQuantity());
this.artist = form.getArtist();
this.etc = form.getEtc();
}
Item
클래스에 추상화 함수(updateItem
)를 생성하고 자식 클래스(Album
, Book
, Movie
)에서 @Override
를 통해 업데이트 함수를 구현하면 instanceof
와 다운 캐스팅을 사용하지 않고 정보 업데이트를 적용할 수 있다.