OpenApI 3.0 Swagger 문서 작성 및 설정 방법
·
Spring
들어가며Swagger 는 RestDocs 에 비해 단순 적용은 간편하지만 기본적인 설정만으로 사용하기에는 아쉬운 부분이 있다. 이번 글에서는 Open API 3.0 Swagger 를 적용할때 필요한 개념과 조금 더 나은 문서를 만들기 위한 몇가지 노력들을 적어본다. Spring을 사용한다면 아래 2개의 라이브러리를 사용할 수 있다.Spring FoxSpring DocSpring Fox의 경우 마지막 업데이트일인 2020년 이후 업데이트가 없으므로, Spring Doc을 사용했다. Springdoc-openapi Modules SpringDoc OpenAPI는 Spring Boot 뿐만 아니라, WebFlux 도 지원하며 UI 레이어와 REST API 레이어로 구분되어 구성된다.UI 레이어는 API 문서를..
[Gradle] 통합 테스트 패키지 분리하기
·
Gradle
들어가며테스트를 작성할때 통합테스트, 단위테스트를 나눠서 관리하고 싶었다. 단위 테스트와 통합테스트는 테스트 소요 시간이 차이가 나고, 단위테스트에서 필요한 의존성과 통합 테스트에서 필요한 의존성이 다른 경우가 많다. Gradle 에서 통합테스트는 통합 테스트끼리, 단위 테스트는 단위 테스트끼리 실행하고 싶을 경우 별도 모듈로 나누거나, 별도 패키지로 나눠서 관리할 수 있다. 이 글은 패키지로 나누는 경우에 대한 글이다. 아이디어sourceSets는 Gradle에서 소스 코드와 리소스 파일의 경로, 클래스 경로 등을 정의하는 구조다. Gradle에서 java(또는 java-library) 플러그인을 추가하면 main, test  두 개의 sourceSet 들이 정의된다. main 에는 applicatio..
[Mysql] 데이터 Dump/Import
·
카테고리 없음
언제 사용하는가?MySQL 데이터를 다른 MySQL 인스턴스로 옮겨야 할 때가 있다.운영 환경 DB 데이터를 개발 환경의 DB로 옮길 때온-프레미스로 운영하던 DB를 AWS RDS 같은 클라우드 서비스로 옮길 때 데이터 백업, 아카이빙MySQL 재설치사이드프로젝트에서 기존에는 비용 문제로 인해 docker-compose 를 이용해 단일 EC2 애플리케이션과 mysql 을 띄워 실행시켰다.이번에 인프라 구성을 RDS 로 변경하게 되면서 RDS 로 기존 데이터를 옮기는 작업이 필요하므로, 2번 상황에 해당한다. 이 때 데이터 덤프, 임포트 작업이 필요하며 mysql 의 경우 mysql-client 를 이용한다. (Mysql Workbench 를 쓰더라도 내부적으로 mysql-client 의 mysqldump..
[Docker] docker prune 으로 사용하지 않는 오브젝트 정리
·
Infra
docker prune 명령어docker 의 prune 명령어를 이용하면 사용하지 않는 컨테이너, 이미지, 네트워크, 볼륨 등을 일괄 삭제할 수 있다.docker container prunedocker image prunedocker network prunedocker volume prune --filter 를 이용해 필터링 조건을 추가할 수 있다.  # 24시간동안 사용하지 않은 이미지docker container prune --filter "until=24h"# env=dev 라벨을 가진 볼륨docker volume prune --filter "label=env=dev"# 72시간동안 사용되지 않는 builder 캐시docker builder prune --filter "unused-for=72h"#..
[GitHub] 반복적인 Github Label 생성 작업 자동화하기
·
Git&GitHub
들어가며새로운 프로젝트를 진행하면서 Label을 만들어야 할 일이 생겼다. 기존에는 Label을 프로젝트마다 수동으로 작성했는데 공통으로 사용되는게 많을 뿐더러 같은 Label을 반복적으로 만들면서 너무 번거롭다고 느껴졌다. 이를 자동화할 수 있는 방법을 찾아보았고 GithubAPI 와 GitHub Label Sync 를 이용해 해결했다. 아이디어기존 Repo 에는 라벨이 생성되어 있으므로, 기존 Repo 의 라벨을 읽어와 새로운 레포에 적용시켜주면 될 것이다.신규 리포에 존재하던 라벨을 모두 지운다GithubAPI 로 기존리포에 라벨을 읽어온다이를 GitHub Label Sync 를 이용해 동기화해준다 Github Token을 발급한다토큰이 있다면 해당 부분은 건너뛰어도 된다.  깃허브 토큰이 없는 경..
[SpringBoot] MapStruct 제대로 활용하기
·
Spring
들어가며MapStruct는 Java 애플리케이션에서 객체 간의 매핑을 자동으로 생성하기 위한 코드 생성기다.이번 글에서는 프로젝트에서 MapStruct 를 사용한 부분을 리팩토링한 몇 가지 예시를 통해 MapStruct 를 조금 더 효율적으로 쓰기 위해 알아야 할 부분들을 정리했다. 기본 사용법에 대한 내용은 편리한 객체 간 매핑을 위한 MapStruct 적용기 (feat. SENS) 에 잘 설명되어 있으니 참고하면 좋을 것 같다. default 메소드는 필요시에만 사용한다아래처럼 source 와 target 이 존재하고 이를 매핑해야 하는 경우// source@Builderpublic record QueryMemberJoinTeam( TeamMemberRole role, Lon..
[SpringBoot] @DataJpaTest 테스트 클래스 간 데이터 충돌 문제 해결
·
Spring
들어가며Repository 테스트를 하던 중, 개별 테스트는 성공하는데 전체 테스트가 실패하는 현상이 발생해, 이를 해결하고 정리한 글이다. Repository 단위 테스트 구성Repository 테스트는 아래처럼 RepositoryTest 클래스를 만들어서 상속하도록 구성했다.이렇게 구성한 이유는 아래와 같다.모든 테스트 클래스마다 애노테이션을 매번 붙이기 번거롭다.공통으로 의존성을 주입해야 하는 것들을 한 번만 작성하면 된다. (ex TestEntityManager 등)@BeforeEach 등을 상위 클래스에 정의해주면 이를 상속하는 모든 클래스에 적용된다.static 으로 공통 설정을 관리할 수 있다. (TestContainers 등)@DataJpaTest@ExtendWith(SpringExtens..
[SpringBoot] 데이터베이스 마이그레이션 툴 Flyway 도입기
·
Spring
들어가며프로젝트에서 데이터베이스 마이그레이션 툴로 Flyway 를 도입하면서 이를 정리한 글이다. 데이터베이스 마이그레이션데이터베이스 마이그레이션이란?데이터베이스 마이그레이션은 데이터베이스 구조나 데이터 자체를 변경하는 과정을 의미한다.데이터 이전: 하나의 데이터베이스 시스템에서 다른 시스템으로 데이터를 옮기는 작업데이터베이스 스키마 변경: 테이블, 인덱스 등 데이터베이스 구조를 추가, 수정, 삭제버전 관리 및 이력 추적: 마이그레이션 툴을 이용해 데이터베이스의 변경 사항을 버전 관리하고 변경 내역을 추적왜 도입하려고 하는가?프로젝트를 진행할 때 로컬, 개발, 프로덕션 각각 별도로 데이터베이스를 사용해왔다. 개발시 엔티티 구조를 변경했을 때 이로 인해 데이터베이스 스키마도 변경되는데, 이 변경된 구조를 ..
자바의 정석 OOP(1)
·
Java
자바의 정석 객체지향(1) 부분을 읽고, 압축 정리한 글이다.객체지향 언어객체지향 언어의 주요 특징 3가지코드의 재사용성이 높다. : 새로운 코드를 작성할 때 기존의 코드를 이용해 쉽게 작성이 가능하다.코드의 관리가 용이하다. : 코드 간 관계를 이용해 적은 노력으로 쉽게 코드를 변경할 수 있다.신뢰성이 높은 프로그래밍을 가능하게 한다. : 제어자와 메서드를 이용해 데이터를 보호하고, 올바른 값을 유지하도록 하며 코드의 중복을 제거해 코드의 불일치로 인한 오동작을 방지한다.객체지향 개념은 아래 3가지를 생각하며 학습한다.재사용성유지보수중복 코드의 제거객체지향 개념을 이해했다 하더라도 객체지향적 장점들을 충분히 활용한 프로그램을 작성하기는 쉽지 않다.너무 객체지향 개념에 얽매여 고민하기보다는 프로그램을 기..
[JPA] EntityManager 정리
·
JPA
JPA 를 사용하면서, 엔티티 매니저에 대한 개념이 부족한 것 같아, 관련 개념들을 정리한 글이다.EntityManagerFactory엔티티 매니저 팩토리는 엔티티 매니저를 만드는 팩토리로 여러 스레드가 동시에 접근해도 안전하게 사용할 수 있도록 설계되었다. 따라서, 엔티티 매니저 팩토리를 여러 군데에서 @PersistenceUnit 으로 주입 받아도 인스턴스 객체는 항상 같다. EntityManagerFactory 를 인스턴스화 할 때 생성비용이 크기 때문에 한개만 만들어 애플리케이션 전체에서 공유한다. 생성 비용이 크다는 것은 EntityManagerFactory 를 인스턴스화할 때 여러 가지 초기화 작업이 많이 필요하다는 것을 의미한다. 아래와 같은 초기화 작업이 이루어지며, 리소스와 시간이 많이 ..