Mocking한 객체의 메소드 인자 상태 확인

Mocking한 상태인 orderTableDao 에서 orderTableDao.save(entity) 를 호출했을 때, entity의 필드값을 검증할 필요가 있었다. argThat() 메서드를 사용하면 검증이 가능하다. verify(orderTableDao, times(3)).save( argThat(orderTable -> !orderTable.isEmpty() && Objects.nonNull(orderTable.getTableGroupId()) ) ); 참고 자료 https://stackoverflow.com/questions/31993439/can-mockito-verify-an-argument-has-certain-properties-fields https://www.baeldung.com/mockito-argument-matchers

2024-09-15 · 1 min · 31 words

mocking

아래와 같이 람다 형식으로 특정 모드를 mocking 할 수 있다. val mock = mock<MyClass> { on { getText() } doReturn "text" } 참고 자료 https://github.com/mockito/mockito-kotlin

2024-09-15 · 1 min · 25 words

MockHttpServletRequest

문제 상황 Spring MVC의 컨트롤러에서 요청 보낸 사람의 IP를 확인하기 위해서 HttpServletRequest를 파라미터로 받고 있다. @PutMapping fun put(request: HttpServletRequest) { // ... request.remoteAddr // ... } 단위 테스트를 작성할 때, HttpServletRequest를 인자로 넘겨야되는데, 이는 인터페이스라서 직접 구현해야되는 상황이 발생했다. 해결 방법 Spring Test에서는 MockHttpServletRequest를 제공해주고 있다. 이는 HttpServletRequest의 구현체다. @Test fun test() { controller.put(MockHttpServletRequest()) } 참고 자료 How to Mock HttpServletRequest | Baeldung java - How to extract IP Address in Spring MVC Controller get call?...

2024-09-15 · 1 min · 79 words

MetaStream

JavaScript에서 비디오 스트림을 캡쳐하여 분석 ,가공 저장 등을 가능하게 해준다. 예제를 기반으로 사용법을 익혀본다. const canvas = document.querySelector("canvas"); // Optional frames per second argument. const stream = canvas.captureStream(25); const recordedChunks = []; console.log(stream); const options = { mimeType: "video/webm; codecs=vp9" }; // 1 const mediaRecorder = new MediaRecorder(stream, options); mediaRecorder.ondataavailable = handleDataAvailable; // 2 mediaRecorder.start(); function handleDataAvailable(event) { console.log("data-available"); if (event.data.size > 0) { recordedChunks.push(event.data); console.log(recordedChunks); download(); } else { // … } } function download() { const blob = new Blob(recordedChunks, { type: "video/webm" }); // 3 const url = URL....

2024-09-15 · 1 min · 151 words

Maven 시작하기

소개 Maven이란?: 빌드 툴 빌드란?: 아래의 4가지 과정이 존재한다. 컴파일: java코드를 JVM에 올려서 인터프리터가 이해할 수 있는 수준으로 바이너리로 바꿔주는 과정 테스트: 소스코드 컴파일 -> 테스트 코드 컴파일 -> 테스트 실행 패키징: jar나 war 같은 형식으로 압축 배포: 패키징한 것을 remote 저장소에 배포 일반적으로 배포 기능은 안쓰고 Jenkins 같은 외부 툴 사용 Maven 설정 디렉토리 구조(Java web project) pom.xml: maven 설정이 포함되어 있다. /src/main/java: java source code /src/main/resources: 배포할 환경 설정 파일(xml, properties) /src/main/webapp: 웹자원 (JSP, JS, CSS 등) /src/test/java: test source code /src/test/resource: test 환경의 설정 파일 /target: 컴파일 된 결과물이 저장되는 경로 프로젝트마다 구조가 조금씩 다를 수 있다....

2024-09-15 · 6 min · 1091 words

Maven Repository

배경 2개의 프로젝트 사이에 의존 관계를 갖고 있을 때, 로컬에서 빌드하는 방법을 몰랐다. Maven Repository Maven은 3가지 종류의 레포지토리를 지원한다. local: 로컬 장치의 폴더 central: Maven 커뮤니티에서 제공하는 레포지토리 remote: 어떤 조직의 커스텀 레포지토리 Maven에서는 빌드 했을 때 프로젝트를 로컬에서 재사용 할 수 있도록 로컬에 저장한다. 해결 방법 의존이 되는 프로젝트를 먼저 local repository에 배포하고 빌드하면 성공적으로 빌드된다. mvn install # 빌드 후 local repository에 배포 참고 자료 https://www.baeldung.com/maven-local-repository

2024-09-15 · 1 min · 69 words

Maven dependency tree 그리기

배경 팀내에 사용하고 있는 컴포넌트 간에 어떤 의존 관계를 가지고 있는지, 의존 관계에 사이클이 존재하지 않는지 확인이 필요했다. 문법 mvn dependency:tree -Dincludes=[groupId]:[artifactId]:[type]:[version] -Dincludes 또는 -Dexcludes 옵션을 통해 자신이 원하는 의존만 필터링해서 볼 수 있다. groupId, artifactId, type, version 중에 자신이 필터링을 원치 않는 값은 빈값으로 해두면 되고, 와일드 카드도 사용할 수 있다. org.apache.*::: 참고 자료 https://maven.apache.org/plugins/maven-dependency-plugin/examples/filtering-the-dependency-tree.html

2024-09-15 · 1 min · 56 words

MariaDB의 charset 이슈

MariaDB는 기본 캐릭터셋으로 utf8mb4를 쓰기 때문에 스키마 생성시 utf8을 사용하게 설정해야된다. CREATE DATABASE practice DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

2024-09-15 · 1 min · 20 words

MariaDB 설치 하기

먼저 자신이 필요한 버전을 찾는다. 아래 링크에서 찾을 수 있다. https://downloads.mariadb.org/mariadb/repositories/ 이 글은 MariaDB 10.6을 기준으로 진행한다. MariaDB 레포지토리를 내 Ubuntu 시스템에 등록한다. sudo apt-get install software-properties-common sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc' sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] https://mirror.yongbok.net/mariadb/repo/10.6/ubuntu bionic main' MariaDB 10.6을 설치한다. sudo apt update sudo apt install mariadb-server 참고 자료 https://www.linuxbabe.com/mariadb/install-mariadb-10-5-ubuntu

2024-09-15 · 1 min · 52 words

Map에서 get 호출시 NPE

배경 map.get(null)을 호출하면 NPE가 발생할 것으로 예측했는데 발생하지 않았다. NPE가 발생하지 않는 이유를 이해한다. Map 인터페이스 get() 메서드 호출시 파라미터가 null이면 NPE가 발생한다고 명시되어 있다. HashMap 하지만 HashMap은 Map 인터페이스의 구현체임에도 key가 null인 경우를 허용하고 있어, get() 메서드 호출 시 null을 넘길 수 있다. TreeMap Map의 또 다른 구현체인 TreeMap의 경우는 null을 넘기면 NPE가 발생한다. 참고 자료 https://www.baeldung.com/java-treemap-vs-hashmap

2024-09-15 · 1 min · 58 words

macOS에서 mariadb 설치 에러 해결

https://mariadb.com/resources/blog/installing-mariadb-10-1-16-on-mac-os-x-with-homebrew/ 위 링크를 읽으면서 mariadb를 설치한 뒤, mariadb를 실행하니 다음과 같은 에러로 실행에 실패하는 문제가 생겼다. [ERROR] /usr/local/opt/mariadb/bin/mariadbd: unknown variable 'mysqlx-bind-address=127.0.0.1' /usr/local/etc/my.cnf 파일에 들어가서 저 부분을 주석처리한 뒤, 재실행하니 해결되었다. 참고 자료 https://stackoverflow.com/questions/58245118/warning-the-post-install-step-did-not-complete-successfully-when-trying-to-ins https://mariadb.com/resources/blog/installing-mariadb-10-1-16-on-mac-os-x-with-homebrew/

2024-09-15 · 1 min · 34 words

m1 mac에서 rosseta2로 shell 실행 하기

배경 nvm을 통해 v10.16의 Node.js를 사용해야 되었다. 하지만, m1 칩의 경우 nvm에서 v16.0.0 부터 지원을 하고 있었다. 그래서 v10.16을 설치하면 아래와 같은 에러가 발생했다. Downloading and installing node v10.16.3... Downloading https://nodejs.org/dist/v10.16.3/node-v10.16.3-darwin-arm64.tar.xz... curl: (22) The requested URL returned error: 404 Binary download from https://nodejs.org/dist/v10.16.3/node-v10.16.3-darwin-arm64.tar.xz failed, trying source. grep: /Users/user/.nvm/.cache/bin/node-v10.16.3-darwin-arm64/node-v10.16.3-darwin-arm64.tar.xz: No such file or directory Provided file to checksum does not exist. Binary download failed, trying source. https://github.com/nvm-sh/nvm 해결 방법 아래 명령어롤 틍해 Rosetta 2로 zsh을 실행하면, 문제없이 설치가 가능해진다....

2024-09-15 · 1 min · 85 words

m1 mac에서 homebrew 사용시 경로

배경 homebrew를 사용해서 Apache를 설치했는데 예상한 위치에 설치되지 않았다. Intel 사용시 경로 vs M1 사용시 경로 intel의 경우에는 기본 경로가 /usr/local/bin/brew 이다. m1의 경우에는 기본 경로가 /opt/homebrew/bin 이다. which brew 명령을 통해서 현재 brew가 설치되어 있는 위치가 어디인지 파악할 수 있다. 참고 자료 https://earthly.dev/blog/homebrew-on-m1/

2024-09-15 · 1 min · 44 words

lower_bound, upper_bound 바이너리 서치

python에서 자체적으로 함수로 제공하고 있다. lower_bound: bisect_left(literable, value) upper_bound: bisect_right(literable, value) 참고 자료 https://docs.python.org/3/library/bisect.html

2024-09-15 · 1 min · 14 words

Lombok

롬복을 통해 쉽게 생성자, getter, setter, 빌드 패턴이 구현된다. @Builder @Getter @AllArgsConstructor @NoArgsConstructor @Entity public class Game { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NonNull private String name; } access 속성으로 접근 제어자 지정할 수 있다. @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED)

