• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

템플릿 콜백 패턴 - OrderControllerV5에 제네릭이 잘 적용이 안됩니다

22.11.24 21:00 작성 조회수 277

0

템플릿 콜백 패턴으로 애플리케이션에 적용하는 부분에서 제네릭으로 타입 지정을 하고,

컨트롤러에서 String을 리턴 받도록 지정했는 데, 자꾸 결과는 Object가 리턴된다고 toString()을 하라고 하네요.

아래 이부분에서 call()함수를 String으로 리턴받도록 했으나 인텔리제이에서는 계속 Object가 리턴된다고 나옵니다

  •  

    @GetMapping("/v5/request")
        public String request(String itemId) {
            return template.execute("OrderControllerV5.request", new TraceCallback<>() {
                @Override
                public String call() {
                    orderService.orderItem(itemId);
                    return "ok";
                }
            });
        }

제가 빼먹은게 있을까요?

  • 문제 생긴 오더 컨트롤러 v5 코드

    package hello.advanced.app.v5;
    
    import hello.advanced.trace.callback.TraceCallback;
    import hello.advanced.trace.callback.TraceTemplate;
    import hello.advanced.trace.logtrace.LogTrace;
    import hello.advanced.trace.template.AbstractTemplate;
    import lombok.RequiredArgsConstructor;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class OrderControllerV5 {
        // template method pattern 적용
    
        private final OrderServiceV5 orderService;
        private final TraceTemplate template;
    
        public OrderControllerV5(OrderServiceV5 orderService, LogTrace trace) {
            this.orderService = orderService;
            this.template = new TraceTemplate(trace);
        }
    
        @GetMapping("/v5/request")
        public String request(String itemId) {
            return template.execute("OrderControllerV5.request", new TraceCallback<>() {
                @Override
                public String call() {
                    orderService.orderItem(itemId);
                    return "ok";
                }
            });
        }
    
    }
  • 트레이스 템플릿 코드

    package hello.advanced.trace.callback;
    
    import hello.advanced.trace.TraceStatus;
    import hello.advanced.trace.logtrace.LogTrace;
    
    public class TraceTemplate<T> {
    
        private final LogTrace trace;
    
        public TraceTemplate(LogTrace trace) {
            this.trace = trace;
        }
    
        public <T> T execute(String message, TraceCallback<T> callback) {
            TraceStatus status = null;
            try {
                status = trace.begin(message);
    
                // 로직 호츌
                T result = callback.call();
    
                trace.end(status);
    
                return result;
    
            } catch (Exception e) {
                trace.exception(status, e);
                throw e;
            }
        }
    }

답변 1

답변을 작성해보세요.

0

도도새님의 프로필

도도새

질문자

2022.11.24

자답입니다.

public class TraceTemplate<T> 에 제네릭 타입을 클래스 레벨로 설정해놓고

public <T> T execute(String message, TraceCallback<T> callback) 
여기 메서드 레벨에 또 메서드 시그니처 앞에 <T> 붙여서 제네릭 타입을 중복 지정해서 그런거 같습니다.

제네릭은 잘몰라서 원리는 모르겠지만 <T> 중복으로 선언하면 안되는 것 같습니다. 
위의 코드 중에 둘 중 하나에 빼면 돌아가더라구요