728x90

분류 전체보기 636

우아한 Redis - Redis 톺아보기

세미나 영상 우아한 Redis 내용 정리 Redis란 무엇인가? In-Memory Data Structure Store이면서 오픈소스 String, Set, Sorted-Set, Hash, List 등의 타입을 지원한다. 캐시(Cache)로 자주 사용한다. Look Aside Cache, 캐시에 자료가 없으면 DB 접근 후 캐시에 갱신한다. Write Back, 캐시에 쓰고 이걸 모아서 DB에 저장한다. Redis에서의 Collection 개발의 편의성을 끌어올리고 난이도를 대폭 낮춰준다. 모든 것들이 그렇듯, 적합한 컬렉션을 고르고 잘 이용하는 것이 무엇보다 중요하다.\ 랭킹 서버의 예시 DB에 넣고 Score를 처리하는 시스템은 유저가 많아진다면? Redis를 도입하고 Sorted Set을 사용해서 ..

MySQL(MariaDB)의 EXPLAIN으로 실행 결과 분석하기

실행 계획이라고 하면, 쿼리가 어떻게 데이터를 불러오는지에 대한 계획을 의미한다. 실행 계획을 통해서 어떤 테이블이 어떤 방식으로 조회됐는지 확인할 수 있다. 조회 쿼리의 인덱스 사용 유무를 확인할 때, 전체 조회 대상 중에서 검색 조건에 의해 어느정도의 비율로 필터링 되는지와 같이 성능 튜닝에 필요한 요소들을 확인하고자 할 때 쿼리 실행 계획을 확인해보는 것이 좋다. 실행 계획을 확인하는 데 있어서, MySQL(MariaDB)에서는 EXPLAIN, DESCRIBE, DESC를 사용한다. 세 명령어 모두 같은 결과를 내기 때문에 편한 걸 사용하면 된다.(필자는 EXPLAIN을 많이 쓴다.) 사용 예시 EXPLAIN SELECT * FROM employee WHERE employee_num BETWEEN ..

Computer Science/DB 2021.11.07

Gradle의 라이브러리 의존성 옵션 정리

익숙함 문득 웹 프로젝트 관련 내용들을 정리해나가면서, gradle 파일을 보니까 다음과 같은 부분이 눈에 들어왔다. dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' } 언제부턴가 기존 프로젝트를 따라가는 방식으로 라이브러리 의존성을 작성하다 보니까, 이것들에 대한 이해하고 있..

GitHub에서의 Git 토큰 인증

맥북 세팅을 진행하면서 GitHub에 있는 학습용 repository를 로컬에 clone을 진행하려고 보니까 아래와 같은 문구를 내뿜었다. Cloning into 'Self-Study'... Username for 'https://github.com': Twinparadox Password for 'https://Twinparadox@github.com': remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. remote: Please see https://github.blog/2020-12-15-token-authentication-requir..

옵저버 패턴(관찰자 패턴, Observer Pattern)에 대해 알아보자

옵저버 패턴(Observer Pattern)? 어떤 클래스(들)의 동작이 특정 상태 변화에 따라서 동작해야 하는 경우를 생각해보자. 예를 들어서, 어떤 구독 서비스를 이용하는 유료 회원과 무료 회원이 존재한다. 구독한 유료 회원에게만 신규 콘텐츠가 등록되면 뉴스 레터 형태의 알림이 전송되어야 한다. 이런 상황에서 무료 회원은 반드시 해당 서비스의 페이지에 들어가서 신규 콘텐츠가 존재하는지를 확인해야 한다. 유료회원은 구독 서비스가 전송한 뉴스 레터를 통해서도 확인할 수 있는 추가적인 방법이 생기는 셈이다. 이 때, 구독 서비스가 새로운 내용(콘텐츠)가 등록되었을 때 모든 유저들에게 뉴스 레터를 전송하는 방식을 구성하는데 적용해볼 수 있는 것이 옵저버 패턴이다. 여기서 유료 회원은 Observer고, 신규..

Java의 Stream에서 parallelStream은 stream보다 항상 빠를까?

