분류 전체보기 426

(Linux 서버로 사용중인) 노트북 SSD/하드 추가 및 마운트

Intro 지난번에는 노트북에 램을 추가시켰습니다. 본격적으로 이것 저것 다양한 용도로 사용하려고 하는데 저장공간이 이미 거의 다 차버렸습니다. 하단의 비어있는 2.5인치 SATA 슬롯 다행히도 램을 추가하면서 확인해보니 여분의 2.5인치 sata 슬롯이 비어있는걸 확인 했었기에 저렴한 하드를 하나 구입하려고 알아보던 차에 쿠팡에서 512GB SSD가 하드보다도 싼 가격에 반짝 딜이 올라왔고, 바로 구입을 해서 설치 해 보았습니다. SSD 설치 SSD는 설치는 그냥 비어있는 슬롯에 꼽기만 하면 되기 때문에 정말 쉽습니다. 같은 공간에 2.5인치 하드디스크를 구입해서 설치 해도 됩니다. SSD는 그냥 꼽고 땡이지만 하드디스크는 물리적 충격에 민감하기 때문에 고정하는 작업이 보통 추가로 필요합니다. 파티션 ..

IT Computer/Linux 2022.12.01

(Linux 서버로 사용중인) 노트북 메모리 추가

Intro 집에서 2년째 가벼운 서버 용도로 사용하고 있는 노트북이 있습니다. 클라우드를 저렴하게 사용할 수 있다면 베스트겠지만, 여러 가지 무료 클라우드를 비교 해 보았을때, 오라클에서 제공하는게 가장 좋음에도 불구하고 최대 2개의 인스턴스 및 각각 1GB의 메모리를 사용 할 수 있다보니 도커 기반의 무엇인가를 올리기에는 엄두가 나지 않습니다. 그러다보니 오라클 클라우드는 개인 ip 주소를 드러내지 않기 위한 간단한 프론트 서버 용도 정도로만 사용 하고 있습니데. 제가 필요한 컨테이너 중에는 메모리를 크게 차지하는게 몇몇 있는데, 그 중에서도 엘라스틱 서치는 평소에도 제 PC 기준 5GB 정도의 많은 메모리를 잡아먹습니다. 램 용량과 클라우드 비용은 정비례를 할 만큼 램의 크기는 비용에 큰 영향을 주다..

IT Computer/Linux 2022.11.27

[Java] 불변객체(Immutable Object)의 JSON 직렬화 및 역직렬화

Intro DTO 혹은 VO 객체를 생성 할 때, Immutable 하게 생성 한다면 여러가지 장점이 있습니다. 멀티 쓰레드 환경에서 동기화를 고려 할 필요 없이 안전하게 사용 할 수 있으며, 캐싱을 하기에도 유리합니다. 특히 mutable 객체를 잘못 코딩함으로서 생기는 사이드이펙트는 예측하기도 어려울 뿐더러 오류가 발견되는것도 쉽지 않습니다. 한참이 지나서야 도대체 알 수 없는 오류가 발생해서 이것 저것 한참을 디버깅을 하다가 객체를 잘못 다룬게 발견될때는 거의 소름이 돋을 정도입니다. 프로퍼티의 값이 변화될 일이 없고, 값이 변경되어서는 안되는 객체를 방어적 복사를 하는 거 보다는 애초에 불변객체로 생성 하는것이 성능을 비롯한 여러 가지 장점이 있습니다. 재사용도 얼마든지 할 수 있습니다. 이전의 ..

Programming/Java 2022.11.20

Cannot find a (Map) Key deserializer for type 해결

문제 Cannot find a (Map) Key deserializer for type [simple type, com.example.GroupView] Map의 키를 단순 String이 아닌 클래스로 했더니 Jackson의 역직렬화 중 에러 발생 키로 사용하는 코드는 아래와 같이 간단한 DTO 객체 public class GroupView { public GroupView(String uuid, String name, String alias) { this.uuid = uuid; this.name = name; this.alias = alias; } private final String uuid; private final String name; private final String alias; } 원인 ..

[H2] Database "mem:testdb" not found, either pre-create it or allow remote database creation 해결

Intro 스프링부트에서는 아래와 같은 설정으로 간단하게 인메모리 H2 데이터베이스를 사용 할 수 있습니다. application.yml spring: datasource: url: jdbc:h2:mem:testdb username: sa build.gradle.kts runtimeOnly("com.h2database:h2") 이후 h2:console 설정을 켠다면, 콘솔 페이지에서 데이터베이스를 직접 확인 해 볼 수 있는데요 spring: h2: console: enabled: true settings: web-allow-others: true 위와 같이 설정했을때에는, /h2-console 경로로 들어가면 데이터베이스를 웹 페이지에서 직접 확인 해 볼 수 있습니다. 그런데, Test Connectio..

