MySQL 서버 구조 MySQL 서버는 서버로부터 SQL 요청을 받고 해당 SQL을 처리하는 프로세스를 처리하기 위해 아래와 같은 순서로 디스크에 접근해서 요청을 처리한다. MySQL엔진에서 쿼리를 처리하고, 스토리지 엔진을 통해 데이터를 쓰거나 읽을 수 있다. MySQL 엔진 MySQL 엔진은 내부적으로 쿼리 파서, 전처리기, 옵티마이저, 쿼리 실행기를 가지고 있다. 쿼리 파서 SQL을 파싱하여 Syntax Tree를 만들고, 이 과정에서 문법 오류 검사를 수행한다. 전처리기 쿼리파서에서 만든 Tree를 바탕으로 전처리(preprocessing)를 수행한다. ex) 테이블이나 컬럼 존재 여부, 접근 권한 등의 오류 검사 쿼리파서와 전처리기는 컴파일 과정과 매우 유사하지만, SQL은 프로그래밍 언어처럼 ..
문제 Controller에 대한 Test를 진행하기 위해 @WebMvcTest를 진행했다. @SpringBootTest는 모든 구성 요소를 로드해서 실제 실행과 같은 환경에서 테스트를 진행하기 때문에 매우 무겁다는 단점이 있어 Controller에 대한 테스트는 @WebMvcTest를 사용하는 것으로 알고있어서 선택한 것이었다. 하지만 @WebMvcTest가 어떻게 동작하는지에 대해 모르는 상태였고, 그에 따라 "jpa metamodel must not be empty!" 라는 에러 메세지를 만나게 되었고, 문제를 해결하면서 @WebMvcTest에 대해 공부해보았다. 원인 jpa metamodel must not be empty는 Auditing 관련 빈을 생성하지 않고 @EnableJpaAuditing..
문제 상황 H2 데이터베이스에 연결한 상태로 JPA에 대한 테스트 코드를 작성하는 도중 테이블이 정상적으로 생성되었음에도 아래와 같은 "테이블을 찾을 수 없다"는 에러 메세지를 보게되었고, 해당 문제를 해결하기 위해 @DataJpaTest에 대해 찾아보았다. could not prepare statement [Table "ARTICLE" not found (this database is empty); SQL statement: @DataJpaTest @DataJpaTest는 JPA에 대한 테스트 실행 시 테스트를 위한 내장 데이터베이스를 생성해서 실제 DB에 영향을 주지않고 테스트 할 수 있도록 환경을 제공해준다. @DataJpaTest의 동작 과정은 EntityScan을 통해 Entity들을 읽어 스키..
JPA Auditing이란? 생성자, 수정자, 생성 시간, 수정 시간과 같은 메타 데이터를 자동으로 관리할 수 있는 JPA 라이브러리이다. Auditing 적용방법 @EnableJpaAuditing JPA Auditing 기능을 활성화하는 애노테이션으로 꼭 활성화를 시켜주어야 Auditing이 정상적으로 동작한다. * Config class에서 @EnableJpaAuditing을 넣어주어도 무방하다. @EnableJpaAuditing @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } @EntityLis..
고민 게시글에 해시 태그 기능을 넣을 때 DB 스키마를 어떻게 설계할 지 고민해보았다. 게시글 테이블에 해시 태그 컬럼을 추가해서 해시 태그를 저장하는 방법과 해시 태그 테이블을 분리하여 게시글 아이디를 외래키로 사용하는 방법 2가지에 대해 고민해보았다. 해시 태그 방식 해시 태그 테이블을 사용했을 때는 매번 조인을 해야하고, 그에 따라 쿼리가 좀 더 복잡해지며, 데이터가 많아지면 조인으로 인한 성능 저하가 발생할 수 있다는 단점과 정규화를 통해 중복을 최소화하고, 태그에 대한 검색에서는 성능이 잘 나올 수 있다는 장점이 있다. 컬럼 방식 컬럼 방식으로 저장 시 검색에서 parsing 또는 like 연산에 의한 성능 저하가 발생하고, 정규화가 힘들다는 단점이 있지만, 테이블 구조가 심플하고, 조인이 없어..
팀 프로젝트를 진행하게 되면 Github, Bitbucket과 같은 형상 관리 툴을 사용해야한다. 이때 프로젝트에 사용된 DB 주소나 Password, API Key 등의 민감 정보가 업로드 되지않도록 주의해야한다. 아래와 같이 민감 정보를 감추는 다양한 방법들이 존재하는데, 이번 포스팅에서는 환경 변수를 사용하는 방법에 대해 살펴보겠다. 환경 변수 사용 .gitignore를 이용해 민감 정보가 담긴 파일 따로 관리 Jasypt를 이용한 설정 파일 속성 값 암호화 Vault, spring cloud config와 같은 중앙화된 민감 정보 저장소 활용 application.yml 파일에 환경 변수 적용하는 방법 달러 기호와 중괄호를 이용해서 환경 변수를 적용할 수 있으며, spring 파일에서는 @Valu..