Backend 11

유저 닉네임 검색 속도 개선 - Postgresql 문자열 검색 빨리하기

먼저 성과부터 보여드립니다. 성과 개선 전 select * from user_table where nickname ilike '코%' order by id desc limit 100 postgresql 의 explain analyze 해본 결과 cost : 114404.84 Execution Time : 2571.743ms 정직한 Parellel Seq Scan 개선 후 select * from user_table where nickname ilike '코%' order by id desc limit 100 postgresql 의 explain analyze 해본 결과 cost : 743 Execution Time : 0.8ms 문제 문제 상황 유저간의 닉네임을 검색해야 했는데, 이 검색 속도가 느렸음 ..

Backend 2024.01.17

서버 2대중 1대만 특정 태스크를 (알람) 하도록 하는 법

1차 시도 master_server db 를 만들어서 마스터가 될 ip 정보를 넣어두었다 그리고 서버들은 1분마다 아래 체크를 해서 본인이 마스터인지 확인을 했다 @Transactional(isolation = Isolation.SERIALIZABLE) fun checkIfMasterServer(): Boolean { val masterServerEntity = masterServerRepository.findByIdOrNull(1) ?: MasterServerEntity(1) val expireAt = masterServerEntity.expireAt if (expireAt?.isBefore(LocalDateTime.now()) != false) { masterServerEntity.ip = InetA..

Backend 2022.09.14

Read-Only 함수에 @Transactional 을 붙여야 하는가?

스프링부트 + JPA 를 쓰다보면 @Transactional 어노테이션을 자주 사용하게 된다 어떠한 로직이 동작하면서 DB 값도 바꿔야 하는 상황일때 해당 로직이 실패하면 DB까지 모두 롤백시킬 심산으로 @Transactional 어노테이션을 활용하고는 했다 그런데 어느날 내가 Transactional 어노테이션을 남용하고 있는건 아닐까..? @Transactional(readOnly = true) 어차피 읽기만 할건데.. 롤백 될일도 없는데.. 이 코드가 과연 맞나..? 싶은 의문이 든다.. 두둥 알고보니 Spring JPA repository base class 가 애초에 모든 메소드들을 read-only transaction 으로 생각한다고 한다 저 코드는 필요 없는것! JPA Buddy 그리고 J..

Backend 2022.09.13

nginx 버전이 노출되어 있으면 위험할 수 있다구?

nginx 의 버전을 외부 사용자가 확인할 수 있게 노출시켜두면 위험하다! nginx 버전이 노출되는 대표적인 페이지로는 오류 페이지가 있다 nginx 에서 오류를 응답할때 기본적으로 반환하는 페이지에 버전 정보가 나오게 된다 1. 왜 위험한가 nginx 의 특정 버전의 취약점이 발견되면 이를 이용한 공격이 너무 쉬워진다. 최소한 내 서버의 nginx 버전이라도 모르게 해야한다. 2. 어떻게 대응해야 하는가 nginx 의 기본 오류 페이지가 반환되지 않도록 하거나, 위 기본 오류 페이지에서 버전 정보가 나가지 않도록 조치를 해야 한다 #nginx.conf http{ ... server_tokens off; ... } 위와 같이 옵션을 추가해주면, 아래와 같이 버전정보 없이 오류페이지를 반환한다 3. 요정..

Backend 2021.12.27

java 의 로깅 이란 (JCL, SLF4J, log4j, logback)

spring boot 로 개발을 하다보면 디펜던시에 띢 띢 log4j, logback 을 추가해서 사용하기만 했지,, 얘네가 어떤 애들인지 몰랐어서 알아보기로 함 # 로깅 퍼사드 JCL 은 Apache Commons Logging 이고 이를 줄여서 JCL 이라고 부른다 (Jakarta Commons Logging) spring 에서는 기본적으로 위 JCL 을 사용하는데, JCL 은 인터페이스 형태로 있어서, 이를 구현체와 함께 사용해야 한다. SLF4J 는 Simple Logging Facade for Java 의 약자이다. JCL 과 SLF4J 는 로깅 퍼사드이다. 퍼사드 패턴 (Facade Pattern)은 건물의 정면"을 의미하는 단어로 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인..

Backend 2021.12.13

spring boot 에서 etag 설정하기

0. 배경 RFC(Request for Comments) 표준 방식에 의해 캐시 validation 방식이 변경됨 기존 : etag, last-modified 둘다 비교 변경 : etag 만 비교 etag 도입이 필요하다 1. etag 란 ETag == entity tag == 응답 body 값의 해시 값 HTTP 응답 헤더에 담아서 보내준다 응답 body 가 변하면 etag 도 변해야 한다 2. spring boot 에서 etag를 사용하기 위한 전제조건 # web.xml or build.gradle etagFilter org.springframework.web.filter.ShallowEtagHeaderFilter etagFilter /foos/* 3-1. (내가 사용한 방법) servlet filt..

Backend 2021.11.29

docker quick start 따라해보기

도커 퀵 스타트 docker 환경설정 mac - docker 데스크톱 docker run hello-world library : 도커 허브의 공식 이미지가 저장되어 있는 네임스페이스 local에서 hello-world:latest 를 찾을 수 없기 때문에 library/hello-world에서 pull 해오게 된다 docker image ls repository, tag 확인 가능 docker ps --all 여전히 running 중이면 --all 없이도 뜬다 Dockerfile Dockerfile 은 컨테이너를 위해 개인 파일 시스템을 조립하는 방법을 설명 응용 프로그램을 컨테이너화 하기 위함 docker build --tag bulletinboard:1.0 / successfully tagged bu..

Backend 2020.06.07

왜 도커를 사용해야 할까요?

Docker 왜 도커를 사용해야 할까요? 참고 유튜브 컨테이너 애플리케이션을 환경에 구애받지 않고 실행하는 기술 서버마다 다른 운영기록 a서버는 잘 되는데 b서버는 왜 죽지? 같은일을 했는데? 눈송이서버 눈송이서버에서 애플리케이션이 죽으면 굉장히 많은 가능성을 따져야 한다 tmux를 사용해서 다양한 서버에 동시에 명령어를 전달하기도 한다 Docker file 도커 파일을 빌드하면 도커 이미지를 만들어 준다 도커이미지 : 명령어들을 모두 실행한 결과물 도커 이미지는 명령어 시행 시점까지 저장한다 1년사이에 스크립트의 내용이 바뀔 수도 있다. 그러나 도커 이미지를 만들어두면 1년전 도커이미지를 그대로 사용할 수 있다 서버를 코드화 한다 견고함 유연성 서버를 소프트웨어 사용하듯 다른사람의 도커이미지 실행해 보..

Backend 2020.06.07

kotlin으로 java springboot 프로젝트 리팩토링 하기 2

kotlin 으로 java springboot 프로젝트를 리팩토링 하며 알게된.. java와 kotlin의 차이 java와 kotlin 코드에 사용되는 몰랐던 개념 좋은 코드를 위한 고민 Any type을 Any라는 키워드로 지정할 수 있다 Any Java의 Object에 해당된다 when 인수에 대응하는 모든 분기를 조건이 충족될때까지 순차적으로 맞춰본다 모든 가능한 경우가 존재한다고 증명할 수 없는 경우에 else는 꼭 있어야 한다 companion object 코틀린에는 정적변수 혹은 메소드가 없고, 대신 패키지 내에 함수를 선언하여 사용할 수 있다 kotlin은 static 키워드 대신 companion object 기능을 제공 companion은 클래스 내부에 companion이라는 정적(sta..

Backend 2020.04.19

kotlin으로 java springboot 프로젝트 리팩토링 하기

spring boot + java로 만들어진 API 제공 서비스를 kotlin으로 리팩토링 하기 👩🏻‍🍳 intelliJ gradle 프로젝트 불러오기 spring boot maven으로 빌드하는법을 배운지 얼마되지 않아 갑자기 이번 프로젝트는 gradle으로 빌드 해야 했다. dependency를 선언하는데에 있어서, 프로젝트를 불러올때 작은 차이가 있었다 프로젝트 불러오는법 gradle.build 파일로 import gradle에 필요한 external library가 자동으로 불러지지 않는 경우 .idea 파일을 지운다음 다시 import 하여 해결 gradle 프로젝트로 인식 못할 때 🙅🏻‍♀️ 기존 프로젝트의 버전을 그대로 사용? 기존 프로젝트의 버전은 아래와 같았다 gradle : 4.3 sp..

Backend 2020.04.11