전체 글 27

Filter, Interceptor, AOP

웹 개발시 반복되는 로직들이 종종 발생한다. 예를 들면 로그인 관련(세션처리), XSS 공격 방어 등. 이러한 반복되는 로직들이 발생하는 곳 마다 해당 코드를 작성하면, 코드 중복이 심해진다. 이러한, 공통부분(공통로직)을 프로그램의 흐름 앞, 중간, 뒤에 추가하여 모듈화 하여 관리할 수 있다. Spring 에서는 이러한 기능을 세가지 방법을 통해 제공한다. 1. Filter 2. Interceptor 3. AOP 각 방법들은 실행되는 타이밍(시점)이 다르다. Filter filter는 그림을 통해 알 수 있겠지만, DispatcherServlet 보다도 앞단에서 처리된다. 이는 즉, Spring 영역 밖에 있음을 의미한다. filter는 결국 Spring Bean을 사용하지 않는 단순 ServletRe..

Spring 2021.08.26

equals(), hashCode (), == 연산자

서론 우리가 임의의 Class를 생성했을 때 별도로 생성하지 않아도 사용할 수 있는 메서드들이 있다. 그 예가 바로 toString(), equals(), hashCode()이다. 이러한 메서드들을 별도로 생성하지 않아도 사용할 수 있는 이유는 Java의 모든 class들은 Object 클래스를 상속받기 때문이다. 즉, 위 메서드들은 Object 클래스의 메서드이다. 참고) == 연산자는 대체 무엇인가? 기본적으로 == 연산은 주소값을 비교해서 같으면 true, 다르면 false를 반환한다. hashCode() hashCode 메서드는 객체의 해시값(integer)을 반환한다. 가장 상위 객체인 Object 클래스의 hashCode()는 아래와 같이 native 메서드로 지정되어 있으며, 객체의 메모리 ..

Java 2021.08.25

동기 비동기와 blocking / non-blocking

예전에는 조금 어렵다고 느껴졌었지만 최근에 프로젝트 하면서 이런 부분들을 좀 다루어 보았고, 다루어 보니 생각했던 것보다 더 중요한 부분이라 생각되어 포스팅을 하려고 한다. 동기(Synchronous) vs 비동기(Asynchronous) 동기와 비동기의 가장 큰 차이는 '호출되는 함수의 작업 종료를 누가 신경쓰는지' 이다. 동기 동기의 경우 호출되는 함수의 작업 종료를 호출 하는 함수가 신경쓴다. 그림에는 B가 종료되는 시점에서 B에서 A로 화살표가 가고 있지만, 이는 B가 작업 종료를 알려준다의 의미가 아니라, 제어권을 반환한다고 생각하는게 더 이해하기 쉬울 듯 하다. 실제로는 A가 B에게 "너 끝났니?" "너 끝났니?" "너 끝났냐고" 반복해서 물어보면서 B의 종료를 확인한다. 이는 즉, A가 B의..

OS 2021.08.03

Database Transaction과 데이터 동기화 -2

지난 포스팅에서 Database Transaction이 무엇인지 알아보았다. 참고: https://ldh-developer.tistory.com/30 Database Transaction과 데이터 동기화 -1 트랜잭션이란? 데이터베이스가 수행할 연산들의 논리적인 작업 단위(하나의 질의가 아닐 수 있다) 트랜잭션의 특징 원자성(Atomictiy) 트랜잭션이 데이터베이스에 모두 반영이 되거나, 하나도 반 ldh-developer.tistory.com Transaction의 기본적인 개념들은 인터넷에 워낙 자료들이 많아서 굳이 자세하게 다루지는 않았다. 문득, Transaction에 대한 이론은 알고있었지만 내가 알던대로 제대로 동작하고 있을까 ? 라는 의문이 들었다. 눈으로 직접 확인하는게 가장 좋을 것 같..

Spring 2021.08.01

Database Transaction과 데이터 동기화 -1

트랜잭션이란? 데이터베이스가 수행할 연산들의 논리적인 작업 단위(하나의 질의가 아닐 수 있다) 트랜잭션의 특징 원자성(Atomictiy) 트랜잭션이 데이터베이스에 모두 반영이 되거나, 하나도 반영이 안되어야 한다.( 1 or 0이어야 함. 0.5는 없다.) 트랜잭션 도중 하나의 작업이라도 성공하지 못하면 모두 Rollback 되어야 함 일관성(Consistency) 트랜잭션이 성공한 후에도 언제나 일관성 있는 데이터베이스 상태를 유지해야 함 독립성(Isolation) 특정 트랜잭션이 수행 중이라면, 해당 트랜잭션이 완료될 때까지 다른 트랜잭션의 연산이 끼어들 수 없다 수행 중인 트랜잭션은 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다 영속성(Durability) 트랜잭션이 완료된 후에는 해..

