728x90

분류 전체보기 288

Mysql 이모지 저장하기

이모지 같은 문자들은 글자당 최대 4바이트의 사이즈가 필요한데 Mysql 의 utf8 문자셋의 경우 글자당 최대 3바이트까지만 지원한다. 이에 일부 ❤️ 같은 일부 이모지는 저장 가능하지만 🧜 같은 이모지는 아래와 같은 오류와 함께 저장이 되지 않는다. SQL Error: 1366, SQLState: HY000 Incorrect string value: '\xF0\x9F\xA7\x9C' for column ... 모든 이모지를 사용하려면 문자셋을 utf8mb4 로 변경해줄 필요가 있다. 참고로 utf8는 utf8mb4의 서브셋이기때문에 인코딩 타입이 utf8 -> utf8mb4 변경 되더라도 기존에 저장된 문자열이 깨지지는 않는다. 다만 문자 하나당 최대 바이트 수가 바뀌면서 문자열 칼럼에 인덱스가 걸려..

Backend/Database 2022.02.07

Coroutine timeout 설정

Coroutine 을 사용하는 이유는 병렬처리 또는 자원의 균일한 사용이다. 이런 면에서 timeout 은 필수로 필요한 설정이 된다. Coroutine 패키지에서 제공되는 withTimeout 함수를 사용하면 손쉽게 timeout 을 설정할 수 있는데 이걸 어떤 형태로 사용하느냐에 따라 동작이 전혀 달라지기 때문에 이를 기록해 놓는다. 결론부터 말하면 아래와 같은 형태로 사용하면 된다. runBlocking(Dispatchers.IO) { repeat(5){ launch { try{ withTimeout(3000) { if (it == 1) delayRoutine(it) else normalRoutine(it) } }catch (e: Exception){ println("$it ${e.message}"..

Backend/Kotlin 2022.02.04

[Kotlin] 코틀린에서 @QueryProjection 사용하기

Querydsl를 이용하는 경우 엔티티와 다른 반환 타입인 경우 Projections를 사용한다. Projections 를 적용하는 방법은 여러가지가 있는데 권장되는 방법은 @QueryProjection 어노테이션을 활용하는 것이다. 우선 https://findmypiece.tistory.com/287 와 같이 코틀린에서 JPA Entity 를 정의할 경우 일반 class 사용이 권장되지만 Projections 은 영속상태가 아니라 dirty checking 도 동작하지 않고 lazy loading도 어차피 지원하지 않기 때문에 data class 를 사용해도 무관하다. @QueryProjection 는 생성자에 지정할 수 있는데 코틀린에서는 이걸 사용하기가 좀 애매하다. 기본생성자를 별도 클래스로 만드..

Backend/Kotlin 2022.02.03

[Kotlin] JPA Entity. data class? class?

Spring 가이드에도 나와있듯이 JPA Entity 는 data class가 아닌 일반 class 를 사용하는 것이 권장된다. 사실 data class 를 Entity로 사용하더라도 몇가지만 주의하면 문제될 것은 없지만 일반 class 사용이 권장되는 이유는 data class 를 Entity 로 사용할 경우 data class 답게 사용하지 못하게 된다는 것에 있다. 코틀린이 data class 의 특징은 아래와 같다. equals(), hashCode(), toString(), copy() 메소드를 자동으로 만들어준다. copy() 메소드는 얕은복사만 지원하기 때문에 data class 는 불변 클래스로 사용하는 것이 권장된다. 순수하게 데이터만 관리하는 클래스인 만큼 open 키워드를 통한 상속을..

Backend/Kotlin 2022.02.03

kubectl panic: runtime error: index out of range .. with length .. [recovered]

Jenkins Job 에서 kubectl 을 사용하는데 위와 같은 에러가 났다. 신기한 것은 동일한 명령을 로컬에서 하면 잘 된다. 거의 반나절 삽질하다 찾은 원인을 공유한다. 결국 yaml 파일에 문제가 있었던 것인데 나는 ingress 부분이었다. ingress 정의시 spec.rules.host 항목 마지막에 공백이 포함되었던 게 문제였다. 예를 들어 에러가 났던 ingress yaml 파일은 아래와 같다. 그런데 로컬에서는 왜 잘 됐나? kubectl 버전에 따라 이를 trim 처리해서 잘 처리하는 버전이 있고 에러를 리턴하는 버전이 있는 것 같다. 문제 없이 처리되었던 로컬환경의 kubectl 버전을 보니 1.20.4 였고 Jenkins에서 사용하던 kubectl 버전은 1.21.1 이었다. 상..

[Jenkins] 젠킨스 스크립트 내에서 현재시간 값 사용하기

스크립트에서 현재시간을 활용할 일이 생겼다. 서칭해보니 스크립트 내에서 함수를 만들어서 구해오는 방법과 아예 잡 구성시 파라미터로 받는 방법이 있었다. 이 중 나는 빌드 스크립트에서 반복적으로 구할게 아니기 때문에 후자 방식을 사용했다. 우선 Date Parameter 플러그인 설치가 필요하다. 그리고 잡 생성시 대략 아래와 같이 설정해서 사용하면 된다. 그리고 빌드 스크립트 구성시에는 아래와 같이 사용하면 된다.(Scripted Pipeline 기준) def requestTime="${params.REQUEST_TIME}" https://uchupura.tistory.com/59 https://www.oofbird.me/75

카테고리 없음 2022.01.10

Jenkins 에서 갑자기 Job 생성이 안될 때

잘 사용하던 Jenkins 에서 위와 같은 메시지를 출력하며 신규 잡 생성이 안된다. 기존 잡 동작은 정상이다. Jenkins 관리 > System Log 로 이동해서 로그 화면을 열어 위에 명시된 Logging ID 로 조회해보니 아래와 같은 에러가 확인됐다. job 관련 디렉토리가 생성되었는데 이게 read-only 라는 거 같다. 응? 기존에는 잘 생성되었는데 왜 갑자기? 더 신기한 것은 젠킨스는 이외에도 많이 있고 모두 k8s 환경에 helm 으로 구축했다. 관련 yaml 파일을 확인해보니 딱히 다른 게 발견되지 않았다.. 그런데 실제 위 Jenkins 컨테이너에 접속해서 /var/jenkins_home/jobs 디렉토리에 mkdir 로 아무 디렉토리나 생성해보려고 했는데 진짜 아래와 같은 에러를..

Base/CI, CD 2022.01.10

JVM 실행 옵션 정리

레거시 코드를 분석하다보니 SpringBoot 로 구성된 자바 서버 구동시 몇가지 JVM 옵션을 지정하고 있어서 확인해봤다. 뭐든 확실하지 않은 건 안 쓰느니만 못하니까. 참고로 Tomcat 에서는 JVM 옵션을 JAVA_OPTS와 GC_OPTS 라는 환경변수 값으로 나눠서 지정하기 때문에 그 기준으로 작성하였다. 추가로 확인된 사항은 수시로 업데이트 할 예정. JAVA_OPTS: -server Server HotSpot JVM을 사용하는 옵션이다. Server HotSpot JVM은 Desktop용 Appkication을 구동하는데 유리하고, 최적화(Optimization)에 필요한 모든 과정을 최대한으로 수행한다. Application의 시작시간은 느리지만, 일정 시간이 흐르면 Client HotSp..

Backend/Java 2022.01.10
728x90