728x90

재직중인 회사에서 옆 동료가 레거시를 수정하는 중에  도움을 요청하였다..

대략적인 문제는 특정 엔드포인트 호출시 내부 로직을 보니 같은 쿼리를 키값 만큼 루프를 돌며 쿼리를 호출하는데 해당 쿼리가 0.5초나 걸려 루프사이즈가 커질 수록 점점 느려지는 문제가 있는것을 확인했다 나를 포함한 옆 동료분들도 직접 작업을 한게 아니라서 왜 이렇게 만들었는지는 알수가 없다..

 

 

해당 문제를 해결하기 위해 data Grip 에 일단 쿼리를 실행해 보았다.

 

위 이미지는 문제로 보이는 쿼리를 실행계획으로 돌려본 결과값이다.

제일 상단에 나오는 부분이 문제가 있는 듯하다.

rows에 나오는게 가장 많은데다가

possible key에는 분명히 가능하지만 실제 key에는 인덱스가 타지 않는다.

 

타지 않는 인덱스를 보니 boolean 필드이다.

아래는 스택오버플로우

https://stackoverflow.com/questions/10524651/is-there-any-performance-gain-in-indexing-a-boolean-field

 

Is there any performance gain in indexing a boolean field?

I'm just about to write a query that includes a WHERE isok=1. As the name implies, isok is a boolean field (actually a TINYINT(1) UNSIGNED that is set to 0 or 1 as needed). Is there any performanc...

stackoverflow.com

설명하자면 boolean 필드에 값이 너무 많다면 인덱스를 사용하지 않는다고 한다..

항상 일을 하고 있지만 항상 배우게 된다..

728x90
728x90

신규 리소스를 배포가 제대로 이루어지지 않아 확인을 해보니 배포 후? 빌드를 하는 중에 디비가 연결이 되지 않아 끊기는 문제가 생겼다.

해당 리소스 ec2 에서 핑 테스트를 해보니 아래와 같은 에러가 발생하였다.

Unable to execute HTTP request: Network is unreachable

혹시나 하여 핑을 구글에 날려보아도 먹통이다..

내가 알아보고 확인한 결과 총 5가지 문제중 하나로 인해 나오지 않을까 싶어 해당 케이스 를 정리해보았다.

 

1. 네트워크 연결 문제: 이 오류는 네트워크 연결에 문제가 있는 경우 발생할 수 있습니다. 예를 들어 컴퓨터나 서버가 인터넷에 연결할 수 없으면 AWS EC2 엔드포인트와 통신할 수 없습니다.

  • 내 로컬에서는 이상이 없음으로 위 문제는 아니다.

 

2.  보안 그룹 설정: EC2 인스턴스와 연결된 보안 그룹이 올바르게 구성되지 않은 경우 인스턴스가 다른 리소스와 통신하지 못할 수 있습니다. 보안 그룹이 적절한 IP 주소 및 포트의 트래픽을 허용하는지 확인하십시오.

  • 혹시나 변경된 정보가 있는지 aws 콘솔 로 들어가 확인 해 보아도 변경사항이 없었다.

 

3. 라우팅 테이블 설정: VPC와 연결된 라우팅 테이블이 올바르게 구성되지 않은 경우 인스턴스가 다른 리소스와 통신하지 못할 수 있습니다. 라우팅 테이블이 트래픽을 올바른 대상으로 라우팅하도록 구성되어 있는지 확인하십시오.

  • 라우팅 테이블 또한 확인하고 최근에 변경 사항이 없어서 문제가 없었다.

 

4. 방화벽 설정: 컴퓨터나 서버에서 방화벽을 활성화한 경우 방화벽이 AWS EC2 엔드포인트에 대한 트래픽을 차단할 수 있습니다. 방화벽이 적절한 IP 주소 및 포트에 대한 트래픽을 허용하는지 확인하십시오.

  • 방화벽 그룹 또한 변경사항이 없어서 문제가 아닌듯 보인다.

5. AWS 서비스 문제: 드물지만 AWS 서비스 자체의 문제로 인해 이 오류가 발생할 수 있습니다. AWS 상태 페이지를 확인하여 EC2 또는 기타 서비스에 진행 중인 문제가 있는지 확인하십시오.

  • 위 4가지 문제가 아니기 때문에 의심 스러운 부분은 여기 뿐인듯하다.

 

