[JAVA] try-with-resources 정리
·
BackEnd/JAVA
1. try-with-resources란?try-with-resources는 자원을 자동으로 관리하기 위한 구문으로, 자원을 명시적으로 닫지 않아도 자동으로 해제됩니다. 파일, 네트워크 소켓, 데이터베이스 연결과 같은 자원들은 반드시 사용 후 닫혀야 합니다. 자바 7에서 도입된 try-with-resources는 이러한 자원을 자동으로 해제하는 구조를 제공합니다.1.1 자원(Resource)이란?자바에서 자원이란 사용 후 반드시 해제해야 하는 외부 시스템과의 연결을 의미합니다. 파일, 데이터베이스 연결, 네트워크 소켓 등이 자원에 해당합니다. 자원을 닫지 않으면 메모리 누수나 시스템 리소스 고갈 문제가 발생할 수 있습니다.1) 자원의 종류파일: 파일을 읽고 쓰기 위한 FileReader, Buffered..
[JAVA] 자바 부모클래스 및 인터페이스 심화: 오버라이딩과 메서드 동작
·
BackEnd/JAVA
1. 자바 부모 클래스와 인터페이스 메서드를 오버라이딩 하지 않게 하는 방법자바에서 인터페이스나 부모 클래스의 메서드를 오버라이딩하지 않게 하려면 final 키워드를 활용하는 것이 핵심입니다. 하지만, 각각의 경우에서 어떻게 적용되는지 좀 더 자세히 설명드리겠습니다.1.1 부모 클래스 메서드를 오버라이딩 하지 않게 하려면부모 클래스에서 자식 클래스가 특정 메서드를 오버라이딩하지 못하게 하려면, 해당 메서드를 final로 선언해야 합니다. final로 선언된 메서드는 자식 클래스에서 오버라이딩할 수 없습니다.class Parent { public final void someMethod() { // 이 메서드는 오버라이딩 불가 }}class Child extends Parent { ..
[Monitoring] Prometheus와 MySQL Exporter로 Grafana MySQL DB 모니터링 시스템 구축하기
·
DevOps/Monitoring
1. 시작하며사이드 프로젝트를 진행하면서 Spring Boot 애플리케이션의 모니터링 시스템을 구축하던 중, 데이터베이스 상태를 실시간으로 모니터링할 수 있는 환경도 필요하다는 생각이 들었습니다. 데이터베이스는 서비스 성능과 안정성에 중요한 영향을 미치는 핵심 요소이기 때문에, 이를 효과적으로 관리하고 분석할 수 있는 시스템 구축이 필요했습니다.Grafana에 대해 조사하던 중, MySQL 데이터베이스 모니터링 대시보드를 손쉽게 구성할 수 있다는 점을 알게 되었습니다. 이번 프로젝트에서는 Prometheus와 MySQL Exporter를 활용해 데이터를 수집하고, Grafana 대시보드를 통해 이를 시각화하여 MySQL 모니터링 시스템을 구축하는 과정을 공유하려고 합니다.1.1 프로젝트 구조와 목표이 프..
[트러블 슈팅] RESTful API 설계: GET 메서드에서 Request Body를 사용해도 될까?
·
트러블 슈팅
1. 시작하며회사에서 진행 중인 프로젝트에서 프론트엔드와 백엔드 간 통신에서 예상치 못한 문제가 발생했습니다. API 설계 시 Spring Boot에서 GET 메서드에 @RequestBody를 사용해 데이터 요청을 처리하도록 구성했는데, Postman을 이용한 테스트에서는 정상적으로 동작했지만, Axios를 사용하는 프론트엔드 클라이언트에서는 요청이 실패했습니다.당시 Parameter 값이 많아 DTO를 record로 정의한 뒤 @RequestBody로 데이터를 전달받도록 설계했지만, 클라이언트와의 통신에서는 400 Bad Request 에러가 발생하며 정상적으로 동작하지 않았습니다. 이 글에서는 해당 문제를 해결하며 알게 된 GET 메서드와 Request Body의 관계, 그리고 RESTful API ..
[JAVA] 인터페이스 정리
·
BackEnd/JAVA
1. 인터페이스란?자바에서 인터페이스는 클래스가 구현해야 하는 메서드의 규격(계약)을 정의하는 역할을 합니다. 즉, 행동의 청사진(스펙)을 제공하며, 인터페이스에 선언된 메서드들을 해당 인터페이스를 구현하는 클래스가 반드시 구현해야 합니다.인터페이스는 자바의 다형성(Polymorphism)을 지원하는 중요한 개념 중 하나로, 이를 통해 서로 다른 클래스들이 동일한 방식으로 호출될 수 있도록 보장합니다.2. 인터페이스의 특징2.1 메서드 선언만 존재 (자동으로 public abstract 적용)인터페이스 내의 메서드는 구현부가 없는 추상적인 메서드입니다. 별도로 public 또는 abstract를 명시하지 않아도, 모든 인터페이스 메서드는 자동으로 public과 abstract가 적용됩니다. 즉, 인터페이..
[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: ..