-
Maven Central에 JAVA 라이브러리 등록하기
Maven Central에 JAVA 라이브러리 등록하기 Controller를 만들면서, requestDto에 validation을 넣어 처리하는 경우가 많다. spring-boot-starter-validation에서 제공하는 어노테이션들로 대부분 커버가 가능했지만, 가끔 필요하지만 없어서 아쉬운 validation 이 있었다. 예를들면 파일업로드관련? 지금까지는 request를 받아서 checkParam() 같은 메소드를 만들어 처리를 했었는데, 뭔가 코드가 마음에 들지 않았다. 그래서 프로젝트 내부에 annotation을 만들어 spring에서 제공하는 validation과 같이 사용하였는데… 매 프로젝... Read More
-
ELK - POSTGRES to LOGSTASH
postgres 데이터를 logstash를 이용해 elasticsearch에 저장하는 방법은 여기에 있지만, 그 후에 더 추가해서 사용한 방법이 있어 따로 정리해보았다. 우선, 아래와 같은 conf 파일을 logstash에서 기본적으로 사용한다고 가정한다. # cd logstash/pipeline # vi {이름}.conf input { jdbc { jdbc_connection_string => "jdbc:postgresql://{IP}:{PORT}/{DATABASE}" jdbc_user => "{USER}" jdbc_password => "{PASSWORD}"... Read More
-
Spring 에러 발생 시, Slack 알람 만들기
지금 진행하고 있는 프로젝트 중 환자의 유전자 데이터를 분석하여 관련 데이터를 제공하는 기능이 있다. 사용자 요청이 들어오면, 분석 서버로 분석을 요청하고, 그 후 작업은 비동기로 처리하고 있는데, 서버로 올렸을 경우 에러가 언제 발생했는지 모르고 그냥 지나치는 경우가 종종 있었다! 이것 말고도, 사용자가 사용했을 때, 예상하지 못했던 에러가 발생했어도 모르고 지나가는 일도 있었고.. 무튼, 여러모로 에러가 발생하면 알림오면 좋겠다고 생각을 했었다. 2가지 방법으로 테스트를 했었고, 이에대한 기록을 남기고자한다! 1. logback-slack-appender Spring에 관련 기능이 있을까 하여 검... Read More
-
2022 맞이 2021 회고
2022 맞이 2021 회고 12월 즈음 부터 여기저기서 다른 개발자 분들의 회고를 보았다. 다른 분들의 글들을 보면서 과연 나는 2021년에 무엇을 했는가를 생각하게 되었고.. 생각만 하다가 나도 글로 남기면 좋을 것 같아 이렇게 글을 작성하게 되었다. 회고를 글로 쓰면 좋을 것 같았던 것 ^^.. 자기반성 자아비판 내가 왜그랬을까 후회 첫 회고를 쓰니 간단히 이력을 작성해보자면, 2020년 2월 1일에 현재 회사에 입사했고, 2022년 현재 2년이 1개월 남은,1년 11개월차 백엔드개발자 이다. 입사해서 2개의 프로젝트를 진행하였는데, 하나는 작년에 ... Read More
-
특정 API만 Swagger에 노출
현재 프로젝트에 개발 서버가 2대가 있는데, 이 중 한 서버에서는 특정 API 만 swagger에 노출 해야 하는 문제가 발생하였다. swagger를 설정 할 때, basepackage를 지정해서 사용하는 방법도 있지만, 그럼 컨트롤러에 있는 모든 API가 노출되기도 하고…별로인 부분이 있어 그보다 좀더 커스텀하게..? 사용 할 수 있는 방법을 찾아 적용해 보았다. Profile 설정 아래와 같이 profile을 만들고 각 서버에 맞는 profile에 include 시켜주었다. (파일을 만들지 않고 바로 넣는것도 가능한…!) 특정 API만 노출해야하는 서버라면 true, 전체 노출 하는 서버라면 fal... Read More
-
Spring-Elasticsearch 연동 2 - Query Builder
유용한 참고자료 Java High Level Rest Client 사용 정리 guide 1. 기본 사용법 Spring Elasticsearch 연동 1과 같이 설정을 완료하였다면, 바로 호출해서 사용가능하다. @Service @RequiredArgsConstructor public class ElasticsearchService { private final RestHighLevelClient client; private static final String INDEX = "my_index"; public SearchResponse sampleQuery() throws IOExcepti... Read More
-
Spring-Elasticsearch 연동 1- Spring 설정
유용한 참고자료 elasticsearch java builder 모음 spring-data-elasitcsearch VS rest-high-level-client 기본 설정 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch' compile 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.15.0' compile 'org.elasticsearch.client:elasticsearch-rest-clie... Read More
-
Spring Batch Insert 어떻게 해결했을까
대용량의 데이터를 DB에 넣어야 하는 일이 발생했다. 한 파일당 약 3만줄의 데이터를 파싱해서 20개의 테이블에 나눠 저장을 하였다. 파일은 모두 90개였던 것으로 기억한다. (전체 저장 데이터가 5G정도 나왔었다.) 다 저장해보니 용량이 어마무시했던 기억이 있는데, 지금은 사용하지 않아 없어졌다. 하지만 Spring Batch Insert를 도전했던 좋은 추억이라 (^^) 기록을 해보려 한다. JdbcTemplate Bulk Insert 활용기 기본 사용 방법 bulk insert를 위해 batchUpdate() 함수를 사용하였다. 기본 사용 방법은 아래와 같다. @RequiredArgsConstru... Read More
-
ELK Security 설정
유용한 참고자료 security 적용 기본(username + password) security api key 적용 elasticsearch 무료버전인 basic license에서 security 기능은 api-key 관리 기능까지 제공을 한다. 참고 이에 맞는 elk security 설정을 정리해 보았다. 1. config 파일 설정 elk를 설치한 후에는 자동으로 elastic이라는 username이 생성되는 것 같다. elasitc은 superuser 권한으로 모든 인덱스 및 데이터를 포함하여 클러스터에 대한 전체 액세스 권한을 부여한다. 참고 logstash나 kibana를 설정할 때, 다른 ... Read More
-
ELK query 사용 정리
설정 java heap memory 늘리기 $vi docker-elk/docker-compose.yml service: elasticsearch: ... environment: EX_JAVA_OPTS: "-Xmx8G -Xms4G" 최대 8G/최소4G로 수정 elasticsearch 기본 최대 조회 개수 1만개 -> 현재 10만개로 변경 참고 PUT your_index_name/_settings { "max_result_window" : 500000 } kibana에... Read More
-
DOCKER에서 ELK 설치 및 사용하기
유용한 참고자료들 Elastic 가이드북(한글) centos에 docker 설치(docker-docs) linux에 docker-compse 설치 docker-conpose 명령어 정리 dokcer-elk git elk config 수정 정리 logstash - jdbc 연결 참고 자료 logstash - jdbc docs 1. Docker 설치 docs를 참고하여 설치 docker를 이미 설치했고 사용하고 있는 상태라면 삭제 X 2. docker-compose 설치 docker-compose docs를 참고하여 설치 3. docker-elk 설치 docker-elk 설치를 원하는 위치로... Read More
-
Spring에서 외부 API 호출하기 3 (WebClient 활용)
활용 그.래.서 대-충 webClient를 사용하는 방법은 알았고, 그 후엔 어떻게 하면 효율적으로 사용할 수 있는지 계속 고민을 하였었다. ~~(효율적이라 쓰고 귀찮아서 어떻게 하면 한번에 처리할 수 있을까 머리 굴린거라고 읽는.. )~~ 대략적인 상황은 이랬었다. 약 20개의 각기 다른 api를 호출. 각 Response는 당연히 다르다. (같은 것도 있긴 했다.) 외부 api에서 서버에러가 발생하는 경우(http status가 40x, 50x로 오는 경우) response가 정해진 형식으로 도착한다. 그 외 예상하지 못한 오류가 발생하면 그냥 에러로 넘어온다. 어떤 api는 상태... Read More
-
Spring에서 외부 API 호출하기 2 (Webclient)
spring 5 이상에서는 webclient를 지향한다 하여 프로젝트에서는 webclient를 주로 사용하였다. 원래는 전체적으로 다 쓰고 싶었지만 안되는걸 어떡하나요 webclient를 사용하면서 약간 힘든점이 있었다면 webclient는 webFlux를 사용한다는 것이었다. reactive programming은 너무 미지의 세계였고.. 공부할 것도 많고.. 여러모로 장벽이 느껴졌지만 천천히 공부해 가면서 프로젝트를 진행해보았다. (천천히 해도 됐을지는 모르겠다..^^.. ) WebClient WebClient에 관한 설명이다. Simply put, WebClient is an interfac... Read More
-
Spring에서 외부 API 호출하기 1 (RestTemplate)
프로젝트에서 외부 api를 이용하여 로직을 짜는 부분을 맡게 되었다. Spring에서 외부 api를 호출하기 위해서는 RestTemplate이나 Webclient를 사용한다고 하여 관련 자료를 찾아보고 적용해 보았다. 사실 처음에는 webClient만을 사용하다가, 안되는 기능이 있어 restTemplate도 같이 사용하게 되었다… 프로젝트를 진행하면서 새롭게 알게 된 사실이나 정리할 부분이 많아 이를 한번 정리해 보았다. RestTemplate restTemplate은 Spring 3부터 지원된 api로, api를 호출한 후 응답을 받을 때 까지 기다리는 동기 방식이다. spring5 버전부터는 res... Read More
-
JPA OneToOne 관계인데 2개가 저장됨
구독플랫폼 프로젝트 회원가입/수정 부분을 진행하는 중이었다. 회원가입을 먼저 진행하여 User를 생성하였고, 그 후에 Customer에 필요한 정보를 넣어 생성하거나 수정하는 로직을 만들었다. 간단한 insert니까 빨리 끝낼 수 있을 줄 알았다. 나의 경기도 오산이었다… OneToOne관계니까 당연히 1개만 저장될 줄 알았는데 혹시 몰라 한번 더 눌러보니 2개가 저장되는 일이 발생하였다. 뭐가 잘못이지? CaseCade, Fetch, Transactional 모두 수정해 보았지만 2개보다 더 많이 저장되는 경우도 발생해버렸다 ^^.. 혹시나 하는 마음에 생성된 테이블을 보니.. Customer 테이블에 ... Read More
-
HTTP 헤더 2 - 캐시와 조건부 요청
캐시가 없을 때 웹 브라우저에서 GET/star.jpg 요청 서버에서 헤더(0.1M) + 바디(1.0M) 데이터를 전송함 -> 총 1.1M 웹 브라우저에서 다시 start 요청 2번 반복 -> 1.1M 데이터가 다시 전송됨 데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야한다 인터넷 네트워크는 매우 느리고 비쌈 브라우저 로딩 속도가 느림 -> 느린 사용자 경험 캐시 적용 웹 브라우저에서 GET/star.jpg 요청 서버에서 헤더(0.1M) + 바디(1.0M) 데이터를 ... Read More
-
HTTP 상태코드 요약
클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능 1xx : 요청이 수신되어 처리중 (거의 사용안함) 2xx : 요청 정상 처리 3xx : 요청을 완료하려면 추가행동 필요 (리다이렉트) 4xx : 클라이언트 오류, 잘못된 문법 등으로 서버가 요청 수행할 수 없음 5xx : 서버 오류, DB 문제 등으로 서버가 정상 요청을 처리하지 못함 만약, 모르는 상태코드가 나타난다면? 클라이언트는 상위 상태 코드로 해석해서 처리 -> 299로 온다면 대충 2xx.. 성공이구나.. 이렇게.. 1XX 상태코드 HTTP 상태 코드 Value ... Read More
-
클라이언트에서 서버로 데이터 전송
데이터 전달 방식은 크게 2가지 쿼리 파라미터를 통한 데이터 전송 GET 주로 정렬 필터, 검색어 ex) /search?q=hello -> hello를 검색 메시지 바디를 통한 데이터 전송 POST, PUT, PATCH 회원가입, 상품주분, 리소스 등록, 리소스 변경.. 클라이언트에서 서버로 데이터를 전송하는 상황 4가지 1. 정적 데이터 조회 GET /static/star.jpg HTTP/1.1 Host: localhost:8080 클라이언트에서 star.jpg 정적 이미지 조회를 GE... Read More
-
HTTP API를 만들어 보자
HTTP API를 만들어 보자 API를 설계할 때 가장 중요한 것은 리소스 식별 리소스? 회원을 등록 -> 회원이라는 개념이 리소스 등록, 수정 이런 동사는 모두 배제하고 회원 리소스를 URI에 매핑해야한다 ex) 조회 members/ 수정 members/{id} 삭제 members/{id} 참고 : 계층 구조상 상위를 컬렉션으로 보고 복수단어 사용권장 (member -> members) 위의 조회, 수정, 삭제 등을 구별하는 방법 -> 행위로 구분 -> HTTP 메서드로 구분한다... Read More
-
HTTP
HTTP HyperText Transfer Protocol HTTP 메시지에 모든것을 전송 ex) HTML, TEXT, IMAGE, 음성, JSON 등 서버간 데이터를 주고받을 때도 대부분 HTTP 사용 TCP 연결은 게임..? 요즘은 게임도 HTTP로 주고받음 현재 가장많이 사용하는 버전은 HTTP/1.1 HTTP/2 와 HTTP3도 혼용해서 많이 사용(주로 성능개선으로 이뤄져있음) 기반 프로토콜 TCP HTTP/1.1, HT... Read More
-
Fork한 repository 최신으로 동기화 하기
Fork한 repository 최신으로 동기화 하기 1. git remote -v 현재 연결된 remote 확인 -> 내 repository에 있는 원격이어야함! 2. git remote add upstream {원본 repository 주소} 동기화 해오고 싶은 원본 repository 를 upstream 이라는 이름으로 추가한다. 3. git fetch upstream 원본 repository의 최신 내용을 가져온다. 4. git checkout {branch} 원하는 브랜치로 체크아웃 5. git merge upstream/{branch} upstrea... Read More
-
ENUM 리팩토링 과정
업무중에 enum을 사용해서 타입을 정한 부분이 있었다. 2020년 12월쯤 짰던 코드 같은데, 만들 당시에도 switch문이 과도하게 들어가고 list에 add를 반복하여 사용하는 등 만족스럽지 못한 코드였다. 물론 그당시에도 enum을 썼었다. 그런데 switch문이.. 2개나.. ㅠㅠ.. 이번에 다시 이 기능을 손보며 불만족 스러운 코드를 바꿔보았다. 기존코드 기존 코드를 그대로 가져올 수 없어서 enum 의 대표 예제인 계산기와 내 코드에서 발생한 문제를 조합하여 예시를 만들어보았다. 계산기를 기본과 공학용으로 나눠 BASIC타입에는 덧셈, 뺄셈 ENGINEERING에는 덧셈, 뺄셈, 곱셈,... Read More
-
URI
URI Uniform Resorce Identifier 리소스를 식별하는 통일된 방식 URL, URN ? URL은 리소스가 이 위치에 있음을 지정 URN은 리소스에 이름을 부여 ex) isbn:1234566 URN은 잘 사용되지 않아서 거의 URI = URL URL 전체 문법 scheme://[userinfo@]host[:port][/path][?query][#fragment] ex) https://www.google.com:443/search?q=hello&hl=ko https - 프로토콜 www.google.com - 호스트명 443 - 포트번호 ... Read More
-
JPA - Auditing
JPA - Auditing 엔티티 변경 시점에 언제, 누가 변경했는지에 대한 정보를 기록하는 기능 Auditing 정보를 담은 추상 클래스 생성 @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public abstract class BaseTimeEntity { @CreatedDate private LocalDateTime createdDate; @LastModifiedDate private LocalDateTime lastModitiedDate; } ... Read More
-
인터넷 네트워크
인터넷 통신 클라이언트와 버서간 다양한 노드 서버들을 거쳐서 통신 IP(인터넷 프로토콜) 클라이언트와 서버간 지정한 IP 주소로 데이터를 전달한다. 패킷이라는 통신단위로 데이터 전달 클라이언트 -> 서버, 서버 -> 클라이언트 간의 노드들은 경로가 달라질 수 있음 중간에 서버가 끊길 경우 제대로 도착하지 않음 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송 여러개의 패킷이 순서대로 도착하지 않을 수 있음 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상일 경우 구분 불가 TCP, UDP TCP IP 계층의 보완 출발지 포트와 ... Read More