2022/05 13

Linux) 스왑(swap) 메모리 설정 변경

Intro 메모리 부족 Windows 에서는 WSL 위에 도커 컨테이너 몇개 띄우고, 인텔리제이에 브라우저 탭 몇개만 켜면 메모리가 바닥나버리는 바람에 Linux 사용을 시작한지도 어느덧 1년이 다 되어갑니다. 처음 우분투로 옮겼을때는 평소 윈도우에서는 메모리를 다 잡아먹었을 만큼 어플리케이션을 띄워도 거의 절반의 메모리 만을 사용하기 때문에 굉장히 쾌적했는데 그 사이 도커 컨테이너도 몇개 늘고 프로젝트에서 사용하는 어플리케이션도 몇개 늘어났습니다. 메모리 부하가 조금만 심해졌다 하면 컴퓨터가 그대로 멈춰버리는 바람에 그때마다 Ctrl + Alt + F6 으로 터미널 모드에 들어가 돼지 프로세서들 몇개를 kill 해낸 후 Alt + F1 로 돌아오는 방식으로 해결을 하고는 있지만 여간 번거로운 일이 아닙..

IT Computer/Linux 2022.05.31

Git) 서브모듈 추가 및 제거

Intro A 라는 프로젝트 아래에 B 라는 서브 모듈이 필요 하게 되었습니다. 이미 B 프로젝트는 C 프로젝트를 서브 모듈로 가지고 있는 상황이었는데, A 프로젝트에 B 프로젝트를 서브 모듈로 추가하고, 다시 삭제하는 과정을 진행 해 보도록 하겠습니다. 서브모듈 추가 git submodule add 저장소주소 서브모듈경로 로 추가 할 수 있습니다. 아래의 명령어는 메인 git 저장소의 /build 폴더에 url-to-pdf 라는 프로젝트를 url-to-pdf 라는 이름으로 서브모듈로 추가하는 예시 입니다. git submodule add git@github.com:Shane-Park/url-to-pdf.git build/url-to-pdf 이후 확인해보면 .gitmodules에 [submodule "b..

Development/Git 2022.05.31

Nojde.js Web app을 도커 이미지로 만들고 Docker Hub에 올리기

Intro Node.js로 작성한 웹 어플리케이션을 간단하게 도커 이미지로 만든 후에 해당 이미지를 도커 허브에 push 해서 어디서나 받아서 사용하는 방법을 알아 보도록 하겠습니다. 1. Node.js 웹 어플리케이션을 도커 이미지로 Node.js App 생성 일단 준비된 Node.js 웹 어플리케이션이 없다면 테스트를 위해 생성 해 줍니다. 준비된 어플리케이션이 따로 있다면 이 과정은 생략 하실 수 있습니다. Node.js 앱을 생성 할 빈 폴더를 생성 한 뒤 해당 폴더에 package.json 파일을 생성 해 줍니다. { "name": "docker_web_app", "version": "1.0.0", "description": "Node.js on Docker", "author": "First L..

Development/DevOps 2022.05.30

Git) 여러개의 Git 저장소 한번에 fetch / pull

Intro 사용하는 PC 가 여러개 (Linux, MacOS, ...) 있다 보니, 혼자서만 사용하는 Git Repository라고 해도 fetch 혹은 pull 을 꼬박꼬박 진행 해 주어야 합니다. 가끔씩 fetch / pull 을 까먹은 상태로 커밋을 하고 거기에 push -f로 강제 푸시라도 하는 날에는 기존에 작업했던 내용을 잃기도 합니다. 코딩을 하다가 자바의 특정 기능을 테스트 해보고 그걸 나중을 위해 기록으로 남겨두는 저장소 시간 날 때 알고리즘 문제를 풀어보는 저장소 새로움 배움이 있거나 기록할 게 있을 경우 추후 블로그 작성을 위해 메모해 두는 저장소 이 세 저장소는 특히 여러개의 PC에서 commit이 자주 일어나는데요. 특히 출/퇴근 후에는 혹시 모를 실수를 방지하기 위해 모든 저장소..

Development/Git 2022.05.27

Kotlin) Data class 에 기본 생성자 만들기