내가 전문가는 아니기 떄문에  일단  해당 ec2 를 중단 및 재시작을 하는 방향으로 시도해보았다.(해당 ec2는 개발 서버 였기에)

 

재 시작을 통해 빠르게 복구 될 줄알 았지만 이번엔 재시작 이후 cpu 점유율이 미친듯이 오르는 문제에 부딪쳤다..

아래는 점유율이 오르는 문제를 해결하기 위해 참고한  블로그 사이트 이다. 

https://nan-sso-gong.tistory.com/32

 

[AWS] EC2 인스턴스 CPU사용량 100% 오류(크래딧 문제 아님)

본 포스팅은 AWS EC2머신을 사용하던중 cpu사용량이 100퍼센트에 육박하면서 ssh연결등이 모두 끊기는 상황에 대해서 말하고자 합니다. ++하단에 추가내용 기술합니다 오류라고 한 것은 어제, 그리

nan-sso-gong.tistory.com

 

결론 부터 말하면 완전 중단 후 텀을 두고 재 시작을 하니 죽어도 내려가지 않던 CPU 점유율이 점진적으로 줄어 들었다..

위 참조 블로거를 보시면 스택오버 플로우에도 나와 같은 거지같은 상황을 맞이한 사람들이 있는데 이사람들 또한 크레딧 문제가 아니라는 생각에 모두 stop and start(역시 말 안들을떄는 재부팅이 최고..)

를 가장 많이 투표되었다.

 

일을 굉장히 짧게 한건 아니지만 항상 새롭다..

 

728x90
728x90

얼마전 회사에서 exception처리되는 메세지들이 오는 채널에 아무것도 오지 않는 이상한 일이 발생하였다. 

오류는 아래와 같다.

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

 

위와 같은 에러가 발생을 하였는데 내용을 보니  SSL 인증 관련 에러 발생으로 인해 슬랙 webhook 에러 이다.

아래는 에러 해결을 위한 참고 자료 이다.

https://www.skyer9.pe.kr/wordpress/?p=7544

 

unable to find valid certification path to requested target – 상구리의 기술 블로그

unable to find valid certification path to requested target https 통신을 하는 상황에서 인증서가 없다거나, 사실인증서로 인증되고 있는 경우, 또는 정상적인 인증서라고 해도 JDK 에 포함되어 있지 않는 인증

www.skyer9.pe.kr

간단하게 해결 방법을 기술하자면  JDK 버전이 낮아서 나온문제이다. 현재 레거시 프로젝트 들은 1.8.0_66 을 사용중인데 워낙 낮은 버전이다 보니 기존 자바 버전들을 모두 사이드 이펙트 없는 수준까지는 해당 리소스 ec2 들마다 직접 자바를 설치하고 진행 하였다.

 

역시 버전관리는 주기적으로 꼭 해줘야한다..

728x90
728x90

회사에서 db를 직접 핸들링 하여 조회 삭제 를  하는 중에  아래와 같은 오류가 발생하였다.

 

구글링을 해보니 테이블이 깨진것이기 떄문에 콘솔창에서 직접 복구를 해야한다고 나온다.

check table product_images; -- 테이블 조회
analyze table product_images; -- 테이블 분석
repair table product_images;  -- 테이블 복원

테이블을 체크 결과 아래와 같은 에러를 확인하였다.

Wrong bytesec: 0-0-0 at linkstart: 3650572 Corrupt 에러가 있는것을 확인하였다

 

아래는 에러 참고 링크
https://dba.stackexchange.com/questions/68187/mysql-wrong-bytesec-0-0-0-at-linkstart-0

 

mysql Wrong bytesec: 0-0-0 at linkstart: 0

I have several MySQL (MyISAM) tables that have been corrupted. Running CHECK TABLE mytable returns: > +-----------------+-------+----------+----------------------------------- | > clldata.m...

dba.stackexchange.com

 

에러라는게 어디서든 발생하지만 해결방안이 생각보다는 간단해서 다행이다.

728x90

'코드 > dev' 카테고리의 다른 글

ec2 네트워크 연결 되지 않는 오류  (2) 2023.11.22
jenkins slack webhook 에러  (2) 2023.11.22
java dateTime 타임존  (2) 2023.11.22
Junit test filtering  (2) 2023.11.17
비동기처리 시 Spring security 문제  (0) 2023.11.16
728x90

