본문 바로가기

전체 글

(14)
[PostgreSQL] Sequence: 정의, 활용 방법, 그리고 정렬 방식 사용 사례 이번 포스팅을 작성한 이유일반적으로 드래그 앤드 드롭 정렬을 구현하는 데에는 Integer 방식, GreenHopper 방식, Linked List 방식 그리고 Atlassian Jira의 랭킹 알고리즘, LexoRank 정도가 있는 것으로 알고 있다(LexoRank 방식이 궁금하다면, 여기에서 자세히 알 수 있다). 나는 사이드 프로젝트에서 아이템 정렬 및 순서 변경 기능을 구현할 때, Integer와 순서가 변경되는 위치에 따른 분기 조건을 고려하는 방식의 쿼리를 사용하였다(링크). 하지만, 현재 회사에서는 PostgreSQL의 Sequence를 활용하여 아이템 정렬 및 순서 변경 기능을 구현하고 있다. 이에, 다소 생소했었던 PostgreSQL Sequence에 대해서 더 자세히 알아보고, 어떤 방..
[PostgreSQL] WITH TIES 옵션: 정의, 활용 방법, 그리고 효율적인 사용 사례 이번 포스팅을 작성한 이유회사 프로젝트에서 Cron 방식으로 데이터를 주기적으로 조회하는 쿼리를 커서 기반 페이지네이션으로 구현했고, 커서는 데이터 생성 시간을 뜻하는 created 컬럼(Datetime)을 대상으로 했다. 데이터 생성 시간이 동일한 케이스는 없을 것이라고 판단하였기에 쿼리는 단순 ORDER BY, LIMIT으로 구현했다. 하지만, 개발을 마치고 테스트 하던 중 일부 데이터가 조회되지 않고 누락되는 케이스가 발생했고, 원인을 파악해보니 특정 데이터를 일괄로 등록할 때 청크 단위로 동일한 생성 시간을 넣어주고 있는 케이스가 발견되었다(역시, 섣부른 판단은 이런 결과를..). 따라서, 커서 기반 페이지네이션의 조건을 변경해야 되는 상황이었고 복합 인덱스 설정과 WITH TIES 옵션 중 고민..
Nginx CORS + HTTPS 설정하기 본 포스팅은 AWS EC2 인스턴스(Ubuntu 24.04 LTS)를 기준으로 작성하였습니다.1. Nginx Install$sudo apt-get install nginx$nginx -v #nginx version 확인2. Nginx Config SettingsNginx의 동작 방식을 결정하는 nginx.conf 파일은 /etc/nginx 에 위치해 있다. 해당 파일에서는 Basic Settings, SSL Settings, Logging Settings, Gzip Settings and Virtual Host Configs 등 다양한 값을 세팅할 수 있다. 이번 포스팅에서는 Virtual Host Configs의 /etc/nginx/sites-enabled/* 을 커스터 마이징 하여 Nginx CORS..
[Alembic] Auto Generating Migrations autogenerate 란? Alembic에서 제공하는 autogenerate 옵션은 SQLAlchemy의 ORM을 이용하여 정의한 메타데이터를 읽어 변경된 모델과 현재 데이터베이스 스키마를 비교하여 자동으로 마이그레이션 스크립트를 생성 해주는 옵션이다. autogenerate 옵션을 사용하기 위해서는 실제 데이터베이스 스키마를 선언한 모델로 부터 Base를 호출하여 target_metadata 변수에 설정해주어야 한다(초기값은 None). # alembic/env.py # add your model's MetaData object here # for 'autogenerate' support from myapp import mymodel target_metadata = mymodel.Base.metada..
[백준] 2577번 - 숫자의 개수 문제 풀이 import java.io.*; public class ArrayEx2 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int num = 1; int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; for (int i = 0; i < 3; i++) { int x = Integer.parseInt(br.readLine()); num = num * x; } br.close(); System.out.println(num); // 입력한 3개의 값을 모두 곱한 값 for (int ..
[백준] 10818번 - 최소/최대 문제 문제 풀이 import java.io.*; import java.util.StringTokenizer; import java.lang.*; public class ArrayEx1 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int x = Integer.parseInt(st.nextToken()); // 첫 번째 입력 값을 정수로 변환, 4 입력 int num; int min=1000000; int max=-1..
[ERROR] IntelliJ - actual and formal argument lists differ in length - 에러 Stack 예) Error:(27, 24) java: constructor Employee in class com.course.rabbitmqproducer.entity.Employee cannot be applied to given types; required: no arguments found: java.lang.String,java.lang.String,java.time.LocalDate reason: actual and formal argument lists differ in length - 해결 방법 Settings > Build, Execution, Deployment > Compiler > Annotation > Enable annotation processing 체크
입력과 출력 hasNextInt() true or false 값 반환 public class MainInput { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (!sc.hasNextInt()) { // 사용자가 입력한 값이 정수(int)가 아니면 while문 진행 sc.next(); // 기존에 입력된 값을 초기화 System.err.println("다시 입력하세요"); // 정수가 입력되지 않은 것을 사용자에게 err로 확인 } int i = sc.nextInt(); System.out.println(i * 10); sc.close(); } } new 연산자를 통해 생성한 Scanner 객체를 sc라는 변수에 ..