본문 바로가기

프로그래밍

(93)
프로그램 별로 다른 JDK Version 설정하기 서론 Scouter(현 시점 기준 v.2.17.1) 라는 APM 오픈소스를 사용하려고 하니 문제가 생겼다. Local의 Java 환경은 JDK 17을 사용 중인데, Scouter Server는 JDK 1.8만 지원하고 Scouter Client는 jdk 11 이상만 지원하는 문제이다. 첫번째 시도 처음에는 Scouter Server의 기준에 맞게 JDK 1.8로 환경 변수를 낮게 설정하여 Server를 실행하고 JDK 17로 환경 변수를 변경해 Scouter Client를 실행하려고 했으나 너무 뻘짓이라고 생각했다. 본론 사수님 사랑합니다. 아무리 생각해도 답이 나오지 않고 구글에 검색해도 환경변수를 편집하라는 답 밖에 없었다. 환경 변수를 편집하지 않는 선에서 해결하려고 짱구를 굴려봐도 답이 나오지 않..
[Vus.JS] 하위 컴포넌트의 Key Event를 막아보자. 서론 회사에서는 ckeditor4 라이브러리를 사용해 에디터를 사용하고 있다. 그냥 사용하는 것이 아닌 Modal 창에 띄워놓고 사용하는데, maximize 기능으로 최대화를 할 때 ESC버튼으로 창을 닫을 시 화면이 깨지는 현상이 발생했다. ckeditor 라이브러리 제작자도 Modal에서 사용하면 버그가 발생할 수 있다고 경고했다. 하지만 나는 ITO 서비스를 하고 있고, 고객이 원하는 스펙을 만들기 위해서 Modal에 사용했으니 이제 버그를 고쳐야한다. 본론 수정하기에 앞서 문제를 정의해봤다. Modal 창에 있는 ckeditor를 사용할 때 최대화를 하고, 그 상태에서 ESC 버튼을 누르면 화면이 깨진다. 이제 ckeditor의 문제인지 Modal의 문제인지 파악을 해야한다. 우선 라이브러리 스펙..
[Jenkins] 싱글벙글 Jenkins 핥아보기(Spring boot + Maven + Jar + Git) 서론 회사에서 스케줄러를 만들었으니 이를 자동 배포하는 프로그램을 만들라는 지시가 떨어졌다. - 스케줄러 제작기 [Spring] @Scheduler를 동적으로 대체하자! (Feat. ThreadPoolTaskScheduler) 서론 현재 사내에서 사용하고 있는 스케줄러를 개선하는 작업을 하고 있다. 기존에는 C# 환경에서 RestSharp + Thread를 활용해 스케줄링 작업을 하고 있었으나 내가 부서이동을 하는 바람에 마지막 skydevilk.tistory.com 각설하고 Jenkins를 처음 다뤄보는 입장에서 git에 올린 spring boot 프로젝트를 받아 jar파일로 빌드 후 배포하는 것 까지 해보겠다. 물론 사내 캡처는 보안으로 막혀있으니😥 내 개인PC에서 재연하려고 한다. 모든 시행착오를 ..
[Spring] @Scheduler를 동적으로 대체하자! (Feat. ThreadPoolTaskScheduler) 서론 현재 사내에서 사용하고 있는 스케줄러를 개선하는 작업을 하고 있다. 기존에는 C# 환경에서 RestSharp + Thread를 활용해 스케줄링 작업을 하고 있었으나 내가 부서이동을 하는 바람에 마지막으로 C#을 Java로 변경하고 가라고 하셨다. 🥲 (C#과 Java는 비슷하니 금방 배우실 수 있을겁니다! 라고 말했으나... 하라고 하셨으니 만드는게 인지상정! 호다닥 만들러 슝~💻) 현재 스케줄러는 하단과 같은 json 구조에서 데이터를 파싱해 사용하고 있다. [ { "name": "ATrigger", "endPoint": "/ATrigger", "cronExpression": "0/10 * * * * *", "enable": "true" }, { "name": "BTrigger", "endPoin..
[SwiftUI] 특정 View에서 TabView 가리기 친구 목록에서 프로필 View로 이동 시 하단과 같은 문제가 생겼다. 이는 내가 원하는 결과도 아니고 사용성에서도 매우 좋지 않았다. 구글링을 해보니 TabView { NavigationStack { } } 구조로 되어 있는 코드를 NavigationStack { TabView { } } 이런식으로 바꾸면 해결 된다고 한다. 하지만 TabView - Navigation 구조를 바꾸면 상상치 못할 버그들이 엄청 많이 나올 것이 뻔하기 때문에 다른 방법을 찾아보기로 했다. SSAFY 2기 단톡방에서 답을 찾았다. 3년째 내 헛소리를 잘 받아주시는 고마우신 분들이다. 결론적으로는 toolbar에서 tabBar를 히든처리 해주면 되는 간단한 문제였다. NavigationStack { List { HStack {..
[SwiftUI] View의 사이즈 얻기(Feat. GeometryReader) 프로필 보기 화면을 SwiftUI로 작업하던 도중 View의 사이즈를 어떻게 얻을까 고민을 하였다. self를 통해 가져오려고 해봤지만 Failed... 따라서 검색을 해서 오늘의 주제인 GeometryReader 를 학습했다. GeometryReader란? Apple 공식 홈페이지 문서에 간단히 나와있다. "콘텐츠를 자체 크기 및 좌표 공간의 함수로 정의하는 컨테이너 보기입니다." "이 보기는 상위 레이아웃에 유연한 기본 크기를 반환합니다." 그래요. 이거 쓰면 됩니다. 라고 한마디로 정의해주고 있다. 사용 방법도 매우 간단하다. var body: some View { GeometryReader { geometryValue in VStack { Image(systemName: "person") .res..
[UIKit] TableViewCell에서 AutoLayout 동적으로 추가 및 삭제하기(AutoLayout programmatically Swift) 프로젝트를 하던 도중 TableViewCell에 AutoLayout을 동적으로 추가를 할 일이 생겼다. 하단은 프로필에 상태메세지가 없을 경우 사용자 이름을 centerYAnchor로 주는 코드이다. if(self.dataSource[indexPath.section][indexPath.row].statusMsg == nil) { cell.name.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true } else { cell.name.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true cell.statusMessage.text = self.dataSource[in..
[UIKit] TableView section header 간격 문제 해결 TableView를 만드는 도중 아래의 그림과 같이 Section이 nil인 경우에도 header가 잡히는 경우나 간격이 추가되는 버그가 있다. 우선 nil일 때 Header Section의 크기가 들어가지 않도록 변경해보자. tableView.tableHeaderView = .init(frame: .init(x: 0, y: 0, width: 0, height: CGFloat.leastNonzeroMagnitude)) tableView를 생성할 때 위의 코드를 추가해주면 아래와 같이 section이 없으면 View가 추가되지 않는다. 다음으로 친구라는 섹션 위의 공백을 없애보자. tableView.sectionFooterHeight = 0 우선 Footer를 사용하지 않으므로 FooterHeight를 0..