[CICD] Nginx + Docker Compose로 구현한 Blue-Green 배포 전략
·
DevOps/CICD
1. 시작하며사이드 프로젝트를 운영하면서 백엔드 코드 변경이 빈번하게 발생했습니다. 신규 기능 추가뿐만 아니라 리팩토링 작업과 성능 개선을 포함한 지속적인 코드 품질 향상을 위해 이루어진 작업이었습니다. 하지만 배포 단계에서 서비스 중단이 발생할 가능성이 큰 문제가 되었습니다.서비스 중단은 사용자 경험에 직접적인 영향을 미칠 수 있으며, 특히 실시간으로 사용되는 서비스라면 이는 치명적일 수 있습니다. 서비스 운영 중에도 배포가 이루어지더라도 사용자에게 중단 없는 경험을 제공하는 것이 목표였습니다.이를 위해 무중단 배포 전략을 도입하기로 결정했습니다. 기존에는 간단히 Docker 컨테이너를 종료하고 새 컨테이너를 띄우는 방식으로 배포를 진행했지만, 이 과정에서 서비스가 일시적으로 중단되는 문제가 있었습니다..
[JAVA] 추상 클래스 (Abstract Class) 정리
·
BackEnd/JAVA
1. 추상 클래스 (Abstract Class)란?추상 클래스란 클래스의 설계도를 제공하지만 완전하지 않은 클래스입니다. 즉, 일부 메서드는 구현되어 있지만, 구체적인 내용을 정의하지 않은 추상 메서드를 포함할 수 있습니다. 추상 클래스는 직접 객체를 생성할 수 없으며, 상속을 통해 자식 클래스에서 구체적으로 구현해야 합니다.1.1 추상 클래스 정의추상 클래스는 abstract 키워드를 사용하여 선언합니다.추상 메서드도 abstract 키워드를 사용하며, 해당 메서드는 내용 없이 메서드 선언만 있습니다.자식 클래스에서 추상 메서드를 반드시 구현해야 합니다.2. 추상 클래스의 특징2.1 추상 클래스는 객체를 생성할 수 없다.추상 클래스는 불완전한 클래스이므로 직접적으로 객체를 생성할 수 없습니다. 추상 메..
[JAVA] 접근 지정자 (Access Modifiers) 정리
·
BackEnd/JAVA
1. 접근 지정자란?자바에서 접근 지정자(access modifier)는 클래스, 메서드, 변수 등에 대한 접근 범위를 설정하는 키워드입니다. 접근 지정자는 클래스 외부에서 해당 멤버에 대해 어디까지 접근할 수 있는지를 제어합니다. 접근 범위를 설정함으로써 캡슐화(encapsulation)를 강화하고, 코드의 보안성과 유지보수성을 높일 수 있습니다.접근 지정자는 총 네 가지가 있으며, 각각은 해당 멤버에 대해 접근할 수 있는 범위(동일 패키지, 자식 클래스, 외부 클래스 등)를 제한하거나 허용하는 역할을 합니다. 클래스 설계 시 접근 지정자를 적절히 사용함으로써 데이터 보호, 코드의 모듈화, API의 안정성 등을 보장할 수 있습니다.2. 접근 지정자의 종류2.1 public 접근 지정자정의: public..
[Spring] @ResponseBody VS ResponseEntity<T>
·
BackEnd/Spring & JPA
1. @ResponseBody란?@ResponseBody는 Spring MVC에서 컨트롤러 메서드가 반환하는 값을 HTTP 응답 본문으로 직렬화하여 클라이언트에게 전달할 때 사용됩니다. 반환되는 데이터는 Jackson 라이브러리를 사용하여 JSON 형식으로 변환됩니다. 기본적으로 HTTP 상태 코드는 200 OK로 설정되며, 데이터만 반환하는 단순한 API 응답 처리에 주로 사용됩니다.1.1 @ResponseBody의 주요 특징JSON, XML과 같은 포맷으로 데이터를 반환HTTP 상태 코드는 기본적으로 200 OK주로 REST API 응답에서 사용뷰를 반환하지 않고 데이터를 직렬화하여 전달2. ResponseEntity란?ResponseEntity는 HTTP 응답의 상태 코드, 헤더, 본문을 모두 명시..
[Spring] @Controller VS @RestController
·
BackEnd/Spring & JPA
1. @Controller 란?@Controller는 Spring MVC 패턴에서 주로 사용되는 어노테이션으로, 웹 페이지(View)를 반환하기 위해 사용됩니다. 이 어노테이션을 통해 컨트롤러 클래스를 정의하면, 클라이언트 요청을 받아서 JSP나 Thymeleaf와 같은 뷰(View)를 생성하여 반환할 수 있습니다. Spring에서 @Controller는 주로 전통적인 웹 애플리케이션에서 페이지를 렌더링할 때 사용됩니다.1.1 @Controller 동작 흐름클라이언트 요청: 클라이언트는 브라우저 또는 HTTP 클라이언트를 통해 DispatcherServlet으로 URI에 해당하는 요청을 보냅니다. 예를 들어 /users/detailView와 같은 URI로 요청이 들어옵니다.Handler Mapping: ..
[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 컨테이너를 관리하려면 ..