DataBase
데이터베이스(rebooting now)

[db] transaction

https://codenme.tistory.com/22 데이터베이스 참고자료 index~ recovery system codenme.tistory.com 위의 자료를 기반으로 작성한 내용입니다. 페이지 별로 관련 내용을 정리한 것이니, 해당 자료와 함께 보는 것을 권장 드립니다. Transaction의 개념 트랜잭션(Transaction)이란? 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다. 각 유저는 혼자 db 사용한다고 생각하도록, 운영되어야하고, 실제로 여러 유저가 동시 접근을 수행하더라도, 에러가 생겨 데이터에 손상이 가서는 안된다. 예시 A 가 어떤 값을 읽으려고 접근하는데, 다른 누군가가 그사이에 해당 값을 바꿨다면, 데이터의 일관성에 문제가 생기는 것이다. 이처럼, DB..

데이터베이스(rebooting now)

[db] query optimization

https://codenme.tistory.com/22 데이터베이스 참고자료 index~ recovery system codenme.tistory.com 위의 자료를 기반으로 작성한 내용입니다. 페이지 별로 관련 내용을 정리한 것이니, 해당 자료와 함께 보는 것을 권장 드립니다. (update at 23-08-09) Query Optimization 실제로 특정 데이터를 얻기 위한 요청을 처리할 때 해당 요청에 부합하는 쿼리는 여러가지가 있다. 이들 중, 최적의 query 찾아서 연산 시간을 줄이는 것을 query optimization 이라고 한다. 동일한 결과를 내는 Relation, operation 조합들 중, 해당 상황에서 최적의 대안 쿼리를 찾아서 수행하는 것으로 이를 줄일 수 있다. 한번 특..

데이터베이스(rebooting now)

[db] query processing

https://codenme.tistory.com/22 데이터베이스 참고자료 index~ recovery system codenme.tistory.com 위의 자료를 기반으로 작성한 내용입니다. 페이지 별로 관련 내용을 정리한 것이니, 해당 자료와 함께 보는 것을 권장 드립니다. (update at 23-08-08) Query Processing 데이터베이스에서 데이터를 가져오거나 데이터를 삽입할 때 사용하는 언어를 Query라고 한다. 쿼리는 실제 연산 속도에 큰 영향을 미친다. Query Processing이란 우리가 보낸 Query를 데이터베이스가 처리하는 과정을 말한다. Query Processing 구조 1) Parsing and translation: query를 internal form으로 ..

데이터베이스(rebooting now)

[db] indexing part-2 (B+ Tree)

https://codenme.tistory.com/22 데이터베이스 참고자료 index~ recovery system codenme.tistory.com 위의 자료를 기반으로 작성한 내용입니다. 페이지 별로 관련 내용을 정리한 것이니, 해당 자료와 함께 보는 것을 권장 드립니다. (update at 23-08-08) part1 https://codenme.tistory.com/21 [DB] indexing part-1 (index의 구조) https://codenme.tistory.com/22d 데이터베이스 참고자료 index~ recovery system codenme.tistory.com 위의 자료를 기반으로 작성한 내용입니다. Dbms가 레코드 들을 잘 찾기 위한 구조로써 heap은 별로다. (전체..

데이터베이스(rebooting now)

[DB] indexing part-1 (index의 구조)

https://codenme.tistory.com/22d 데이터베이스 참고자료 index~ recovery system codenme.tistory.com 위의 자료를 기반으로 작성한 내용입니다. (update at 23-08-08) Dbms가 레코드 들을 잘 찾기 위한 구조로써 heap은 별로다. (전체를 다 뒤져야할 수 도 있다) 데이터를 미리 정돈하면 bin search 등으로 linear search보다 빨리 search 가능. Search key: file 안의 record 찾는데 사용. Index file: index entry라는 record 들을 포함 Index entry: (search key,pointer) 구조. ( 원본 파일보다 적은 용량을 통해 해당 파일의 실제 위치 가르킨다) 인..

Software Engineering
소프트웨어 공학(rebooting now)