Intro Kotlin과 SpringBoot를 활용해 스프링 시큐리티를 공부하고 있습니다. 아직은 코틀린에 익숙하지가 않아 자바로 된 코드를 코틀린으로 작성 할 때는 한번씩 꽤나 막히는 부분이 있는데, 이번에는 기본 생성자를 찾지 못한다는 오류가 발생했습니다. 생성자가 없다는 오류 기본 생성자를 찾지 못해 에러가 발생하고 있었는데요.. 자바였다면 그냥 @NoArgsContructor 라는 롬복 어노테이션 하나만으로도 해결 할 수 있는 이 상황을 코틀린에서는 어떻게 해결 해야 할까요? 문제의 원인이 된 상황과 해결 방법을 확인 해 보겠습니다. 원인 일단 발단이 된 코드는 아래와 같습니다. jackson 라이브러리를 활용해 request의 reader를 그대로 읽어 AccountDto 로 변환 하는 과정 인..

Programming/Kotlin 2022.05.25

Linux) 대용량의 더미 파일 생성하기

Intro 10GB가 넘는 대용량의 파일 업로드 처리에서 문제가 있었습니다. 해당 파일을 제공받아 테스트를 진행 해 보았는데 이후에 다양한 파일 용량별로 처리 여부와 핸들링에 걸리는 시간을 확인해보려고 하는데, 적당한 파일을 구할 방법이 생각나지 않았습니다. https://testfiledownload.com/ 인터넷에 이런식으로 더미 파일을 제공하는 사이트가 있기는 하지만, 초당 300kb/s 정도의 처참한 속도가 나오기 때문에 테스트를 위한 파일을 다운로드로 해결 할 수는 없었습니다. 다행히도 이런 경우에는 간단한 명령어로 더미 파일을 생성 할 수 있습니다. 여러가지 명령어를 모두 정리 해 두었으니 각자 편하신 명령어를 사용 해서 더미 파일을 생성하시면 됩니다. Linux dd 첫번째로 가장 흔하게 ..

IT Computer/Linux 2022.05.25

JAVA) Date 를 LocalDateTime 으로, 혹은 그 반대로 변환하기

Intro 제법 오래된 프로젝트를 유지보수 하고 개선하다보니, Date 타입을 다루어야 할 일이 제법 많이 있습니다. Date API는 JDK 1.0 부터 제공된 유구한 역사를 가진 클래스인데요, 워낙 문제가 많다보니 JDK 1.1에서 바로 Calendar 클래스가 추가 되며 Date의 많은 메서드들을 @Deprecated 시켜버렸지만 여전히 오랜기간 꾸준히 애용되어 왔습니다. 그러다 마침내 JDK 1.8 버전에서 JodaTime 의 날짜와 시간 API가 추가되면서 LocalDateTime 이나 LocalDate를 사용 할 수 있게 되었습니다. 기존에 있는 Date를 걷어낼 수 있으면 참 좋겠지만, 그럴 여유가 없을 경우에는 일단 새로 작성하는 코드들에서 최대한 Date 사용을 피하지만, 어쩔 수 없이 ..

Programming/Java 2022.05.23

IntelliJ) 자동 임포트 정렬시 이클립스와 같은 규칙으로 설정하기

Intro Eclipse IDEA를 사용하며 습관처럼 Ctrl + Option(Alt) + O 키를 눌러 Optimize import 기능을 사용 하다 보면, 혼자서 진행하는 프로젝트가 아닌 이상은 각자의 IDE 환경설정 등에 따라 import 문을 모두 재 정돈 해 줍니다. 매번 커밋 할 때 마다 import 문 변경 사항이 너무 많다보니 프로젝트의 코드변경 히스토리때문에 버전관리 용량도 커지고, 변경사항을 trace 할 때에도 쓸데없는 변경 사항들이 눈에 보이다 보니 통일을 위해 이클립스와 같은 방식으로 변경해야겠다는 생각이 들었습니다. import 설정 변경 일단 Settings > Editor > Code Style > Java > imports 로 찾아 들어 가 줍니다. Scheme이 보이는데,..

Spring) 스프링의 "redirect:" 리다이렉트 처리

Intro Spring Framework 를 사용한다면 컨트롤러에서 리턴타입은 String으로 하고 view 이름 대신 "redirect:" 로 시작하는 문자열을 반환 하면 해당 주소로 리다이렉트를 시켜 줍니다. "redirect:" 를 했는데 리다이렉트가 되지 않고 있다는 질문을 받아서 코드를 확인해보는데, 일단 redirect에 오타는 없었습니다. 그러면 혹시 @ResponseBody 어노테이션이 적용된건지 확인을 하는데 그렇지 않기에 코드를 맨 위로 올려보니 아니나 다를까 @RestController 어노테이션이 보였습니다. 이럴땐 간단하게 @Controller로 바꾸고 필요한 부분들에만 @ResponseBody 어노테이션을 작성 하거나 아니면 리턴타입을 ResponseEntity로 하는 방법이 있..

