분류 전체보기

    [Docker] Spring Boot와 MySQL을 docker-compose로 실행하자

    이전 게시글에선 서버에서 직접 어플리케이션 소스 코드를 다운받아 빌드하는 배포 방식을 사용했다면, 이번엔 도커를 사용하여 어플리케이션을 이미지로 만들어 배포하는 방식을 사용할 것이다. 따라서 본 게시글엔 이미지 배포의 첫번째 단계인 도커를 통한 이미지 빌드 방식을 서술하려고 한다. Docker 일관성 있는 운영환경의 중요성이 강조됨에 따라 컨테이너를 통한 배포 방식이 주를 이루며 사용되고 있다. 또한 어플리케이션의 코드 상의 문제를 테스트 코드에서 검증했다면, 운영상의 서버 설정 문제를 컨테이너에서 검증할 수도 있다. Dockerfile? docker-compose? docker를 처음 사용하려고 보면 어떤 곳에선 Dockerfile을, 어떤 곳에선 docker-compose를 사용하고 있다. 어떤 차이..

    [JAVA] JMH(Java Microbenchmark Harness)를 사용하여 성능 테스트를 해보자

    JMH(Java Microbenchmark Harness) 개발을 하다보면 이 로직보다 다른 로직이 더 빠를 것 같은데? 이 라이브러리 사용이 더 좋을 것 같은데? 하는 궁금증이 있다. 하지만 어플리케이션 단위로 성능을 측정하기엔 부수적인 로직들과 라이브러리가 들어가기 때문에, 함수 단위로 성능 측정을 하고 싶은 생각이 든다. 그렇다고 time함수를 사용해서 end time과 start time을 측정해서 성능 테스트 결과는 이러하다 라고 하기엔 warm up, 쓰레드 갯수 등 고려해야 할 사항들이 많다. 이러한 부분을 해결해주기 위한 성능 측정 프레임워크가 벤치마크 프레임워크이다. 특징 oracle의 jit compiler 개발자가 만들었기 때문에 타 benchmark framework보다 신뢰할 수 ..

    [JPA] Spring Jpa Repository의 영속성 컨텍스트 동작방식

    개발을 하다보면 Root 도메인에 종속적인 Sub 도메인을 어떻게 처리할지 고민이 될 때가 있다. 예를 들면, 재생 목록의 음악들은 재생 목록이라는 Root 도메인에 종속적인 Sub 도메인 들이다. Delete And Insert 방식을 실행할 수도 있고, Update 방식을 사용할 수도 있다. 그러다보니 JPA를 사용했을때, 각 개발 방식이 어떻게 동작하는지 알고 싶어서 직접 엔티티를 생성하며 테스트 코드를 작성해 보았다. 코드는 모두 깃허브에 작성해두었다. private SimpleEntity create(String name) { SimpleEntity entity = SimpleEntity.builder() .name(name) .build(); return repository.save(entit..

    [JPA] Spring Data에서 save()와 saveAll()의 성능 차이

    https://www.baeldung.com/spring-data-save-saveall 해당 글은 위 링크를 번역한 글입니다. Overview Spring Data의 save와 saveAll의 성능 차이를 알아보자. Application Book.java @Entity public class Book { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String title; private String author; // constructors, standard getters and setters } BookRepository.java public interface BookRepository extends JpaR..

    [Gradle] Spring Boot 멀티 모듈 설정

    Gradle Groovy 언어를 기반으로한 빌드 도구 왜 maven이 아닌 gradle을 사용할까 cache를 적용하여 빌드 속도를 줄일 수 있다. 스크립트 언어로 변수 설정, 로직 구현 등 반복되는 코드 양을 줄일 수 있다. task 설정, 모듈별 의존성 설정 등 xml과 비교해 가독성이 높다. init.gradle 초기화 스크립트, build시에 가장 먼저 실행 사용자 정보 및 실행 환경 초기화에 사용 gradle.properties 환경에 따라 값이 달라지는 파라미터 정의 settings.gradle rootProject.name = 'study' include 'simple' 빌드 대상 프로젝트를 설정 멀티 모듈 프로젝트에서 build 대상 프로젝트를 지정 build.gradle 프로젝트 의존관계..

    [Github Action] CodeDeploy와 S3를 이용하여 배포하기

    배포 전 CI 구성은 여기에 정리해두었다. 전체 과정은 wbluke님 블로그를 많이 참고했다. 전체 코드는 깃허브에 정리해두었다. 전체 배포 과정 어플리케이션에 배포에 필요한 절차를 AppSpec.yml에 작성한다. CodeDeploy에 프로젝트의 특정 버전을 배포해달라고 요청하면, CodeDeploy는 배포를 진행할 EC2 인스턴스에 설치되어 있는 CodeDeploy Agent들에게 요청받은 버전을 배포해달라고 요청 요청받은 Agent들은 코드 저장소에서 프로젝트 전체를 다운로드 받고, AppSpec.yml 파일을 읽어 해당 파일의 절차대로 배포를 진행한다. Agent는 배포를 진행한 후 CodeDeploy에게 성공/실패 등의 결과를 알려준다. AWS 리소스 생성 EC2 jar 파일을 실행시킬 OS에 ..