[Software Engineering] Object Oriented Analysis&Design

OOA (Object Oriented Anlysis) OO design Process OO analysis: 문제의 이해 / Key 컨셉, relationship 식별/ Vocabulary생성 /도메인 모델 생성에 관함. Communication용 / UML class diagram을 informal notation으로 사용한다. Starting point of finding class later ( low representational gap) Use case or requirement를 input으로 사용한다. System Behavior 정의 :System sequence diagram, System behavior contract 문제를 Model/ diagram으로, concept 정의: Dom..

소프트웨어 공학(rebooting now)

[Software Engineering] Design Pattern

Design Pattern 디자인 패턴의 이유와 방법, 언제 어떤 디자인 패턴을 써서 문제를 해결하는지에 대해 살펴보자. Design 패턴 디자인 공통 언어, 전문가와 소통 도움, 문서화, 가독성( 한번 패턴 만들면 그 디자인을 잘 설명한다) Architecture Vs Design pattern Architecture high-level 프레임워크: 시스템을 component와 interaction으로 정의 Design 패턴 architecture보다 lower-level. Reusable Collaboration Ex) 시스템 X 와 그 subsystem Y를 decouple 하는 방법은? 디자인 패턴의 용도 Object oriented reuse를 높은 추상화레벨에서 돕는다. Object-orien..

소프트웨어 공학(rebooting now)

[Software Engineering] Version Control System [Git]

Version Control System 버전 컨트롤 시스템이란? 버전관리 시스템(VCS, Version Control System)이란 파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 불러올 수 있는 시스템을 의미한다. 이를 사용하면, 다음과 같은 이점을 누릴 수 있다. 선택한 파일을 이전 상태로 되돌릴 수 있고, 변경 사항을 비교하고, 변경한 사람 및 변경시기를 추적할 수 있다. 파일을 잃어버리거나 잘못 고쳤을 때도 쉽게 복구할 수 있다. 다른 사람들과 동시에 작업을 진행할 수 있다. 이번 글에선, 가장 유명한 VCS 중 하나인 Git에 대해 알아보겠다. Git 버전 컨트롤 시스템의 특징 Git으로 적은 규모에서 효울적으로 변화를 track할 수 있다. Cloud-based Git..

optimization
back-end study

[Optimization] 인덱싱(indexing)을 통한 성능 개선 분석

indexing이란? 인덱스를 설정하면 해당 컬럼들의 값을 해시 맵 형태로 메모리에 저장해두고 검색할 때 메모리에서 검색을 먼저 하고 해당하는 행을 찾아 반환하지만 인덱스 생성하는데에도 비용이 들고, 데이터 수정, 추가 시마다 업데이트가 필요하기에 데이터의 추가, 수정 삭제에 대한 처리 속도가 낮아진다. 그렇기에 인덱싱으로 "유의미한" 검색 성능 향상을 만들 수 없다면, 만들지 않는 것이 좋다. 그럼 언제 인덱싱이 효과적이지 못할까? 인덱싱이 효과적이지 않은 상황 - 작은 테이블: 작은 크기의 테이블에서는 인덱스가 적용되어도 큰 차이를 만들지 못할 수 있다. 이런 경우에는 인덱스를 적용하는 대신에 테이블을 자주 스캔하는 것이 더 효율적일 수 있다. - 자주 변경되는 테이블: 자주 데이터를 추가, 수정, ..

back-end study

[Optimization] 캐싱(caching)을 통한 성능 개선 분석

Test Environment 3인 유저 채팅방에서 채팅 추가 시, api의 속도를 확인하는 것으로 cache 적용 전 후 의 성능을 비교했습니다. 기본 전략 반복 읽기가 많은 데이터를 캐싱하였기에 lookl aside +write around 전략을 사용하고, 일관성 유지를 위해 데이터 수정 발생시 캐시 데이터를 버린 뒤, 이후 사용시 캐시를 다시 Hit시켜 캐시메모리에 변경사항을 로딩하는 방식을 사용했습니다. caching 적용 전 api 속도 sql 수행 횟수 기본적으로 chatroom, mem ber의 엔티티를 select하는 sql이 각각 수행되고, 해당 채팅을 db에 insert하는 명령어가 수행된다. 추가적으로, 캐싱을 적용하지 않았으므로 채팅 알림을 보내기 위해 채팅 방 내의 모든 멤버들의..