Spring 2021.08.01

모놀리식 아키텍쳐와 마이크로 서비스 아키텍쳐

1. 모놀리식 아키텍쳐 (Monolithic Architecture) 모놀리스한 아키텍쳐란, 모든 업무 로직이 하나의 애플리케이션 형태로 패키지되어 서비스되고, 애플리케이션에서 사용하는 데이터 또한 한 곳에 모인 데이터를 참조하여 서비스 하는 형태. 특징 일반적으로 성능향상을 위해 Scale Up을 고려한다. (서버 스펙 향상) 장점 설계가 간단하다 End-to-End 테스트가 용이 단일 코드 베이스로 복잡도가 낮음 빠르다 (서비스간 통신을 위해 네트워크 타지 않아도 됨) 단점 일부의 장애가 전체 서비스의 장애로 확산될 수 있다 기능 일부의 수정을 위해 애플리케이션 전체를 통째로 배포해야 함 프로젝트 규모가 커질수록 배포에 들어가는 시간 증가 코드 양 증가할수록 복잡도 증가 -> 유지보수 어렵다 2. 마..

msa 아키텍쳐 2021.07.14

spring boot와 elasticsearch 연동하기

기본적으로 spring boot와 elasticsearch를 연동하는 방법에는 네 가지가 있다. ElasticsearchRepository RestClient HighLevelRestClient ElasticsearchRestTemplate ElasticsearchRepository JPA 사용법과 거의 동일하다고 생각하면 될 듯 하다. 위와 같이 ElasticsearchRepository를 상속받는 interface를 선언하면 자동으로 구현체를 만들어준다. 이후 위와 같이 엔티티 클래스를 작성하고 ElasticActionLogRepository를 통해 저장해 본 결과 정상적으로 데이터가 입력되는 것을 확인할 수 있었다. 문제점 ElasticsearchRepository를 사용할 Entity Class는..

카테고리 없음 2021.05.16

클러스터, 노드, 인덱스, 샤드

클러스터, 노드, 인덱스, 샤드 Node Elastic search 서버가 실행되는 서버 단위를 Node라고 한다. 물론, 하나의 서버에 여러 노드를 실행할 수 있지만 이는 권장하지 않는다. (가용성을 위해) Cluster 하나 이상의 Node로 구성된 Node들의 묶음 단위. cluster.name 설정값으로 구분한다. Index 관계형 데이터베이스에서 Database에 해당하는 Component이다. 인덱스는 Shard라는 단위로 분리되어 저장된다. Shard 관계형 데이터베이스에서 Partition에 해당하는 Component이다. 샤드가 루씬의 단일 검색 인스턴스이다. 프라이머리 샤드와 복제본(Primary shard & Replica) 처음 생성된 샤드를 Primary Shard, 복제본은 Re..

카테고리 없음 2021.05.13

Node의 종류와 역할

Master node 인덱스(데이터베이스)의 메타 데이터, 샤드의 위치와 같은 클러스터의 상태 정보를 관리 노드 추가 및 제거와 같은 클러스터의 전반적인 관리 담당 클러스터 중 하나의 node가 해당 역할을 수행 Master node 가 다운되거나 네트워크 연결이 종료되면 다른 마스터 후보 노드 중 하나가 마스터 노드로 승격 클러스터중 마스터 노드 역할을 할 수 있는 노드가 없을 경우 클러스터 작동 정지 Data node 실질적으로 데이터를 저장하는 노드 검색과 통계 같은 데이터 관련 작업 수행 색인 작업은 CPU, 메모리, 스토리지 같은 컴퓨팅 리소스를 많이 소모하기 때문에 리소스 모니터링 필요 Coordinating node 사용자의 요청만 받아서 처리 클러스터 관련 요청은 마스터 노드에, 데이터 관..

Elastic search 2021.05.13

Elastic search Configurations

cluster.name: " 클러스터명이 같으면 같은 클러스터로 묶이고, 클러스터명이 다르면 서로 다른 클러스터로 인식된다. node.name: "" 노드는 클러스터를 구성하는 각 서버를 의미한다. 노드명을 통해 각 노드들을 구분한다. node.attr.: "" 노드별로 속성을 부여하기 위한 일종의 네임스페이스 지정. 이 속성을 이용하여 샤드 배치를 임의적으로 조절할 수 있다. path.data:[""] 색인된 데이터를 저장하는 경로 지정 배열 형태로 여러개의 경로 입력 가능 → 한 서버에서 디스크 여러개 사용 가능 path.logs:"" 로그 저장 경로. .log 형태로 저장됨. 날짜가 변경되면 이전 로그 파일은 뒤에 날짜가 붙은 파일명으로 변경 bootstrap.memory_lock: Elastics..

Elastic search 2021.05.13