분류 전체보기 168

SwaggerUI + Spring REST Docs 함께 사용하기(feat. Rest Assured)

이 글은 딥다이브한 내용을 쭉 풀어쓴 내용입니다. 시간이 없으신 분은 전체 소스코드를 참고해 주세요. 0. 시도하게된 이유 0.1 Swagger 경험 이전에 TODO List 라는 프로젝트에서 Swagger 를 사용해본 적이 있습니다. API 문서가 자동으로 생긴다는 점은 편했지만, 비즈니스 로직과 API 를 위한 코드가 섞여있다는 것이 마음에 들지 않았습니다. 0.2 Spring REST Docs 시도 그러던 중 우아한형제들 기술블로그를 인상깊게 보아 Spring REST Docs 를 시도해보게 되었습니다. Spring REST Docs 는 다음과 같은 장점이 있었습니다. API 문서가 테스트코드 통과 후 생성됨 비즈니스 로직에는 API 문서 관련 코드가 전혀 없음 커스텀이 자유로움 하지만, 다음과 같..

Java/Spring 2022.07.31

2022 코드스쿼드 마스터즈 코스 백엔드 과정 수료 회고

회고를 시작하며(시작을 되돌아 보며) 우물안 개구리 시작을 되돌아 보면, 나는 우물안 개구리였던 것 같다. 다른 개발자(개발자 지망생)들이 얼마나 치열하게 살고있는지, 어떤 책을 읽으며 어떤 강의를 보고 어떻게 공부하는지 전혀 몰랐다. 하지만 2022 코드스쿼드 마스터즈 코스 백엔드 과정에서 동료들과 공부한 경험은 내 인생의 전환점이 될 것이라 확신한다. 과정중에 느낀것들 기본기 기본기를 제쳐두고 기술 사용법만 익히는 태도는, 한쪽 눈을 감고 사는것과 마찬가지라는 생각이 들었다. 한쪽 눈을 감고 살면, 감은 쪽 눈의 세상은 보지 못한 채 지나간다. 만약 그 쪽에 내가 찾고있던 장소가 있었다면, 찾는데 시간이 많이 걸리거나 못찾을 수도 있다. 즉, 기본기를 잘 다져놓아야 아는 만큼 보이고, 보이는 만큼 배..

회고 2022.06.28

AWS EC2, RDS, VPC 및 배포 자동화 구성하기

위 그림과 같은 인프라 구조를 구성하는것이 목표 입니다. 1. VPC 설정 이름 : issue-tracker-vpc IPv4 CIDR : 10.0.0.0/16 태그 : project, issue-tracker 1.1 private subnet 2개 생성 이름 : issue-tracker-private-subnet-1-ap-northeast-2a private subnet 1 : 10.0.0.0/24 가용 영역 : ap-northeast-2a 태그 : project, issue-tracker 이름 : issue-tracker-private-subnet-2-ap-northeast-2b private subnet 1 : 10.0.1.0/24 가용 영역 : ap-northeast-2b 태그 : project, ..

9. 옵티마이저와 힌트

1. 개요 옵티마이저는 DBMS 에서 가장 복잡한 부분입니다. 그래서 옵티마이저가 만들어 내는 실행 계획을 이해하는 것 또한 상당히 어렵습니다. 하지만, 실행 계획을 이해할 수 있어야 불합리한 부분을 찾아 최적화할 수 있습니다. 먼저, 아래에서 실행 계획을 이해하기 위해 필요한 내용들을 짚고 넘어가겠습니다. 1.1 쿼리 실행 절차 1. SQL 파서 가 SQL 문장을 분석하여, 파스 트리 를 만들어 낸다. 1번 작업은 MySQL 의 SQL 파서(쿼리 파서) 에서 실행됩니다. 2. 파스 트리 를 확인하며 테이블을 읽고, 어떤 인덱스를 이용할지 선택한다. 2번 작업은 옵티마이저 가 실행하고, 이때 결정된 사항들이 실행 계획입니다. 3. 2번째 단계에서 결정된 테이블 읽기 순서나, 선택된 인덱스를 통해 스토리지..

데이터베이스 2022.06.14

8. 인덱스 (2)

