24.01.28

서린·2024년 1월 28일

혼자개발

목록 보기
31/82

api 속도를 측정해보기 위한 방법을 서칭하다가
코드를 사용하는 방법이 있어서
클래스를 생성해봤다

package com.project.api;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ApiResponseTimeMeasurement {

    public static void main(String[] args) {
        log.info("main 메서드 시작");
        // 측정하려는 API
        String apiUrl = "http://localhost:8080/api/mountain-info";

        try {
            measureApiResponseTime(apiUrl);
        } catch (Exception e) {
            log.error("에러 발생: " + e.getMessage());
            e.printStackTrace();
        }
    }

    private static void measureApiResponseTime(String apiUrl) throws Exception {
        // API 요청 전에 현재 시간 기록
        long startTime = System.currentTimeMillis();

        // API에 GET 요청 보내기
        URL url = new URL(apiUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");

        // API 응답 코드 확인
        int responseCode = connection.getResponseCode();
        log.info("#### HTTP 상태 코드: " + responseCode);

        // API 응답 내용 읽기 (옵션)
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        StringBuilder responseContent = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            responseContent.append(line);
        }
        reader.close();

        // API 응답 후에 현재 시간 기록
        long endTime = System.currentTimeMillis();

        // 응답 시간 계산 (밀리초 단위)
        long responseTime = endTime - startTime;
        log.info("#### 응답 시간: " + responseTime + " 밀리초");

        // API 응답 내용 출력 (옵션)
        // log.info("응답 내용: " + responseContent.toString());

        // 연결 종료
        connection.disconnect();
    }
}

++ currentTimeMillis는 성능 측정을 위한 코드의 수행 시간을 기록하기에는 적합하지 않을 수 있다고 한다
wall-clock time이기 때문에 다른 작업의 영향을 받거나 시스템의 시간을 변경하는 경우 등 측정 결과에 영향을 줄 수 있는 요소들이 있기 때문이다
따라서 날짜와 관련한 계산을 위해 사용하는 것이 더 적합하며, 코드의 수행 시간 측정은 nanoTime를 사용하는 것이 더 정확하므로 위 코드를 수정했다!


이때 발생한 에러

/favicon.ico가 뭔지 검색해보니
favorites icon의 약자로 웹페이지나 웹사이트를 대표하는 아이콘 이라고 한다.

웹 브라우저는 페이지를 요청할 때 자동으로 favicon을 요청하는데, 이때 favicon이 존재하지 않으면 위와 같은 에러가 난다고 한다

해결 방법은?
프로젝트의 src/main/resources/static 폴더에 favicon.ico 파일을 추가하면 된다
(이 위치는 Spring이 정적 자원을 기본적으로 찾는 경로 중 하나이다)
favicon.ico 파일을 생성 해주니 에러가 해결됐다

그 다음
ApiResponseTimeMeasurement를 실행 시켰는데 로그가 console에 찍히지 않았다..

log에 대한 설정이 잘 되어있나 찾아봤다
logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">

    <!-- Appenders -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%d %5p [%c] %m%n</Pattern>
        </encoder>
    </appender>

    <!-- Logger -->
    <logger name="com.project" level="DEBUG" appender-ref="console" />

    <!-- Root Logger -->
    <root level="info">
        <appender-ref ref="console" />
    </root>
</configuration>

logback의 로그 level이나 root에 대한 설정도 잘 되어있고
초기에 lombok 설정도 해놓아서 따로 gradle에 의존성 추가를 하지 않아도 되는 상태였다

package com.project.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogTest {

	private static final Logger log = LoggerFactory.getLogger(LogTest.class);

    public static void main(String[] args) {
        log.info("---------- Log 테스트 ---------");
    }
}

로그 찍기 테스트를 만들어서 실행해봐도 로그는 찍히지 않는다

0개의 댓글