728x90
반응형

전체 글 131

[Management] QueryDSL : QueryReuslt Dto로 반환 & Join Error & Alias orderBy 참조 방법

오늘은 QueryDSL 사용 시 Q객체를 사용하지 않고, 결과값을 사용하지 않고 DTO를 이용해서 반환하는 방법을 정리해보겠습니다. 1. DTO를 이용해서 반환하는 경우 sum()이나 count() 같은 메서드 사용하는 경우 join을 이용해 다른 엔티티 정보를 반환하는 경우 2. DTO를 반환하는 방법 queryFactory.select( Projections.bean ( Entity.class, QEntity.entity.properties ... ) ) Setter를 이용한 바인딩으로 잘 사용하지는 않는 방법입니다. queryFactory.select( Projections.constructor( Entity.class, QEntity.entity.properties ... ) ) 생성자를 이용한 ..

Project/Management 2022.11.09

[Management] QueryDSL : orderBy() - MultiSort 동적으로 적용

Frontend 요청 페이징을 적용하고 나니, 전체 데이터를 응답해주지 않기 때문에 프론트에서 속성 별 정렬이 안되기 때문에 페이징이 적용된 부분에는 백엔드에서 동적으로 Multi Sort를 적용해달라는 요청을 받았습니다. Frontend의 Request Body /*Request Body JSON FORMAT*/ { "page":Integer, "size":Integer, "sortBy":String[], // 정렬이 필요한 필드 값 "sortDesc":Boolean[] // sortBy가 DESC인지 ASC인지 Boolean값을 통해 알려줍니다. } Backend 처리 1. 기존 코드 /*Entity에 실제 엔티티의 이름 적용*/ public Page EntitySearch(SearchConditio..

Project/Management 2022.11.08

[Management] Nginx를 이용한 Vue.js와 Spring 배포

개요 저희 프로젝트는 AWS에 Spring Project 내부 /resources/static에 Vue.js 빌드파일을 넣고, WAR파일을 빌드하여 하나의 빌드파일로 배포를 하고 있었습니다. 원래는 한 서버에서 두 개의 파일을 빌드해야 프론트를 수정할 때 서버를 끄지 않고 진행할 수 있습니다. 하지만 의사소통의 문제로 하나의 빌드파일을 이용해서 배포를 하고 있었습니다. 그래서 AWS서버에 Nginx를 이용해서 Vue.js 빌드파일을 웹서버에 올리고, Spring과 연결하는 작업을 진행하였습니다. 1. EC2 서버에 접속하여 Nginx 설치 sudo apt-get update sudo apt-get install nginx #nginx 설치 sudo vi /etc/nginx/sites-enabled/def..

Project/Management 2022.11.08

[Clean Code] 10장 클래스

깨끗한 코드를 작성하기 위한 열번째 기록 클래스 체계 클래스의 구성은 가장 먼저 변수 목록이 나오고, 정적 공개(static public) 상수, 그리고 정적 비공개(static private) 변수, 그리고 비공개 인스턴스가 나옵니다. 변수 목록 다음에는 공개 함수가 나온다. 비공개 함수는 자신을 호출하는 공개 함수 직후에 넣는다. 즉 추상화 단계가 순차적으로 내려간다. 캡슐화 변수와 유틸리티 함수는 가능한 공개하지 않는 편이 낫지만 반드시 숨겨야 한다는 법칙도 없다. 때로는 변수나 유틸리티 함수를 protected로 선언해 테스트 코드에 접근을 허용하기도 한다. 하지만 테스트 코드는 중요하기 때문에 같은 패키지 안에서 함수를 호출하거나 변수를 사용해야 한다면 비공개 상태를 유지할 방법을 찾아야 한다...

[Management] API 통신 시 로그 출력하는 필터 추가

각 코드에 log.info 또는 log.error를 출력하기 위해서 많은 코드를 추가해야합니다. 저는 Filter를 이용해서 API 호출을 할 때 그 결과를 로그로 출력하려고 합니다. 1. Filter를 상속한 LogUtil을 생성합니다. @Component @Order(0) @RequiredArgsConstructor public class LogUtil implements Filter { } @Component를 통해 Bean으로 등록합니다. @Order(0)을 통해 우선적으로 필터링을 적용합니다. 2. log를 출력하기 위한 Logger를 받아오고, Json을 스트링 객체로 변환하기 위한 ObjectMapper를 받아옵니다. private final Logger log = LoggerFactory...

Project/Management 2022.11.03

[Management] AWS 배포 빌드 파일 자동 재시작 스크립트

현재 진행중인 프로젝트를 AWS에 배포를 하였습니다. 배포를 하고 수정사항이 계속 나오고 있는 시점에 젠킨스를 적용하기 전이라 서버를 재시작할 때 실행중인 프로세스를 찾아서 종료하고 다시 실행시키는 작업이 반복되었습니다. 그래서 스크립트 파일을 통해 실행 시켰을 때 이작업을 바로 해주는 쉘 스크립트를 작성하였습니다. start.sh #!/bin/bash echo "start Project Spring Boot Application" #현재 실행중인 프로세스의 PID를 찾습니다. CURRENT_PID=$(ps -ef | grep java | grep jar) echo "$CURRENT_PID" #실행중인 프로세스가 없다면 프로세스 종료할 필요가 없습니다. if [ -z $CURRENT_PID ]; echo..

Project/Management 2022.10.27

[Relational Databases] Datasource Routing

사용자에 따라서 데이터베이스를 다르게 지정하고 싶다는 생각을 했습니다. 그래서 사용자에 따른 다른 데이터베이스를 적용하는 법을 알아보았습니다. 개요 User를 간단하게 만들고 Repository와 Controller를 만들어서 API를 구축하였습니다. 그리고 회사에 따라 DB를 변경하여 저장하고 조회하는 기능을 구현해보겠습니다. 구조 구조는 다음과 같습니다. User API 부분은 기본적인 코드라서 Database Routing 부분만 설명드리겠습니다. 전체코드는 아래에 깃허브 링크를 참고해주세요. 1. application.properties 설정 #company01과 company02는 제가 설정한 이름입니다. 임의로 이름을 지정하시면 됩니다. #저는 두 회사의 하나의 서비스를 공급할 때, 데이터베이..

[Clean Code] 9장 단위 테스트

깨끗한 코드를 작성하기 위한 아홉번째 기록 TDD 법칙 세 가지 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 위와 같은 법칙을 따른다면 코드를 한줄 작성할 때 마다 테스트 코드가 생길 것입니다. 그렇게 되면 실제 코드 보다도 더 많은 테스트 코드가 생길 것입니다. 이는 심각한 문제를 유발하기도 하기 때문에 신중하게 테스트 코드를 짜야합니다. 깨끗한 테스트 코드 유지하기 책에서 한 이야기가 나옵니다. 급하게 프로젝트를 완성해야 했기 때문에 지저분하지만 빠르게 테스트 코드를 작성한 이야기. 여러분도 예상하셨겠지만 지저분한 테스트는 테스트를 안 하는..

[Java] 자바 메모리 영역 관련 노트 정리

블로그 포스팅을 보고 다시 한번 적으면서 메모리 영역 관련 내용 정리하였습니다. [관련 포스팅] [Java] 메모리 관리 - 스택, 힙, Garbage Collection Stack 영역 Heap 영역에 생성된 객체 타입의 데이터들에 대한 참조를 위한 값들이 할당됩니다. 원시타입(Primitive Types) - byte, short, int, long, double, float, boolean, char 타입의 데이터들이 할당됩니다.. lakelight.tistory.com [참고] 1. [JAVA] ☕ 그림으로 보는 자바 코드의 메모리 영역(스택 & 힙)

JAVA 2022.10.24

[Java] Thread Local

ThreadLocal 스레드 단위로 로컬 변수를 사용할 수 있다는 장점이 있습니다. 또한 여러 메서드를 전역변수처럼 사용할 수 있습니다. 다만 다른 스레드와 변수가 공유되지 않도록 주의해야 합니다. ThreadLocalMap private 클래스로 구성되어 있어 외부에서 접근할 수 없고, 내부적으로 해시 테이블 정보를 갖고 있는데, 요소는 WeakReference를 확장하고 ThreadLocal 객체를 키로 사용하는 Entry 클래스입니다. Thread ThreadLocalMap를 타입 멤버 필드로 가지고 있는데, 특정 스레드의 정보를 TreadLocal에서 직접 호출 할 수 있도록 합니다. ThreadLocal의 withInital 메서드 쓰레드 로컬 변수를 생성하면서 특정 값으로 초기화하는 메서드입니..

JAVA 2022.10.24
728x90
반응형