제네릭을 활용한 유연한 메서드 설계

강찬우·2024년 1월 5일

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를 이용하면 이러한 문제도 해결된다.

장점과 주의사항

장점:

  • 코드 재사용성 향상: 같은 로직을 여러 DTO에 대해 중복해서 작성할 필요가 없다.
  • 유연성: 새로운 타입의 DTO가 필요할 때, 서비스 메서드를 변경하지 않고도 대응할 수 있다.

주의사항:

  • 타입 안전성: type 매개변수로 전달된 클래스가 적절한 DTO를 나타내는지 런타임 이전에 확인할 수 없다.
  • 성능 고려: 매핑 도구(예: ModelMapper)는 리플렉션을 사용할 수 있으므로, 성능에 민감한 상황에서는 고려가 필요하다.

결론

제네릭을 활용한 서비스 메서드 설계는 Spring Framework에서 데이터 접근 및 변환 로직을 유연하게 관리할 수 있는 강력한 방법이다. 이 방법을 통해 코드의 중복을 줄이고, 높은 유연성과 재사용성을 얻을 수 있다.

0개의 댓글