강의

멘토링

로드맵

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của hoo788
hoo788

câu hỏi đã được viết

Nguyên tắc cốt lõi của Spring - Nâng cao

Sắp xếp

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

Đã giải quyết

Viết

·

419

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;
            }
        }
    }
디자인-패턴spring

Quiz

Các vấn đề chính nảy sinh khi mã chức năng phụ trợ như logging bị trộn lẫn với logic nghiệp vụ cốt lõi là gì?

Thiếu tái sử dụng code

Khó hiểu logic cốt lõi

Khó khăn thêm/thay đổi tính năng bổ sung

Liên kết chặt chẽ giữa các đối tượng

Câu trả lời 1

0

hoo788님의 프로필 이미지
hoo788
Người đặt câu hỏi

자답입니다.

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

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

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

câu hỏi đã được viết

Đặt câu hỏi