👩🏻‍💻 Programming 88

Kafka - Classpath is empty 이슈

로컬에서 Kafka를 돌렸는데 아래와 같은 로그가 출력됐다. Classpath is empty. Please build the project first e.g. by running './gradlew jar -PscalaVersion=2.11.12' 해결책은 크게 2가지가 있는데, 나는 2번의 방법으로 해결할 수 있었다.참고로 사용중인 운영체제는 Mac OS이다.1. Kafka Source 파일이 아닌 Binary 파일을 다운 받기  Kafka 공식 다운로드 사이트에서 Source 파일이 아닌 Binary 파일을 다운받아 실행하자.  2. 파일 경로에 특수 문자 또는 공백이 없는지 확인 내 경우엔 아래와 같이 kafka가 설치된 경로에 공백이 포함되어 있었다./DM/Desktop/work/dev util..

Java9 부터는 String이 StringBuilder보다 빠를 수 있다

개요작성 계기Java 9 이전 : String StringBuilderJava 9 이후 : String > StringBuilder진짜일까?결론 0. 작성 계기회사에서 작업 도중 위와 같은 코드 리뷰가 들어왔다.개인적으로 나는 Java랑 그렇게 친하다고 생각하진 않는다.코딩 테스트 언어도 C++로 선택했었고, 회사 외부에서 하는 프로젝트는 Kotlin 또는 Dart를 사용한다.Java는 현재 회사 업무랑 병행하면서 조금이라도 익숙해지고자 알고리즘 문제를 풀때 사용하는데, 애정이 없다보니 무언가 궁금한 키워드가 있을때는 수박 겉핥기 식으로 대충 이해하고 넘기는것 같다.이 기회에 모르는 지식이 있으면 제대로 짚고 넘어가자는 생각이 들었다. 1. Java 9 이전 : String StringBuilderJav..

Optional을 막 쓰지 말자

개요작성 계기Optional이란?왜 막 쓰면 안되지?결론 0. 작성 계기회사에서 작업 도중 위와 같이 코드 리뷰가 들어왔다.Java나 Kotlin으로 개발할때 Null Check 로직이 필요되는 부분이라면 Optional을 빈번하고 사용하고 있었는데,Optional의 장점만 알고있었지 단점은 잘 모르고 있다는 생각이 들었다.이 기회에 Optional의 장점과 단점을 정리해보자. 1. Optional이란?Optional은 Java 8부터 추가된 컨테이너 클래스이다.// 기존 null 체크if (account != null) { processAccount(account);}// Java8의 Optional 적용var accountType = Optional.ofNul..

방어적 복사와 깊은 복사의 차이

방어적 복사가 뭐죠? NEXT STEP 과제를 하던 중, 멘토님으로부터 위와 같이 피드백이 들어왔다. 얕은 복사와 깊은 복사까지는 들어봤지만 방어적 복사는 처음 들어봤기에 정리를 해보면 좋겠다는 생각이 들었다. 잘 작성된 글을 참고하자 👍🏻 우아한 테크코스의 블로그에서 3기_파피님이 가독성이 좋게 내용을 정리하셨는데, 해당 내용을 참고하자. 방어적 복사와 Unmodifiable Collection 방어적 복사 vs Unmodifiable Collection… tecoble.techcourse.co.kr

WebFlux의 개념과 사용법

0. 목차 WebFlux, 넌 누구냐 Reactive Programming WebFlux 개념 WebFlux란? WebFlux의 등장 배경 WebFlux 사용의 권장되는 환경 WebFlux가 무조건 좋은가? Spring MVC vs WebFlux Mono vs Flux 1. WebFlux, 넌 누구냐 2024년부터 팀원분과 새로운 프로젝트를 진행하게 됐다. 이미 어느정도 기본 셋팅이 이루어진 프로젝트였는데, 이 프로젝트에서는 WebFlux로 외부 API를 호출하고 있었다. WebFlux는 들어만봤지 실제로는 사용한 적이 없었는데, 대략적으로 전통적인 Spring MVC에 비해 스레드를 상대적으로 덜 사용한다 정도까지만 알고 있었다. 제대로 사용하기 전에 왜 이 프로젝트에서는 WebFlux를 사용했는지, ..

