목록전체 글 (33)
참새의 이야기
지난 글에서는 querydsl을 사용하기 위해 알아야 하는 아주 기본적인 부분들을 소개했다. 이번에는 최근에 프로젝트를 하면서 querydsl을 사용하면 유연하게 db 조회를 할 수 있다는 것을 실감했는데, 지난가을에 했던 뉴핏 프로젝트를 크게 개선할 수 있겠다는 생각이 들어서 글로도 기록해보려고 한다. 우선, 아래는 뉴핏에서 개선이 필요한 코드의 일부분이다. @GetMapping public ResponseEntity getAllEquipment( @RequestHeader(name = "authority-id") Long authorityId, @RequestParam(name = "purposeType", required = false) PurposeType purposeType, @RequestP..
뉴핏 프로젝트를 진행하기에 앞서 querydsl을 공부하고 있었지만 다른 팀원들이 querydsl에 대한 학습 경험이 없어서 일단은 querydsl을 사용하지 않고, Spring Data Jpa가 제공하는 쿼리 메서드와 @Query 어노테이션을 활용하여 repository 계층을 구성했다. 우리 서비스에서 필요한 repository의 메서드들을 어느 정도 구현하고 보니 쿼리를 자동 생성해 주는 쿼리 메서드는 괜찮았지만, @Query 어노테이션으로 직접 쿼리를 작성한 경우에는 가독성이 너무 안 좋다는 점이 아쉬웠다. 이때 querydsl을 도입하지 않을 수 없다는 생각이 들었고, 팀원들에게 querydsl 도입하자고 제안했다. JpaQueryFactory querydsl을 사용하여 쿼리를 만들기 위해서는 ..
지난 글을 읽다보면, 한 가지 이상한 점이 있다. docker compose를 EC2 인스턴스에 install 해두고 실제로는 사용을 하지 않았다. 이번에는 nginx를 프록시 서버로 추가하고 이 모든 것을 docker compose를 이용하여 EC2 인스턴스에 구성해보려고 한다. workflow의 개선 이에 앞서, 지난번에 작성한 workflow도 개선을 해보려고 한다. github actions의 environment 기능을 사용하여 배포 환경을 분리하고 명령을 직접 입력했던 것들을 Github actions의 Marketplace에 있는 공용 action으로 replace하려고 한다. 일부 action의 경우, 현 시점 latest 버전으로 최신화도 해줄 것이다. 아래의 workflow는 최종본이 ..
GDSC-Hongik의 인프라 초기 세팅을 담당하게 되었다. docker, github actions 등 CI/CD 기술들을 말로만 들어보거나 블로그 몇 개 보면서 기계적으로 따라 하기만 해왔는데, 마침 팀원들이 다들 유경험자라서 내가 우선 구축해 보고 피드백을 받을 수 있게 되었다. 전체 흐름 설계를 요약하자면 이렇다. github의 특정 브랜치에 push와 같은 이벤트가 일어났을 때, github actions가 이를 감지하고 workflow에 따라 빌드와 배포를 시작한다. workflow의 빌드 과정에서 도커 이미지가 빌드되면 docker hub로 푸시한다. 이후 workflow의 배포 과정에서 ec2에 접속하고, docker hub로부터 도커 이미지를 pull 해와서 실행한다. 여기까지가 당장 구..
필터링 stream의 filter 메서드는 인수로 받은 predicate와 일치하는 모든 요소를 포함하는 스트림을 반환한다. List vegetarianDished =menu.stream() .filter(Dish::isVegetarian) .collect(toList()); 이 경우에는 Dish의 isVegetarian()이 true라면 모두 포함한 stream을 만들고 .collect(toList())가 리스트로 바꿔 반환한다. distinct 아래와 같은 정수 리스트가 있다고 하자. List numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4); 이 정수 리스트에서 짝수만을 출력하되, 같은 값에 대해서는 한 번만 출력하고 싶다면 distinct를 사용하면 된다. 같은 지에..
SQL에서 where로 처리하던 로직을 컬렉션으로도 만들 수 있지 않을까? 크기가 큰 컬렉션은 병렬적으로 처리해야 할 텐데 이 코드를 단순하게 할 수 없을까? 이 두 질문의 답으로 스트림을 제안한다. 지난 프로젝트를 하면서 스트림을 안 썼다면 코드가 훨씬 길고 복잡해지겠다는 생각을 했다. 스트림을 야무지게 쓰기 위해 스트림이 무엇인지부터 알아보자. 스트림이란 스트림은 자바 8에 새로 추가된 기능으로, 선언형으로 컬렉션 데이터를 처리할 수 있다. 선언형이라는 것은 데이터를 임시 구현 코드 대신 질의로 처리할 수 있다는 의미다. 멀티 스레드 코드를 구현하지 않아도 병렬 처리를 할 수 있다는 점도 장점이다. 다음의 자바 코드를 스트림으로 개선해보자. List lowCaloricDishes = new Array..
앞선 챕터에서 등장한 람다 표현식을 조금 더 자세히 알아보고 메서드 참조에 대해서도 알아보자. 람다는 무엇인가 람다는 이름이 없는 익명이다. 람다는 특정 클래스에 종속되지 않으므로 함수다. 메서드의 파라미터로 전달하거나 변수로 저장할 수 있다. 람다 표현식 (Apple a1, Apple a2) → a1.getWeight().compareTo(a2.getWeight()); 람다는 세 부분으로 이루어진다. (Apple a1, Apple a2) 파라미터 리스트 → 화살표 a1.getWeight().compareTo(a2.getWeight()); 람다 바디 어디에서 쓸 수 있는가 람다 표현식은 함수형 인터페이스라는 문맥에서 사용할 수 있다. 함수형 인터페이스란 추상 메서드가 오직 하나인 인터페이스를 말한다. 예..
변화하는 요구사항에 대응하기 위해 동작 파라미터화를 사용할 수 있다. 하지만, 동작 파라미터화는 코드가 길어지게 한다. 자바 8에서는 람다 표현식으로 이 문제를 해결한다. 요구사항에 대응 녹색 사과 필터링 public static List filterGreenApples(List inventory) { List apples = new ArrayList(); for (Apple apple:inventory) { if(Green.equals(apple.getColor())) { apples.add(apple) } } return apples; } 녹색 사과를 필터링하는 경우만 생각하면 위의 코드도 좋은 코드가 될 수 있다. 갑작스럽게 빨간 사과를 필터링하고 싶다는 요구 사항이 추가되면 어떻게 대응할 수 있을..