분류 전체보기 299

[java] lambda 를 이용한 GroupBy mulitiple field 사용하기

lambda 에서 Collector를 이용해 GroupBy를 사용할 수 있다 결론만 말하자면 DB에 저장되어 있다면 DB에 있는 함수를 사용하길 권장하지만... 데이터 자체를 가공해야한다면 어쩔 수 없이 써야할 거 같다. 암튼 한번 알아보자. 다음과 같이 테스트 데이터를 준비했다. 데이터를 담을 객체를 먼저 생성한다 @Getter @ToString public class Sales { private String yyyymm; private String storeId; private Long sales; public Sales(String yyyymm, String storeId, Long sales) { this.yyyymm = yyyymm; this.storeId = storeId; this.sales..

[retrofit, gson] Expected BEGIN_OBJECT but was STRING 에러 해결(String -> LocalDate)

Retrofit을 사용하면서 위의 에러가 발생했는데, 확인해보니 String 을 특정 타입으로 변경할때 발생한 에러다. 정확히는 Retrofit이 아닌 Gson 에서 변환하던 중 에러가 발생한 것이다. 샘플을 통해 알아보자. 우선 기존 코드는 다음과 같다 @Getter @ToString public class ResponseApiTest { @SerializedName("date") private LocalDate date; @SerializedName("time") private LocalTime time; @SerializedName("datetime") private LocalDateTime datetime; } 다음 에러가 발생했다. 2021-01-17 15:56:15.827 INFO 18290 ..

[jpa] 쿼리 로그 설정

jpa 쿼리가 보이는 설정을 하는건 크게 2가지가 있다. 1) show-sql 을 true로 설정하는 방법 2) p6spy를 이용한 로깅(외부라이브러리). 1번은 파라미터 안에 무엇이 들어있는지 알 순 없고 바인딩쿼리만 로그에 찍힌다. 2번은 추가설정을 좀 해주어야 한다. 1) show-sql을 사용하는 방법은 간단하다. application.properties 에다 다음이 설정을 추가하면 된다. spring.jpa.show-sql=false # 여기 spring.jpa.properties.hibernate.format_sql=false # 여기 spring.jpa.hibernate.ddl-auto=none spring.jpa.hibernate.generate-ddl=true spring.jpa.hibe..

[axios, react, redux] 서버통신 시 로딩바 띄우기

axios를 이용해 Backend와 API통신하면서 중간에 로딩바가 필요했다. 그런데 이걸 매번 호출마다 넣을 순 없으니 axios의 interceptors 옵션을 이용해 넣기로 했다. 우선 Loading 화면을 우선 만든다. 해당 로딩화면은 항상 최상위어야 한다. 다음처럼 컴포넌트를 만들어 Root에 추가했다. 로딩이미지는 material-ui에 있는 것을 사용했다. https://material-ui.com/api/circular-progress/ CircularProgress API - Material-UI The API documentation of the CircularProgress React component. Learn more about the props and the CSS custom..

[springboot] 자주쓰는 정보 파라미터에 설정해 자동 주입하여 받기(resolver 사용)

Spring Security Oauth2 를 이용해 로그인을 할 경우, Principal를 이용해 name을 조회할 수 있는데, 여기서 한단계 더 나아가 유저정보를 가지고 있어야 할때가 있다. 이럴때 아마 principal.getName()을 이용해 유저정보를 조회한 후 회원정보를 불러올 것이다. ... public String testUser(Principal principal) { User findUser = loginMapper.findUserInfoByUserEmail(principal.getName()); ... } ... 아마 로그인을 이용한 정보는 거의 대부분의 비지니스 로직에서 쓸텐데 그렇다면 위 코드를 매번 삽입해야 한다. 이부분을 생략하고자 설정하는 것이다. 일전에 AOP를 이용해 어노..

[aws] aws cli로 s3 파일 삭제(console에서 파일삭제 실패 시-파일명 한글일 경우 실패함)

aws s3파일 중에 한글로 되어있는 경우 console 에서 지우는데 계속 실패하여 aws cli로 지우기로 했다. 오랜만에 aws cli를 사용하는데, 다음의 에러가 발생했다. $ aws zsh: /usr/local/bin/aws: bad interpreter: /usr/local/opt/python/bin/python3.7: no such file or directory 찾아보니 클라이언트를 재설치하란 말이 있어서 재설치 하기로 했다. 참고로 이번 환경은 macOS에서 한 것이다 brew reinstall awscli 다음으로 awscli 를 실행하는 링크를 재연결한다 $ brew link --overwrite awscli Linking /usr/local/Cellar/awscli/2.0.44.....

[nginx] aws에 nginx설치 및 멀티도메인 설정(reverse-proxy)

AWS에 설치하기 전에 yum 버전을 최신으로 업데이트 해준다 sudo yum update -y nginx 를 설치하려고 하면 다음과 같은 메세지가 나온다. Loaded plugins: extras_suggestions, langpacks, priorities, update-motd amzn2-core | 3.7 kB 00:00:00 No package nginx available. Error: Nothing to do nginx is available in Amazon Linux Extra topic "nginx1" To use, run # sudo amazon-linux-extras install nginx1 Learn more at https://aws.amazon.com/amazon-linux-2..

[airflow] BigQueryOperator 사용할때 location 에러

다음에러가 떴을 경우. ... 'errors': [{'reason': 'notFound', 'message': 'Not found: Dataset [프로젝트명]:`[dateset이름] was not found in location US'}] ... 내 경우 데이터셋을 서울리전(asia-northeast3) 에 저장하게 했는데, 기본값은 US여서 문제가 발생한줄 알고 찾았다. BigQueryOperator의 파라미터중 location이 있길래 옵션으로 다음처럼 넣어봤는데도 동일한 에러가 났다. checker = BigQueryOperator( dag=dag , task_id='bq_check_exist_table' , sql=sql , location='asia-northeast3' ) 첫번째 실험은 lo..