결론부터 말하자면, 당연히 아니다. 병렬 처리라는 것이 단순히 작업을 쪼개서 수행하는 것에 그치는 게 아니라, 그것을 취합하는 과정도 있고 그 쪼개면서 발생하는 오버헤드, 컨텍스트 스위칭 등을 고려해야 하기 때문이다. ParallelStream Java8부터는 parallelStream(), parallel()만을 사용하고도 stream을 병렬 처리할 수 있게 한다. ForkJoinPool 관리 방식을 사용해서 복잡하던 스레드 관리 방식을 Fork와 Join을 통해서 작업들을 분할 정복(Divide and Conquer) 기법으로 처리한다. ParallelStream을 사용할 때 몇 가지 특징에 대해 알고 넘어가는 것이 좋다. 병렬 처리이기 때문에, 순서를 보장하지 않는다. 별도의 설정이 없으면 해당 어..

공식 문서를 통해 스프링 배치(Spring Batch)에 대해 간략하게 알아보기

Batch Processing 일괄 처리 작업 어떤 서비스를 즐기다 보면 전산 작업 시간 등등에 진행되는 작업이 이 배치 작업이다. 예시로 들면 이런 게 있다. 대용량의 데이터를 복잡한 작업으로 처리하는 경우 주간, 월간 지표 집계와 같은 특정 시점에 정해진 작업이 수행되는 경우 대용량 데이터 유효성 검사 등의 작업을 트랜잭션 안에서 처리 및 기록해야 하는 경우 위 작업을 일반 어플리케이션에서 할 수는 없기 때문에, 이를 위한 별도의 배치 처플리케이션을 구현하고 해당 어플리케이션을 기동하는 편이다. 그렇기 때문에 다양한 작업을 배치 작업을 이용해 처리하고 있고, Srping에서는 Spring Batch를 통해 제공하고 있다. Batch 원칙 일반적으로 같은 서비스 환경에서 동작하는 서비스와 배치는 서로 ..

Framework/Spring 2021.06.20

Elasticsearch와 RDBMS의 용어 비교, 그리고 장단점

Elasticsearch와 RDBMS의 용어 비교 RDBMS Elasticsearch Schema Mapping Database Index Partition Shard Table Type Row Document Column Field Elasticsearch를 써야 할 때? RDBMS 단순 텍스트 매칭에 근거해서 검색을 지원한다. 최신 RDBMS는 Full-text 검색을 지원하지만, 아직도 많은 곳에서 사용하는 RDBMS에서는 이를 지원하지 않는다. 지원한다고 하더라도, 한글에서는 썩 좋은 능력을 보여주지 못하는 부분이 있다. 반면 Elasticsearch는 n-gram 기반 Full-text 검색을 지원한다. 여러 단어로 변형하거나, 동의어/유의어에 근거한 검색도 가능하고 여러 플러그인으로 형태소 기..

Computer Science/DB 2021.06.13

IntelliJ Gradle import 시, 오류 해결 방법 : Unable to find method

무슨 오류인가? Unable to find method ''java.lang.String org.gradle.api.artifacts.result.ComponentSelectionReason.getDescription()''. IntelliJ가 추천해줬던 해결 방법 Reimport를 시도해라. Gradle을 다시 설치하거나, 다시 시작해라. (IntelliJ 재부팅) 보통 1번의 방법으로 해결되는 경우가 많다. 이에 관해서는 jojoldu님의 블로그에 자세하게 설명되어 있다. https://jojoldu.tistory.com/364 IntelliJ에서 Gradle 프로젝트 작동안될때 간혹 Gradle 프로젝트를 IntelliJ에서 불러올때 Gradle이 정상작동하지 않을때가 있습니다. 전혀 코드가 작동하..

개발 팁/IDE 2021.06.13

Garbage Collection in Python, 파이썬의 GC에 대해

Python에서의 GC 파이썬은 기본적으로 레퍼런스 카운팅(Reference Counting)을 바탕으로 GC를 수행하고 메모리를 관리한다. 레퍼런스 카운팅(Reference Counting)? 모든 객체는 참조 당할 때 이 레퍼런스 카운트를 증가시키고, 참조가 없어지면 이를 감소시킨다. 이 값이 0이 되면 객체가 메모리에서 해제된다. 해당 객체의 레퍼런스 카운트 값을 확인하는 코드는 다음과 같다. sys.getrefcount(obj) GC의 동작 원리 앞서 언급한 것처럼 GC는 레퍼런스 카운트를 기준으로 진행하는데, 좀 더 정확히 다루자면 세대와 그에 따른 임계값을 바탕으로 주기적으로 관리한다. 여기서 말하는 세대는 숫자가 클수록 오래된 객체이며, GC는 기본적으로 0세대, 즉, 비교적 최근에 생성된 ..

728x90