전체 글 363

(Linux) Too many open files 에러가 발생하는 경우

Too many open files 에러가 발생하는 경우 해당 포스팅은 Linux 서버에서 발생하는 'Too many open files' 에러에 대한 해결 방법과 해당 에러가 발생할 수 있는 상황에 대해서 살펴본 내용입니다. File Descriptor / open files Too many open files 에러에 대해 살펴보기 위해서는 먼저 '파일 디스크립터(File Descriptor / open files)'에 대해서 알아야 하는데요. Linux에서는 파일을 열면(open) 파일 디스크립터를 반환하며, 반환된 파일 디스크립터는 파일을 읽고 쓰는 데 사용됩니다. 문제는 리눅스 환경에서 Java의 소켓 통신(HTTP, API, JDBC 커넥션 등) 또한 파일로 취급된다는 것인데요. 때문에 소켓을 ..

Programming/Linux 2023.10.18

RabbitMQ 개념과 구조 정리 (Exchange Type, Dispatch 등)

RabbitMQ 개념과 구조 정리 RabbitMQ란? 'RabbitMQ'는 AMQP를 구현하여 메시지 생성자와 소비자 사이에서 메시지를 중계해 주는 '메시지 브로커'입니다. * AMQP(Advenced Message Queuing Protocol) 메시지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜 RabbitMQ는 메시지 지향 미들웨어(Message Oriented Middleware)에 속하는데요. 메시지 지향 미들웨어는 비동기 메시지를 사용하는 응용프로그램들 사이에서 데이터를 송수신하는 것을 의미하며, 이러한 시스템을 구현한 솔루션을 '메시지 큐(Message Queue)'라고 합니다. 그렇다면 메시지 큐를 사용하는 이유는 무엇일까요? 메시지 큐를 사용함으로써 얻을 수 있는 이점은 아래와 ..

@RequestMapping 정규식, PathPattern 활용하기

@RequestMapping 정규식, PathPattern 활용하기 '@RequestMapping'에는 정규식과 PathPattern을 적용할 수 있는데요. 이런 기능이 있는 줄 모르고 있었는데, 간단하고 또 활용성 있는 기능인 것 같아서 정리하게 되었습니다. @RequestMapping 정규식 사용 방법 @RequestMapping(value = "{변수명:정규식}") public void request(@PathVariable String 변수명) { ... } @RequestMapping에서는 다음과 같이 '{변수명:정규식}' 형식을 통해 정규식을 적용할 수 있는데요. //영문 대소문자 //http://localhost:8080/request/TestValue @RequestMapping("/req..

OSIV(Open Session In View) 개념 정리 및 예시

OSIV(Open Session In View) 개념 정리 및 예시 spring.jpa.open-in-view=false application.properties(또는 yml) 파일의 내용을 항상 복사 붙여 넣기 식으로 사용하고, 또 동작에 문제가 없었기 때문에 'spring.jpa.open-in-view' 옵션이 어떤 역할을 하는지 모르는 상태로 계속 사용해 왔었는데요. 최근 프로젝트에서 해당 옵션 값으로 인해 문제가 발생하면서 'OSIV(Open Session In View)'가 무엇인지 찾아보고 정리하게 되었습니다. OSIV란? 먼저 JPA의 EntityManager가 Hibernate에서는 Session이라고 불리는데요. OSIV의 Session은 이 세션을 의미합니다. 때문에 사실 JPA에서는 ..

spring boot email 전송 (spring-boot-starter-mail, mailjet)

Spring Boot Email 전송하기 (+ Mailjet) 해당 포스팅은 스프링 부트에서 'spring-boot-starter-mail' 의존성을 사용하여 이메일을 전송하는 코드 예시입니다. 전체 코드는 포스팅 맨 하단에 github 주소를 링크해 두었으니 참고해 주시면 좋을 것 같습니다. (아래 이메일 발송 코드는 spring boot 3.1.4 환경에서 작업되었습니다.) SMTP SMTP는 'Simple Mail Transfer Protocol'의 약자로 인터넷을 통해 이메일을 보내고 받는 데 사용되는 통신 프로토콜인데요. SMTP 서버는 SMTP 프로토콜(Simple Mail Transfer Protocol)을 사용하여 메일을 보내는 메일 서버의 구성 요소를 말하며, 이메일 발신 작업에만 사용되..

Dart Class 기본적인 사용법 정리