4. R-Tree 인덱스 MySQL 에는 공간 인덱스(Spatial Index) 라는 개념이 있습니다. 2차원의 데이터를 인덱싱하고, 검색하는 목적의 인덱스 입니다. 기본적인 내부 메커니즘은 B-Tree 와 흡사하지만, B-Tree 는 1차원의 스칼라 값* 차이점은 2차원 공간 개념 값을 저장한다는 것입니다. 스칼라 값 크기, 양만을 나타내는, 숫자로만 표시되는 값을 의미합니다. 예) 우유 1팩의 용량, 비행기의 무게 등 MySQL 은 공간 데이터를 다룰 수 있는 공간 확장(Spatial Extention)을 제공하는데 다음과 같은 기능들이 있습니다. 공간 데이터를 저장할 수 있는 데이터 타입 공간 데이터 검색을 위한 공간 인덱스 (R-Tree 알고리즘) 공간 데이터의 연산 함수 (거리 또는 포함 관계의..

데이터베이스 2022.06.08

8. 인덱스 (1)

1. 디스크 읽기 방식 CPU나 메모리 처럼 전기적 특성을 띄 장치와 HDD, SDD 같은 기계식 장치는 처리속도 차이가 아주 많이 납니다. 그래서 쿼리의 성능을 좌우하는 것은, 어떻게 디스크 I/O 를 줄이느냐가 핵심이라고 합니다. 그러기 위해서는 먼저 디스크에 대해 살짝 짚고 넘어가야 합니다. 1-1. HDD 와 SSD 위는 컴퓨터 주요 장치들의 처리 속도 차트입니다. 기본적으로 CPU 의 처리속도는 SSD, HDD 에 비해 월등히 빠른 것을 보실 수 있습니다. SSD 의 장점은 기존 HDD 보다 랜덤 I/O 가 훨씬 빠르다는 것 입니다. 그래서 DBMS 와 같이 순차 I/O 보다 랜덤 I/O 가 훨씬 더 자주 일어나는 환경에서는 SSD 가 적합합니다. 1-2. 랜덤 I/O 와 순차 I/O 데이터 페..

데이터베이스 2022.05.31

SpringBoot 설정 암호화

Github Action 을 이용한 배포 자동화를 진행해보려니, application.properties 의 민감정보를 어떻게 처리해야할지 고민이 되었습니다. 여러 방법을 찾아보다가, 찾은 선택지는 다음과 같습니다. 민감정보 환경변수(변수) 관리 Secrets 에서 설정파일 내용을 읽어와서 Github Action 에서 설정파일 생성 민감정보 암호화 결론부터 말씀드리면 저는 4번 방법을 선택했는데요. 각 방법에 장단점이 있어서, 간단하게 정리해봤습니다. 방법 장점 단점 1. 민감정보 환경변수 관리 - 설정파일을 Github 에 올릴 수 있음 - 개발, 빌드, 서버 세곳의 환경변수를 관리해야함 - 관리할 민감정보가 많아질수록 관리하기 힘듦 2. Secrets 에서 설정파일 내용을 읽어와서 Github Ac..

Java/Spring 2022.05.27

AWS 프로젝트 환경 구성(VPC, EC2, RDS, CodeDeploy)

1. 프로젝트용 사용자 생성 필요한 권한(FullAccess) VPC RDS EC2 2. VPC 서브넷 구축 Multi AZ 로 구성하지 않은 이유 WAS 와 DB 의 안정적인 서비스를 위해서는 AZ_2 도 구성해야합니다. 하지만, 비용상의 문제로 실습만 해보고 운영하진 않을 예정입니다. AZ_2 가용영역에 private subnet 이 있는 이유 그럼에도 private subnet - 2 를 만든 이유는 RDS 서브넷 그룹이 최소 2개 이상의 가용영역으로 구성된 서브넷들로 구성해야하기 때문입니다. 정석대로라면, NAT Gateway 와 Bastion 을 분리해야 하지만, 비용상의 문제로 2개를 함께 운용하기로 결정하였습니다. (private subnet - 2 VPC 에서 서브넷만 생성해놓고, 인스턴스..

인프라 2022.05.26

5. 트랜잭션과 잠금

Real MysQL 8.0 1권을 읽고 정리한 내용입니다. 잘못된 내용이 있을 경우 댓글로 남겨주시면 감사하겠습니다🙏 트랜잭션 논리적인 작업셋이 모두 처리되거나, 모두 처리되지 않는 기능입니다. 이로서, 작업의 완전성을 보장해주게 됩니다. ACID 라는 트랜잭션이 안전하게 수행된다는 것을 보장하는 성질이 있습니다. Atomic : 원자성, 트랜잭션 내의 작업들은 모두 성공하거나, 모두 실패함 Consistency : 일관성, 데이터의 일관성(무결성)을 보장해야함 Isolation : 독립성(상호배제성), 다른 트랜잭션의 영향을 받지 않아야함 Durability : 지속성, 성공하면 영구적으로 반영되고 장애시에도 데이터 정합성에 문제가 없어야 함 MySQL 에서의 트랜잭션 트랜잭션은 여러개의 변경 작업들이..

데이터베이스 2022.05.24

[MySQL] 4. 아키텍처(2)

Real MysQL 8.0 1권을 읽고 정리한 내용입니다. 잘못된 내용이 있을 경우 댓글로 남겨주시면 감사하겠습니다🙏 InnoDB 스토리지 엔진 아키텍처 MySQL 의 스토리지 엔진 중 가장 많이 사용되는 InnoDB 스토리지 엔진은 위와 같은 구조로 되어있습니다. InnoDB 는 MySQL 에서 사용할 수 있는 스토리지 엔진 중에서 거의 유일하게 record lock 을 제공합니다. 그래서 높은 동시성 처리가 가능하고, 성능이 뛰어납니다. 프라이머리 키에 의한 클러스터링 InnoDB 의 모든 테이블은 프라이머리 키(PK)를 기준으로 클러스터링 되어 저장됩니다. 즉, 테이블의 레코드들은 디스크에 PK 의 순서대로 저장된다는 뜻 입니다. 그리고 세컨더리 인덱스*는 레코드의 주소 대신, PK 값을 논리적인 ..

데이터베이스 2022.05.16