728x90

Backend 150

URL 에 포함된 한글 파라미터 처리

아파치와 톰캣이 각각 별도로 구성되어 있는 환경에서 GET 요청을 처리하는 API를 만들었다. 파라미터로 한글을 받는데 이게 계속 깨져서 들어왔다. 결국 해결했는데 반나절을 꼬박 날려버려서 해결하는 과정에서 알게된 사실들을 기록한다. URL에 포함된 한글 파라미터는 반드시 인코딩을 할 필요는 없다. 기본적으로 인코딩 하지 않아도 http 프로토콜 내에서 자동으로 인코딩 된다. 명시적으로 인코딩이 필요한 경우는 공백이나 특수문자가 포함된 경우이다. 다만 인코딩을 해서 보내면 아파치에서 그걸 그대로 읽어들이지만 인코딩을 하지 않을 경우 한글을 바이트배열로 인코딩한다. 아무튼 이런 상황에서 톰캣의 server.xml 파일에는 Connector URIEncoding 이 UTF-8로 잘 되어 있었는데 컨트롤러에서..

SpringBoot 내장톰캣 JVM 메모리 default 값

일단 SpringBoot 환경에서 패키징 결과물로 생성된 jar 파일을 실행할 때 실행옵션을 주면 JVM 메모리를 설정할 수 있다. java -jar -Xms1024M -Xmx1024M app.jar 그 외 톰캣이 구동될 때 참조하는 CATALINA_OPTS, JAVA_OPTS 와 같은 환경변수에 -Xms1024M -Xmx1024M 를 지정해놔도 된다. 알다시피 Xms 는 초기힙사이즈, Xmx는 최대힙사이즈이다. 그렇다면 아무런 설정을 하지 않을 경우 메모리 기본 설정값은 어떻게 될까? 이는 jvm 의 설정을 그대로 따라가는데 물리메모리의 1/64를 초기 힙사이즈로 할당하고 1/4을 최대 힙사이즈로 할당한다. 만약 쿠버네티스 환경이라면 pod 이 배포되는 노드의 메모리를 위에서 말하는 물리메모리라고 보면..

Backend/Spring+Boot 2021.11.15

[Kotlin] 초기화 없이 속성을 선언하는 방법 lateinit

일단 lateinit 키워드의 의미는 해당 속성의 초기화를 미루겠다는 의미이다. 왜 미루는데? 자바를 기준으로 생각하면 초기화를 미루고 싶으면 일단 생성자에 포함하지 않으면 되자나? 그런데 그렇더라도 초기화가 안되진 않는다. 타입별 초기값으로 자동으로 초기화될 뿐..lateinit 는 아예 이런 초기화도 미룬다는 걸 의미한다. 이런 상황이 왜 필요한지 생각을 해보자. 생성자로 초기화를 강제하진 않지만 포함하고 싶은 속성이 있을 수 있다. 자바의 경우 클래스를 만들 때 아래와 같이 타입만 지정된 속성을 만들면 된다. String str; int i; 이 경우 지정된 기본값이나 null 이 할당된 채로 객체가 생성될 것이다. 즉, 객체 생성시 자동으로 초기화가 되기 때문에 클래스를 만들때는 딱히 지정하지 않..

Backend/Kotlin 2021.11.05

인덱스 스캔과 묵시적 형변환

oracle, mysql 모두 동일하니 여기에서는 mysql 을 기준으로 작성한다. 아래와 같은 테이블 있다고 가정해보자. CREATE TABLE TEST ( SEQ bigint(11) NOT NULL AUTO_INCREMENT, ID_INT int(10), ID_VARCHAR varchar(10), PRIMARY KEY (SEQ), KEY IDX_ID_INT (ID_INT), KEY IDX_ID_VARCHAR (ID_VARCHAR) ) 일반적으로 알고 있던 지식은 칼럼을 조건으로 조회할 때 해당 칼럼에 타입과 일치하는 값으로 조회을 해야 하고 그렇지 않으면 타입이 달라 인덱스 스캔이 되지 않는다는 것이었다. 맞는 말이긴 하지만 꼭 우리가 명시적으로 그렇게 해줄 필요는 없다. 만약 ID_INT 를 조건으..

Backend/Database 2021.10.20

Deployment 적용시 ORA-01882: timezone region not found

그동안 잘 적용되던 kubectl apply -f ... 로 잘 적용되던 Deployment 가 갑자기 아래 오류를 내뿜으로 커넥션을 생성하지 못했다. ORA-01882: timezone region not found 타임존 오류인거 같아 Deployment 에서 참조하는 ConfigMap 에 아래와 같이 타임존을 추가하니 문제가 해결되었다. apiVersion: v1 kind: ConfigMap metadata: name: ... data: SPRING_PROFILES_ACTIVE: "sandbox" SYS_LOG_MIN_LEVEL: "info" TZ: Asia/Seoul

ingress https 설정

일단 클러스터가 연결되어 kubectl 로 조작이 가능한 상황이어야 한다. 다운로드 받은 인증서로 secret 생성 일반적으로 tls 인증서 관련 압축파일을 다운로드 받아서 압축을 풀면 key 파일과 cert 파일이 있을 것이다. 그 경로로 이동해서 아래와 같은 명령어로 secret 을 생성한다. kubectl create secret tls ${secret_name} --key={tls_key_file_name} --cert=${tls_cert_file_name} -n ${namespace} Ingress 에 https 적용 metadata: annotations: nginx.ingress.kubernetes.io/force-ssl-redirect: "true" #http 로 접근하더라도 자동으로 ht..

AutoBoxing과 AutoUnBoxing

Java 1.5가 널리 쓰이던 시절 Java 개발자 면접에 유행처럼 쓰이던 질문이 오토박싱과 오토언박싱 이다. 지금은 너무도 당연해서 이 용어조차 모르고 지내고 있는데 갑자기 생각하려니 기억이 안나 미리 정리해 놓는다. Java에서는 기본타입에 매칭되는 Wrapper 클래스들이 존재한다. int는 Integer, boolean은 Boolean 같은 것들이다. 기본타입의 데이터를 Wrapper 에 넣는 것을 박싱 이라고 하고 반대를 언박싱이라고 한다. Java 1.5 이전에는 이러한 작업시 아래와 같이 명시적으로 변환을 해줘야 했다. Integer intWrapper = new Integer(1); int intValue = 1; int i = (int)intWrapper; Integer j = new I..

Backend/Java 2021.08.25

스키마와 유저. 그리고 데이터베이스

DBMS 를 다루다보면 스키마, 유저, 데이터베이스라는 명칭을 많이 들어봤을 것이다. 대부분 어떻게 표현해도 대충 알아듣고 커뮤니케이션에 큰 문제는 없지만 문서상나 글로 소통을 할 경우 명확한 표현이 필요한 경우가 있다. 그런데 이에 대한 명확한 의미를 알고 쓰는 개발자는 많지 않다. 딱히 중요하게 생각하지 않기도 하고 어떤 이는 스키마==유저라고 하는 사람도 있고 어떤 이는 전혀 다르다고 하는 사람도 있다. 그 이유는 가장 보편적으로 사용되는 Oracle과 Mysql 에서 그 의미가 다르게 사용되기 때문인데 정리하면 아래와 같다. Oracle 오라클에서 스키마는 사용자(USER)가 생성한 모든 오브젝트(테이블, 인덱스, 프로시저 등)를 의미한다. 사용자와 스키마는 전혀 다른 개념으로 스키마에 각각의 사..

Backend/Database 2021.08.19
728x90