java
java

java의 동작 원리 및 구조 [JVM의 구조]

자바의 특징 - 객체지향언어: 하지만, 요새 대부분 언어가 객체지향언어( 이제 자바만의 특징이 아니다) - 람다식: 함수형 프로그래밍의 원천 - Stream API: 람다 표현식과 메서드 참조등의 기능과 결합해서 복잡하고 어려운 데이터 처리 작업을 쉽게 조회, 필터링, 변환하여 처리가능. -병렬 프로그래밍: 여러 CPU코어에서 쓰레드를 배분하여 동시에 작업 수행가능. JDK: 자바를 사용할 때 필요한 프로그램 (ex: word를 설치해야 문서 작성 가능. ) openjdk, amazon Corretto, 등등. 자바 컴파일러 자바 컴파일러는 자바를 가지고 작성한 자바 코드를 자바 가상머신(JVM)이 이해할 수 있는 자바 바이트코드로 변환하는 역할을 수행한다. '.java' 파일을 '.class' 파일로 ..

java

[effective java] 생성자에 매개변수가 많다면 빌더를 고려하자

빌더 패턴 정적 팩터리와 생성자에 선택적 매개변수가 많을 때 고려할 수 있는 방안 대안1: 점층적 생성자 패턴 또는 생성자 체이닝 • 매개변수가 늘어나면 클라이언트 코드를 작성하거나 읽기 어렵다. public class A{ int a; int b; int c; A(int a,int b) {}; //필요한 필드만 주입하여 생성하는 경우가 있다. A(int b){};//3개 필드 ->최대 2^3==8개의 생성자가 생성된다. ............ } 대안2: 자바빈즈 패턴 (기본 생성자로 생성 후, setter를 통해 필요한 의존관계를 주입) • 완전한 객체를 만들려면 메서드를 여러번 호출해야 한다. (일관성이 무너진 상 태가 될 수도 있다.) ex) A객체는 a,b,c 객체를 주입받아야 사용될 수 있는데..

java

[java] 체크, 언체크 예외에 대한 분석과 잘못된 오해

우선 글을 시작하기에 앞서, java의 checked/unchecked 예외가 적힌 아래의 표를 보자. 위의 표를 보고 "뭐야, 다 아는 내용이잖아?" 라는 생각이 들었다면, 그것은 잘못 공부한 것이다. 위의 표에서는 "예외 발생 시 트랜잭션 처리" 라는 부분이 잘못되었다. 온전히 "자바"의 관점에서만 본다면, rollback 여부와 예외의 종류는 전혀 무관하고, rollback을 할지, 말지는 우리가 정하는 거다. 이러한 오해의 기원은 Spring의 DB 트랜잭션 처리에 있다. Spring DB 트랜잭션 처리 chkecked 예외: 복구 가능성이 존재하기에 try catch로 잡아서 따로 복구로 직을 수행하도록하고 롤백하지 않는 것이 보통이다. unchecked 예외: 복구할 가능성이 없거나 적은 di..

java

[이펙티브 자바] 정적 팩토리 메소드

정적 팩토리 메소드 정적 팩토리 메서드란 객체 생성의 역할을 하는 클래스 메서드 이다. 정적(static) 이란? 고정적이기에 인스턴스를 생성하지 않아도 사용할 수 있다. 정적 메소드: 인스턴스를 생성하지 않아도, 호출 메소드를 만들 수 있다. final과 헷갈릴 수 있는데, final은 "최종적인", 즉 한번 값이 할당되면 "불변" 이라는 특성을 가지게 해준다. 추가적으로, 전역 변수와 정적 변수의 차이점이 헷갈리는 경우가 많아, 둘의 차이점을 정리해보겠다. Global VS Static 1) 전역(global) 변수는 다른 파일에서도 가져다 쓸수 있지만 정적(static) 변수는 해당 파일의 scope안에서만 접근이 가능하다. 2) 초기화 하지 않은 정적(static) 변수의 경우 본문에서 사용하지 ..