Vuetify에서 v-data-table에 \n(줄바꿈)이 동작하지 않는 현상

0. 목차 이슈 해결 1. 이슈 Vue.js(2.6.11v)와 Vuetify(2.4.0)을 사용하는 프로젝트에서 아래와 같은 형식으로 Data Table을 보여주는 로직이 있다. 아래 코드가 실제로 현업에서 사용되는 코드는 아니며, 글을 작성하기 위해 쉬운 예시로 코드를 작성했다. ============================================================= data() { return { page: 1, pageCount: 0, itemsPerPage: 10, headers: [ { text: 'Calories\n(per 100g)', align: 'center', sortable: false, value: 'calories' }, { text: 'Protein\n(pe..

OOM과 Garbage Collector, 그리고 Dump

목차 OOM (Out of Memory) (1) OOM의 발생 원인 OOM과 Garbage Collector의 관계 Dump를 뜨다 MAT 사용법 참고 자료 0. OOM (Out of Memory) 업무를 보다보면 팀 메신저 방에 이따금씩 OOM에 관련된 내용이 공유된다. 메모리가 부족한 에러이니 덤프를 떠서 메모리 누수의 원인을 분석 후 해결방안을 찾으면 되지만, 제대로 이해하고 있다는 느낌이 들지 않았다. 또한 덤프를 뜨는게 해결 방안의 전부인것 같지는 않았다. 이 기회에 관련 용어 및 해결 방안을 정리해보고자 한다. (1) OOM의 발생 원인 공식문서의 언급에 따르면 OOM은 Java의 Heap 메모리가 부족하여 더 이상 가용한 메모리가 없을 경우 발생한다. 대표적으로 아래 2가지 사례로 발생한다...

Docker compose 명령어

분류 명령어 설명 실행 docker-compose up - docker-compose.yml에 정의된 서비스들을 시작하거나 이미 동작중이었다면 재시작 - 단, 이미 돌아가고있던 서비스에 대해서 docker-compose.yml에서 변경된 사항이 없다면 재시작하지 않고 별 다른 변화를 주지 않음 docker-compose run - 새로운 컨테이너를 생성하여 시작 - 때문에 '일회성' 또는 '특별' 작업을 위해 실행하는 것을 권장. - 추가로 실행하고자 하는 특정 서비스 이름이 요구됨. docker-compose start - 중단됐던 컨테이너를 시작 (새로운 컨테이너 생성 X) - 이미 동작되고 있던 컨테이너라면 영향 없음 docker-compose restart - 중단됐던, 또는 이미 동작되고 있던 ..

NPE(Null Pointer Exception)를 방지하는 방법

NPE(Null Pointer Exception)란? Null Pointer Exception의 줄임말로, null인 객체를 참조하려고 할 때 발생하는 Exception이다. 좀더 정확히 말하자면 java의 데이터 타입중 기본 타입(primitive type)과 참조 타입(reference type)이 있다. 기본 타입의 대표 예시로는 int가 있고, 참조 타입의 대표 예시로는 String이 있다. 참조 타입은 객체의 생성 이전에는 할당된 메모리 주소가 없는 null을 참조하는 변수이며, 이때 할당된 주소가 없는 null 상태의 변수를 가지고 작업을 진행하다면 NPE를 맞딱뜨리게 된다. 간과하기 쉬운 예외 물론 NPE를 처리 안한다고 당장 서비스가 안돌아가는건 아니다. 하지만 매번 불필요한 NPE로 st..

@JsonUnwrapped의 개념과 사용법

JsonUnwrapped란? 객체 내부의 프로퍼티(Property), 다시말해 객체 내부의 변수가 unwrapped 상태로 직렬화가 이루어져야할때 사용되는 어노테이션이다. 이해하기 쉽게 아래 예시를 봐보자. Department.java package com.logicbig.example; public class Department { private String deptName; private String location; ............. } Employee.java package com.logicbig.example; import com.fasterxml.jackson.annotation.JsonUnwrapped; public class Employee { private String name; ..