일을 하다보면 늘 시간과 관련하여 파싱 혹은 생성할 일이 많다.

자바에서 날짜 혹은 시간을 사용하는 방법을 간략하게나마 정리하기 위해 작성을 하였다.

 

타임존

타임존은 동일한 로컬 시간을 따르는 지역을 의미한다.
보통 구각별로 고유 타임존을 사용하며, 면적이 넓은 나라는 지역 별로 다른 타임존을 사용한다.

 

타임존의 종류 

  • GMT(GreenWich Mean Time)
한국의 타임존은 보통 GMT +09:00으로 표현된다. 영국 그리니치 천문대 기준으로 하는 태양 시간.
  • UTC
지구 자전 주기의 흐름이 늦어지고 있는 문제를 해결한 시간. GMT를 대체하기 위한 새로운 표준. GMT와 아주 미세한 차이인데, 소프트웨어에서 사용할 때는 UTC가 더 정확한 표현이다.
  • Offset
UTC+09:00에서 +09:00의 의미는 UTC 기준 시간보다 9시간 빠르다는 의미이다. 즉, UTC 12시이면, 한국시간으로 9시라는 것이다. 이처럼, UTC와의 차이를 나타낸 것을 Offset이라고 한다.
보통 국가나 지역마다 자신이 사용하는 타임존에 대해 고유 이름을 부여한다. 대한민국의 타임존은 KST(Korea Standard Time)이라고 부른다. KST = UTC+09:00 이라고 이해하면 쉽다.
한 지역의 타임존은 하나 이상의 오프셋을 갖는다. 해당 지역의 정치/경제적 상황에 따라 계속해서 달라질 수 있다.
  • ISO 8610
날짜와 시간 관련된 데이터 교환을 다루는 국제 표준. 국제 표준화 기구(ISO)에 의해 공포되었고, 1988에 처음으로 공개되었다.

 

ex) 2021-07-19T17:40:00+09:00

위 시간을 해석해 보면

  1. Z or +00:00 : UTC 기준시를 나태내는 표시
  2. T : 날짜 뒤에 시간이 오는 것을 표시해주는 문자
  3. 시간(17:40:00) : 시:분:초 형태. 언어에 따라 초 뒤에 소수점 형태로 milliseconds가 표시되기도 한다.
  4. Timezone Offset : 시간 뒤에 +/-시간:분 형태 나타냄
  5. Z or +00:00 : UTC 기준시를 나태내는 표시
// 로컬 시간
2021-07-19T17:40:00.000

*//UTC(GMT)*

2021-07-19T17:40:00.000Z

*//로컬 시간을 의미하면서 UTC(GMT) 대비 +09:00 임을 의미*

2021-07-19T17:40:00.000+09:00

 

java1.8 이전 date

java.util패키지에 Date 클래스가 존재한다. JDK1.0부터 제공되어온 클래스이다. JDK1.1에서는 Calendar 클래스도 나왔다. Calendar 추가 후 Date의 대부분이 deprecated 됐다.

형식화 클래스
java.text 패키지에 포함되어 있으며, 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있다. 객체지향적 설계하여 표준화했다.

 

1.8 이전 가장 자주쓰던 SimpleDateFormat  아래와 같다. 

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

 

 

1.8 이후 Java.time 패키지

기존 java에 있던 Date, Calendar 클래스의 단점을 해소하기 위해 JDK1.8부터 java.time 패키지가 추가되었다.

java.time : 날짜와 시간을 다루는데 필요한 핵심 클래스들을 제공
java.time.chrono : 표준(ISO)이 아닌 달력 시스템을 위한 클래스들을 제공
java.time.format : 날짜와 시간을 파싱하고, 형식화하기 위한 클래스들을 제공
java.time.temporal : 날짜와 시간의 필드(field)와 단위(unit)를 위한 클래스들을 제공
java.time.zone : 시간대(time-zone)와 관련된 클래스들을 제공


가장 큰 특징은 String 클래스처럼 불변(Immutable) 하다는 것. 그래서 항상 새로운 객체를 반환한다.

 

 

핵심 클래스

  • LocalDateTime
Zone구분 없이 Local 시간을 표시

시간표현 - LocalTime class

날짜표현 - LocalDate class

둘다 표현 시, LocalDateTime을 사용
  • ZondDateTime
Zone을 구분하는 시간을 나타낸다. 2021-07-19T17:40:00.000++09:00[Asia/Seoul]