[인텔리제이] 한글이 들어간 파일 모두 찾기

Intro 프로젝트에서 국제화 작업을 진행이 대부분 마무리되어, 이제는 모든 뷰단에서 완전하게 하드코딩된 한글 메시지가 제거가 되었는지 확인이 필요 했습니다. 눈에 보이는 페이지를 하나 씩 일일이 찾아서 변경을 했지만, 거의 완료가 되고 나서도 특정 이벤트에만 등장하는 숨겨진 텍스트들이 꽤나 있었습니다. 이때는 정규식 표현을 활용하여 손쉽게 모든 파일에서 한글이 입력된 부분만 찾아낼 수 있습니다. 한글 찾기 파일에서 찾기 Shift 키를 연속으로 두 번 누르고 Find in Files 를 검색 하시면, 단축키를 찾아 낼 수 있습니다. Linux / Windows 에서는 Ctrl+Shift+F 키 이며, Mac 에서는 Ctrl 키 대신 커맨드 키가 들어갑니다. 해당 단축키를 입력 해 보면 위에 보이는 것과..

스프링 부트 java -jar 혹은 bootrun시 port 변경하기

Intro 이번글은 매우 간단한 글인데, 자꾸 까먹어서 블로그 글로 정리해두고 필요할 때 찾아보려고 작성 해 두려고 합니다. 스프링 부트 프로젝트를 IDE로 손쉽게 실행 할 수 있지만, Scale out 이나 로드밸런스 등의 테스트를 할 때는 같은 어플리케이션을 여러개 띄워두어야 하는 경우가 생깁니다. 테스트의 경우에는 인텔리제이에서 Run Configuration을 여러개 카피해서 사용하는게 가장 좋기는 하지만 이런 방법도 있다고 알고 있는 편이 좋겠고 실제로 쓸일이 제법 있었습니다. 포트 지정해 실행 아래와 같이 포트 설정을 하여 실행 할 수 있습니다. java -jar 아마 가장 흔하게 쓰이지 않을까 생각 됩니다. java -jar -Dserver.port=18080 ./target/my-app-0..

[Java] Stream을 활용해 중첩 컬렉션 및 Tree 평면화하기

Intro TREE 형태로 만들어둔 메뉴 목록을 평면화해야 하는 일이 있었습니다. Stream의 flatMap을 활용하면 이중 컬렉션의 평면화를 아주 쉽게 할 수 있는데, 트리 전체를 평면화 시키는건 코드를 깔끔하게 작성하는데 고민이 많았습니다. 스트림을 활용해 트리 형태의 그래프를 평면화 시키는 작업을 한번 해 보도록 하겠습니다. 이중 컬렉션 평면화 가장 먼저 이중 컬렉션의 평면화를 몸풀기로 진행 해 보도록 하겠습니다. 이 작업은 필요한 경우가 잦아 모두 한번쯤은 작성해 해 보셨을거에요. 일단 중첩 컬렉션을 평면화시키는 메서드를 가진 인터페이스를 선언 하고 interface CollectionFlatter { Collection flatten(Collection collection); } 거기에 맞는 ..

Programming/Java 2022.11.07

[도커 방화벽 설정] 엘라스틱서치 특정 IP 클라이언트 접속만 허용하기

Intro 국비학원 최종 프로젝트때 잘 알지도 못하면서 검색 엔진을 도입 했었습니다. 물론 지금도 검색엔진에 대해 잘 모르다보니, 회사에서 진행중인 프로젝트에서 검색엔진을 활용하는 기능을 추가 할때면 SolrJ API를 이리저리 뒤져가며 낑낑대며 간신히 병목이 생기지 않을 정도만 하고 있습니다. 잘 알지도 못하는 검색엔진 도입의 대가는 실로 커서, 장점이라면 그때 당시 도와줄 사람이 없어 처음으로 공식 문서들을 뒤져가며 스스로 무언가를 바닥부터 만들어 내며 맨땅에서도 뿌리를 내릴 수 있는 야생성을 기르고 어떻게든 하면 된다는 자신감을 얻었습니다. 반면 단점도 만만치 않은데 일단 국비학원을 졸업한지 1년 4개월쯤 지난 지금도 그때 당시의 프로젝트를 여전히 띄워 두고 있습니다. 처음엔 집에 남는 노트북으로 ..

Development/DevOps 2022.10.29

[SpringBoot] 에러 발생시 Slack으로 알림 보내기

