프로그래밍 공부

    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] DB ConnectionPool이란?

    DB Connection DB를 사용하기 위해 DB와 애플리케이션 간 통신을 할 수 있는 수단. DB 드라이버와 DB 연결정보를 담은 URL이 필요하다. DB 커넥션풀 DB 커넥션 객체를 여러 개 생성하여 풀(Pool)에 담아놓고 필요할 때 꺼내쓰는 방식. 즉, 자주 쓰는 객체를 미리 만들고, 사용한 다음 필요할 때마다 가져간 다음에 반납하는 방식(=Pooling)을 의미한다. 간단히 정리하자면 다음과 같다. 여러 개의 DB Connection을 하나의 Pool에 모아놓고 관리 DB 커넥션 객체를 여러 개 생성한 뒤 Pool에 담아놓고 필요할 때 불러와서 사용 만약, 빌려줄 수 있는 Connection이 없다면 Connection 객체가 반환할 때 까지 클라이언트는 대기 상태로 전환 사용이 끝난 커넥션 ..

    [TDD] 테스트 코드 작성 순서와 종류

    레벨 2가 되고 Spring을 사용하다 보니 TDD에 대한 부분이 다소 무너지는 것 같아서 테스트 주도 개발 시작하기 (최범균 저)의 내용을 간단하게 정리하여 이야기해보고자 한다. 테스트 코드 작성 순서 쉬운 경우에서 어려운 경우로 진행 예외적인 경우에서 정상인 경우로 진행 초반에 복잡한 테스트부터 시작하면 안 되는 이유 초반부터 다양한 조합을 검사해야 하는 코드를 만들게 되면, 해당 테스트를 통과시키기 위한 코드가 많아진다. 한 번에 완벽한 코드를 짤 수는 없기 때문에 작성하기 쉬운 코드를 작성하는 것이 개발 속도에 많은 도움이 된다고 한다. 한 번에 구현하는 시간이 짧아지면 디버깅할 때 유리하고, 원인을 찾기도 더 빠르다. 예외상황을 먼저 테스트해야 되는 이유 예외상황은 복잡한 if 블록을 동반할 때..

    도메인이란 무엇인가?

    개발을 진행함에 있어서 '도메인' 이라는 개념을 처음 들어본 사람은 없을 것이라고 생각한다. 그러나, '도메인이 뭐라고 생각하세요?' 라고 물어보면 막상 대답하기 어려운 것이, 이렇게 적당히 알고 있기 때문에 넘어가는 개념들이라고 생각한다. (일단, 나는 그랬다.) 이프와 이야기하다가 해당 개념에 대한 나의 생각이 부족하다고 생각해서 도메인에 대한 정리를 해보려고 한다. 도메인이란? 먼저, 사전적 정의를 얘기해보자 A domain is a field of study that defines a set of common requirements, terminology, and functionality for any software program constructed to solve a problem in th..