LocalDateTime + 시간대 : ZonedDateTime 클래스
ZoneId zoneId = ZoneId.of("Asia/Seoul");
//ZoneId zoneId = ZoneId.of("America/New_York");
ZonedDateTime zoneDateTime = dateTime.atZone(zoneId);
System.out.println(zoneDateTime); // 2021-07-19T17:40:00.000+09:00[Asia/Seoul]
  • ZoneOffset
UTC로부터 얼만큼 떨어져있는지 ZoneOffset으로 표현한다. 서울은 +9, 미국 뉴욕은 -4이다.
ZoneOffset krOffset = ZonedDateTime.now().getOffset();
int krOffsetInSec = KrOffset.get(ChronoField.OFFSET_SECONDS); // 32400
  • OffsetDateTime
ZonedDateTime은 ZoneId로 구역을 표현하지만, ZoneOffset을 사용하는 것은 OffsetDateTime이다. ZoneId는 일광절약시간 같은 시간대 관련 규칙을 포함하지만 ZoneOffset은 시간의 차이로만 구분한다. 그래서 컴퓨터 통신 간에는 계절별로 시간을 뺏다 더했다 하는 것 보다 안전한 OffsetDateTime을 이용한다.
  • Parsing & Format
java.time.format 패키지에 들어있는 DateTimeFormatter와 parse 메서드를 사용한다.
//Date To String 
LocalDate localDate = LocalDate.of(2021, 7, 19);
String localDateString = DateTimeFormatter.ISO_LOCAL_DATE.format(localDate); // "2021-07-19"
String localDateString = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE); // "2021-07-19"
//String To Date
LocalDateTime localDateTime = LocalDateTime.parse("2021-07-19T00:00:00");

위 예시 말고도 날짜를 더하고 비교하는  여러가지가 더 있지만 이정도로 개념적인 정리는 될듯 하다.

 

 

728x90
728x90

재직중인 회사에 이전에 작업된 부분중에 테스트 필터링이 적용되어 있는 부분을 확인하였다. 이 부분에 대하여 공부 겸 정리를 할려고한다.

 

Tag annotation

공식문서의 설명은 이렇다.

Tags are a JUnit Platform concept for marking and filtering tests. The programming model for adding tags to containers and tests is defined by the testing framework. For example, in JUnit Jupiter based tests, the @Tag annotation (see Tagging and Filtering ) should be used.

즉, Tag 어노테이션의 목적은 테스트에 어떤 테스트인지 표기하는 동시에 필터링하는 것입니다.

 

Tag 어노테이션 사용 사례

 

아래는 여러개를 동시에 적용

 

Filtering

가끔 테스트를 하다보면 
특정 테스트만 실행하고 싶은 경우
가 있습니다. 특정 feature에 대해서만 테스트를 하고 싶다거나, 시간이 오래걸리는 통합 테스트는 제외시키고 테스트하고 싶다거나 말이죠. 이런 경우에 필터링해서 실행시킬 수 있습니다. 이를 위해서는 gradle 수정이 필요합니다.

 

위의 task 안에 inclueTag와 excludeTag 값을 통해 설정할 수 있습니다.

예시같이 설정한 경우, unit Tag 가 들어가면서 bar Tag 가 들어가지 않은 경우의 테스트를 수행하게 됩니다.

하지만 위와 같이 적용 시 gradle 설정에만 의존하여 테스트를 구성해야함

*// build.gradle*

*// `gradle test`: integration tag가 붙은 테스트는 제외*

tasks.named('test') {
    useJUnitPlatform {
        excludeTags 'integration'
    }
}

*// `gradle integrationTest`: integration tag가 붙은 테스트만 수행*

task integrationTest(type: Test) {
    useJUnitPlatform {
        includeTags 'integration'
    }
}

 

이를 탈피하기 위해 위와 같이 적용 가능

위의 설정을 풀어보자면

  • integration tag가 붙지 않은 테스트 실행: gradle test
  • integration tag가 붙은 테스트 실행: gradle integrationTest

사용하면서 느낀 점은 꼭 필요할때 써야하는데 불필요하게 붙는 경우가 많은 것 같다(테스트 코드를 제외시킬거라면 굳이 작성할 필요가 있을까..)

나의 경우에는 필요하지 않다 판단되면 disabled처리를 이용하는 편이다.

728x90

+ Recent posts