'전체 글'에 해당하는 글 2243건

Gradle Wrapper in IDEA

Tool/Gradle 2021. 10. 18. 22:14

Gradle 프로젝트 소스를 실행할 때, 로컬 컴퓨터에 프로젝트와 동일한 버전의 gradle 이 필요할 수 있는데 Wrapper 를 사용하면 해당 버전을 수동 설치할 필요가 없다. Gradle Wrapper 를 사용하면 지정된 버전의 gradle 이 없을 경우 자동으로 다운로드 및 설치를 하여, 해당 프로젝트를 동일한 gradle 버전으로 빌드할 수 있다. 구성원들의 안정적이고 표준화된 실행을 보장하기 위해 항상 Wrapper 로 빌드를 실행하는 것을 권장한다.

 

 

1. Wrapper 파일 생성

 

누군가 해당 소스를 받아서 Wrapper 를 사용할 수 있게 하려면, 미리 wrapper 파일을 생성해야 한다. 이 때는 gradle 이 로컬 컴퓨터에 설치되어 있어야 한다. 기본적으로 Gradle 프로젝트를 생성하는 init task 로 wrapper task 까지 실행된다. wrapper task 는 "Build Setup" 그룹에 존재하며, 이를 실행할 경우 프로젝트 디렉토리에 wrapper 파일을 생성해 준다.

 

$ gradle wrapper

gradle/wrapper/gradle-wrapper.jar
gradle/wrapper/gradle-wrapper.properties
gradlew(.bat)

 

  • jar 파일은 properties 파일에 기반하여 Gradle 배포판을 다운로드하는 코드가 포함된다.
  • gradlew 파일은 Wrapper 로 빌드를 실행하기 위한 스크립트이다.
  • properties 파일에는 gradle 버전과 배포판 타입을 선택할 수 있으며 기본적으로 사용중인 gradle 버전을 따른다.

 

명령줄에서 직접 버전과 배포판 타입을 지정하여 wrapper 파일을 생성할 수도 있고,

 

$ gradle wrapper --gradle-version 7.2 --distribution-type all

 

이미 민들어진 properties 파일을 수정하여 동일한 결과를 만들 수도 있다.

 

distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip

 

 

2. Wrapper 사용

 

$ gradlew build

 


 

※ IDEA 에서의 Gradle 설정

 

Wrapper 를 활용하는 가장 일반적인 방법은 프로젝트 생성하는 사람이 Wrapper 설정까지 마쳐놓고, 다른 개발자들이 IDEA 설정에서 wrapper 파일을 사용하도록 설정하는 것이다. 

 

 

간혹 수동으로 설치한 gradle 과 프로젝트 설정의 gradle 버전에 혼동을 느낄 수 있다. 로컬에서 프로젝트 gradle 버전 설정은 [File] - [Settings...] - [Build, Execution, Deployment] - [Build Tools] - [Gradle] 에서 설정한다. 그렇게 설정한 버전은 [View] - [Tool Windows] - [gradle] 창에서 사용된다.

 

 

하지만 [View] - [Tool Windows] - [Terminal] 에서의 gradle 은 수동 설치 후 로컬 컴퓨터의 환경 변수에 지정된 gradle 버전과 연결되어 있다. Terminal 에서 프로젝트 디렉토리 안에 있더라도 [Settings...] 에서 설정한 프로젝트의 gradle 버전과 연관이 없다. IDEA Terminal 이지만 CMD 와 같다.  [File] - [Settings...] - [Tools] - [Terminal] 에서 사용할 터미널 종류를 선택할 수 있다.

 

 


 

You can configure gradle wrapper to use distribution with sources. It will provide IDE with Gradle API/DSL documentation.

 

IDEA 에서 gradle-wrapper 사용시 배포판 타입이 바이너리 전용 파일을 사용하도록 설정되어 있는 경우 발생하는 알림이다. 수락하면 docs/source 를 포함한 all 버전의 gradle 로 설치되고 사용된다. (무시해도 상관없음)

 

 

Gradle 설치 파일의 배포판 타입(DistributionType).

 

  1. gradle-version-bin.zip (bin: 바이너리만)
  2. gradle-version-all.zip (all: docs, source 포함)

 

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

 

Windows Defender might be impacting your build and IDE performance. IntelliJ IDEA checked the following directories:

 

IntelliJ 실행시 간혹 보이는 알림이다. 바이러스 백신 프로그램에서 실시간 검색이 활성화되어 있는 경우, IDE 빌드시 새로 생성되는 파일들과 관련하여 여러 간섭을 하게 될 수 있고 그로 인해 빌드 성능에 영향을 미칠 수 있으니, 해당 IDE 프로세스(idea64.exe, fsnotifier64.exe, ...) 를 바이러스 실시간 검색에서 제외시키거나, IDE 관련 디렉토리들을 제외시키는 것을 권장하고 있다.

 

