보통 Blue/Green 자동화 배포 파이프라인을 구축할 때 Jenkins를 많이 이용한다. Aws에서 제공하는 Code Pipeline을 사용해 구축할 수 도 있지만 배포할 때마다 비용이 발생하므로, 자주 배포가 일어난다면 서버 비용만 나오는 Jenkins를 사용하는 것이 이득일 수 있다. 아래 예제는 Bitbucket Repository 안에 있는 소스를 배포해야 하므로 Bitbucket과 연동하는 법으로 정리하였고 젠킨스 서버는 Local에서 Docker 컨테이너를 띄어 진행했다. 간단히 그림으로 표현하자만 아래와 같다. 1. 젠킨스 이미지 다운로드 및 실행 아래 명령어로 젠킨스 도커 이미지를 다운로드해 컨테이너를 실행한다. docker run -itd --name jenkins -p 8090:80..
분류 전체보기
반응형
고 평소 API 문서를 적용할때는 Spring Rest Docs를 많이 사용했는데 이번 기회에 Spring Docs + Swagger ui를 적용해서 둘의 장단점 비교를 해보고 싶어서 사용해봤다. Spring Docs. + Swagger 설정 예제 개발 환경은 Spring Boot 2.6.6 버전에 Gradle을 사용하였다. 1. dependency 설정 dependencies { ... compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' implementation 'org.springdoc:springdoc-openapi-ui:1.6.8' } springdoc-openapi-ui 안에는 Swagger-..
Querydsl를 사용하던 중 Expressions.stringTemplate을 이용해 MySQL에 DATE_FORAMT을 사용했는데, 실제 API는 잘 작동하지만 Test 코드에서는 DATE_FORMAT 함수가 없다고 오류가 발생했다. 실제 API 데이터베이스는 MySQL을 사용하고 테스트는 H2 Database를 사용했다. ... Expressions.stringTemplate( "date_format({0}, '%m')", user.createdDateTime ), ... 검색해보니 H2에는 DATE_FORMAT 함수가 없고 FORMATDATETIME을 사용해야 하는데 요것을 사용하면 실제 API에서 오류가 발생하고... 그래서 H2 Database에 사용자 정의 alias를 등록해 사용하기로 하였..
의도를 분명히 밝혀라 의도가 분명하게 들어나있는 이름을 지어라. 좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다. 그러므로 이름을 주의 깊게 살펴 더 나은 이름이 떠오르면 개선하기 바란다. 변수나 함수 그리고 클래스 이름은 존재의 이유, 수행기능, 사용 방법을 주석으로 설명하지 않아도 알 수 있어야 한다. public Set getNumbers() { Set numbers = new HashSet(); while (numbers.size() < 7) { Integer number = (int) (Math.random() * 45) + 1; numbers.add(number); } return numbers; } 위 함수는 1부터 45까지 중복이 없는 랜덤한 7개의 숫자를..
코드는 언제나 존재한다. 여러 개발자들은 코드는 더 이상 문제가 아니라고, 새로운 기술이나 비지니스 모델의 요구사항에 집중해야 한다고 생각하는 사람도 있다. 실제로 코드의 종말이 코앞에 닥쳤다고 주장하는 사람이 없지 않다. 코드를 자동으로 생성하는 시대가 다가온다는 말이다. 그때가 되면 프로그래머는 필요가 없다. 하지만 이것은 절대로 불가능한 기대다. 인간 조차도 고객의 막연한 감정만 갖고는 성공적인 시스템을 구현하지 못한다. 궁극적으로 코드는 요구사항을 표현하는 언어라는 사실을 명심한다. 요구사항에 더욱 가까운 언어를 만들 수도 있고, 요구사항에 정형 구조를 뽑아내는 도구를 만들 수도 있다. 하지만 어느 순간에는 정밀한 표현이 필요하다. 그 필요성을 없앨 방법은 없다. 그러므로 코드도 항상 존재하리라...
스트림에서는 한 번만 연산을 수행할 수 있으므로 결과도 한 번만 얻을 수 있다는 것이 Java8 스트림의 가장 큰 단점이다. 스트림을 두 번 탐색하려면 IllegalStateException이 발생한다. 하지만 한 스트림에서 여러 결과를 얻어야 하는 상황이 있을 수 있다. 그러려면 한 번에 한 개 이상의 람다를 스트림으로 적용해야 한다. 즉, fork 같은 메서드를 이용해서 스트림을 포크(분기) 시키고 포크된 스트림에 다양한 함수를 적용해야 한다. 심지어 여러 연산을 각각의 스레드에서 병렬로 실행할 수 있다면 더 좋을 것이다. 하지만 Java8의 스트림에서는 이 기능을 제공하지 않는다. Spliterator(특히 늦은 바인딩 기능을 활용), BlockingQueue, Future를 이용해서 Java8에서..
Java8의 라이브러리와 언어의 업데이트된 부분을 알아보자. 어노테이션(annotation) Java의 어노테이션은 부가 정보를 프로그램에 장식할 수 있는 기능이다. 즉, 어노테이션은 문법적 메타데이터(syntactic metadata)다. Java8의 어노테이션은 두 가지가 개선되었다. 1. 어노테이션 반복 이전 자바에서는 선언에서 지정한 하나의 어노테이션만 허용했다. @interface Author { Stirng name(); } @Auth(name="a") @Auth(name="b") @Auth(name="c") // 에러 발생 : 중복된 어노테이션 이제 반복 조건만 만족한다면 선언을 할 때 하나의 어노테이션 형식에 여러 어노테이션을 지정할 수 있다. 어노테이션 반복은 기본으로 제공되는 기능이 아..
패턴 매칭 일반적으로 함수형 프로그래밍을 구분하는 중요한 특징으로 구조적인 패턴 매칭(pattern matching)을 들 수 있다. 예를 들어 자동차 연료를 주입하는 로직이 있다고 가정했을때 가솔린, 디젤, 전기 차량에 따라 다른 연료를 주입해야 한다. 이럴때 자바에서는 if-then-else나 switch문을 사용해서 구현하곤 한다. public class Car { } public class GasolineCar extends Car { } public class DieselCar extends Car { } public class ElectricCar extends Car { } // 연료 주입 public Car fuel(Car car) { if (car instanceof GasolineCar..
스트림과 게으른 평가 스트림은 데이터 컬렉션을 처리하는 편리한 도구다. 효율적인 구현 및 여러 이유로 Java8 설계자들은 스트림을 조금 특별한 방법으로 java8에 추가했다. 그중 하나로 스트림은 단 한 번만 소비할 수 있다는 제약이 있어서 스트림은 재귀적으로 정의할 수 없다. 자기 정의 스트림 다음 코드처럼 소수 스트림을 계산할 수 있다. public boolean isPrime(int candidate) { int candidateRoot = (int) Math.sqrt((double) candidate); return IntStream.rangeClosed(2, candidateRoot) .noneMatch(i -> candidate % i == 0); } public Stream primes(i..
함수는 모든 곳에 존재한다. 함수형 프로그래밍이란 함수나 메서드가 수학의 함수처럼 부작용 없이 동작함을 의미한다. 함수형 언어 프로그래머는 함수형 프로그래밍이라는 용어를 좀 더 폭넓게 사용한다. 즉, 함수를 마치 일반 값처럼 사용해서 인수로 전달하거나, 결과로 반환받거나, 자료구조에 저장할 수 있음을 의미한다. 일반 값처럼 취급할 수 있는 함수를 일급 함수(first-class function)라고 한다. 자바 8에서는 :: 연산자로 메서드 참조를 만들거나 람다 표현식으로 직접 함숫값을 표현해서 메서드를 함수값으로 사용할 수 있다. 고차원 함수 함수형 프로그래밍 커뮤니티에 따르면 다음 중 하나 이상의 동작을 수행하는 함수를 고차원 함수(higher-order functions)라 부른다. 하나 이상의 함..