Reactive Programming
MSA, EDA, Reactive 패러다임

Spring mvc VS Node.js 비교분석

흔히 사용하는 백엔드 프레임 워크는 스프링, node js 가 있다. 둘의 차이를 바탕으로 몇가지 중요한 CS 지식들을 돌아보자. 스프링 프레임워크는 기본적으로 Java 언어와 JVM 기반으로 동작하며, Java의 스레드 기능을 활용하여 멀티 스레드 방식으로 동작한다. 스프링은 요청마다 새로운 스레드를 생성하여 처리하며, 각각의 요청이 독립적으로 처리되기 때문에 안정적이고 예측 가능한 방식으로 동작한다. 단점: 스레드의 생성과 관리에 대한 오버헤드가 발생할 수 있고, 스레드의 동기화 문제도 발생할 수 있다. 반면에, Node.js는 이벤트 기반의 비동기 방식을 사용합니다. Node.js는 단일 스레드로 동작하며, 이벤트 루프와 콜백 함수를 사용하여 요청을 비동기적으로 처리한다. 이러한 방식은 스레드 생성..

back-end study

Blocking / Non-blocking 과 Sync / Async 의 차이

동기와 비동기 동기(Synchronous, 동시에 발생) 동시에 일어난다는 의미이다. 즉, 요청과 그 결과가 동시에 일어난다는 약속을 의미한다. 요청을 하면, 시간이 얼마나 걸리든 상관없이 요청한 자리에서 결과가 주어져야 한다. 요청과 결과가 모두 한 자리에서 동시에 일어나게 된다. 여러 노드 사이의 작업 처리 단위를 동시에 맞추겠다는 의도를 포함하고 있다. 설계가 매우 간단하고 직관적이지만 결과가 주어질 때까지 아무것도 못하고 대기해야 한다는 단점이 존재한다. 비동기(Asynchronous, 동시에 발생하지 않는) 동시에 일어나지 않음을 의미한다. 즉, 요청과 결과가 동시에 일어나지 않는다는 약속을 의미한다. 요청한 그 자리에서 결과가 주어지지 않는다. 노드 사이의 작업 처리 단위를 동시에 맞추지 않아..

back-end study

WebClient 이론 및 사용법

아래 글을 읽고 오면 도움이 됩니다. https://codenme.tistory.com/100 Blocking / Non-blocking 과 Sync / Async 의 차이 Blocking A 함수가 B 함수를 호출 할 때, B 함수가 자신의 작업이 종료되기 전까지 A 함수에게 제어권을 돌려주지 않는 것 Non-blocking 함수를 호출하며 제어권을 넘겨주는 것으로 호출한 함수가 다른 codenme.tistory.com restTemplate: 멀티 스레드 Blocking 방식( 호출하는 함수가 호출된 함수의 응답을 대기한다. ) - HTTP 요청 후 Json, xml, String과 같은 응답을 받을 수 있는 템플릿 - RESTful 형식을 지원한다 - 멀티 스레드와 Blocking 방식 사용 - B..

MSA, EDA, Reactive 패러다임

Spring reactive Stack VS Servlet Stack

Spring에서 Reactive Stack과 Servlet Stack의 차이점과 장단점은 다음과 같다. Servlet Stack: Servlet Stack은 전통적인 방식으로 웹 애플리케이션을 처리하는 기술 스택이다. Servlet 컨테이너를 기반으로 동작하며, 요청마다 쓰레드를 생성하여 처리한다. 각 쓰레드는 독립적으로 요청을 처리하고 응답을 반환한다. 장점: - 잘 알려진 기술 스택: Servlet은 오랜 기간 동안 사용되어온 기술로, 많은 개발자들이 익숙하다. - 간편한 개발: Servlet API를 사용하여 간단한 웹 애플리케이션을 구축할 수 있다. - 기존 라이브러리와의 호환성: 많은 서드파티 라이브러리들이 Servlet 기반으로 개발되어 있으며, 기존에 작성된 코드를 쉽게 통합할 수 있다. 단..

