전체 글

반응형

Stream anyMatch() vs filter.count > 0 성능 비교

개요

Java에서 스트림으로 작업할 때 조건자 or 기준과 일치하는 항목이 하나 이상 있는지 확인하는 로직을 작성할 때가 있습니다.
anyMatch()와 filter().count > 0 Stream API는 동일한 처리를 하지만 anyMatch()를 사용하는 것이 더 안전하고 성능상에 장점이 있는데 그 차이점에 대해 알아보고자 합니다.

차이점

가장 큰 차이점은 anyMatch()의 경우 Stream 요소에 일치하는 첫번째 항목이 존재하면, Stream을 중지하고 결과를 반환하게 됩니다.
반면에 count()의 경우는 모든 Stream 요소를 순회하고 그 결과인 count를 반환하게 됩니다.

Stream 요소가 작을 경우는 큰 차이가 없겠지만, Stream의 요소가 크면 클수록 성능상에 영향을 미칠 수 있습니다.

Code

일치하는 요소가 존재하면 Stream 종료
return component.getContents()
                .stream()
                .anyMatch(x -> "v1000".contains(x.getContentsCode())) ? "Y" : "N";
Contents Size까지 스트림 순회하고 count 반환
return component.getContents()
                .stream()
                .filter(x -> "v1000".contains(x.getContentsCode()))
                .count() > 0 ? "Y" : "N";
반응형
반응형

골프 단계별 동작을 작성해봅니다.

기억 나는대로.. 

올해 2월 말말부터Kim.Jay 프로님에게 레슨을 시작했습니다. 역시나 정말 어려운 운동이 내요.
골프를 처음 접 한건 8년 전인데, 그 당시는 회사 동호회로 입문해서 레슨도 안 받고 선배님들 따라 실전으로 필드 나가서 내 멋대로 휘두르던 시절이 그립기도 하네요.. 😂
제대로 배워보겠다고 마음먹고 시작한 지 2개월 차인데, 갈 길이 정말 멀게만 느껴지는군요.. 이래서 다들 평생 운동이라고 하나 봅니다.
골프 레슨받으면서 머릿속에 생각나는 동작을 정리해 봅니다.
맞고 틀리고의 문제가 아니라, 정말 어렵네요 ㅎㅎ

그립

왼손은 손가락 끝에서부터 그립을 말아서 잡는다는 생각으로 쥔다, 손바닥으로 잡는 것이 아니고.. 그리고 오른손으로 가볍게 새끼손가락을 서로 갈고리?? 어쨌든.. 엄지와 검지로 그립을 견고하게 잡는다.

어드레스

양발을 모으고 정면(타깃 방향)을 바라본다. 그리고 엉덩이를 툭 빼고 허리 편 상태로 살짝 구부린다.. 그리고 시선을 공의 뒤쪽을 째려볼 수 있도록 살짝 뒤쪽을 향하고 양발을 어깨너비만큼 벌린다. 무릎을 살짝 구부리고 양발에 체중이 실린다는 느낌으로 편안하게 서 있는다. 팔과 어깨에 힘을 빼고 툭툭 털어본다. 그립을 잡은 채로 양팔을 앞으로 살짝 뻗어서 다시 제자리에 놓아본다.. 겨드랑이가 불편하지 않아야 하니께..ㅋㅋ

테이크어웨이

왼손으로 팔을 드는 것이 아니라.. 그립을 잡고 있는 오른손 중지와 약지 사용하는지 체크(매번 왼팔에 힘이 잔뜩 들어간채로 왼팔로 들어올렸는데, 이렇게 되면 다운스윙시 클럽을 못던지고 잡고 있게 되고.. 팔에 힘 잔뜩...들어간다... 털어내기 위해 오른손 중지와 약지로 테이크어웨이를..)
양팔이 펴졌는지 체크
헤드가 오픈되지 않도록 살짝 아래를 향하는지 체크
테이크어웨이 후 왼쪽 골반이 뒤로 빠지고, 왼쪽 다리는 견고하게 잡았지 체크

백스윙

테이크어웨이 후 서서히 올라가는데 오른쪽 팔꿈치가 접혀진 상태까지 올라간다.
왼 손가락으로 쿠킹을 하며,
더 이상 못 올라갈 때 왼팔과 함께 그대로 들어 올린다.
팔의 위치는 삼각형이 만들어졌는지 체크
왼팔은 펴졌는지 체크

인아웃 스윙시 백스윙시 최대한 플랫하게 그대로 쭉들어올리는데 너무 과하지 않게..팔목이 그대로 펴졌는지 체크(요즘 배우는 중..)

다운 스윙

오른팔 팔꿈치가 그대로 중력에 의해 접힌 상태로 내려 먼저 내려오는지 체크
왼쪽 골반이 먼저 움직이면서 상체를 리드하는지 체크
왼쪽 팔이 접힘 상태로 왼발을 지나갈 때까지 유지했는지 체크
왼발이 축이되고 골반이 뒤로 돌아간다는 느낌으로 상체 로테이션을 진행하는지 체크
오른발이 접혔다 스프링처럼 펴지는데, 이때 오른발 엄지발가락 안쪽이 지면에 닿으면서 펴지는지 체크
몸은 그대로 있고 팔이 먼저 공을 빠져나가는지 체크
이때까지 양팔의 겨드랑이는 몸통에 붙인 상태로 그대로 펄러스루로
그리고 자연스럽게 오른팔과 왼팔이 펴지며 피니쉬 자세로

전체적인 동작에 대해서 그동안 KIM, Jay 프로님에게 배운 내용을 적어봤습니다.
5개월이 지난 지금 처음 그립을 잡았을때와는 정말 많은 발전이 있었네요 ㅎㅎㅎ

