분류 전체보기

    동기-비동기, 블로킹-논블로킹

    이 두가지 개념은 서로 전혀 다른 곳에 초점을 맞춘 별개의 개념들이므로 서로 직접적인 관련은 거의 없다고 봐도 됩니다. 동기(sync) / 비동기(async)는 행위에 관한 개념 - 프로세스의 수행 순서에 관한 매커니즘 블럭(block) / 논블럭(non-block)은 함수 호출에 관한 개념 - 프로세스의 제어권에 관련된 매커니즘 - 제어권 : 제어권은 자신(함수)의 코드를 실행할 권리 같은 것이다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다. - 결과값을 기다린다는 것 : A 함수에서 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리느냐의 여부를 의미한다. Blocking / Non-Blocking이 현재의 작업 상태에 따라 동작이 결정되는것이라..

    랜덤액세스(랜덤 I/O)와 인덱스

    쿼리에서 참조되는 컬럼이 인덱스에 모두 포함되는 경우가 아니라면 인덱스 스캔 이후 '테이블 Random 액세스'가 발생합니다. 이는 잦은 블록 I/O를 발생시켜 성능 원인이 될 수 있으며 확인, 추출, 정렬 랜덤 액세스를 없애기 위해 노력해야 합니다. 그중에서 확인 랜덤 액세스를 줄이는 것이 가장 중요합니다. 랜덤액세스? 랜덤 액세스는 데이터를 저장하는 블록을 한 번에 여러 개 액세스 하는 것이 아니라 한 번에 하나의 블록만을 액세스 하는 싱글 블록 I/O 방식입니다. 블록 : hdd나 sdd에 저장되는 물리적인 단위. 일반적으로 몇 KB~ 몇 MB 크기. 반대로 테이블 풀 스캔(Table Full Scan)의 경우에는 한 번에 여러 개의 블록을 액세스 하는 멀티 블록 I/O 방식을 사용합니다. 랜덤 액..

    MySQL 낙관적 락과 데드락(dead lock) With JPA Hibernate

    프로젝트에서 모임 가입 기능을 구현하면서, 동시성 문제와 데드락까지 경험한 내용 그리고 어떻게 해결하였는지 고민과정과 해결방법을 정리하려고 합니다. 프로젝트 버전 SpringBoot 2.7.8 MySQL 8.028 Spring Data Jpa Hibernate 5.6.14 모임 가입 기능? 저희 프로젝트에는 모임과 모임에 가입할 수 있는 기능이 있습니다. 모임 가입에 대한 비즈니스 요구사항은 다음과 같습니다. 모임이 존재하고, 모임에는 인원제한이 있습니다. 인원제한이 다 찬 모임에 참여하려는 경우, 참여가 불가능 합니다. 모임에 여러명이 동시에 요청해도, 요청한 순서대로 모임에 가입되어야 합니다. 모임과 모임 구성원은 1:N 관계이며, 모임 제한 인원은 모임 테이블에 존재합니다. 동시성 문제가 발생할 것..

    디디의 Redis

    목차 Redis 개요 Cache 개념 Redis 자료구조 Redis 주의사항 Redis 개요 Remote dictionary server redis.io 에는 다음과 같이 redis를 소개한다. Redis는 인메모리 데이터 구조 저장소로, 데이터베이스, 캐시, 메시지 브로커로 사용한다고 말한다. Remote dictionary는 Key-Value 형식의 자료구조 DB server 32bit CPU Int 최대값은? 21억~ Key값이 21억을 넘어가서 쿠팡에서 오류가 발생했다 하여 int에서 long으로 데이터형식을 변환하여 문제를 해결했다. Cache 개념 나중 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는것. 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소 그림 : 메모리 계층 구조 위..

    변하는 값을 테스트 하는 방법(LocalDateTime, UUID, Random)

    개발을 하다보면 현재 시간이나, 랜덤 값이 필요한 로직이 분명 필요합니다. 프로젝트를 진행하면서, LocalDate.now()와 UUID.randomUUID 등을 사용해야 했습니다. 하지만 테스트를 할 수가 없는 문제가 발생하였습니다. 모임 엔티티의 생성 조건과 참여 조건의 요구사항은 다음과 같습니다. 모임 시작날짜, 종료날짜는 현재시간 이유여야만 한다. 종료날짜 이후에는 참여하지 못하고 예외가 발생하게 된다. 이 때, 종료 날짜는 무조건 현재날짜 이후에만 지정 가능하고, 현재 요청한 시간은 항상 endDate 이므로 만약 endDate가 3월 16일이고, 3월 15일날 테스트를 하게된다면 항상 통과할 수 밖에 없게 되어 모임 가입이 불가능한 테스트를 할 수 없게 됩니다. public class Book..

    Spring 2.7 버전대 RestDocs Cookie 문서화 방법(RestDocs 2.0.7)

    프로젝트 버전 SpringBoot 2.7.8 Spring Rest Docs 2.0.7 프로젝트를 진행하던 중, 인증과정에서 RefreshToken을 Cookie로 사용할 일이 있어 RestDocs로 Cookie를 문서화 하여야 했습니다. 이와 관련해서 RestDocs 공식문서, github 이슈, StackOverFlow글을 관련하여 찾아보았습니다. https://github.com/spring-projects/spring-restdocs/pull/592 https://docs.spring.io/spring-restdocs/docs/2.0.7.RELEASE/reference/html5/ https://stackoverflow.com/questions/39472873/how-can-i-document-th..

    RestDocs - Custom Error Code Enum 문서화

    RestDocs - Custom Error Code Enum 문서화 Enum으로 Custom ErrorCode 관리시 Enum 문서 자동화 방법 SpringBoot 버전 2.7.8 restdocs 버전 2.0.7 개요 데브코스에서 프로젝트를 하다 고민이 생겼습니다. 프론트엔드와의 협업간에 API 문서로 Spring RestDocs를 사용하고 있었고, API 사용 시 에러 응답에 대해 httpStatus 코드만으로는 클라이언트에 에러에 대해 디테일하게 설명할 수가 없어서 클라이언트가 개발과정 중 생긴 오류들에 대해 정확하게 알 수 있게 우리는 ErrorCode를 Enum으로 정의해서 내려주기로 하였습니다. public enum ErrorCode { ... NOT_MATCHED_COMMENT_AUTHOR(H..

    JUnit5 리스트가 정렬 조건에 맞게 정렬되었는지 검증하는법

    List가 특정한 기준으로 정렬할 때 보통, Comparator 인터페이스를 사용하여 정렬 기준을 지정한다. // List를 정렬할 Comparator Comparator comparator = (s1, s2) -> s1.compareTo(s2); // List를 정렬 List list = new ArrayList(); list.add("apple"); list.add("banana"); list.add("cherry"); list.sort(comparator); 이제, List가 특정한 기준으로 정렬되었는지 확인하려면, 다음과 같이 assert 메소드를 사용하여 비교하면 된다. // List가 특정한 기준으로 정렬되었는지 확인 assertThat(list).isSortedAccordingTo(compa..

    SQL 테이블의 중앙값을 찾는법

    테이블의 중앙값 구하기 student_id(학생 ID) weight(체중 kg) A100 50 A101 55 A124 55 B343 60 B346 72 B378 72 C563 72 C345 72 1. 집합 지향적 방법 테이블을 상위 집합과 하위 집합으로 분할하고 그 공통부분을 검색하는 방법 SELECT AVG(weight) FROM (SELECT W1.weight FROM Weights W1, Weights W2 GROUP BY W1.weight HAVING SUM(CASE WHEN W2.weight >= W1.weight THEN 1 ELSE 0 END) >= COUNT (*) / 2 AND SUM(CASE WHEN W2.weight = COUNT (*) TMP ) CASE 식에 표현한 두 개의 함수 ..

    UriComponentsBuilder, ServletUriComponentsBuilder, 201 URI 생성

    URI의 개념과 UriComponentsBuilder의 필요성 인터넷상에 존재하는 모든 자원(Resource)은 URI를 이용하여 그 위치를 나타낸다. 아래와 같이 다양한 구성요소로 이루어진 URI를 개발자가 직접 문자열로 작성하는 것은 상당히 불편한데, scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment] Scheme UserInfo Host Port Path Query Fragment 스프링에서는 URI를 보다 쉽게 다룰 수 있도록 도와주는 UriComponentsBuilder를 제공한다. UriComponents 클래스 UriComponents 클래스는 말 그대로, URI를 구성하는 Components들을 효과적으로 다룰 수 있도록 ..