해결됨
자바 ORM 표준 JPA 프로그래밍 - 기본편
제네릭을 적용한 BaseEntity 응용에 관한 질문입니다.
명강의 남겨주신 김영한 강사님 Respect 합니다.모든 JPA 강의는 패스했고 Spring MVC 고급편 듣고있습니다요. 좋은강의 감사드립니다.
제가 예제 응용시 BaseEntity 를 확장해보려고 예제 작성중에 몇가지 궁금증이 생겨 이렇게 질문을 남기게 되었습니다.
아래는 클래스 계층구조입니다.
위에서 BaseEntity 를 타입 파라미터를 적용하여 하위 엔티티를 추상 계층에서 핸들링 하기위해 아래와 같이 BaseEntity 에 제네릭을 적용 해봤습니다.아래는 BaseEntity 선언부 입니다.
public abstract class BaseEntity<T extends BaseEntity<T>>
public abstract class BaseEntity<T extends BaseEntity<? extends BaseEntity<T>>>
여기서 너무나도 햇갈리게 되었는데요, 딱히 컴파일 시 애러가 나지는 않았음에도 불구하고, 초반에는 1번처럼 작성했다가, 나중에 2번으로 바꾸게 되었는데요, 이유는 와일드카드 ? 가 안전하다고 해서 적용하게 되었는데, 컴파일 애러는 안나지만 불안감이 들어서 질문하게 되었습니다.
사실, 이렇게 BaseEntity 제네릭타입 선언부를 수정하게 된 배경은 BaseEntity 를 바탕으로 BaseService 도 만들게 되었는데요1번처럼 BaseEntity 작성시서비스를 아래와 같이 작성해 보았더니 적용에 문제가 있었기 때문입니다.
public abstract class BaseService<E extends BaseEntity<E>, DTO> {
그래서 타입 E 를 와일드 카드를 적용했더니 아래와 같이 바꿨더니 문제가 없었습니다
public abstract class BaseService<E extends BaseEntity<?>, DTO> {
이 부분때문에 Entity 까지 손보게 되었던 것이었죠...제네릭 너무너무 햇갈립니다. 선언하기 부터 맨붕이예요...상속구조의 제네릭 클래스 예시를 찾기가 어려워 이렇게 남기게 되었습니다.
질문입니다.
위 BaseEntity 제네릭 적용에 두가지 선언 방식은 왜 다른걸까요...제눈에는 `BaseEntity 를 상속받은 타입` 이라는 논리가 같아보여서 질문하게 되었습니다.
강사님이시면 좀더 어떤 효과적인 방식으로 구성하실지 견해를 배우고 싶습니다.
몇번을 다시봐도 배울게 많은 강의 항상 고맙습니다.읽어주셔서 감사드립니다.