반응형
반응형
MongoDB find Query 예외

오늘은 MongoDB find query를 사용하면서 예상치 못한 예외에 직면했던 내용을 공유하려고 합니다.
먼저 Toy project 구성한 환경입니다.

  1. Spring Boot
  2. Webflux
  3. ReactiveMongodb
  4. Kotlin

The Probloem

Caused by: org.springframework.data.mongodb.UncategorizedMongoDbException: Query failed with error code 2 and error message 'Field 'locale' is invalid in: { locale: "order" }' on server localhost:27017; nested exception is com.mongodb.MongoQueryException: Query failed with error code 2 and error message 'Field 'locale' is invalid in: { locale: "order" }' on server localhost:27017

Order collection에서 locale field?? 제가 사용하는 field는 아닌데?? 정말이지.. 원인을 알 수가 없었고.. 너무 생뚱맞은 예외 메시지입니다. 원인은 바로... 아래 그림을 보시면.. Data Class에 MongoDB document를 선언했는데, 자동 완성 기능을 사용하다보니 바로.. 오타가 들어갔습니다.
Collection을 Collation으로 Collation는 MongoDB에서 데이터 정렬에 사용하는 예약어 입니다........
정말 어처구니없는 실수로... 2시간을 날려버린 거 같네요..

The Soultion

오타를 막기 위한 해결책 몇 가지 억지로 적어봅니다.

  1. 별칭 없이 작성하기..
    @Document("order")
    data class Order
  2. @Document 자체를 생략해도.. data class name을 가지고 Document 유추가 가능하기에.. 좀 억지 같네요..ㅎㅎ
    data class Order

그럼에도 가장 좋은 해결책은 오타가 발생하지 않도록 자동완성 사용 시 항상 주의를 기울이는 습관이 필요할 거 같습니다.

오늘은 오타로 인해 고생했던 내용을 공유하였습니다.

반응형
반응형
반응형
반응형
Google OTP 크롬 확장 프로그램

 

오늘은 구글 OTP를 스마트폰 대신 크롬 확장 브라우저로 설치하여 좀 더 편리하게 사용하는 방법에 대하여 작성해 보겠습니다.

요즘은 업무를 하면서 구글 OTP 앱을 스마트폰에 설치하여 인증이 필요한 시스템에 접속 할 때 사용하고 있습니다. 기존에 사용하던 SMS 인증보다는 한단계 덜 거치기 때문에 편리하다고 생각이 되지만, 그럼에도 매번 인증을 위해 스마트폰 앱을 켜고 번호를 확인해서 PC 화면에 입력하는 방식은 동일하죠??
매번 인증 시마다 스마트폰을 항상 소지해야 하고, 앱을 매번 켜야 하다 보니 여간 불편한 게 아니었죠.. 또 한번 로그인에서 끝이 아니라, 업무 중 자리 이동 등 상황에서 네트웍이 변경될 경우 재 로그인도 필요하고.. 🤦‍♂️

그리하여 스마트폰 앱 없이도 OTP 인증을 받을 수 있는 좀 더 편리한 방법이 없을까 고민을 하고 검색을 했더니.... 역시나 다들 같은 마음이었군요!!! 바로 크롬 확장 브라우저를 사용하는 방법이 있었습니다. 요즘 같은 시대에는 ChatGPT에게 조언을 구하면 친절하게 설명해주겠죠? 거짓 정보일 수도 있으니 너무 믿지는 마시구요😅
본론으로 돌아와 크롬 확장 프로그램 설치 방법을 공유합니다.

Google 확장 프로그램 설치

먼저, Authenticator 해당 경로로 이동해서 크롬 확장 프로그램을 설치합니다.

Authenticator 

 

인증 도구

인증 도구는 브라우저에서 2단계 인증 코드를 생성합니다.

chrome.google.com

Google OTP 인증 추가

설치 후 우측 상단의 펜 모양 or QR스캔의 아이콘을 클릭 합니다.

등록 방법은 QR코드와 키 입력이 있는데, 저의 경우는 QR코드로 등록하기때문에 미리 발급 받은 QR코드를 브라우저 화면에 노출시켰습니다. QR코드 스캔을 누르시고 발급 받은 QR코드를 스캔하시면 됩니다!

위 순서대로 등록하시면 구글OTP 앱과 같은 5자리의 숫자가 나오는 것을 확인하실 수 있습니다.

사용하실 때는 마우스로 숫자를 클릭하면 텍스트 복사가되서 쉽게 붙여넣기 하시면 됩니다.
오늘은 구글 OTP를 크롬 확장 프로그램에 설치하여 스마트폰 어플없이 사용하는 방법에 대하여 남겨봅니다.

감사합니다 😁

반응형
반응형
Kotlin Package Naming Rule 예외

file:///Users/jongpillee/workspace/kotlin-spring-data-mongo/src/main/kotlin/kotlin/mongo/SpringBootApplication.kt:1:1 Only the Kotlin standard library is allowed to use the 'kotlin' package

자바에서는 자바의 Package명 첫 Word를 Java로 시작해도 예외는 발생하지 않지만, Java와 달리 Kotlin에서는 kotlin이라는 Package name을 작성하게 될 경우 위와 같은 Exception이 발생합니다

The problem

위 Path에서 /src/main/kotlin/kotlin/ 이부분이 Exception이 발생합니다. 네이밍 작성 시 kotlin/ 다음 kotlin으로 사용을 할 수가 없다는 의미입니다.

Solution

해결 방법은 간단합니다. 아래와 같이 첫 패키지명으로 kotlin을 사용하지 않으면 됩니다. ㅎㅎㅎ
두 번째로 작성할 경우 이슈 없이 잘 동작합니다.

반응형

+ Recent posts

반응형