2024-09-15 · 1 min · 41 words

logrotate의 config 파일이 root 소유자가 아니면 실패하는 이슈

발생한 문제 logrotate 명령어 수행시 error: Ignoring {config 파일 경로} because the file owner is wrong (should be root or user with uid 0). 가 발생함 이전 서버 환경에서는 이런 문제가 없었는데 신규 서버에서 발생함 원인 logrotate 3.8.0 부터 root 권한으로 logrotate 실행 시, config 파일의 파일 소유자가 root 인지 검증한다. 이전 서버에서는 3.8.0 보다 낮은 버전이어서 문제가 되지 않았다. https://github.com/logrotate/logrotate/blob/master/ChangeLog.md https://github.com/logrotate/logrotate/compare/r3-7-9...r3-8-0 참고 자료 https://superuser.com/questions/793013/logrotate-no-longer-reads-symlinked-configuration-file-due-to-non-root-ownership

2024-09-15 · 1 min · 65 words

logrotate

목적 Linux에 존재하는 로그 로테이팅 명령어다. logrotate 는 로그 로테이트 과정을 관리하는데 사용되고, cron을 통해서 보통 실행한다. logrotate 실행에 필요한 파일 /usr/sbin/logrotate: logrotate 명령어(실행 파일) /etc/cron.daily/logrotate: anacron을 이용해 매일 실행할 logrotate /etc/logrotate.conf: 로그 로테이트 설정 파일 conf 파일 아래와 같이 로테이트 할 로그 파일 경로와 설정을 명시한다. 정규식을 이용한 표현도 가능하다. /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/daemon.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate invoke-rc....

