> pg_prewarm 사용하기
데이터베이스가 재시작되면 버퍼에 유지되고 있던 데이터들은 모두 제거되며 shared buffer에 다시 채워지기 전까지 해당 데이터에 접근하면 쿼리 성능이 떨어진다. 이때 pg_prewarm을 사용하면 수동 캐싱을 하거나 환경설정을 통해 자동 캐싱을 할 수 있...
데이터베이스가 재시작되면 버퍼에 유지되고 있던 데이터들은 모두 제거되며 shared buffer에 다시 채워지기 전까지 해당 데이터에 접근하면 쿼리 성능이 떨어진다. 이때 pg_prewarm을 사용하면 수동 캐싱을 하거나 환경설정을 통해 자동 캐싱을 할 수 있...
일시적인 배치 작업으로 대량 데이터들을 처리해야된다면 이전에 배웠던 Shared Buffer 영역을 사용하게 될것이다. 해당 데이터들은 일시적으로 사용되는 데이터들인데 Shared Buffer 영역을 차지하게 되면 정작 hit율이 많은 데이터들은 victim 버...
데이터베이스 시스템에서 메모리는 한정된 고비용 자원이기 때문에 효율적인 관리가 필수적입니다. PostgreSQL에서는 이를 위해 Clock Sweep 알고리즘을 사용하여 공유 버퍼를 관리합니다. 메모리에 올라와 있는 데이터가 자주 사용되지 않는다면(즉, 캐시 ...
일단 shared buffer 영역이 존재하는 이유는 매번 쿼리를 날릴때마다 DB는 디스크에 접근해서 데이터를 가져오기엔 비용과 부하가 발생한다. 이걸 해결하려면 메모리에 데이터를 미리 캐싱해서 올려두면 매번 디스크 IO를 발생시키지않고 응답속도와 비용절감을 ...
create table tab_OID(id integer); --테이블생성 -- 위에서 생성한 테이블의 oid 조회 select OID, relname from pg_class where relname ='tab_oid'; --16426,tab_oid selec...
[Kubernetes] CNI, Flannel, 그리고 Service의 차이 완벽 정리 쿠버네티스를 공부하다 보면 네트워크 부분에서 머리가 아파옵니다. CNI, Flannel, Service… 다 통신을 하게 해주는 것 같은데, 도대체 무슨 차이가 있을까요? ...
[Kubernetes] Kind로 실습하며 정리한 핵심 개념 요약 (노드, 컨트롤러, 서비스) 로컬 쿠버네티스 학습 도구인 **Kind(Kubernetes in Docker)**를 사용하여 실습하면서 알게 된, 초심자가 헷갈리기 쉬운 핵심 개념들을 정리해 보았...
MySQL InnoDB 스토리지 엔진은 모든 테이블 데이터를 B+Tree 구조의 클러스터드 인덱스(Clustered Index) 형태로 저장하며, 실제 디스크 상의 데이터는 16KB 단위의 페이지(Page)로 구분되어 .ibd 단일 테이블스페이스 파일에 기록...
PostgreSQL은 데이터를 8KB 크기의 힙 페이지(Heap Page 또는 Block) 단위로 관리합니다. 디스크 I/O와 메모리(Shared Buffers) 적재의 최소 단위인 이 페이지 내부에서 각 행(Tuple) 데이터는 무작위로 위치하는 것이 아니...
Oracle 오라클에서 트랜잭션이 커밋되면 트랜잭션 테이블의 undo 세그먼트 헤더의 state 값을 10(active) -> 9(committed) 처리 scn(system change number)에는 현재 커밋시점의 scn으로 업데이트 ...
예시의 데이터로 tmin=1, value=”one”데이터가 트랜잭션으로 수정이 발생하면 물리적으로 새 로우가 생성되고 tmin=2, tmax=null, value=”two” 상태로 생성 변경전의 로우에는 tmax=2로 변경이 된다.(현재 value=...
Oracle Database는 멀티버전 동시성 제어(MVCC) 및 트랜잭션 롤백(Rollback)을 실현하기 위해 데이터 블록 헤더 내 ITL(Interested Transaction List)과 Undo Segment 구조를 정교하게 활용합니다. 이 포스팅에...
스프링 프레임워크 기반 백엔드 애플리케이션 개발 시 조회 전용 서비스 메서드에 @Transactional(readOnly = true) 옵션을 부여하는 것은 보편적인 관례(Best Practice)입니다. 단순히 “조회 성능이 좋아진다”를 넘어, 계층별(스프링...
먼저 예시코드를 보고 진행해보자. void proxyFactoryBean() { ProxyFactoryBean pfBean = new ProxyFactoryBean(); // 프록시 객체를 만들수 있도록 함 pfBean.setTar...
TreeMap의 멀티스레드 환경에서의 문제와 해결 방법 회사 프로젝트에서 멀티스레드 환경에서 TreeMap을 이용하여 기본값을 설정하고, 요청이 오면 해당 값을 확인한 후 TreeMap에 값이 없으면 해당 값을 넣고 가져오는 방식의 로직을 사용했습니다. 그러나...
package org.example; import java.lang.ref.Cleaner; public class Room implements AutoCloseable { // 자동 자원 회수를 위한 인터페이스 구현 private static fina...
Spring Security와 JWT(JSON Web Token)를 결합하여 API 서버를 설계할 때 흔히 마주치는 시나리오 중 하나는, 인증되지 않은 사용자(예: Authorization 헤더에 JWT 토큰이 누락되었거나 유효하지 않은 경우)가 권한이 필요한 ...
자바에서 객체의 논리적 동등성을 비교하기 위해 반드시 이해해야 하는 두 메서드가 바로 equals()와 hashCode()입니다. 자바 기본 라이브러리인 Object 클래스에 정의되어 있으며 모든 자바 객체가 상속받습니다. 이번 포스팅에서는 hashCode()의...
안녕하세요, 백엔드 개발자 버즈입니다. 최근 회사 업무와 다양한 사유로 개인 블로그와 GitHub 활동에 다소 소홀했습니다. 그동안 회사 프로젝트 개발 및 새로운 기술 스택의 도입 때문에 눈코 뜰 새 없이 바쁜 시간을 보냈기 때문인데요. 오늘은 그 과정에서 겪었...
카프카 브로커/클러스터/주키퍼 카프카 브로커는 카프카 클라이언트와 데이터를 주고받기 위해 사용되는 주체이자 데이터를 분산 저장하여 장애가 발생하더라도 안전하게 사용할 수 있도록 도와주는 애플리케이션이다. 하나의 서버에는 한 개의 카프카 브로커 프로세스가 실행...
$ https://archive.apache.org/dist/kafka/3.0.0/kafka_2.12-3.0.0.tgz//자바 설치 $ java -version $ wget https://archive.apache.org/dist/kafka/3.0.0/kafka...
리눅스(Linux)나 맥(macOS) 환경에서 인프라 배포나 자동화 작업을 처리할 때 가장 먼저 찾게 되는 도구는 바로 Bash 셸 스크립트(Shell Script)입니다. 이번 포스팅에서는 셸 스크립트 파일 최상단에 붙는 #!/bin/bash의 의미와 함께, ...
입사하자마자 Spring Batch로 이용하여 멀티데이터베이스를 제어하는 코드를 짰다. 바로 본론으로 들어가보자. 1.resources/application.yml 생성 datasource: DB 종류 이름1: first: jdbc...
참조:https://oingdaddy.tistory.com/183 [[Spring Batch] Skip/Retry Simple Example (Springboot based) Spring Batch의 기본적인 기능들을 지난 포스팅들을 통해 알아보았다. 이번에...
참조:https://oingdaddy.tistory.com/180 [[Spring Batch] Listener Example (Springboot based) 지난 글에서 다뤘던 Springboot Batch Chunk Example에서 소스들을 살펴 볼때 ...
스프링 배치(Spring Batch)를 사용하다 보면 일반적인 스프링 빈(Bean)의 싱글톤(Singleton) 컨텍스트와는 다른 독특한 스코프 어노테이션인 @JobScope와 @StepScope를 접하게 됩니다. 이번 포스팅에서는 이 배치 전용 스코프들의 역할...
배치를 처리할 수 있는 방법은 크게 2가지가 된다. Tasklet을 사용한 Task기반 처리 배치 처리 과정이 비교적 쉬운 경우 쉽게 사용 대량 처리를 하는 경우 더욱 복잡 하나의 큰 덩어리를 여러 덩어리로 나누어 처리하기 부적합 @Bean ...
출처:https://cheese10yun.github.io/spring-batch-basic/ 스프링 부트 배치의 장점 대용량 데이터 처리에 최적화되어 고성능을 발휘한다. 효과적인 로깅,통계처리,트랜잭션 관리 등 재사용 가능한 필수 기능을 지원한다....
배치 처리나 주기적인 백그라운드 작업이 필요한 대규모 엔터프라이즈 시스템에서 신뢰성 높은 작업 예약을 위해 필수적으로 고려되는 자바 오픈소스 라이브러리가 있습니다. 바로 Quartz Job Scheduler입니다. 스프링 기본 스케줄러(@Scheduled)가 단...
참조:https://deeplify.dev/back-end/spring/batch-tutorial 스프링 배치(Spring Batch) 배치 프로세싱은 일괄처리하는 뜻을 가지고 있다. 일괄처리의 의미는 일련의 작업을 정해진 로직으로 수행하는 것이라고 할 수...
참조:https://velog.io/@modsiw/JPAJava-Persistence-API%EC%9D%98-%EA%B0%9C%EB%85%90 [JPA(Java Persistence API)의 개념 자바 ORM 기술에 대한 표준 명세로, JAVA에서 제공하는...
참조:https://velog.io/@max9106/Spring-AOP%EB%9E%80-93k5zjsm95 AOP란 Aspect Oriented Programming의 약자로 흩어진 Aspect들을 모아서 모듈화 하는 기법이다. 서로 다른 클래스더라도 비...
참조:https://leveloper.tistory.com/33 IoC(Inversion Of Control) IoC란 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성하게 하여 가독성 및 코드의 중복,유지보수를 편하게 할 수 있게 한다...
참조:https://velog.io/@wlsdud2194/what-is-di [[DI] Dependency Injection이란 무엇일까? Dependency Injection, 의존성 주입이 무엇이고 어떤 이점이 있는지 예시를 통해 정리한 글입니다. ve...
참조:https://velog.io/@taeha7b/api-restapi-restfulapi [API, REST API, RESTful API 개념정리 API, REST API, RESTful API 말은 많이 들었는데 무엇인지 모르는 분들, 추상적으로 ‘이...
소프트웨어 디자인 패턴 중 가장 빈번하게 사용되고 객체지향 설계의 꽃이라 불리는 패턴이 있습니다. 바로 전략 패턴(Strategy Pattern)입니다. 전략 패턴을 적용하면 알고리즘(실제 비즈니스 로직)을 사용하는 클라이언트 코드의 수정 없이도, 런타임에 동적...
파사드패턴이란? 건물의 정면을 의미하는 단어로 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴을 의미한다. 파사드 객체는 복잡한 소프트웨어 바깥쪽의 코드가 라이브러리의 안쪽 코드에 의존하는 일을 감소시켜 주고 ...
public class User1 extends Observer{ public User1(String msg){ this.msg = msg; } } 참조:https://coding-factory.tistory.com/710 ...
참조:https://coding-factory.tistory.com/713?category=974095 데코레이터 패턴이란? 데코레이터 패턴은 주어진 상황 및 용도에 따라 어떤 객체에 책임(기능)을 동적으로 추가하는 패턴을 말한다. 데코레이터 말 그대로 장...
참조:https://coding-factory.tistory.com/711 프록시 패턴이란? 프록시는 대리인이라는 뜻으로 무엇인가를 대신 처리하는 의미이다. 일종의 비서라고 생각하면 된다.사장님한테 사소한 질문을 하기보다는 비서한테 먼저 물어보는 개념이라고...
참조:https://lee1535.tistory.com/72?category=819409 [Lee’s Grow Up lee1535.tistory.com](https://lee1535.tistory.com/72?category=819409) 어뎁터 패턴이란?...
참조:https://elfinlas.github.io/2019/09/23/java-singleton/ [Java에서 싱글톤(Singleton) 패턴을 사용하는 이유와 주의할 점 Java에서 Singleton 패턴이란?Singleton(이하 싱글톤) 패턴은 자...
DAO(Data Access Object) 데이터베이스의 data에 접근하기 위한 객체이며 데이터베이스 접근을 하기 위한 로직과 비즈니스 로직을 분리하기 위해서 사용한다. 사용자는 자신이 필요한 interface를 DAO에게 던지고 이 interface를...
데이터베이스에서 데이터 통계를 낼 때 집계 함수인 COUNT()와 SUM()은 가장 기본적이고 널리 사용되는 SQL 함수입니다. 하지만 두 함수를 사용하면서 COUNT(*)는 정상 작동하지만 SUM(*)을 수행하려 할 때는 SQL 문법 에러(Syntax Erro...
데이터베이스에서 조회 쿼리(SELECT)를 실행할 때, 테이블에 저장된 실제 데이터를 가져오는 것뿐만 아니라 쿼리의 입력 파라미터로 전달된 값을 SELECT 결과 컬럼에 그대로 포함하여 다시 반환(Echoing)해야 할 때가 있습니다. 이번 포스팅에서는 이러한 ...
select select 열 이름(들) from 테이블명; =테이블명에서 열 이름(들)을 가지고 와라 전체출력-select * from 테이블명 응용-select 열이름1,열이름2 from 테이블명 (선택한 열이름들을 출력한다.) 1.숫자 제한 se...
REST는 Representational State Transfer의 약어로 하나의 URI는 하나의 고유한 리소르를 대표하도록 설계된다는 개념에 전송방식을 결합해서 원하는 작업을 지정한다.예를 들어 /boards/123은 게시물 중에서 123번이라는 고유한 의미...
게시물 관리에서 마지막은 다양한 검색 처리이다. 검색 기능은 다시 검색 조건과 키워드로 나누어 생각해 볼 수 있다.검색 조건은 일반적으로 태그를 이용해서 작성하거나 를 이용하는 경우가 많다.과거에는 를 이용하는 경우가 더 많았지만 최근에는 일반 웹사이트에...
URL으니 파라미터를 이용해서 정상적으로 원하는 페이지로 이동하는 것을 확인했다면 화면 밑에 페이지 번호를 표시하고 사용자가 페이지 번호를 클릭할 수 있게 처리한다. 페이지를 보여주는 작업은 다음과 같은 과정을 통해서 진행한다. 브라우저 주소창에서 페...
MyBatis는 SQL을 그대로 사용할 수 있기 때문에 인라인뷰를 이용하는 SQL을 작성하고 필요한 파라미터를 지정하는 방식으로 페이징 처리를 하게 된다.여기서 신경써야 하는 점은 페이징 처리를 위해서는 SQL을 실행할 때 몇 가지 파라미터가 필요하다는 점이다...
구현된 기능들 중 가장 미숙한 부분은 목록 페이지이다.목록 페이지는 기본적으로 페이징처리가 필요한데 상식적으로 생각해 봐도 수많은 데이터를 한 페이지에서 보여주면 처리 성능에 영향을 미친다.또한 브라우저에서도 역시 데이터의 양이나 처리 속도에 문제를 일으키게 된...
화면을 개발하기 전에는 반드시 화면의 전체 레이아웃이나 디자인이 반영된 상태에서 개발하는 것을 추천한다. 일부 개발자들은 화면을 나중에 처리한다고 생각하고 진행하는 경우가 있는데 결과적으로는 두 배의 시간을 들이는 결과가 될 가능성이 높기 때문에 권장하지는 않...
비즈니스 계층의 구현까지 모든 테스트가 진행되었다면 이제 남은 작업은 프레젠테이션 계층인 웹의 구현이다. Controller의 작성 스프링 MVC의 Controller는 하나의 클래스 내에서 여러 메서드를 작성하고, @ResquestMapping 등을 이용...
비즈니스 계층 비즈니스 계층은 고객의 요구사항을 반영하는 계층으로 프레젠테이션 계층과 영속 계층의 중간 다리 역할을 하게 된다. 영속 예층은 데이터베이스를 기준으로 해서 처리하게 된다. 예컨데,’쇼핑몰에서 상품을 구매한다’고 가정해 보자.해당 쇼핑몰의 로직...
영속/비즈니스 계층의 CRUD 구현 코드를 이용해서 데이터에 대한 CRUD 작업을 진행한다. 다음과 같은 순서로 진행한다. 테이블의 칼럼 구조를 반영하는 VO(Value Object) 클래스의 생성 MyBatis의 Mapper 인터페이스의 작성/X...
예제 프로젝트 구성 예제를 위한 프로젝트는 ex02 이름으로 생성하고 Spring Legacy Project로 생성한다. 프로젝트 생성한 후에는 pom.xml의 수정,데이터베이스 관련 처리,스프링 MVC 처리와 같은 순서로 진행한다. pom.xml &l...
일반적으로 웹 프로젝느는 3-tier 방식으로 구성한다. Presentation Tier(화면 계층)는 화면에 보여주는 기술을 사용하는 영역이다. 그동안 예제를 보면 Servlet/JSP나 스프링 MVC가 담당하는 영역이 된다. Presentation ...
Controller의 Exception 처리 Controller를 작성할 때 예외 상황을 고려하면 처리해야 하는 작업이 엄청나게 늘어날 수 밖에 없다. 스프링 MVC에서는 이러한 작업을 다음과 같은 방식으로 처리할 수 있다. @ExceptionHand...
Controller의 리턴 타입 스프링 MVC의 구조가 기존의 상속과 인터페이스에서 어노테이션을 사용하는 방식으로 변한 이후에 가장 큰 변환 중 하나는 리턴 타입이 자유로워 졌다는 점이다. Controller의 메서드가 사용할 수 있는 리턴 타입은 주로 다...
Model이라는 데이터 전달자 Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정할 수 있다. Model 객체는 JSP에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 하는 존재이다. 이를 이용해서 JSP와 같은...
@RequestMapping의 변화 @Controller 어노테이션은 추가적인 속성을 지정할 수 없지만, @RequestMapping의 경우 몇 가지의 속성을 추가할 수 있다. 이 중에서도 가장 많이 사용하는 method 속성이다.그중에서 GET방식과 PO...
스프링 MVC를 이용하는 경우 작성되는 컨트롤러에는 특징이 있다. HttpServletRequest/HttpServletResponse를 거의 사용할 필요 없이 필요한 기능 구현 다양한 타입의 파라미터 처리,다양한 타입의 리턴 타입 사용 가능 GE...
MyBatis MyBatis는 복잡한 SQL문을 따로 정의하여 유지보수하기 편리한 장점이 있다. -spring-jdbc/spring-tx:스프링에서 데이터베이스 처리와 트랜잭션 처리 -mybatis/myBatis-spring:Mybatis와 스프링 연동용 ...
오라클(Oracle) 데이터베이스는 다른 보편적인 오픈소스 관계형 데이터베이스(예: MySQL, MariaDB)와 대비되는 구조적인 차이를 지니고 있습니다. 그중 대표적인 개념이 바로 테이블스페이스(Tablespace)입니다. 이번 포스팅에서는 오라클 데이터베이...
자바(Java) 진영에서 보일러플레이트(Boilerplate) 코드를 획기적으로 줄여주는 라이브러리를 꼽으라면 단연 롬복(Lombok)일 것입니다. 개발자가 게터(Getter), 세터(Setter), 생성자(Constructor) 등을 직접 타이핑하지 않아도 어...