MSA, EDA, Reactive 패러다임

WebFlux VS Spring MVC

이번 글에선 이론적으로 WebFlux가 Spring MVC에 대비해 어떤 이점이 있는지 분석하고, 외부의 performance Test를 이러한 이론을 증명하겠습니다. WebFlux를 사용하는 이유는? - aync & Non-blocking방식으로 인해 cpu, Thread, memory등의 리소스 낭비 없이 효율적으로 동작한다. - 서비스간 호출이 많은 MSA에 적합하다. spring webmvc vs webflux webmvc - Blocking & sync - 사용자의 요청이 들어올 때 마다 Thread를 생성하여 처리(multi thread) - Thread Pool에서 미리 스레드를 일정 갯수 생성하고 사용(스레드 생성, 삭제 비용의 절감) - 요청이 들어오면 Queue 에 쌓고 순서에 따라서 ..

MSA, EDA, Reactive 패러다임

reactive programing [이론 정리]

리액티브 프로그래밍 리액티브 프로그래밍은 비동기적인 데이터 스트림을 다루기 위한 프로그래밍 패러다임이다. 이 패러다임은 데이터의 흐름을 중심으로 개발을 진행하며, 데이터의 변경에 반응하여 비동기적으로 처리합니다. 리액티브 프로그래밍은 확장성과 반응성이 중요한 애플리케이션에서 유용하게 활용된다. 리액티브 프로그램의 필요성 1년 치 구독료를 지불하였는데 배달이 오지 않고 1년 치 신문이 모두 준비되면 그제야 배달을 시작한다면 어떻게 될까? 실제로는 기사가 최신일 때 독자가 읽을 수 있도록 출간 후 가능한 빨리 배달된다. 또한 독자가 기사를 읽는 동안 기자는 새로운 다음 기사를 작성한다. 이 모든 것은 병행으로 진행된다. 이처럼 애플리케이션 코드를 개발할 때는 명령형(imperative)와 리액티브(react..

MSA, EDA, Reactive 패러다임

Request-Respone(Rest 통신) VS 비동기 메세지 통신(Pub-Sub)

Request-Response VS Event-Driven Application Request-Response 요청/응답 통신방법은 동기 통신에 단일 통신 방법으로, 요청자는 응답자의 주소를 알고 있어야 통신이 가능합니다. 이런 방식을 Point to Point 방식이라 한다. 이 방식은 서비스가 늘어나고, 복잡해 질수록 기억해야 주소가 늘어난다. 복잡하게 서비스들끼리 연결되어있다고 하여 스파게티 네트워크(Spaghetti network) 라고도 불린다. 동기 통신이기 때문에 응답 서비스가 항상 떠있어야 하고, 응답서비스에서 오랜 시간을 소비하면 그만큼 응답이 늦어지기진다. 또한 요청 채인이 길어지면 장애전파(Fault Spread)의 위험성이 있다. 장점: 명확한 요청과 응답: 클라이언트는 서버에게 필..

MSA, EDA, Reactive 패러다임

Reactive System과 event-driven Architecture

Reactive 패러다임 리액티브(Reactive) 패러다임은 비동기적인 데이터 흐름과 변경에 반응하는 프로그래밍 패러다임이다. 이 패러다임은 데이터 스트림에 대한 관찰과 반응을 중심으로 한다. 리액티브 시스템에서는 데이터의 변화나 이벤트를 발생시키는 작업들이 스트림 형태로 표현된다. 이 스트림은 연속적으로 도착하는 데이터나 이벤트의 시퀀스를 나타내며, 이러한 데이터 스트림에 대한 관찰과 처리가 중요한 역할을 한다. 리액티브 패러다임의 핵심 개념은 다음과 같다. 1) 데이터 스트림 (Data Streams): 데이터 스트림은 시간에 따라 연속적으로 도착하는 데이터나 이벤트의 흐름을 나타낸다 이러한 데이터 스트림은 비동기적으로 처리되며, 변화에 따라 업데이트될 수 있다. 2) 옵저버블 (Observable..

MSA, EDA, Reactive 패러다임

(EDM) Event Driven MicroService 기초 지식 정리

MSA MSA(MicroService Architecture)는 소프트웨어 개발 기법의 하나이다. MSA는 단일 애플리케이션을 작은 서비스 모음으로 개발하는 접근 방식으로, 각 서비스는 자체 프로세스에서 실행이 되고 느슨한 연결(Loosely-coupled) 구조로 만들어 HTTP 리소스인 REST와 같은 경량 메커니즘과 통신한다. 한마디로 "하나의 큰 애플리케이션을 여러 개의 작은 애플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍처" 이다. Monolothic(모놀로식) 아키텍처는 ui - Business Logic - DataLayer 등으로 나누어져 1개의 서비스를 개발하는 것으로, 과거 많이 사용하던 방법이다. 최근 넷플릭스가 MSA로 전환을 성공하고, 넷플릭스 OSS라고 불리는 오픈소..

MSA, EDA, Reactive 패러다임

Node.js기반 Express VS java기반 Spring WebFlux

Spring mvc는 분명 "multi Thread, sync, Blcoking" 방식을 통해 Node.js 대비 이점이 존재하지만, 단점 역시 존재한다. 그리고 이러한 단점이 요즘의 애플리케이션 개발 트렌드에 적합하지 않기에 Spring webflux등의 Reactive Stack을 통한 리액티브 프로그래밍을 통해 이러한 단점을 극복하도록 지원한다. 하지만, Spring의 Reactive Stack와 유사하게, express 기반의 Node.js 역시 async, non-blocking, event-driven 방식을 사용한다. 이번 글에선 스프링 webflux와 유사하게 async, non-blocking, event-driven 방식을 사용하는 Node.js를 비교분석해보겠다. 1) Spring w..