Dart 언어 Class 기본적인 사용법 정리 Dart는 객체 지향 프로그래밍 언어이며, Flutter 역시 객체 지향 프레임워크인데요. 객체 지향 프로그래밍(OOP)에서는 특정 객체를 생성하기 위한 틀인 클래스(class)가 중요하기 때문에 'Dart 언어의 기본적인 Class 사용법'을 정리한 내용입니다. Class class Student { String name = "leo"; int grade = 3; final String birth = "920101"; void info() { print("name: $name, grade: $grade"); } } void main() { var student = Student(); //출력 가능 print(student.name); //수정 가능 stud..

Programming/Flutter 2023.09.24

Prometheus 설정 및 실행, 사용 방법(+ PromQL)

프로메테우스 Prometheus 설정 및 실행, PromQL 사용 방법 해당 포스팅은 'Spring Boot Actuator', 'Prometheus 개념 및 특징' 포스팅에서 이어지는 내용으로 prometheus.yml 파일을 통한 프로메테우스 설정 및 실행, 그리고 기본적인 PromQL 사용 방법에 대한 내용입니다. 메트릭을 가져오기 위해 actuator가 실행되어 있어야 하며, actuator에 대한 선행 작업이 필요하신 경우 아래 포스팅을 참고하시면 좋을 것 같습니다. 2023.09.09 - [Programming/Monitoring] - Spring Boot Actuator(+ Micrometor) 모니터링 시스템 구축 1편 (spring boot 프로젝트 기반 모니터링 시스템 구축 관련 포스팅..

세아제강지주, 앞으로의 주가 흐름이 궁금한 종목

탄탄한 실적과 해상풍력(세아윈드)까지 앞으로의 흐름이 궁금한 종목, 세아제강지주 기존 강관 사업으로 인한 탄탄한 실적과 더불어 해상풍력 관련주로도 관심을 받고 있는 '세아제강지주'에 대한 내용 정리입니다. 세아제강지주는 매출 및 영업이익이 큰 폭으로 증가하고 있으며, 2.47이라는 PER로 봤을 때도 상당히 저평가로 상당히 저평가로 여겨지는데요. 하지만 실제 매출이나 영업이익 대비 주주 환원이 좋지 않다고 생각되며, 이 외에도 지주사의 특징상 자산가치 대비 저평가를 받을 수밖에 없는 구조라고 생각되기 때문에, 적은 비중으로 보유하고 있는 종목이지만 투자로 인한 수익의 시점보다는 앞으로 어떻게 흘러갈지가 궁금한 종목이라 내용을 기록해 보게 되었습니다. * 종목에 대한 추천이 아니며, 투자에 대한 판단과 책..

Finance 2023.09.16

Prometheus 개념 및 특징 정리, 모니터링 시스템 구축 2편

모니터링 시스템 구축 2편, Prometheus 개념 및 특징 이전 포스팅을 통해 '모니터링의 개념과 목적' 그리고 spring-boot-actuator, Prometheus, Grafana를 통한 '모니터링 시스템 구축의 전체적인 흐름'에 대해서 살펴보았으며, 그중에서 'Actuator'와 'Micrometor'에 대해서 자세하게 알아봤습니다. 2023.09.09 - [Programming/Monitoring] - Spring Boot Actuator(+ Micrometor) 모니터링 시스템 구축 1편 이어지는 이번 포스팅에서는 actuator에서 만들어진 메트릭을 수집 및 통합하여 저장하는 역할을 하는 'Prometheus'의 개념과 특징에 대해 살펴보겠습니다. Prometheus 개념 및 특징 Pr..

Spring Boot Actuator(+ Micrometor) 모니터링 시스템 구축 1편

스프링 부트 모니터링 시스템 구축 - Spring Boot Actuator, Micrometor 해당 포스팅에서는 스프링 부트 프로젝트를 기반으로 하여 'spring-boot-actuator', 'Prometheus', 'Grafana'를 연동한 모니터링 시스템 구축에 대한 전체적인 흐름과 각각의 기능 그리고 실제 연동 방법에 대해서 살펴볼 예정입니다. 하나의 포스팅에서 다루기는 많은 내용이기 때문에 시리즈로 이어지며, 해당 포스팅에서는 Actuator에 대한 자세한 내용과 Micrometor의 역할에 대해 간단하게 다루고, 이어지는 포스팅에서 Prometheus와 Grafana에 대해 다뤄 볼 예정입니다. 모니터링(Monitoring) 시스템 '모니터링'이란 시스템 상의 상태 변화를 지속적으로 감시하는..

(Spring Boot) Filter를 통한 Request, Response Logging

Filter를 통한 Request, Response Logging 방식과 발생했던 문제 개발을 하다 보면 요청된 Request에 대한 로깅이 필요한 경우가 생기는데요. 해당 포스팅은 'Filter를 통해 Request, Response에 대한 로깅을 남기는 방법과 그 과정에서 발생했던 문제점'에 대해 기록한 내용입니다. *** Logging의 경우 Filter가 아닌 인터셉터(Interceptor) 또는 AOP(Aspect Oriented Programming)로도 처리가 가능한데요. 각각의 방식에 대한 용도와 장단점이 있겠지만, 여기서는 필터 체이닝 과정에서 ServletRequest, ServletResponse 객체에 대한 조작이 가능하다는 점과 스프링 영역 밖(Dispatcher Servlet 전..

Flutter 학습 전 Dart 언어의 특징 살펴보기

Dart 언어의 특징 살펴보기 해당 포스팅은 Flutter 학습 전 'Dart 언어에 대한 특징'을 살펴보며 정리한 내용입니다. Dart와 Flutter 'Dart'는 구글이 JavaScript를 대체하기 위해 2011년 개발한 웹 프로그래밍 언어인데요. '세련되지 않은 언어적 특성과 높은 러닝 커브', 'TypeScript 등 JavaScript를 대체할 수 있는 다른 언어의 등장', 'Dart로 이루어진 구현체가 없다는 점' 등의 이유로 인해 좋은 평가를 받지 못했습니다. (심지어 2018년에는 배울 필요가 없는 프로그래밍 언어 1위를 차지하기도 했었습니다.) 하지만 2017년 구글에서 클로스 플랫폼 앱 프레임워크인 'Flutter'를 발표한 이후 상황이 바뀌기 시작했습니다. 플러터의 가장 큰 장점은..

Programming/Flutter 2023.08.29

MySQL Workbench, ERD 생성 방법(+ zero or one 설정 방법)

MySQL Workbench, ERD 생성 방법 ERD란, Entity Relationship Diagram의 약자로 Entity 개체의 관계를 표시하는 다이어그램을 말합니다. (ER 다이어그램이라고도 부릅니다.) ERD는 데이터베이스의 구조를 한눈에 알아보기 위해 사용되는데요. 'Draw.io', 'DBDiagram.io' 등 웹 또는 프로그램을 통해 사용할 수 있는 ERD 툴이 존재하지만, RDBMS로 MySQL을 사용하는 경우 Workbench 자체적으로 ER 다이어그램 툴이 내장되어 있습니다. 해당 포스팅에서는 'MySQL의 Workbench를 통해 ERD를 생성하는 방법'에 대해 정리하였습니다. (작업 환경은 MySQL Workbench 8.0.30 Version입니다.) Workbench를 통..

Programming/MySQL 2023.08.27

JPA save, saveAll 성능 차이가 발생하는 이유

JPA save(), saveAll() 성능 차이가 발생하는 이유(Feat. @Transactional) Spring Data Jpa에서 데이터를 insert 할 때 'save()' 메서드 또는 'saveAll()' 메서드를 사용할 수 있는데요. 구현된 코드를 살펴보면 saveAll() 메서드는 내부적으로 save() 메서드를 반복하는 구조로 되어 있습니다. 그러면 단순하게 생각해서 여러 건의 데이터를 반복문을 통해 각각 save() 하는 것과 한 번에 saveAll() 하는 것에는 차이가 없을 것 같은데요. 결론을 먼저 말씀드리면, 여러 건의 데이터를 insert 할 때는 saveAll() 메서드를 사용하는 것이 성능상 더 좋으며, 해당 포스팅은 'saveAll()을 사용하였을 때 성능 차이가 발생하는..

x-www-form-urlencoded 타입이란 (multipart/form-data와의 차이점)

x-www-form-urlencoded와 multipart/form-data 차이점 //기존에 설정된 springdoc consumes default-consumes-media-type: multipart/form-data //변경된 설정 default-consumes-media-type: application/x-www-form-urlencoded 프로젝트 작업 중 동료분으로부터 'multipart/form-data'로 설정된 springdoc default-consumes-media-type을 'application/x-www-form-urlencoded'로 바꾸는 게 어떻겠냐는 제안을 받았습니다. (consumes: 클라이언트가 서버에 보내는 데이터 타입, produces: 서버가 클라이언트에게 반..

Programming/Web 2023.08.23