Intro 토이프로젝트로 단순하게 만들어서 배포 해둔 근무 및 스케줄 관리 웹 어플리케이션이 있습니다. 와이프가 저처럼 매일 매일 출근시간이 정해진게 아니고 쉬프트를 받아 근무를 하다 보니, 종종 근무시간을 까먹고 지각하는 경우가 있었습니다. 제가 와이프 근무시간을 확인하려면 항상 카톡 대화방에 들어가서 사진첩을 뒤적거려야 하는 불편함이 있었습니다. 이 두가지를 해소하고자 첫 버전을 하루만에 대충 만들고 클라우드에 배포까지 끝냈었는데, 동생도 쓰고 무엇보다 처제가 굉장히 유용하게 사용하고 기능 추가 요청도 많이 해주다 보니 처음 계획보다 확장이 꽤나 일어 나고 있습니다. 이 프로젝트 뿐만 아니라, 취업 전에 국비학원에서 진행했던 최종 프로젝트도 생각보다 참고용으로 방문해주는 분들이 있다 보니 지금까지 서..

부트스트랩 기본 폰트 --bs-body-font-family 변경하기

Intro 부트스트랩을 사용 하고 있는데, 전체적으로 기본 폰트를 변경 하려고 하니 --bs-body-font-family가 적용 되어 있어서 변경하는데 까다로운 상황이 있었습니다. 물론 css를 덮어 쓰며 !important; 를 붙이는 방법이 있기는 하지만 애초에 important 는 css 작성 시 권장되지 않는 방법이기도 하고, 그렇게 한번 해 버리면 하위 요소들의 세부적인 폰트 설정이 어려워집니다. 이 문제 상황을 해결 해 보도록 하겠습니다. bootstrap.min.css 인 경우와 scss 인 경우 모두 해결 방법을 작성 해 두었습니다. 문제상황 main.ts import { createApp } from "vue"; import { createPinia } from "pinia"; impo..

[iRods] 데이터 오브젝트가 포함된 리소스 삭제하기 CAT_RESOURCE_NOT_EMPTY

iRods Resource 관련 명령어 iadmin 명령어를 사용하기 위해서는 iRods 호스트 (혹은 컨테이너) 에 접근해 iinit 을 먼저 실시 해 주어야 합니다. 모든 iadmin 명령은 한번의 iadmin 후에 iadmin> 상태에서 입력 가능. 보다 자세한 iRods 명령어는 https://docs.irods.org/ 를 참고. mkresc 리소스 생성. Valut 경로는 반드시 마운트가 이루어져 있어야 합니다. 사용방법 iadmin mkresc 이름 타입 [호스트:Path] [ContextString] 예시 # compound 부모 리소스 생성 iadmin mkresc compex compound '' auto_repl=on # replication 부모 리소스 생성 iadmi..

BCryptPasswordEncoder 사용시 인코딩 할때마다 결과가 달라져요

Intro BCryptPasswordEncoder를 빈에 등록 해놓고, 암호를 검증하는 AuthenticationProvider를 별도로 구현해 봐야 할 일이 있어서 구현을 하고 있었는데요, 아무리 비밀번호를 올바르게 입력 해도 자꾸 비밀번호가 틀리다고 나오는 문제가 발생했습니다. 디버그를 하다 보니 분명 입력된 암호는 같았는데요. 혹시나 각기 다른 비밀번호 인코더가 동작하는지 의심되어서 각각 암호를 저장 할 때와, 암호를 검증 할 때 사용하는 비밀번호 인코더를 확인 해 보았습니다. 확인 결과 완전히 동일한 객체인게 확인 되어서 혹시나 싶어 각각의 위치에서 "1234" 를 인코딩 하도록 해 보았는데요 결과가 당황스러웠습니다. @Test public void encoderTest() { BCryptPass..

[Java Mail] Could not convert socket to TLS; 문제 해결

문제 서버에서 javax email을 활용해 구글 이메일을 전송 할 때 아래와 같은 에러가 발생 했습니다. org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not convert socket to TLS; nested exception is: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate). Failed messages: javax.mail.MessagingE..

BorgBackup 을 이용한 파일 백업

BorgBackup BorgBackup(이하 Borg)은 중복을 제거해주는 오픈소스 백업 프로그램 입니다 Borg의 기본 목표는 효율적이고 안전한 데이터 백업의 제공인데요, 데이터 중복 제거 기술을 활용해 Borg가 오직 변경된 데이터만 저장하도록 하고 있기 때문에 데일리 백업에 아주 적합하다고 합니다. 주요 특징 중복제거로 인한 효율적인 저장 공간 사용 각각의 파일을 다양한 청크로 쪼개고, 이전에 추가된 적이 없는 청크만이 리포지터리에 추가됩니다. 청크는 id hash 값이 같으면 중복으로 간주되는데, id hash를 에는 (hmac-)sha256 와 같은 암호학적으로 강력한 hash 나 MAC 기능이 사용된다고 합니다. 빠른 백업속도 데이터 암호화 데이터 압축: 모든 데이터는 아래의 다양한 압축 옵션..

Development/DevOps 2022.10.04