전체 글 19

Seed를 사용하여 Pagenation + Random에서 중복 없이 데이터 가져오는 방법 | ORDERBY RANDOM PostgreSQL seed

어느날 페이지네이션을 사용하면서 랜덤한 값들을 응답해줘야하는 요구사항이 들어왔습니다.1. 한 번 요청시 5개씩 데이터를 응답해줘야 한다.2. 중복된 데이터가 나오면 안된다.3. 완전 랜덤한 데이터가 나와야 한다. 오늘은 해당 요구사항을 구현하는 방법인 seed에 대하여 알아보고, postgres + jpa 환경에서의 구현 방법을 알아보고자 합니다. Seed란 무엇인가?컴퓨터는 원래 난수를 생성할 수 없다는 사실 아시나요? 저희가 보기엔 마치 난수처럼 보이지만, 사실 정말 임의의 값이 아닌 특정 방법이나 ms를 사용하는 등의 계산 과정을 거쳐 나온 '의사 난수'들입니다.흔하게는 난수표를 사용하는데, 난수표를 선택하는 값을 시드(seed)라고 합니다. 그리고 seed값에 따라 같은 난수표를 사용하기 때문에 ..

Spring 2025.03.16

엑셀 읽어오기 API 개발 시 꼭 고려해야하는 상황 및 예외처리 w 토지조서 엑셀, Apache POI 타입, 엑셀 서식 문제

얼마전 토지조서 엑셀을 받아와 DB에 엑셀 행들을 저장하고, 엑셀 내용 읽어 응답해줘야하는 요구사항이 있었습니다.개발을 하며 엑셀 개발 시 고려가 필요한 두 가지 상황을 발견해서 공유하고자 합니다. 제 개발 환경은 아래와 같으나, 개발 환경이 다르신 분들도 한 번 읽어보시면 도움이 되실 것 같습니다.Spring Boot 3.4.2 + Java 21 + Apache POI 라이브러리 첫번째 상황: NumberOfRows()는 얼마가 나올까?위와 같은 엑셀 시트가 하나 있다고 생각해봅시다. 제가 사용하는 Apache POI 라이브러리에서는 `worksheet.getPhysicalNumberOfRows()`를 사용하여 시트에 내용이 몇 행까지 있는지 가져올 수 있는데요. 여러분들이 사용하시는 라이브러리에도 R..

Etc 2025.03.02

Spring Boot로 OAuth 구현하기 01: OAuth 2.0란? OAuth 완벽 정리

로그인을 할 때 소셜 로그인을 선호하시나요 직접 회원가입을 선호하시나요?저는 소셜 로그인을 더 선호합니다. 2020년 자료이긴 하지만 소비자연맹이 조사한 결과에 따르면 64% 정도의 사용자가 소셜로그인을 주로 사용한다고 대답했네요.  이번 소셜 로그인 파트에서는 가장 많이 사용되는 top 3의 소셜 로그인을 구현하는 방법을 정리해 볼 예정입니다. 오늘은 개발 전 OAuth란 무엇인지 알아보고, 어떤 식으로 동작하는지 이해해볼 것입니다. 구현 전 4챕터를 확인하시는 걸 추천드립니다. 목차는 아래와 같습니다.1. OAuth란?2. OAuth 탄생 이유3. OAuth와 OAuth 2.0의 차이점4. OAuth 2.0 표준 동작 방식 (OAuth 2.1 간단 알아보기) OAuth란?OAuth는 액세스 위임을 위..

Spring 2025.02.16

랜덤 추출이 필요할 경우 고려할 수 있는 TABLESAMPLE 절

개발을 하다보면 랜덤으로 데이터를 응답해줘야하는 상황이 생깁니다.그럴 때 우리는 크게 두 가지 방법 중 하나를 선택할 수 있습니다. 1) DB Query로 랜덤으로 추출하기.2) 로직에서 랜덤으로 추출하기. 보통은 1번에서 ORDERBY RANDOM()함수를 많이 사용합니다. 그런데 RANDOM() 함수가 아닌 테이블을 샘플링 해서 랜덤으로 가져올 수 있다는 것 알고 계셨나요?오늘은 갯수가 크게 상관 없을 경우 고려 가능한 TABLESAMPLE 절에 대하여 정리해보려고 합니다. 추가로 PostgresSQL에서 제공해주는 샘플링 메서드도 알아볼 것입니다. TABLESAMPLE 절TABLESAMPLE은 16년 PostgresSQL에서 처음 도입되었습니다. (PostgresSQL 9.5 버전부터 사용이 가능)..

DB 2025.01.03

테오의 스프린트 18기 백엔드 참여 회고

테오의 스프린트는 프론트엔드 개발자인 테오 님이 진행하시는 스프린트로, '6일간 좋은 사람들과 잘 만들어진 협업 프로세스를 함께 경험한다' 라는 목적으로 만들어진 프로그램입니다.  12월 3일부터 12월 9일까지 진행되었던 테오의 스프린트 18기 참여 회고를 해보려고 합니다. 🚀  닉네임을 정해보자테오의 스프린트에서는 처음 참가 신청을 할때부터 닉네임을 정하게 됩니다.그라운드 룰에서는 '나이 물어보지 않습니다'라는 그라운드 룰이 있는데 서로를 있는 그대로 바라볼 수 있을 것 같아 저는 되게 좋았던 룰이었던 것 같습니다.저는 '야타'라는 닉네임을 정했고, 마감일에 아슬아슬하게 참여하게 되었어요. 🙊 아이디어 나누기, 그리고 팀 빌딩 첫날에는 피그잼 사용법 및 규칙, 어떻게 운영될지에 대해 간단히 알려주..

