작성
·
972
0
답변 2
1
안녕하세요. kkh님
JPQL 쿼리를 작성할 때 from에 자식 타입을 넣으시면 원하시는 결과를 얻을 수 있습니다.
(이게 정석 방법입니다.)
만약 dtype이 꼭 필요하다면 dtype을 필드를 만들고 읽기 전용(insert=false, update=false)으로 JPA @Column 컬럼 매핑하시면 됩니다.
감사합니다.
0
답변 감사합니다.
위와 같이 상속을 사용해서 Entity 를 구성하는 경우 실무에서는 querydsl로 Item, Book, Ablum, Movie Entity의 비즈니스 로직을 작성할 때는 아래 와 같은 방법으로 repository와 service를 구현할 수 있다고 생각합니다.
실무에서는 어떤 방식을 주로 사용하는지 궁금합니다. 만약 3가지 모두 틀린 경우에는 어떤 방식이 가장 좋은 방식인지 궁금합니다.
경험 많으신 김영한 님께서 번호만 선택 해주신다면 많은 도움이 될거 같습니다 ㅜㅜ.
1. Item, Book, Ablum, Movie각각 repository를 따로 두고 service도 따로 둔다.
public interface ItemRepository extends JpaRepository<Item, Long>, ItemQuerydslRepository{
// ..
}
public interface MovieRepository extends JpaRepository<Movie, Long>, MovieQuerydslRepository {
// ..
}
// ...
public class ItemService {
// ..
}
public class MovieService {
// ..
}
//...
2. Item, Book, Ablum, Movie 를 모두 다른 repository로 두고 service에서 map/factory객체에 repository bean을 저장해서 사용한다.
public interface Repository {}
public interface ItemRepository extends JpaRepository<Item, Long>, ItemQuerydslRepository, Repository {
// ..
}
public interface MovieRepository extends JpaRepository<Movie, Long>, MovieQuerydslRepository, Repository {
// ..
}
// ...
@RequireArgumentrs
public class ItemService {
private final RepositoryFactory repositoryFactory;
}
@RequireArgumentrs
public class RepositoryFactory {
private final ItemRepository itemRepository;
private final MovieRepository movieRepository ;
// ....
public Repository getObj(ItemType type) {
if (type == MOVIE) return movieRepository ;
// ,.,.. codes
return itemRepository;
}
}
3. Item, Book, Ablum, Movie의 querydsl interface와 Impl class를 따로 두고 하나의 repository interface에 모두 상속하는 구조를 가진다. -> service도 1개만 사용
public interface ItemRepository extends JpaRepository<Item, Long>, ItemQuerydslRepository, MovieQuerydslRepository{
// ..
}
@RequireArgumentrs
public class ItemService {
private final RepositoryFactory repositoryFactory;
}
좋은 코드를 작성하기 위해서 위 3가지 중 어떤걸 선택하는게 가장 적절한지 궁금합니다....
이 경우 상황에 따라서 1,3번을 선택해야 합니다.
애플리케이션이 단순하고 대부분 공통 로직이면 3번을 선택하고, 애플리케이션이 복잡하고, 비즈니스 로직이 상황별로 다르다면 1번을 선택하면 됩니다.
2번은 크게 장점이 없을 듯 합니다.
도움이 되셨길 바래요^^