인기 글

Github - Pull request template 작성과 설정
·
Git
💡Pull request template은 왜 필요할까? PR의 내용이 중요한 이유는 Pull Request를 통해 코드 리뷰를 받기 때문입니다. 코드 리뷰를 통해 팀원 간의 코드 스타일을 맞출 수 있고, 혼자서는 발견하기 어려운 위험 요소도 발견할 수 있습니다. PR 내용만으로도 변경 사항과 이유를 충분히 이해할 수 있어야 합니다. PR Template을 만들어 Repository에 추가하면 PR을 할 때 PR body에 template의 내용을 자동으로 볼 수 있습니다. PR의 내용을 표준화해서 일관성 있는 좋은 품질의 Pull Request를 유지할 수 있습니다. pull_request_template.md 파일 생성 프로젝트의 Repository에서 파일을 생성합니다. 템플릿은 다음 위치 중 한 ..
Javascript - Uncaught SyntaxError: Invalid or unexpected token 원인과 해결방법
·
나의 에러 일지
개요 평가 시스템을 만들고 있었다. 요구사항 중 특정 기간에만 url에 접근 가능하도록 설정할 수 있는 요구사항이 있었다. (수강 신청 기간을 떠올리면 된다.) 평가 기간을 지정하면 해당 기간 내에만 url에 접근 가능하고, 기간 외에 접근 시 평가 기간이 아니라는 alert창과 함께 로그인 화면으로 리다이렉트되도록 했다. Service public String checkOfficerEvaluationPeriod() { OfficerEvaluationPeriod officerEvaluationPeriod = this.getOfficerEvaluationPeriod(); LocalDate startDate = officerEvaluationPeriod.getStartDate().toLocalDate(); ..
Java - ArrayIndexOutOfBoundsException 원인과 해결법
·
나의 에러 일지
원인정해진 배열의 크기보다 크거나 음수 index에 대한 요청이 있으면 ArrayIndexOutOfBoundsException이 발생한다.배열의 index는 1부터 시작하는 것이 아닌 0부터 시작한다. 배열의 크기를 n이라고 한다면 index는 1부터 n까지가 아닌 0부터 n-1까지인 것이다. 보통 이 부분에서 해당 예외가 많이 발생하는 것 같다.ArrayIndexOutOfBoundsException은 자바 컴파일러에서 검사하지 않고 실행을 시켜야 알 수 있다.int[] arr = new int[5] // arr의 범위는 arr[0] ~ arr[4]로 총 5개의 인덱스를 생성arr[5] = 5; // arr[5]는 존재하지 않기 때문에 예외 발생!// 결과Exception in thread "main" ..
QA - Test Case를 통한 QA 테스트
·
etc
개요이번에 회사에서 진행하던 프로젝트가 마지막 단계에 왔다. 이제 배포를 하기 전에 QA를 진행해야 했다. 하지만 우리 조직에는 체계화 및 구조적으로 QA를 진행하는 문화가 없었다. 당연히 QA 조직도 없다. 그래서 직접 QA 테스트를 진행하기로 했다. 본 글에 내가 QA테스트를 작성했던 내용을 남겨둔다. 부족한 부분이나 잘못된 내용이 있다면 언제든 댓글을 남겨주세요! QA 테스트(Quality Assurance)라고 하면 제조업 분야에서 기계 성능을 테스트하는 QA를 생각할 수 있다. IT에서의 QA는 서비스 기획 단계부터 참여하여 개발, 테스트 그리고 출시까지의 모든 과정에서 잠재적인 품질 리스크를 프로젝트 참여자들과 공유하고 해당 서비스가 사용자의 요구사항에 충족하는지에 대한 관리하는 활동이라고 볼..
Algorithms - 가중치 랜덤 알고리즘(랜덤 쿠폰 뽑기)
·
Algorithms
배경커머스 플랫폼 개발에서 랜덤 쿠폰 지급 이벤트는 빈번히 요구되는 기능이다. 이러한 이벤트에서는 일반적으로 할인율이 낮은 쿠폰일수록 당첨 확률이 높고, 할인율이 높은 쿠폰일수록 당첨 확률이 낮다. 이를 구현하기 위해 각 쿠폰에 가중치를 부여하고, 랜덤하게 쿠폰을 발행하는 가중치 랜덤 알고리즘(Weighted Random Algorithm)이 사용된다. 이번 포스트에서는 이 알고리즘을 알아보고 실제 구현, 테스트까지 진행해보자.  가중치 랜덤 알고리즘(Weighted Random Algorithm)가중치 랜덤 알고리즘은 각 요소에 가중치를 할당해서 선택 확률을 조절하여 선택하는 알고리즘이다.가중치가 높을수록 선택될 확률이 높고 가중치가 낮을수록 선택될 확률이 낮다. 사용 사례게임 개발: 디아블로 시리즈를..
Oracle - 다중 Like (Like In)
·
SQL
기존 서비스에서 검색 기능에 대한 요구사항이 있었다.요구사항은 다음과 같다.복수 검색 가능검색 키워드를 포함하는 결과값 모두 조회ex) kim, lee, park 검색 -> 결과값: kimchanbin, leechanbin, parkchanbin, kimleepark 만약 검색어와 일치하는 결과값만 가져오면 됐다면 IN 연산자를 사용했으면 됐을텐데, 검색어를 포함하는 모든 결과값을 가져와야 했기 때문에 LIKE문을 사용해야 했다. IN 연산자SELECT NAMEFROM USERS WHERE NAME IN ('kim', 'leechan', 'parkchanbin');결과값: parkchanbin  LIKE 연산자SELECT NAMEFROM USERSWHERE NAME LIKE 'kim%'결과값: kimch..
Spring - 이메일 인증 구현해보기 (랜덤 인증번호 보내기)
·
Spring
배경새로 시작하게 된 프로젝트에서 회원가입 중 이메일 인증을 하도록 했다.Spring에서 제공하는 API를 사용하면 생각보다 쉽게 구현할 수 있다. 나는 Google SMTP 서버를 이용해서 이메일 인증을 진행하도록 했다. 개발 환경Java 11Spring 2.xGradleMySQL, RedisIntelliJ 흐름사용자는 회원가입 화면에서 가입하려는 이메일을 입력 후 이메일 인증 버튼 클릭클라이언트 서버에게 사용자의 이메일로 인증 번호 전송 요청서버는 랜덤 인증 번호 생성. 인증 번호를 Redis에 저장 후 사용자의 이메일로 인증 번호 전송사용자는 인증 번호 확인 후 인증 번호 입력 후 확인 버튼 클릭클라이언트는 서버에게 인증 번호 검증 요청서버는 전달받은 인증 번호가 Redis에 저장된 인증 번호와 동..
Oracle - 실행 계획으로 복잡한 쿼리 최적화해보기
·
SQL
배경백오피스를 운영하면서 항상 거슬렸던 부분이 있었다. 바로 느리게 로딩되는 주문 관리 페이지다. 원인은 굉장히 오래 걸리는 주문 목록 조회 쿼리였다. 주문 관리 페이지는 고객의 주문 정보, 배송 현황 등 다양하고 복잡한 데이터를 실시간으로 처리하고 표시해야 하는 중요한 화면이다. MD들은 업무 특성상 하루에도 수차례 이 페이지에 접속해야 하는데, 긴 로딩 시간을 감내해야 하는 상황이었다. 이는 단순히 개인의 불편함을 넘어서 전체적인 업무 효율성 저하로 이어질 수 있었다.(라고 생각한다.)그래서 팀에 건의하여 쿼리를 최적화해보기로 했다. 개발 환경Oracle11gDBeaver (Community Edition 24.1) 쿼리 구조쿼리 최적화를 할 때 가장 중요한 건 최적화하려는 쿼리의 역할과 기능을 아는..
MariaDB - 행 번호 출력하기 ROW_NUMBER() OVER PARTITION BY
·
SQL
오라클에서는 RNUM()을 통해 쉽게 순번에 맞는 행 번호를 출력할 수 있었다. 이번에 JSP로 프로젝트를 진행하면서 MariaDB를 사요하게 되었고 MariaDB에서도 행 번호를 출력할 수 있는 방법에 대해 정리해본다. MariaDB에서는 ROW_NUMBER() OVER() 함수를 사용하면 된다. OVER 안에는 PARTITION BY와 OREDER BY를 사용할 수 있다. PARTITION BY : 결과 집합을 분할하는 데 사용하는 열을 지정한다. PARTITION BY를 지정하지 않으면 모든 행이 단일 그룹으로 취급된다. ORDER BY : 지정된 파티션 내에서 각 행의 고유 ROW_NUMBER가 할당되는 순서를 결정한다. 예제 SELECT ROW_NUMBER() OVER(ORDER BY name ..
HTTP - 프록시 환경에서 실제 클라이언트 IP 찾기 (X-Forwarded-For, X-Real-IP)
·
Network
배경새로운 프로젝트에서 화이트리스트 IP 검증 로직(IP 기반 접근 제한)을 구현하게 되었다. 처음에는 단순하게 request.getRemoteAddr()를 사용하면 될 줄 알았는데, 실제 운영 환경에서는 중간에 프록시를 거치다보니 실제 클라이언트 IP가 아닌 프록시 IP가 조회되는 문제가 있었다. 이 문제를 해결하기 위해 알게된 X-Forwarded-For와 X-Real-IP에 대해 알아보자 문제 상황웹 애플리케이션을 개발하다 보면 클라이언트의 실제 IP 주소가 필요한 경우가 많다. 특히 보안 정책, 접근 제어, 로깅 및 분석 등의 목적으로 사용된다. 하지만 실제 운영을 위한 웹 아키텍처에서는 클라이언트와 서버 사이에 다양한 중간 계층들이 존재한다. 로드 밸런서, 리버스 프록시, CDN 등을 거치면서 ..
Cold Bean
개발하는 콩