위 알림처럼 Windows Defender 알림이 발생했을 때, 자동 fix 시킨다면, 윈도우즈의 [바이러스 위협 방지] 에서 해당 디렉토리들을 자동으로 제외시킨다.

 

  • 프로젝트 작업 디렉토리
  • Gradle 캐시 디렉토리( %USERPROFILE%\.gradle)
  • IntelliJ IDEA 에서 설정 및 캐시 를 저장하는 데 사용하는 디렉토리
    - Configuration (idea.config.path): %APPDATA%\JetBrains\IntelliJIdea2020.3
    - System (idea.system.path): %LOCALAPPDATA%\JetBrains\IntelliJIdea2020.3

 

어떤 경우 위처럼 제외 설정을 마쳤는데도 계속해서 알림이 뜬다면, don't show me again 을 선택했는데도 계속해서 알림이 뜬다면 (idea.config.path)/options/other.xml 파일을 편집하여 해당  알림을 무시할 수도 있다.

 

<component name="PropertiesComponent"> 
    ...
    <property name="ignore.virus.scanning.warn.message" value="true" />
    ...
</component>

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

설악산 마등령

Daily/Hiking 2021. 10. 12. 23:07

2021. 10. 10.

 

며칠전부터 공룡능선을 노려보고 있었다. 공룡능선을 완주하고 나면 두려울게 없을 것 같았다. 이번 주말이 대체휴가로 휴일이 하루 더 붙어서 쉬기에도 좋았지만 토요일에 비가 오는 바람에 하루 공쳤다. 그리고 난 구름이 잔뜩 낀 날에 무언가 새로운 풍경을 바라며 산행을 준비했다. 하체 컨디션도 잘 잡아놨고, 잠도 잘 잤다. 어짜피 날이 흐리니 일출은 어림없으므로 일찍 서두르지도 않았고 그저 페이스 조절만 잘해가기로 마음먹었다. 새벽 5시 20분쯤인가 주차장에 도착했는데 내 앞에 대기열만 10대가 넘었다. 그 시간에 누가 빠져줘야 들어갈텐데 누가 그시간에 나갈꼬; 이게 바로 단풍시즌의 위력이겠지. 난 스피드하게 약간 먼곳에 대고 산행을 시작했다.

 

※ 코스

설악산소공원주차장 - 비선대 - 금강굴 - 마등령삼거리 - 원점회귀

 

입장료를 내고 깜깜한 소공원을 지나면서 계곡의 우렁찬 물소리를 들어보니 어제 비가 꽤 내리긴 했구나 라는 생각이 들었다. 그리고 질퍽한 진흙길과 미끄러운 돌 때문에 험난한 등반이 예상됐다. 비선대에는 입산전 재정비 하는 3~4 팀들이 모여있었다. 이 때까지만해도 구름이 대부분이었지만 하늘도 간혹 보였다. 언제나처럼 나홀로 쓸쓸히 금강굴 방향으로 발걸음을 옮길 때쯤부터 비가 흩날리기 시작했다. 이러다 말겠지 했는데 먹구름이 심상치 않아 다시 기상청을 확인해보니 강수량이 많지는 않지만 계속 비가 온다고 예보되어 있었다. 기대를 저버리지 않는 기상청. 하필 오늘같은 날... 어짜피 신발과 바지는 진흙으로 걸레가 됐고, 비도 거의 흩날리는 수준이라 등반에 큰 무리는 없었지만 하산시 미끄러운 돌길들이 걱정됐다. 마등령삼거리까지 가는 내내 공룡능선을 포기해야 하나 말아야 하나 고민을 하다가 마등령삼거리 도착했는데, 나처럼 고민하다가 되돌아 가는 팀들이 꽤 많았다. 일단 비에 젖은 바위길을 무시할 수 없을 것이고, 그쪽으로는 뷰도 거의 없었다. 결국 난 깔끔하게 공룡능선을 포기했다.

 

 

마등령코스를 되돌아 보자면,  지난번에 무너미고개까지 3시간 걸렸는데 마등령삼거리까지 4시간 걸렸다는게 납득이가 되지 않는다. 그렇다고 그만큼 난이도가 있다고 느껴지지도 않았는데... 뷰는 정말 예술이다. 어짜피 공룡능선 보고 주구장창 올라가는거긴 하지만 그 사이 구름이 조금 받쳐 준다면 기가막힌 절경을 감상하면서 갈 수 있을 것이다. 나도 그래서 약간 구름낀 날씨를 선택했던 것인데... 암튼 설악산은 역시 설악산이다. 최고의 절경! 그리고 단풍시즌에 여유있게 주차하고 싶다면 최소 새벽 5시 이전에는 도착해야 한다는점... 오후1시 정도에는 위 사진처럼 소공원 3km 전방이 모두 주차장임. 도로 위에서 시간 버리고 싶지 않으면 아예 안가는게 상책.

 