2024-09-15 · 1 min · 189 words

log4j vs logback vs log4j2

Java 진영의 대표적인 로깅 프레임워크 log4j, logback, log4j2를 비교해보고자 한다. log4j 가장 오래된 로깅 프레임워크이다. 하지만 그만큼 몇 년 동안 가장 인기있는 프레임워기도하다. 최근에 나온 로깅 프레임워크도 log4j의 계층적 로그 레벨과 로거 같은 개념을 사용하고 있다. 하지만, log4j는 2015년에 개발이 종료되었다. 새로운 프로젝트에서는 해당 프레임워크를 사용하는 것을 권장하지 않는다. logback log4j의 후계자로 log4j와 같은 개발자가 만들었다. log4j와 전체적으로 동일한 개념을 사용하지만 성능이 개선되고 고급 필터링 및 설정 등을 제공하고 있다....

2024-09-15 · 1 min · 108 words

LocalStorage에 데이터 저장, 조회하기

데이터 저장 window.localStorage.setItem('myCat', 'Tom'); 데이터 조회 const cat = localStorage.getItem('myCat') // 없으면 null 데이터 삭제 localStorage.removeItem('myCat'); 데이터 전체 삭제 localStorage.clear(); 참고 자료 https://developer.mozilla.org/ko/docs/Web/API/Window/localStorage

2024-09-15 · 1 min · 23 words

Locale 처리 방식

목표 locale이 무엇인지 이해한다. Spring에서 locale을 어떻게 처리하는지 이해한다. Locale 지리적, 문화적, 정치적 지역을 나타내는 역할을 가지는 클래스 언어, 국가 등을 표현한다. Spring에서 Locale 처리 방법 Spring 애플리케이션에서 요청자의 지역에 따라 다른 언어를 표시하기 위해서는 현재 Locale을 결정하는 방법이 있어야 된다. DispatcherServlet은 locale resolver를 찾고, 찾은 locale resolver를 통해서 locale을 지정하려고 시도한다. RequestContext.getLocale() 메서드 호출을 통해 locale resolver가 설정한 locale을 확인해 볼 수 있다. LocaleResolver LocaleResolver: locale을 선택하기 위한 전략을 나타내는 전략 인터페이스 대표적인 기본 구현체 AcceptHeaderLocaleResolver: HTTP 요청의 Accept-Language 헤더를 통해 locale을 선택한다....

2024-09-15 · 1 min · 185 words