전체 글 130

[레거시 정규화] DB 인덱싱 하기

1. 개요시스템을 운영하면서 요청건수가 쌓이게되어, 단순하게 조회하는 api 부터 시작해서, 요청의 통계등 관리자 사용 api가 점점 느려지는 것이 느껴졌다.우선순위를 낮게 두어 계속 밀렸던 인덱싱을 적용하도록 결정했다.✅ 인덱스란 무엇인가?인덱스는 테이블의 특정 컬럼에 대해 검색 가능한 색인 구조를 만드는 것이다.일반적으로 B-Tree 기반 인덱스가 기본이며, 정렬된 구조로 되어 있어 WHERE, JOIN, ORDER BY 등에서 전체 테이블 스캔을 막는다.왜 인덱스가 성능을 올리는가?전체 테이블을 순회하는 Full Table Scan 보다 빠르게 조회 가능키를 통한 검색 범위 지정이 빨라짐데이터가 많아질수록 효과가 더 커짐다만, insert/update/delete는 오히려 느려질 수 있기때문에 신중..

Back-end/SQL 2026.02.28

[레거시 정규화] DB 정규화 하기2

0. 개요 레거시 db를 정규화 한다이제 운영에 기존 레거시 데이터를 옮기기 위해서는 sql dump가 필요하다구조는 https://gyeong99.tistory.com/139 [레거시 정규화] DB 정규화 하기10. 개요레거시 DB를 보다 보면 이런 테이블을 자주 만난다.“요청에 대한 모든 걸 한 테이블에 다 때려 넣은 구조”문제는 요청 내용 + 요청 메타 정보 + 결재자 정보가 전부 이 테이블에 들어가gyeong99.tistory.com여기서 설명한다 레거시 DB 정규화의 진짜 시간을 쏟은 부분은 기존 REQUEST 테이블 데이터를 새로운 구조로 안전하게 덤프하는 과정이다. 1. DATA dump전제: 레거시 테이블 구조기존 REQUEST 테이블은 이런 형태였다고 가정하자. REQUEST - requ..

Back-end/SQL 2026.02.07

[레거시 정규화] DB 정규화 하기1

0. 개요레거시 DB를 보다 보면 이런 테이블을 자주 만난다.“요청에 대한 모든 걸 한 테이블에 다 때려 넣은 구조”문제는 요청 내용 + 요청 메타 정보 + 결재자 정보가 전부 이 테이블에 들어가 있었다는 점이다.시스템을 새로 개발하면서 레거시 DB에 있는 데이터들을 일부 필요한 부분들은 정규화하여 운영하기로 결정했다 1. 정규화 이전 정규화 이전 : 모든 걸 담고 있던 REQUEST 테이블정규화 전 테이블은 대략 이런 느낌이었다. REQUEST- request_id- request_title- request_content- request_type- request_status- created_at- requester_id- requester_name- requester_dept- approver_id- ..

Back-end/SQL 2026.02.07

[Spring Security + Ldaps] 신규 서비스 AD 인증 연동

