Back-end 10

[레거시 정규화] 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

[Docker] 도커 환경에서 서비스 띄우기

1.  구조  django로 웹 애플리케이션을 개발하고 나서 nginx web 서버를 사용하여 동작할 수 있도록 구성한다 이때 각각 도커 컨테이너로 구성 되어 있으며 nginx 서버의 경우 https로 변경해준다   목록버전1python3.82nginx -- https적용 3docker 4docker-compose   2-(1). dockerfile -- for django web application# 베이스 이미지로 Python 3.8 사용FROM python:3.8-slim# 작업 디렉토리 설정WORKDIR /app# 필수 시스템 의존성 설치RUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ libpq-dev ..

Back-end/Docker 2025.01.02

[Spring boot + MongoDB + MySQL] DB 2개 연동하기

Springboot에 Mysql과 MongoDB 연결하기 1. 연결이유 프로젝트 중, RDBMS로 기본적인 것들은 다 구현해 놨는데, 서비스 배포시 사용자들의 로깅이나 결제 데이터가 쌓이면 Document기반인 관리하기 더 편한 NoSQL로 넣는게 좋을것 같다는 생각이 들었다 따라서 구조는 Springboot에 Mysql과 MongoDB둘다 연결되어 있는 구조이다 이번 글에서는 MongoDB에 AOP로 사용자 접근 로그를 저장하도록 하겠다 Collection이름은 user_history이다 2. 코드 1) build.gradle 수정 가장 아랫줄 코드가 mongodb를 추가한 부분이다 2) User History Entity 수정 //@Entity @Document(collection="user_hist..

Back-end/Springboot 2022.07.26

[AWS] EC2 볼륨 확장

EC2 disk 용량 문제 프로젝트를 진행하면서 수정한 코드를 배포하기위해 파일을 직접 Filezilla로 옮겼는데, 용량문제로 필요한 파일들이 일부 들어가지지 않는 문제를 맞닥뜨렸다. EC2 볼륨 확장 과정 1. 해당 볼륨 탭에 들어가서 늘리려고 하는 인스턴스를 우클릭하여 볼륨을 수정해준다. 2. 확장하는데 시간이 10분이상 소요되니 기다린다. 3. Putty에 접속하여 직접 파일 시스템을 늘려준다. 4. 최적화가 완료된 뒤 다음과 같은 명령어를 입력해준다. df -h #현재 용량 상태 확인 lsblk #어떤 파티션을 조절해야하는지 파티션 상태 확인 sudo growpart /dev/xvda 1 #파티션 크기조정 (공백은 번호구분 용도) lsblk #다시 용량 변화확인 sudo resize2fs /de..

Back-end/Aws 2021.07.29

[AWS] aws에 spring-boot 배포하기

Springboot Jar 파일 배포 aws t2.micro에 구현한 프로젝트를 jar파일로 배포해 보자 . 이때 nginx로 로드밸런싱도 도전했다. aws 배포 방법 먼저, t2.micro 인스턴스를 하나 만들어 둔 상태이다. Gradle로 jar 파일 생성 및 putty에 전송 1. IntelliJ에서 bootJar을 통해서 jar 파일을 만들어준다 2. Putty로 ec2에 접속한다. 3. git clone으로 프로젝트를 다운받는다. 4. jar파일이나 war파일은 업로드하면 안되기 때문에 Filezila를 통해서 받아야한다. jar 파일 실행 1. gradlew가 없어서 만들고 다시 github에 업로드한다. gradle init #gradle초기화 진행 gradle wrapper 2. 깃클론 및..

Back-end/Aws 2021.07.28

[Docker] Dockerfile 만들기

Docker 기초도커 파일 작성하기주의 할 점: Dockerfile이라는 이름으로 파일을 생성해야 함도커 파일의 명령어 파악하기FROM: 베이스 이미지 명시, 이미지 생성시 기반이 되는 이미지 레이어 ex) : ex) FROM alpineRUN: 도커 이미지가 생성되기 전에 수행할 쉘 명령어ex) RUN commandCMD: 컨테이너 시작시 실행 될 명령어를 명시해 준다-> 도커파일 내에 1번만 사용 가능ex) CMD ["echo", "hello"]본격적인 예시 코드FROM node:10#경로지정WORKDIR /usr/src/app#종속성 다운로드COPY package.json ./ RUN npm install#경로 안에 모든 파일 컨테이너 안으로 복사 #소스만 변경 하는 부분을 반영해 주기 위한 부분 ..

Back-end/Docker 2021.07.28

[SQL] GROUP BY 한 결과로 UPDATE 하는 법

기존 서비스 운영 중 DB를 업데이트 해야할 때 서비스 진행중에 새로운 서비스를 도입해서 기존의 사용자에게도 적용해야할 때, 조건을 걸고 일괄 수정이 필요할 때가 있다. 이번의 경우에는 id로 group by절을 사용하여 나온 결과의 수를 세고 그 결과대로 컬럼 두개를 업데이트 시켜야 했다 1. UPDATE가 필요한 조건의 대상자 찾기 user의 id로 그룹화 하여 해당 유저가 작성한 글의 수를 센다 select count(*) as CNT, user_id from feedlist group by user_id having CNT>=7; # Feedlist라는 테이블에서 user_id로 그룹화 하고 반환되는 튜플의 수를 세는데, 7개 이상일 때만 나오도록 한다. group에 대한 조건을 세기 위해서는 w..

Back-end/SQL 2021.07.27