목적지에 도달하지 못하고 하산하는건 이번이 처음이다. 일단 비선대에서 마등령삼거리까지 3.5km 구간에 어찌됐든 3시간이 걸렸고 그대로 4.5km 짜리 공룡능선을 넘는다면 5시간은 더 걸릴듯 했다. 또 무너미고개에서 주차장까지 대충 3시간. 마등령삼거리에서 발걸음을 돌리기 전에 공룡능선을 한참을 쳐다봤다. 최고의 컨디션으로 왔는데도 이렇게 물러날 수 밖에 없음에 이번 생에는 저 능선을 건너지 못할 것 같은 강한 확신이 들었다. 자괴감을 고이 가지고 하산을 시작했고 남은 체력을 소진하느라 거의 뛰어 내려왔다. 무릎이 멀쩡해서 뛰어 내려온 건 아니고 아프지만 견딜만 해서 뛰어 내려왔다. 젖은 바위들 때문에 몇번을 움찔움찔 했지만 다치지 않고 무사히 내려왔다. 무사한줄 알았는데 다음날 허리가 아주 작살이 나있었다. 무릎은 반작살. 등산을 정말 접어야 할랑가보다. 새로 산 등산화랑 등산스틱은 아직 개봉도 않했는데... 간만에 또 제대로 삐졌다. 조용히 헬스나 해야할 팔자인가... 유유...


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

mysql 일별 통계

Database/Mysql 2021. 10. 7. 22:50

특정 기간의 통계를 화면에 출력해야 할 경우가 있다. 일련의 날짜들이 DB 테이블에 들어 있다면 별 문제가 없겠지만, 굳이 별도의 통계 테이블이 필요하지 않다면 쿼리로 일련의 날짜들에 관련된 임시 테이블을 생성해야 한다. 우선 필요한 날짜 기간을 파악하고, 날짜 테이블을 만들어 본다.

 

curdate() - interval 1 day
curdate() - interval 2 day
curdate() - interval 3 day

 

이런 식이라면 현재부터 원하는 이전날짜까지의 결과셋을 만들 수 있다.

 

아래는 0000 부터 9999까지 각 자리마다 컬럼을 구성하는 쿼리이다.

select *
from 
(select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
cross join 
(select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
cross join 
(select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
cross join 
(select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d


0 | 0 | 0 | 0 부터
1 | 0 | 0 | 0
...
9 | 9 | 9 | 8
9 | 9 | 9 | 9 까지가 출력된다.

 

그리고 아래와 같이 select 문을 변경하면 원하는 일자 테이블을 출력할 수 있다.

 

select curdate() - interval (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) ) day as date

 

2021-10-07
2021-10-06
2021-10-05
...

 

그리고 여기에 기간도 설정하고 다른 테이블과 조인하여 통계에도 사용할 수 있다.

 

select a.date as daily, sum(b.cost) as dailycost
from (
    select curdate() - interval (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) ) day as date
    from 
        (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
        cross join 
        (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
        cross join 
        (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
        cross join 
        (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
    ) a left outer join `sales` b on a.date = Date(b.createDatetime)
where 1=1
and a.gDate between '2021-09-01' and '2021-09-31' 
group by daily
order by daily asc;

 

위 쿼리로 2021-09-01 부터 2021-09-31 까지의 일별 매출 통계를 출력할 수 있다.

 

약간 무식해 보이긴 하지만 필요하다면 ^^

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

DBCP connection 유지

Daily/Prog 2021. 10. 6. 21:30
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 38,597,187 milliseconds ago.  The last packet sent successfully to the server was 38,597,188 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
Caused by: java.net.SocketException: Connection timed out (Write failed)

 

개발서버에서 작업 후 다음날 출근하여 동일한 웹페이지에서 쿼리를 보낼 때 발생하는 오류이다. 매일 아침 반복되고 있다.ㅋㅋ mysql connection 이 끊어진 것으로 보이는데... mysql 의 wait_timeout 옵션에 8시간으로 설정되어 있어, 이 시간이 지나고 쿼리를 보낼 때 발생하는 오류이다. autoReconnect=true 를 설정하라는 메시지가 보이지만 이미 설정된 상태이며, 같은 상황에서 이 옵션은 어쨌든 재접속에는 성공하겠지만 접속이 끊긴 상태에서의 첫번째 요청에는 에러를 발생시킬 것이다.

 

Caused by: java.sql.SQLException: Could not retrieve transation read-only status server
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 32,648,084 milliseconds ago.  The last packet sent successfully to the server was 20 milliseconds ago.
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

 

마찬가지 상황인데 이를 방지하기 위해서는 dbcp 설정을 추가/수정해야 한다.

 

 

- validationQuery : select 1
- testWhileIdle : true (커넥션 풀 안에 있는 유휴 상태의 커넥션을 대상으로 테스트 실행)
- timeBetweenEvictionRunsMillis : 7200000 (쓰레드가 동작하는 간격)
- testOnBorrow : true (커넥션  풀에서 커넥션을 가져올때 해당 커넥션의 유효성 검사 실행)

 

위는 2시간 마다 유휴 상태의 커넥션을 대상으로 'select 1' 쿼리를 실행하여 커넥션을 유지시키는 설정이며, naver d2 사이트에서 성능상 testOnBorrow 옵션과 testOnReturn 옵션은 false, testWhileIdle 옵션은 true 로 설정을 추천하고 있지만, 난 testOnBorrow 를 false 로 설정하면서 이 문제가 발생했다는...

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret