[JAVA] 자바에서 main 메서드가 static인 이유
·
BackEnd/JAVA
자바를 처음 배우면 가장 먼저 접하는 메서드가 바로 main 메서드입니다. 하지만 "왜 main 메서드는 항상 static으로 선언되어야 하는가?"라는 질문에 대해 깊이 생각해 본 적 있으신가요? 이번 포스팅에서는 자바의 main 메서드와 static 키워드의 관계를 쉽게 이해할 수 있도록 정리해 보겠습니다.1. main 메서드란?main 메서드는 자바 애플리케이션의 진입점(entry point)입니다. JVM(Java Virtual Machine)은 프로그램 실행 시 가장 먼저 main 메서드를 호출하여 프로그램을 시작합니다.public static void main(String[] args) { // 실행될 코드}구성 요소public: JVM이 외부에서 접근할 수 있도록 선언static: 객체 ..
[Spring] 스프링 개념 및 동작 원리 정리
·
BackEnd/Spring & JPA
1. Spring framework란?Spring Framework는 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크입니다. 엔터프라이즈급 애플리케이션을 개발할 수 있는 기능을 종합적으로 제공하면서도 경량화된 솔루션을 제시합니다.일반적인 엔터프라이즈급 개발에서는 과도한 엔지니어링 기술로 인해 고가의 WAS(Web Application Server)가 필요하지만, Spring은 필요한 기술을 가볍고 단순한 환경에서 사용할 수 있도록 제공합니다.2. Spring framework 특징2.1. IoC (Inversion of Control, 제어의 역전)IoC는 객체의 생성과 관리 제어권을 개발자가 아닌 스프링 컨테이너에 넘기는 개념입니다. 전통적으로는 개발자가 직접 객체를 생성하고 의존성을 관리해야 했지..
[Database] 인덱스를 타지 않는 쿼리 10가지 경우 정리
·
Database
인덱스(Index)는 B-Tree 구조 또는 기타 정렬된 구조를 기반으로 빠르게 데이터를 검색하는 도구입니다. 하지만 특정 조건이나 쿼리 작성 방식에 따라 인덱스가 무시되고 Full Table Scan이 발생합니다. 이러한 상황을 정확히 이해하고, 이를 피하는 것이 데이터베이스 최적화의 핵심입니다.1. 함수나 연산자를 사용하는 경우인덱스가 설정된 컬럼에 함수나 연산자를 사용하면 인덱스를 타지 않고 전체 스캔(Full Scan)이 일어납니다.예제 코드-- 함수 사용SELECT * FROM ExampleTable WHERE UPPER(Name) = 'JOHN';-- 연산자 사용SELECT * FROM ExampleTable WHERE Age + 1 = 30;1.1 Full Scan이 일어나는 이유인덱스는 정..
[Database] 데이터베이스 PK 전략 정리
·
Database
1. PK (Primary Key)전략이란??Primary Key (PK)는 테이블 내에서 각 행을 유일하게 식별하는 데 사용되는 필드입니다. PK는 데이터베이스에서 데이터를 정확하게 조회하고, 수정하며, 삭제하는 데 매우 중요합니다. PK를 생성하는 방법에는 여러 가지가 있지만, 가장 흔한 두 가지는 AUTO_INCREMENT와 UUID입니다.1.1 AUTO_INCREMENT란?AUTO_INCREMENT는 MySQL과 같은 데이터베이스에서 많이 사용되는 기본 키 생성 전략입니다. 데이터가 삽입될 때마다 숫자가 1씩 증가하여 자동으로 기본 키가 생성됩니다.CREATE TABLE member ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(255) NO..
[Monitoring] Portainer로 Sub Server Docker 환경 관리하기
·
DevOps/Monitoring
1. 시작하며최근 사이드 프로젝트를 진행하며 Docker 환경에서 여러 컨테이너를 효과적으로 관리하기 위해 Portainer를 활용해보기로 했습니다. 특히, Main Server(192.168.0.25)에 있는 Docker 컨테이너뿐만 아니라 Sub Server(192.168.0.47)의 컨테이너들도 GUI 기반 툴을 이용해 한곳에서 관리하고자 했습니다. 이를 위해 Sub Server의 Docker Daemon 설정을 수정하고 Portainer Agent를 설치하여 Main Server의 Portainer에서 Sub Server를 연결하는 과정을 정리해보았습니다.2. Sub Server에서 Docker Daemon 설정 수정Main Server에서 Sub Server의 Docker 컨테이너를 관리하려면 ..
[성능 개선] 여러 개의 업데이트를 하나의 트랜잭션으로 처리하기 (Feat. Mybatis, Bulk Update)
·
성능 개선
1. 시작하며최근 회사에서 Quartz 스케줄링을 통해 서버 디렉토리에 저장된 파일 상태와 데이터베이스의 기존 데이터를 비교하여 주기적으로 업데이트하는 작업을 개발했습니다.하지만 초기 구현 방식은 트랜잭션이 여러 번 발생하면서 성능 저하가 심각하게 발생했습니다. 이에 Bulk Update를 도입하여 성능을 대폭 개선한 사례를 공유하고자 합니다.회사 해당 프로젝트 코드는 반입이 금지되어 있으니 이 글에서는 여러 게시글 데이터를 한 번에 업데이트하는 방법과 함께 성능 최적화 및 Null 처리 시 주의사항을 설명합니다.2. 기존 방식의 문제점기존 코드는 애플리케이션단 코드에서 개별 데이터를 업데이트하는 쿼리를 반복적으로 실행하면서 트랜잭션이 여러 번 발생하는 문제가 있었습니다.2.1 기존 코드1) 기존 Myb..
[트러블 슈팅] Jenkins Publish over SSH: BapPublisherException 오류 해결하기
·
트러블 슈팅
1. 시작하며Jenkins를 활용한 CI/CD 파이프라인 설정 중 Publish over SSH 플러그인을 사용하여 서버 간 파일 전송 및 배포를 설정하려 했지만, 예상치 못한 인증 오류로 인해 막히는 경우가 종종 있습니다. 이번 포스트에서는 BapPublisherException 오류의 원인과 해결 방법을 공유합니다.2. 문제점 발생Main Server(192.168.0.25)에 설치된 Jenkins를 통해 Sub Server(192.168.0.47)로 배포를 진행하려고 했습니다. 이를 위해 Jenkins의 Publish over SSH 플러그인을 사용하여 SSH 통신을 설정했지만, 다음과 같은 오류가 발생했습니다.jenkins.plugins.publish_over.BapPublisherExceptio..
[트러블 슈팅] SSH 접속 오류: 포트 설정과 포트포워딩의 중요
·
트러블 슈팅
1. 시작하며최근 라즈베리파이5를 Sub Server로 설정하여 원격 접속을 통해 관리하던 중, 갑자기 외부에서 SSH로 접속이 되지 않는 문제가 발생했습니다. 사설 IP로는 정상적으로 접속이 가능했지만, 공인 IP를 통한 외부 접속에서는 실패하였습니다. 본 포스트에서는 문제의 원인을 분석하고 해결 과정을 공유하고자 합니다.2. 문제점 발생외부에서 공인 IP를 이용한 SSH 접속이 불가능한 상황이었습니다. 이는 네트워크 설정 혹은 SSH 설정의 문제로 추정되었습니다.2.1 원인 분석1) SSH 설정 확인하기먼저, 서버의 SSH 설정을 확인해보겠습니다. 아래 명령어를 통해 설정 파일을 열어 확인하겠습니다.sudo nano /etc/ssh/sshd_config해당 파일에서 SSH 연결 포트가 기본값인 22가..
[JAVA] 레코드 (record) 정리
·
BackEnd
1. 레코드 (record)란?자바에서 record는 자바 16부터 정식 기능으로 도입되어, 자바 17에서 계속해서 사용되고 있는 기능입니다. record는 불변의 데이터 운반 객체를 간단하게 생성할 수 있는 방법을 제공합니다. 이는 주로 데이터를 담기 위한 클래스에 매우 유용하며, 클래스를 정의할 때 필요한 상용구 코드(boilerplate code)의 양을 대폭 줄여줍니다.2. record의 주요 특징들2.1 불변성 (Immutability)레코드는 불변 객체입니다. 레코드의 모든 필드는 final로 선언되며, 객체가 생성된 후에는 필드 값을 변경할 수 없습니다. 즉, 레코드는 객체의 상태가 절대 바뀌지 않도록 보장합니다.public record Person(String name, int age) {..