전체 글

    InnoDB 스토리지 아키텍처

    MySQL 서버는 기본적으로 사람의 머리 역할을 담당하는 MySQL 엔진과 손발 역할을 담당하는 스토리지 엔진으로 구분할 수 있다. 그중 스토리지 엔진의 경우 InnoDB와 MyISAM이 있는데, InnoDB를 8.0 이후부터는 기본으로 제공하고 있다. 따라서 대체로 InnoDB를 거의 사용하게 되는데, 해당 아키텍처에 대해서는 자세히 알지 못하고 사용하는 경우가 많다. InnoDB 스토리지 엔진의 특성 먼저, InnoDB가 가지고 있는 특성에 대해서 알아보자. 프라이머리 키에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 PK를 기준으로 클러스터링되어 저장된다. (물리적으로) 따라서, PK를 사용한 레인지 스캔은 상당히 빨리 처리될 수 있다. 모든 세컨더리 인덱스는 레코드의 주소 대신 PK의 ..

    N+1 문제 해결하기

    N+1 문제란? 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 개수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상 발생 이유 N+1 문제가 발생하는 이유는 JPA가 JPQL을 분석해서 SQL을 생성할 때는 글로벌 Fetch 전략을 참고하지 않고 오직 JPQL 자체만을 사용하기 때문이다. 즉, 아래와 같은 순서로 동작하기 때문에 발생한다고 보면 된다. findAll()을 한 순간 select t from Team t 이라는 JPQL 구문이 생성되고 해당 구문을 분석한 select * from team이라는 SQL이 생성되어 실행된다. DB의 결과를 받아 team 엔티티의 인스턴스들을 생성한다. team과 연관되어 있는 user 도 로딩을 해야 한다. 영속성 컨텍스트에서..

    스프링 트랜잭션 전파속성

    트랜잭션 전파 속성이란? @Transactional 어노테이션(선언적 트랜잭션)을 사용하면 6가지 속성을 지정해 트랜잭션을 세부적으로 이용할 수 있다. readOnly isolation propagation timeout rollbackFor, noRollbackFor (트랜잭션 롤백/커밋 예외) 이중 Propagation은 새로운 트랜잭션을 시작할지 기존의 트랜잭션에 참여할지 등 트랜잭션의 진행 방식에 대한 내용을 결정하게 된다. Spring이 지원하는 전파속성은 다음의 7가지이다. REQUIRED SUPPORTS MANDATORY REQUIRES_NEW NOT_SUPPORTED NEVER NESTED 물리 트랜잭션과 논리 트랜잭션 물리 트랜잭션 : 실제 커넥션 객체를 사용하여 DB에 적용되는 트랜잭션..

    테스트 코드 시간 줄이기

    테스트 코드의 속도 TDD를 이용하여 개발을 진행하다 보면 테스트 속도가 개발 과정에서 영향을 미치는 일이 점점 많아진다. 회고덕 프로젝트를 진행하는 과정에서 테스트 속도를 최적화했던 과정을 공유하고자 한다. DirtiesContext 제거이전 이는 굉장히 초반에 제거한 부분으로, 테스트 속도의 개선이 가장 눈에 띄었던 부분이다. DirtiesContext란? @DirtiesContext는 인수테스트시에 사용하는 메서드인데, 이는 개발자가 정한 기준 (테스트 수행 전/후, 각 테스트 케이스 수행 전/후 등)에 맞춰서 Context를 매번 재생성하여 테스트 격리를 만드어두는 것이다. 스프링 공식문서 링크 테스트 결과 과거 코드의 경우에는 테스트코드가 굉장히 적어서, 현재 회고덕 코드에 DirtiesCont..

    JpaRespository가 아닌 Repository를 사용한 이유

    Spring Data Jpa의 Repository들 Spring Data JPA를 사용하면 대체로 JpaRepository 인터페이스를 사용하게 된다. 하지만 내부를 살펴보면 더 많은 Repository가 존재한다는 것을 알 수 있다. Repository - 기본적인 Repository이다. CrudRepository - CRUD 기능을 제공한다. PagingAndSortingRepository - 페이지네이션과 sort 기능을 제공한다 JpaRepository - 영속성 context를 flush하거나 Batch등의 기능을 선언하지 않고 사용할 수 있다. 이러한 Repository들은 상속관계로 연결되어있어, 결과적으로 JpaRepository는 상위의 모든 Repository가 제공하는 기능들을 제공..

    무중단 배포란?

    무중단 배포란? 말그대로 서비스를 중단하지 않고 배포하는 것을 의미한다. 관련 단어들 컴파일 : 프로그래머가 작성한 소스코드를 기계어로 변환 빌드 : 소스 코드 파일을 컴퓨터에서 실행할 수 있는 소프트웨어 산출물로 변환 배포 : 빌드의 결과물을 사용자가 접근할 수 있는 환경에 배치 무중단 배포가 필요한 이유 같은 포트에서 v1 서비스를 제공하다가 이를 중지하고 새로운 v2 버전을 시작하기까지 서비스는 자연스럽게 중단되게 된다. 이렇게 서비스가 중단되는 시간을 다운타임(Down time)이라고 한다. 물론 유저가 없는 시간에 진행하는 등의 방법으로 회피할 수는 있겠으나, 유저에게 최상의 경험을 제공하기 위해서는 이러한 다운 타임이 없는 무중단 배포를 지원하는 것이 좋다. 리버스 프록시와 로드밸런싱 리버스 ..

    VPC란 무엇인가?

    기존에는 VPC 같은 개념에 대해서 접할 일이 많지 않았는데, 우테코 활동을 하며 AWS 내의 VPN, 서브넷과 같은 개념을 접하게 되어 간단하게 정리해보고자 한다. VPC란 Virtual Private Cloud의 약자로 AWS 클라우드 내에서 논리적으로 격리된 가상 네트워크를 말한다. 해당 네트워크 내에서 EC2 인스턴스와 같은 리소스를 실행할 수 있다. 간단하게 정리하자면 아래 이미지, 그리고 세 가지를 생각하면 좋다. AWS에 사설 네트워크 구축 세심한 네트워크 설정 가능 모든 리전에서 이용 가능 구성 요소 프라이빗 IP 주소, 퍼블릭 IP 주소, Elastic IP 주소 Private IP : VPC 내부에서만 사용할 수 있는 IP 주소 서브넷의 범위에서 자동으로 할당되며, 동일 네트워크에서 인..

    [Spring] BIO NIO 스레드 풀

    Tomcat의 핵심 요소로는 저번에 Servlet Container 인 Catalina와 Connector Framework인 Coyote가 있다. 이중, Servlet Container가 외부와의 소통을 가능하게 하는 Connector에 대해서 알아보자. Connector의 역할 우선, port listen을 통해 Socket Connection을 얻는다. Socket Connection으로부터 데이터 패킷을 획득. 데이터 패킷을 파싱해서 ServletRequest Object를 생성한다. 얻어진 ServletRequest Object를 알맞은 Servlet Container에게 보낸다. 즉, Connector의 역할은 network port를 listen 하여 connection을 얻은 후, 데이터를..

    캐시란?

    캐시란? 캐시란 자주 사용하는 데이터나 값을 미리 복사해놓는 임시 장소를 가리킨다. 저장 공간이 작고 비싼 대신, 빠른 성능을 제공한다. 즉, 반복적으로 사용되는 데이터를 불러올 때, 매번 DBMS나 서버에 요청하는 것이 아니라 메모리에 저장하였다가 쓰는 것을 의미한다. 캐시 적용 / 미적용 시나리오 캐시가 없을 때 데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드하여야 한다. 인터넷 네트워크는 매우 느리고 비싸다. 브라우저 로딩 속도가 느리다. 느린 사용자 경험 캐시 적용 캐시덕분에 캐시 가능 시간 동안 네트워크를 사용하지 않아도 된다. 비싼 네트워크 사용량을 줄인다. 브라우저 로딩 속도를 빠르게 할 수 있다. 빠른 사용자 경험 캐시 시간 초과 캐시 유효 시간이 초과 → 서버를 통해 데..

    회고덕 팀 1주차 회고

    방학 때 한 공부에 대해서는 블로그 글을 많이 적지 못해서 아쉬웠던 터라 (이사 준비 등으로 바빠서... 그냥 노션 정도에만 정리하는 것으로 그쳤다.) 이번에는 고민하는 과정 등을 블로그에 한번 정리하면서 레벨 3의 과정을 정리해보고자 한다. 방학기간, 아이디어 회의 우리 팀의 경우에는 첫 아이디어를 고르는 데에도 꽤 많은 고심을 했다. 현재 잡힌 아이디어인 '회고 플랫폼' 회고덕을 포함하여 정말 많은 아이디어들을 팀원들과 논의하였는데, 각 아이디어들의 장단점이나 특징들을 표에 정리하면서 투표를 진행한 결과, 회고덕으로 진행되었다. 내가 먼저 제시했던 기능이니만큼 나 자신이 필요하다고 여겼던 부분은 바로 회고를 모아보고, 또 쉽게 만드는 기능이었다. 아마 앞으로도 그런 부분에 강점을 두고 계속 기획이나 ..