Spring Framework를 사용하여 데이터베이스로부터 정보를 검색하고, 이를 다양한 형태의 DTO로 변환하여 각각의 요구사항에 맞추어 유연하게 작동하는 서비스 메서드를 만들 수 있다는 생각을 하였다.
예를 들어, Post 엔티티가 있고, 이에 대해 다양한 정보(예: 요약 정보, 상세 정보)를 반환하는 요구사항이 있다면 각 요구사항에 맞는 DTO가 여러 개 필요한 상황에서, 원래의 나였다면 각각의 DTO를 반환하는 별도의 메서드를 만들었을 것이다. 하지만 제너릭을 통한다면 이런 코드 중복과 유지보수의 어려움을 해결할 수 있다.
여기서 제네릭을 활용한 서비스 메서드 설계가 유용하다. 제네릭을 사용하면 하나의 메서드로 다양한 타입의 DTO를 반환할 수 있다.
예를 들면
public <T> List<T> findByAuthor(Member author, Class<T> type) {
// 생략: 데이터베이스로부터 Post 엔티티 리스트 조회
return posts.stream()
.map(post -> modelMapper.map(post, type))
.collect(Collectors.toList());
}
이 메서드는 Member 타입의 author를 받아, 해당 작성자의 Post 목록을 조회한 후, 지정된 type의 DTO로 변환하여 반환한다.
여기서 나는 각각의 Dto가 들어오면 이 Dto에 값을 넣어주는것도 다르기 때문에 문제가 되지 않을까 생각했는데 modelMapper를 이용하면 이러한 문제도 해결된다.
장점:
주의사항:
type 매개변수로 전달된 클래스가 적절한 DTO를 나타내는지 런타임 이전에 확인할 수 없다.ModelMapper)는 리플렉션을 사용할 수 있으므로, 성능에 민감한 상황에서는 고려가 필요하다.제네릭을 활용한 서비스 메서드 설계는 Spring Framework에서 데이터 접근 및 변환 로직을 유연하게 관리할 수 있는 강력한 방법이다. 이 방법을 통해 코드의 중복을 줄이고, 높은 유연성과 재사용성을 얻을 수 있다.