1. 개요 신규 사내 시스템을 만들면서 B/E를 새로 구축하게 되었다. 이때 로그인 및 사용자 인증은 Ldaps를 통해 운영된다.따라서 Spring Security 기반에 Ldaps를 거쳐 인증/인가가 되어야한다.연동 과정을 차례차례 정리해보겠다.2. ArchitectureClient ↓Spring Security Filter Chain ↓AuthenticationManager ↓LdapAuthenticationProvider ↓LDAPS (Active Directory) 3. 상세 조건- 전제 조건 LDAP 서버 정보호스트: ad.company.com포트: 636 (LDAPS)Base DN: 예) DC=company,DC=com유저를 찾는 방식AD면 보통 sAMAccountName (계정아이디..

Back-end/Springboot 2026.02.01

[프로그래머스] 방금그곡

1. 문제https://school.programmers.co.kr/learn/courses/30/lessons/17683?language=python32. 알고리즘더보기1. 시간계산 함수 구현 후 함수 시간 만큼 곡 늘리기2. #을 사용하는 경우 소문자로 치환하기3. 재생시간이 긴순, 음악 제목의 알파벳 순으로 정렬4. 입력한 음악중에 맞는 값 출력 3. 코드def time_cal(enter, out): in_hour, in_minute = map(int, enter.split(':')) out_hour, out_minute = map(int, out.split(':')) min_gap = out_minute - in_minute hour_gap = out_hour - in_hou..

Algorithm 2026.01.19

[프로그래머스] 주차 요금 계산

1. 문제https://school.programmers.co.kr/learn/courses/30/lessons/92341 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 2. 알고리즘더보기1. 시뮬레이션 문제로 자료구조를 잘 이용하여 사용2. 출차 입차 기록 records를 string을 space 기준 파싱 3. 차량번호 기준 오름차순으로 값을 반환해야 하므로 정렬 (기본적으로 records가 출입차 기록이 오름차순으로 됨)4. 차량 번호당 얼마나 있었는지 총합 계산이 필요하여 dict에 저장 5. dict에 출입차 기록 조회 하는 과정에 출차 기록이 없는경우 23:59 추가6. 시간 계산하여 fees 조회 ..

Algorithm 2026.01.11

[프로그래머스] 미로 탈출

1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/159993# 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 2. 알고리즘더보기1. 해당 글은 최단 거리를 찾아야 하므로 bfs가 적합2. 지도의 조건이 중요한데, X를 제외한 모든 칸은 다 여러번 지나다닐 수 있다3. 먼저 시작지점, 출구, 레버의 위치를 저장한다4. 시작 - 레버위치의 최단거리를 구한다 5. 모든 통로는 X를 제외하고 지나 다닐 수 있으므로, 레버까지의 최소이동 거리를 제외하고 지나온 경로를 초기화 시킨다 6. 레버의 위치 - 출구까지의 최단거리를 구한다7. 출구의 위치에 저장된..

Algorithm 2026.01.10

[프로그래머스] 단어 변환

1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/43163# 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 2. 알고리즘 더보기1. 바꿔보고 돌리고 하는 백트래킹 사용2. 먼저 한글자만 다른지 확인하는 함수 checker 구현 -> 문자열 전체길이 -1 이 같은 글자 수 인지 확인3. dfs로 순회해주는데 생각할 조건은 최소값을 구해야하므로, 종료 조건의 경우 현재 문자열이 target과 같아질때 min 으로 업데이트 해준다4. words를 돌면서 checker로 한글자만 다르고 방문한 적 없는지 확인하여 순회한다5. words 에 target..

Algorithm 2026.01.07

[프로그래머스] 소수 찾기

1. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/42839 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 2. 알고리즘 더보기1. string 으로 주어진 문자열을 통해 가능한 모든 숫자 조합을 만들어야한다2. 이때 숫자의 위치에 따라 값이 변하기 때문에 순열을 사용한다 3. 1개만 사용하는 순열 ~ 모든 숫자를 다 사용하는 순열을 조합한다4. integer로 바꾼뒤 소수인지 판별 3. 코드 from itertools import permutations def is_prime(n): # 소수 판별 if n

Algorithm 2026.01.07

[프로그래머스] 타겟 넘버

1. 문제https://school.programmers.co.kr/learn/courses/30/lessons/43165 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 2. 알고리즘 더보기1. 덧셈 뺄셈 모든 연산을 확인해본다2. dfs로 전부 해보는게 솔루션 3. 종료 조건은 현재값이 target 값이며 모든 numbers를 idx를 확인하고 마지막 len(numbers)에 왔을때 최종 결과 값이 나오므로 종료 (여기서 실수 마지막 배열값에 도달하기 전에 중지 하면 값이 안나옴) 3. 코드 answer = 0def solution(numbers, target): def dfs(idx, cur)..

Algorithm 2026.01.06