회고 2024.12.17

NestJS 토큰 검증 기초 of 기초: Guard와 Passport.js

우리는 여러 요청들에 '토큰'을 함께 보내 제가 이 요청을 수행할 수 있는 존재임을 알리게 됩니다. 오늘은 서버의 입장에서 받은 토큰이 정상적인지 여부를 판단하는 과정을 알아보려고 합니다. Nest.js의 토큰 검증 로직에 대한 포스팅은 많지만 조금 더 쉽게 기초와 구현 방법을 풀어낸 포스팅이 있었으면 해서 글을 작성합니다. 특히 대부분의 포스팅에서 Passport.js 라이브러리를 사용하지만 사용할 때와 사용하지 않을 때의 차이, 즉 왜 사용하는가에 대한 설명이 부족하다고 느꼈고 그런 부분을 알려주는 글이 있다면 처음 Nest.js를 시작하시는 분들께 도움이 될 것이라고 생각하였습니다. 다들 사용하는 라이브러리라도 왜 사용하는지를 정확히 아는 게 저희에겐 중요하니까요. Purporse1) Guard가 ..

Nest 2024.12.13

[객체지향의 사실과 오해: 마무리] 07 함께 모으기 / 부록 A

✏️, 💡,❓ 해당 이모지는 저의 생각임을 나타냅니다. 객체지향 설계 안에 존재하는 관점이 있다.개념 관점(Conceptual Perpective): 설계는 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현한다. 이 관점은 사용자가 도메인을 바라보는 관점을 반영하고, 실제 도메인의 규칙과 제약을 최대한 유사하게 반영하는 것이 핵심이다. 명세 관점(Specification Perspective): 사용자 영역인 도메인을 벗어나 개발자 영역인 소프트웨어로 초점이 옮겨진다. 실제 소프트웨어 안 객체들의 책임에 초점을 맞추게 된다. (객체의 인터페이스) 명세 관점에서 프로그래머는 객체가 '무엇'을 할 수 있는가에 초점을 맞춘다. 구현 관점(Implemenation Perspective)은 실제 작업을 수..

Book 2024.11.20

왜 우리는 CORS를 알아야 할까?

우리는 CORS 에러가 나타나면 머리가 지끈지끈 합니다. 저는 CORS를 '에러'의 한 종류라고 생각했어요. 그런데 CORS는 에러가 아니라 '정책'이라는 사실 아셨나요? 오늘 이 글을 읽고 여러분이 CORS에 대한 오해를 풀 수 있었으면 좋겠습니다. 자신도 모르게 많은 미움을 받았을 CORS에게 이 글을 바칩니다! Porpose CORS를 확실히 이해한다. CORSCORS는 Cross-Origin Resource Sharing의 약자로 W3C에서 내놓은 정책입니다.W3C (World Wide Web Consortium)W3C 의 규약 중 CORS 관련 규약이 존재합니다. 이것을 각 브라우저 벤더들(크롬을 만드는 구글, IE를 만드는 마이크로소프트, 파이어폭스를 만드는 모질라, 사파리를 만드는 애플 et..

Etc 2024.11.09

[객체지향의 사실과 오해] 06 객체 지도

✏️, 💡,❓ 해당 이모지는 저의 생각임을 나타냅니다. 길을 물어 직접 알려주는 방법이 '기능적이고 해결 방법 지향적인 접근법'이라면 지도를 이용하는 방법은 '구조적이고 문제 지향적인 접근법'이다. 지도는 길을 찾는 데 필요한 구체적인 기능이 아니라 길을 찾을 수 있는 '구조'를 제공한다. 그리고 지도는 범용적이다. 지도를 제작한 사람들이 지도를 만들 때는 사용할 사람들이 구체적으로 어떤 목적으로 지도를 사용할지 알지 못한다. 지도를 사용하는 사람들의 요구사항은 계속 바뀐다. 마을까지의 길을 찾을 수도 있고 기차역으로 이동하는 길을 찾을 수도 있다. 지도는 이 모든 요구사항을수용할 수 있는데, 지도는 기능에 비해 상대적으로 잘 변하지 않는 안정적인 지형 정보를 기반으로 하고 있기 때문이다. 지도 은유의..

Book 2024.10.30

왜 'a'는 String type이 될 수 없을까? feat. SCP

char을 큰 따옴표로 묶거나 String을 작은 따옴표로 묶으면 type 에러가 발생합니다. char c = "a"; // errorString s = 'a'; // error 🤓 왜 'a'는 String type으로 쳐주지 않는 걸까요?왜 리터럴 타입으로 받을 때 따옴표로 둘을 구분해야하는지 의문을 가져보신 분들이 있을 것 같습니다.해당 글에서는 둘을 구분해야하는 이유를 알아보고, String의 동작 방식을 정리해보려고 합니다. feat. char vs String 'a'와 "a"가 달라야 하는 이유char은 Primitive 타입이고 String은 Reference 타입입니다.Primitive 타입은 기본 데이터 타입으로 값을 직접 저장합니다. 반면 Reference 타입은 이름과 같이 메모리 주..

Language 2024.10.27