하늘은언제나나의편
2025년 3월 20일 목요일
csv load 2.5
csv 파일 처리
2025년 3월 14일 금요일
Grinder jython 2
class RequestBuilder:
def __init__(self, grinder_request, logger):
self.grinder_request = grinder_request
self.logger = logger
self.base_url = ""
self.request_url = ""
self.port = 80
self.parameters = {}
self.cookies = {}
def set_base_url(self, base_url):
self.base_url = base_url
return self
def set_request_url(self, request_url):
self.request_url = request_url
return self
def set_port(self, port):
self.port = port
return self
def set_parameters(self, params):
self.parameters.update(params)
return self
def set_cookies(self, cookies):
self.cookies.update(cookies)
return self
def build_full_url(self, overrides={}):
# 호출 시 덮어쓸 속성 가져오기
active_port = overrides.get("port", self.port)
active_parameters = overrides.get("parameters", self.parameters)
param_string = "&".join([f"{k}={v}" for k, v in active_parameters.items()])
return f"{self.base_url}:{active_port}{self.request_url}?{param_string}"
def execute_get(self, overrides={}):
# 동적으로 속성을 덮어쓴 URL 생성
full_url = self.build_full_url(overrides)
self.logger.info(f"GET 요청 URL: {full_url}")
# GET 요청 실행
response = self.grinder_request.GET(full_url)
self.logger.info(f"GET 응답: {response.text}")
return response
from net.grinder.script.Grinder import grinder
from net.grinder.plugin.http import HTTPRequest
from common_module import RequestBuilder
# nGrinder의 HTTP Request 객체 생성
http_request = HTTPRequest()
# Logger 객체 생성
logger = grinder.logger
# RequestBuilder 인스턴스 생성
builder = RequestBuilder(http_request, logger)
builder.set_base_url("http://example.com") \
.set_request_url("/api/test") \
.set_port(8080) \
.set_parameters({"key1": "value1", "key2": "value2"}) \
.set_cookies({"SESSION": "abc123"})
# 기본 속성으로 GET 요청 실행
get_response = builder.execute_get()
print(f"GET Response: {get_response.text}")
# 덮어쓰기 속성으로 GET 요청 실행
overrides = {
"port": 9090,
"parameters": {"key3": "value3", "key4": "value4"}
}
get_response_with_overrides = builder.execute_get(overrides)
print(f"GET Response with Overrides: {get_response_with_overrides.text}")
grinder jython
class RequestBuilder:
def __init__(self, grinder_request, logger):
self.grinder_request = grinder_request # nGrinder의 HTTPRequest 객체
self.logger = logger # nGrinder의 Logger 객체
self.base_url = ""
self.request_url = ""
self.port = 80
self.parameters = {}
self.cookies = {}
def set_base_url(self, base_url):
self.base_url = base_url
return self
def set_request_url(self, request_url):
self.request_url = request_url
return self
def set_port(self, port):
self.port = port
return self
def set_parameters(self, params):
self.parameters.update(params)
return self
def set_cookies(self, cookies):
self.cookies.update(cookies)
return self
def build_full_url(self):
param_string = "&".join([f"{k}={v}" for k, v in self.parameters.items()])
return f"{self.base_url}:{self.port}{self.request_url}?{param_string}"
def execute_get(self):
full_url = self.build_full_url()
self.logger.info(f"GET 요청 URL: {full_url}") # 로그 추가
response = self.grinder_request.GET(full_url)
self.logger.info(f"GET 응답: {response.text}") # 응답 로그 기록
return response
def execute_post(self):
full_url = f"{self.base_url}:{self.port}{self.request_url}"
self.logger.info(f"POST 요청 URL: {full_url}") # 로그 추가
self.logger.info(f"POST 요청 데이터: {self.parameters}") # 요청 데이터 로그
response = self.grinder_request.POST(full_url, self.parameters)
self.logger.info(f"POST 응답: {response.text}") # 응답 로그 기록
return response
from net.grinder.script.Grinder import grinder
from net.grinder.plugin.http import HTTPRequest
from common_module import RequestBuilder
# nGrinder의 HTTP Request 객체 생성
http_request = HTTPRequest()
# Logger 객체 생성
logger = grinder.logger
# RequestBuilder 인스턴스 생성
builder = RequestBuilder(http_request, logger)
builder.set_base_url("http://example.com") \
.set_request_url("/api/test") \
.set_port(8080) \
.set_parameters({"key1": "value1", "key2": "value2"}) \
.set_cookies({"SESSION": "abc123"})
# GET 요청 실행 및 로그 출력
get_response = builder.execute_get()
print(f"GET Response: {get_response.text}")
# POST 요청 실행 및 로그 출력
post_response = builder.execute_post()
print(f"POST Response: {post_response.text}")
2025년 3월 11일 화요일
sql formmater with mybatis
custom interceptor
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import com.github.vertical_blank.sqlformatter.SqlFormatter;
import java.sql.Connection;
import java.util.Map;
import java.util.Properties;
@Intercepts({
@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class SqlFormattingInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
// 원본 SQL 가져오기
String originalSql = statementHandler.getBoundSql().getSql();
Object parameterObject = statementHandler.getBoundSql().getParameterObject();
// SQL 포매팅 및 파라미터 처리
String formattedSql = formatSqlWithParameters(originalSql, parameterObject);
// 로그 출력
System.out.println("Formatted SQL:");
System.out.println(formattedSql);
return invocation.proceed();
}
private String formatSqlWithParameters(String sql, Object parameterObject) {
// SQL을 포매팅
String prettySql = SqlFormatter.format(sql);
// 파라미터 정보를 하단에 추가
StringBuilder parameterComments = new StringBuilder();
if (parameterObject instanceof Map) {
Map<String, Object> paramMap = (Map<String, Object>) parameterObject;
for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
String paramName = entry.getKey();
Object value = entry.getValue();
parameterComments.append("/* :")
.append(paramName)
.append(" = ")
.append(value)
.append(" */\n");
}
}
// 포매팅된 SQL과 파라미터 주석 결합
return prettySql + "\n" + parameterComments.toString();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 필요에 따라 설정 추가
}
}
Releases · vertical-blank/sql-formatter