오늘 운영 DB에서 사용한 조회 쿼리 때문에 특정 시간에 DB 서버 CPU 사용률이 급격하게 올라간 일이 있었다. 결론부터 얘기하면 DATE 타입 컬럼 값을 비교할 때 썼던 Literal이 문제였다. 특정일시 이후의 데이터를 조회하고 싶어서 DATE컬럼 >= TIMESTAMP '2023-08-08 12:00' 이런 식으로 조건절을 넣었는데 이 부분이 문제가 됐던 것이다. 우선 DATE컬럼 >= SYSDATE - 1/24 이런 식으로 비교하라고 안내를 받았는데 더 좋은 방법이 없을까.. 더미 데이터를 생성해서 재현해봐야겠다.
Jenkins 설치, Agent 구성, Github 연동 문제 해결 Oracle Cloud(OS는 Oracle Linux)에서 Jenkins 설치, 구성 중 생긴 문제들과 문제 해결 과정을 기록한다. 설치한 Jenkins 버전은 2.387.3 이다. 우선 sudo yum install jenkins 명령어로 Jenkins를 설치한다. 설치가 완료되고 sudo service jenkins start 명령어로 Jenkins 서비스를 시작하려고 하니 프로세스는 실행되는데 정상적인 상태가 아닌 거 같다. 실행 결과에 Failed 라는 문구와 함께 Job for jenkins.service failed because a timeout was exceeded 라는 메시지가 뜬다. journalctl -xe 명령어로..
Spring Security의 Crypto 모듈은 대칭키 암호화와 키 생성, 패스워드 인코딩 기능을 제공합니다. 그 중 대칭키 암호화에 관한 인터페이스인 BytesEncryptor와 TextEncryptor를 소개합니다. BytesEncryptor BytesEncryptor를 사용하면 인코딩한 결과물의 형식이 byte[]가 됩니다. org.springframework.security.crypto.encrypt.Encryptors 클래스에는 BytesEncryptor구현체의 인스턴스를 생성하는 두 가지 메서드가 정의되어 있습니다. static BytesEncryptor stronger(java.lang.CharSequence password, java.lang.CharSequence salt) static..
JavaMailSender로 메일 보내기 스프링은 유용한 메일 전송 API를 제공합니다. org.springframework.mail 패키지 아래에 있는 API 중 JavaMailSender를 이용해 메일 전송하는 방법을 소개합니다. 우선 다음과 같은 의존성이 포함되어 있어야 합니다. org.springframework spring-context-support 5.3.19 com.sun.mail jakarta.mail 1.6.7 Spring 5 버전대에선 Jakarta Mail의 네임스페이스가 javax.mail 이기 때문에 Jakarta Mail은 2 버전대가 아니라 1.6 버전대를 이용합니다. 다음으로 프로퍼티 파일입니다. mail.smtp.host=smtp.naver.com mail.smtp.por..
마이크로서비스 패턴 / Chris Richardson (2020). Microservices Patterns (이일웅, 역). 길벗. (원본 출판 2018년)의 내용 중 일부를 정리해봤습니다. 모놀리식과 MSA 모놀리식 아키텍처 패턴은 애플리케이션을 하나의 배포단위로 구성하지만 마이크로서비스 아키텍처 패턴은 독립적으로 배포 가능하면서 자체 DB를 보유한 서비스로 시스템을 분해합니다. 서비스 디스커버리 서비스 인스턴스의 네트워크 위치나 상태가 여러 가지 사유로 달라질 수 있기 때문에 서비스 디스커버리를 사용합니다. 애플리케이션 수준의 서비스 디스커버리 패턴 서비스 클라이언트와 서비스 인스턴스 사이에 이들을 매개하는 서비스 레지스트리가 있습니다. 서비스 인스턴스는 자기 자신을 서비스 레지스트리에 등록하며, ..
enum의 필드를 Map타입 List로 변환하는 방법을 소개합니다. 제네릭 메서드와 함수형 인터페이스를 이용합니다. package io.hurem.model; public interface EnumModel { String getKey(); String getValue(); } enum에서 구현할 인터페이스. getKey()는 enum 필드의 이름을, getValue()는 단일 프로퍼티를 가져온다. package io.hurem.domain.employees; import io.hurem.model.EnumModel; import java.util.Collections; import java.util.Map; import java.util.Optional; import java.util.function...
RESTful Web API - 웹 API를 위한 모범 전략 가이드(원제 RESTful Web APIs)의 내용을 정리해봤습니다. 표준의 종류 명목 표준 < 개인 표준 / 기업 표준 < 개방형 표준 < RFC 명목 표준 명목 표준은 행동 양식이다. 구글 API, 페이스북 API 등이 해당한다. 문서화는 할 수 있지만 다른 사람도 동일한 방식으로 해야한다는 표준의 핵심 가정이 빠져있다. 이 설계에 맞춘 작업을 하려면 이 설계를 이해해야 한다. 명목 표준을 재사용하는 것은 API가 표준을 따른다고 하지 않고 복제본이라고 부른다. HATEOAS Hypermedia as the Engine of Application State란 하이퍼미디어 제약 조건이다. 용어에서 말하는 애플리케이션 상태란 클라이언트가 현재 ..
이 문서는 Java 8 기준으로 작성되었습니다. 추상클래스와 인터페이스는 비슷하다. 객체를 만들 수 없다는 점과 둘 다 메서드를 선언만 할지 아니면 구현도 할지 선택할 수 있다는 점이 같다. 하지만 추상 클래스와 달리 인터페이스는 모든 필드가 키워드를 안 붙여도 자동으로 public static final 이 되며 모든 메서드가 public 으로 선언되거나 정의되어야 한다. 그렇다면 추상 클래스와 인터페이스는 어떤 상황에 사용할까? 이럴 때 추상클래스를 사용한다. 관련성이 높은 클래스들간에 코드 공유를 하고 싶을 때 상속할 공통 메서드와 필드가 많거나 접근 제어자로 public 이외의(protected 또는 private 같은) 것을 사용하고 싶을 때 static 이나 final 이 아닌 필드를 선언하고..