Programming/JPA ⁄Spring 2022.05.13 (1)

Java) HashMap에서 특정 value를 제거하기

Intro Map에서 특정 key를 가진 EntrySet을 제거하는건 어렵지 않습니다. map.remove(삭제할key객체) key로 제거 하는 것 뿐만 아니라, key와 value를 모두 인자로 넘겨서 해당하는 key-value 쌍이 있을때에만 제거하는 방법도 있습니다. 그렇다면 특정 값만 제거 하고 싶다면 어떻게 해야 할까요? values().remove(Object value) 단순 궁금증에 values()로 값들이 들어있는 컬렉션 객체를 불러 온 뒤에, 거기에서 remove 메서드를 호출 해 보았는데 정말 감쪽같이 key, value 쌍이 모두 사라졌습니다. values는 제거가 될 거라고 생각했지만, keySet은 변화가 있기 때문에 오류가 발생하거나 혹은 문제가 생길 거라고 예상 했는데 기대한..

Programming/Java 2022.05.13

Spring) 필드 인젝션의 해로움 _생성자 주입을 사용해야 하는 이유

Intro 스프링을 처음 접하며 의존성 주입이라는 개념을 배운 이후로 한참을 필드 인젝션만 사용 해 왔습니다. 영한님의 스프링이나 JPA 강의에서는 생성자주입을 사용하라고 하고, 학습할때는 항상 생성자 주입을 사용하는 습관을 들여 왔지만 이미 기존에 @Autowired 로 작성된 프로젝트들을 손대기에는 충분한 명분도 스스로의 확신도 사실 없었습니다. 단일 테스트 작성에 어려움을 느꼈을때에도, 아직 테스트 코드를 본격적으로 작성하던 건 아니었기 때문에 스프링 컨테이너를 일일히 띄워가며 테스트를 진행 하기도 했었습니다. 생성자 주입으로 바꾼 계기 그러던 중 꽤나 오래된 프로젝트에서 필드 인젝션을 싹 다 걷어내고 생성자 주입으로 바꾸게 된 계기가 있었습니다. 스프링 부트 1.5 버전을 사용하며 여러가지 불편을..

JAVA) Private method를 테스트 하는법

Intro 간단하게 만든 private 메서드가 잘 작동하는지 궁금했습니다. 기존에 이미 작동하고 로직의 계속 반복되던 부분을 private 메서드로 따로 추출해서 반복을 제거 하려는 의도 였는데.. 이게 쏘아올린 작은 공이 생각보다 많은 생각을 하게 만들었습니다. 일단, 일반적인 방법으로는 private 메서드를 테스트 해 볼 수 없었는데요, 애초에 호출을 하지 못하니 테스트도 불가능한게 당연합니다. private method를 테스트 해야할까? TDD의 아버지이자, Junit의 창시자인 켄트벡은 2020년 어느날 트위터에 아래의 링크를 남겼습니다. http://shoulditestprivatemethods.com/ 해당 링크에 방문 해 보면, 하얀 바탕의 한 가운데에 NO라고 96px의 큰 글자만을 ..

Programming/Java 2022.05.09

Spring Boot2.6에서 Springfox3 실행 실패 에러

Intro Kotlin 프로젝트 였지만, Spring Boot 설정과 관련된 내용이기 때문에 java 로 프로젝트를 진행 하시는 경우에도 문제 해결을 하실 수 있습니다. Kotlin 과 스프링 부트를 이용해 API 서버를 만드는 강의를 따라 실습 해 보던 중 에러가 발생했습니다. 강의에서는 springfox 2.x 버전을 사용하며 새로나온 3.x 버전은 설정과정이 살짝 다르기때문에 구버전을 사용한다고는 했지만, 저는 얼마전 회사에서 진행중인 프로젝트에 springfox3.0.0 버전을 이용해 적용을 시켜본 경험이 있기 때문에 별 고민없이 3.0.0 버전을 적용 시켰습니다. build.gradle.kts implementation("io.springfox:springfox-swagger-ui:2.9.2")..