devops
DevOps

Apache VS Nginx 비교분석

이 글을 읽기 앞서, 관련된 OS, 네트워크 사전 지식들을 정리한 아래의 글을 보고 오면 도움이 됩니다. https://codenme.tistory.com/80 웹서버, 네트워크 관련 사전지식 - 멀티 스레드 프로세스에 대비되는 장점: 1) response 속도 스레드 x 시 IO wait, block 만날때 해당 프로세스는 멈춰야함. 만약 각 스레드가 같은 프로그램의 다른 부분을 맡는다면 한 스레드가 어떤 codenme.tistory.com WAS란? DB 조회 혹은 다양한 로직 처리를 요구하는 동적 컨텐츠를 제공하기 위해 만들어진 Application 서버이다. HTTP 프로토콜을 기반으로 사용자 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어로서, 주로 데이터베이스 서버와 같이 수행된다. WAS는..

DevOps

[도커] Docker Compose

[Docker Compose란?] 여러 컨테이너를 모아서 관리하기 위한 툴 웹 서비스는 프론트엔드 서버, 데이터베이스 서버, 백엔드 서버 등으로 이루어져 있다. 각각을 docker컨테이너로 작성하고, 연결하여 동작하기 때문에, Docker Compose와 같은 관리 툴이 필요하다. 더 나아가, 서비스 규모가 커지면, 매우 많은 양의 컨테이너를 유지, 관리하기 위해 쿠버네티스 등의 관리 툴이 필요하게 된다. docker compose는 docker-compose.yml 이라는 파일을 작성하여, 도커 설정을 넣는다. ( 도커 이미지를 설정하는 Dockerfile 처럼) 이 파일을 도커 이미지 처럼 docker compose 명령으로 실행하면, 다수의 도커가 실행되며, 도커들간의 커뮤니케이션이 이뤄지고, 한번..

코앤미
코딩이랑 이것저것