[aws ec2] jenkins에 root 권한 주기

sudo vi /etc/sudoers 에 직접 수정하려고 하면 readonly밖에 안된다. 다음 명령어로 수정 가능 sudo visudo 그럼 이제 다음의 문구를 찾아 아래 추가하자 ## Allow root to run any commands anywhere root ALL=(ALL) ALL # 밑에 아래 추가 jenkins ALL=(ALL) NOPASSWD: ALL 이제 jenkins에서 execute shell 안에 sudo 로 실행해보자. 실행이 잘되면 설정이 잘 되었음을 의미. 끝.

[react] react + nextjs + redux + typescript 설정하기(redux toolkit 사용)

react + redux + typescript를 이용한 프로젝트 생성을 알아보려 한다 타입스크립트가 적용되는 reaxt + nextjs 를 설치한다. npx create-next-app --example with-typescript test-app npx 를 사용하는 이유는 이전 포스팅을 참조하면 좋겠다. 참조: lemontia.tistory.com/987 [npm] npm 대신 npx 를 사용하는 이유 npm을 사용하려면 글로벌 모듈로 설정해서 사용하기 때문이다. 글로벌이라는 것은 내 컴퓨터 안에 모든 프로젝트가 접근가능하도록 설정하는건데, 다음과 같은 방법으로 설치할 수 있다. npm insta lemontia.tistory.com redux, redux toolkit, immer 등 추가 설치한다..

[npm] npm 대신 npx 를 사용하는 이유

npm을 사용하려면 글로벌 모듈로 설정해서 사용하기 때문이다. 글로벌이라는 것은 내 컴퓨터 안에 모든 프로젝트가 접근가능하도록 설정하는건데, 다음과 같은 방법으로 설치할 수 있다. npm install 모듈이름 -g 예를들어 리엑트 프로젝트를 생성하는 CLI를 할때 글로벌 설치를 하는데 이런 글로벌 설치의 단점은 다음과 같다 1. 모듈 업데이트 확인 불가 2. 모듈 업데이트 변경으로 인한 다른 모듈 에러 발생 이런 문제를 해결하기 위해 npx가 등장했다. npx란? npm 5.2.0 부터 새로 추가된 도구로써, 1회성으로 원하는 패키지를 npm 레지스트리에 접근해 실행, 설치하는 도구다. 그래서 패키지를 업데이트 하지 않아도 npm 레지스트리에 올라가 있는 최신 버전을 수행한다. 사용법은 간단하다. np..

[react + typescript] redux toolkit 사용하기(createAction , ActionType , createReducer)

redux toolkit은 Redux의 공식 개발도구다. 액션 생성자, 리듀서 자체는 단순 함수인데 문제는 코드가 엄청나게 늘어난다는 불편함이 있다. redux toolkit을 사용하면 코드를 줄이는데 도움을 준다(그리 크진 않은듯...) 여기서는 typescript를 함께 사용하고 있다. 그럼 사용방법에 대해 알아보자 (여기선 리듀서에 대한 설명을 생략한다. 개념을 설명하는 포스팅이 아니기 때문) 우선 다음을 설치한다 npm i typesafe-actions 최근버전은 5.x 버전인데 함수하나가 달라졌다 이전에는 createStandardAction 기능이 5.x 로 넘어오면서 createAction 으로 변경되었다. 관련 github 주소: https://github.com/piotrwitek/typ..

[querydsl] group by 쿼리만들기

데이터를 집계해서 뽑아야 할때가 있는데 예를들면 날짜별로 있는 데이터를 월별로 뽑아야 할때 등이다. 예를들어 다음과 같은 테이블과 데이터가 있다고 해보자. 해당 테이블을 월별로 뽑을때 말이다. 쿼리를 만든다면 MYSQL의 경우 DATE_FORMAT을 이용해 만들 수 있는데, 해당 기능은 Mysql에 의존하기 때문에 일반적으로는 불가하다. 그럼에도 호출하려면 Expressions를 이용해 수행할 수 있다. StringTemplate formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})" , salesDaily.yyyymmdd , ConstantImpl.create("%Y-%m")); Expressions.stringTemplate 기능을 사..

[gitlab] root 비밀번호 분실 시 비밀번호 초기화

gitlab 이 설치되어 있는 서버로 접근해야 가능. 여기서는 gitlab-ee 로 설치된 것 한해서 가능하다 서버에 접속한 후 아래 명령어를 실행한다 sudo gitlab-rails console -e production -------------------------------------------------------------------------------- GitLab: 13.2.1 (b55baf593e6) FOSS GitLab Shell: 13.3.0 PostgreSQL: 11.7 -------------------------------------------------------------------------------- gitlab은 PostgreSQL을 사용하는 것을 간접적으로(?) 알게..

[springboot] @SpringBootTest에서 RestTemplate로 localhost 테스트 시 Connection refused

Mock으로 테스트 하는게 아니라 RestTemplate로 localhost를 테스트 한다는 것은 서버가 임시로 떠있고 API를 호출한다는 의미다. 즉 웹서버가 떠 있어야 한다는 의민대 @SpringBootTest를 쓴다면 웹서버를 띄우는 것이 아니라 테스트에 필요한 것들을 실행하기 위해 프레임워크를 해석하는 것이다. 때문에 포트가 명시적으로 할당되 URL을 호출해야 하지만 떠있는 웹서버가 없기 때문에 다음의 에러가 발생하는 것이다. org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:8080/oauth/token": Connection refused (Connection..