Category: Develop

0

Oracle - 인덱스 힌트 사용법

Oracle 인덱스 힌트 사용법 오라클 옵티마이저가 최적의 인덱스를 선택하지 못할 때, 힌트를 사용하여 특정 인덱스 사용을 유도하는 방법을 다룹니다. 인덱스 힌트는 옵티마이저에게 특정 인덱스를 사용하도록 지시하는 강력한 도구입니다. 하지만 남용하면 오히려 성능을 저하시킬 수 있으므로 신중하게 사용해야 합니다. INDEX 힌트 - 특정 인덱스 사용 강제-- 기본 INDEX 힌트 사용SELECT /*+ INDEX(e idx_emp_dept) */ *FROM employees eWHERE department_id = 10;-- 여러 테이블에 각각 인덱스 힌트 적용SELECT /*+ INDEX(e idx_emp_dept) INDEX(d idx_dept_loc) */ e.employee_id, e.last_name, d.department_nameFROM employees e, departments dWHERE e.department_id = d.department_id AND d.location_id = 1700;-- 복합 인덱스 사용 강제SELECT /*+ INDEX(e idx_emp_dept_sal) */ *FROM employees eWHERE department_id = 10 AND salary > 5000; INDEX_DESC 힌트 - 인덱스 역순 스캔-- 인덱스를 역순으로 스캔 (내림차순 정렬 효과)SELECT /*+ INDEX_DESC(e idx_emp_salary) */ *FROM employees eWHERE salary > 5000ORDER BY salary DESC;-- 최근 데이터 조회 시 유용SELECT /*+ INDEX_DESC(o idx_order_date) */ *FROM orders oWHERE order_date >= TRUNC(SYSDATE) - 30ORDER BY order_date DESC; INDEX_FFS 힌트 - Fast Full Index Scan-- 테이블 액세스 없이 인덱스만으로 데이터 조회SELECT /*+ INDEX_FFS(e idx_emp_dept_sal) */ department_id, salaryFROM employees eWHERE department_id IS NOT NULL;-- COUNT 연산에 효과적SELECT /*+ INDEX_FFS(e idx_emp_dept) */ COUNT(*)FROM employees eWHERE department_id > 0;

0

Oracle - 인덱스 최적화

Oracle 인덱스 최적화 오라클 데이터베이스에서 인덱스를 효과적으로 생성하고 활용하는 방법을 다룹니다. 인덱스는 쿼리 성능을 크게 향상시킬 수 있는 중요한 데이터베이스 객체입니다. 적절한 인덱스 선택과 활용은 쿼리 튜닝의 핵심입니다. 적절한 인덱스 생성-- 단일 컬럼 인덱스CREATE INDEX idx_emp_dept ON employees(department_id);-- 복합 인덱스 (선택도가 높은 컬럼을 앞에)CREATE INDEX idx_emp_dept_sal ON employees(department_id, salary);-- 함수 기반 인덱스CREATE INDEX idx_upper_name ON employees(UPPER(last_name));-- 비트맵 인덱스 (Cardinality가 낮은 컬럼)CREATE BITMAP INDEX idx_gender ON employees(gender); 인덱스 사용 유도-- 나쁜 예: 인덱스 컬럼에 함수 사용SELECT * FROM employees WHERE UPPER(last_name) = 'SMITH';-- 좋은 예: 함수 기반 인덱스 사용 또는 검색값 변환SELECT * FROM employees WHERE last_name = UPPER('Smith');-- 나쁜 예: 인덱스 컬럼 변형SELECT * FROM employees WHERE salary * 12 > 100000;-- 좋은 예: 조건 값 변형SELECT * FROM employees WHERE salary > 100000 / 12; 인덱스 종류별 특징B-Tree 인덱스 (기본)

0

Oracle - 실행 계획 분석

Oracle 실행 계획 분석 오라클 쿼리의 실행 계획을 확인하고 분석하는 다양한 방법을 다룹니다. 실행 계획은 오라클 옵티마이저가 SQL 문을 실행하기 위해 선택한 작업 순서와 방법입니다. 효과적인 쿼리 튜닝을 위해서는 실행 계획을 정확히 읽고 분석할 수 있어야 합니다. EXPLAIN PLAN 사용-- 실행 계획 생성EXPLAIN PLAN FORSELECT * FROM employees WHERE department_id = 10;-- 실행 계획 확인SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);-- 상세 실행 계획 확인SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL, NULL, 'ALLSTATS LAST')); AUTOTRACE 활용-- AUTOTRACE 활성화SET AUTOTRACE ON EXPLAIN;SET AUTOTRACE ON STATISTICS;SET AUTOTRACE TRACEONLY;-- 쿼리 실행SELECT * FROM employees WHERE salary > 10000;-- AUTOTRACE 비활성화SET AUTOTRACE OFF; SQL 모니터링-- SQL 모니터링 활성화 (11g 이상)SELECT /*+ MONITOR */ * FROM large_table WHERE condition = 'value';-- SQL 모니터 레포트 확인SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR( sql_id => 'sql_id_here', type => 'TEXT') FROM DUAL;

0

Oracle - 쿼리 튜닝 가이드

Oracle 쿼리 튜닝 가이드 오라클 데이터베이스에서 쿼리 성능을 최적화하는 종합 가이드입니다. 쿼리 튜닝은 SQL 문의 실행 시간을 단축하고 시스템 리소스 사용을 최적화하는 프로세스입니다. 효과적인 튜닝을 위해서는 실행 계획 분석, 인덱스 활용, 통계 정보 관리 등 다양한 기법을 이해해야 합니다. 주제별 가이드1. 실행 계획 분석쿼리의 실행 계획을 확인하고 분석하는 방법을 다룹니다. EXPLAIN PLAN 사용법 AUTOTRACE 활용 SQL 모니터링 운영 환경에서 실행 계획 조회 SQL_ID를 이용한 추적 GATHER_PLAN_STATISTICS 힌트 AWR에서 과거 계획 조회 2. 인덱스 최적화인덱스를 효과적으로 생성하고 활용하는 방법을 다룹니다.

0

Django - 장고 시작하기

목차 Django - App 생성하기 Django - 장고 시작하기 장고 설치하기pip install django 장고 프로젝트 생성하기 - django-admindjango 를 설치하면 django-admin 명령어를 사용할 수 있습니다. 설치된 django-admin 에 startproject 명령어를 사용하면 새롭게 장고 프로젝트를 시작할 수 있습니다. django-admin startproject mysite 장고 서버 실행하기 - manage.py새로운 장고 프로젝트에 들어가면 manage.py 파일이 있습니다. runserver 명령어를 사용하면 장고 서버를 실행할 수 있습니다.

0

Django - App 생성하기

목차 Django - App 생성하기 Django - 장고 시작하기 장고 앱 만들기장고 App 생성은 manage.py 가 있는 프로젝트 폴더에서 startapp 명령어를 사용합니다. startapp 명령어를 사용해 hello_world 라는 이름의 앱을 만들어 줍니다. python manage.py startapp hello_world view.py 작성하기앱 폴더 내에 views.py 파일에 다음과 같은 코드를 작성해줍니다. from django.http import HttpResponsedef hello(request): return HttpResponse("Hello, world. You're at the hello_world index.")# Create your views here.] url.py 작성하기

0

JPA - 더티 체킹과 업데이트 그리고 벌크 연산

JPA 에서의 업데이트 - 더티 체킹 Entity 에 대한 더티 체킹 을 통한 업데이트가 이뤄집니다. JPA 에서는 Entity 를 업데이트 하기 위한 메소드가 별도로 존재하지 않습니다. JPA 에서의 업데이트는 엔티티 변경 과 더티 체킹 을 통해 업데이트가 이뤄집니다. JPA 에서 엔티티를 변경하기 위해서는 변경하고자 하는 엔티티를 조회한 후 해당 엔티티의 값을 변경하면 트랜잭션을 커밋할 때 변경 감지(Dirty Checking) 가 동작해서 데이터베이스에 UPDATE SQL 이 실행하는 방식으로 Entity 에 대한 변경을 반영합니다. @Override@Transactionalpublic ItemDto.Response modifyItemPrice(Long id, ItemDto.Request itemDto) { // 1. 변경하고자 하는 Entity 를 조회합니다. Optional<Item> optionalItem = itemRepository.findById(id); if (optionalItem.isPresent()) { Item item = optionalItem.get(); // 2. Entity 의 값을 변경합니다. item.updatePrice(itemDto.getPrice()); return ItemDto.Response.toDto(item); } else { throw new RuntimeException("Item not found"); }} Update 쿼리문 발생update item set item_type_id=?, modified_date=?, name=?, price=?, version=? where id=? and version=? 더티체크를 통한 업데이트의 한계더티 체킹을 통한 업데이트는 변경된 Entity 개수만큼 Update 문을 실행합니다. 그렇기 때문에 변경된 Entity 가 100개라면 100번의 Update 문이 실행되는 문제점이 있습니다.

0

MySQL - 사용자 추가

사용자 추가create user '[userid]';-- localhost 에서만 접속할 수 있는 계정 생성create user '[userid]'@'localhost' identified by '[비밀번호]';-- 외부에서 접근 가능한 계정 생성create user '[userid]'@'%' identified by '[비밀번호]'; 권한 부여하기-- select 권한 부여grant select privileges on *.* to '[userid]'@localhost identified by '[비밀번호]';-- update 권한 부여grant update privileges on *.* to '[userid]'@localhost identified by '[비밀번호]';-- insert 권한 부여grant insert privileges on *.* to '[userid]'@localhost identified by '[비밀번호]';-- delete 권한 부여grant delete privileges on *.* to '[userid]'@localhost identified by '[비밀번호]';-- select, update, insert 권한 부여grant select, update, insert privileges on *.* to '[userid]'@localhost identified by '[비밀번호]'; 특정 데이터 베이스에 대한 접근 부여-- [Database 명] 데이터베이스에 select 권한 부여grant select privileges on [Database 명].* to '[userid]'@localhost identified by '[비밀번호]'; User 에 따른 데이터 베이스 접근 부여-- localhost User 에게 전체 권한 부여grant all privileges on *.* to '[userid]'@localhost identified by '[비밀번호]';-- 외부접근 User 에게 전체 권한 부여grant all privileges on *.* to '[userid]'@'%' identified by '[비밀번호]';

0

[Docker]

Container 란?컨테이너는 어플리케이션을 실행하기 위해 필요한 모든 요소가 포함된 소프트웨어 패키지를 의미합니다.Container 화된 어플리케이션은 실행시 별 독립된(격리된) 실행환경에서 실행됩니다. Docker 란? Docker 는 컨테이너 기반 가상화 플랫폼으로, 어플리케이션을 패키징하고 배포하는데 사용됩니다. 도커(Docker)는 컨테이너 기반 가상화 플랫폼으로, 어플리케이션을 패키징하고 배포하는 데 사용됩니다. 도커는 소프트웨어를 컨테이너로 묶어서 실행할 수 있게 해주며, 이 컨테이너는 호스트 시스템과 격리되어 있어 응용 프로그램의 이식성과 확장성을 높이는 데 도움이 됩니다.

0

[Docker] 이미지 Build

Docker 이미지 Build 란?Docker Build는 Docker 이미지 를 생성하는 과정을 의미합니다. 이미지 빌드는 Dockerfile 파일을 기반으로 수행되며, 이 파일에는 이미지 생성에 필요한 명령어들이 단계별로 정의되어 있습니다. Dockerfile 살펴보기# Node.js 기반 이미지 사용FROM node:18# 앱 디렉토리 생성WORKDIR /app# package.json 복사 후 의존성 설치COPY package*.json ./RUN npm install# 앱 소스 복사COPY . .# 포트 개방EXPOSE 3000# 앱 실행CMD ["npm", "start"] 이미지 캐시와 레이어Docker Build 는 명령어 하나하나를 레이어로 분리하여 캐시를 사용합니다. 예를 들어 COPY나 RUN 단계에서 변경이 없으면 이전 캐시를 재사용하여 빌드 속도를 높일 수 있습니다. 멀티 스테이지 빌드# Build stageFROM node:18 as builderWORKDIR /appCOPY . .RUN npm install && npm run build# Production stageFROM nginx:alpineCOPY --from=builder /app/dist /usr/share/nginx/html

0

[Docker Compose]

1. Docker Compose란?Docker Compose 는 여러 개의 컨테이너를 한 번에 정의하고 실행할 수 있게 해주는 도구입니다. 일반적으로 실무에서는 웹 서버, 데이터베이스, 캐시 서버 등 다양한 컨테이너가 함께 작동해야 하는 경우가 많은데, 이 모든 것을 일일이 docker run으로 실행하는 건 너무 번거롭습니다. Docker Compose 를 사용하면 docker-compose.yml 파일 하나로 모든 서비스를 정의하고 일괄로 실행시킬 수 있습니다. 2. docker-compose.yaml 살펴보기version: "3.9" # compose 파일 버전services: web: image: nginx ports: - "8080:80" db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: example 3. Docker Compose 기본 명령어docker-compose.yaml 파일이 정의되면 해당 파일에 정의된 컨테이너 이미지나 환경등을 한번에 실행시켜 적용할 수 있습니다. 실행 docker compose up -d

0

Django Rest - 장고를 이용한 rest api 만들기

장고를 이용한 rest api 만들기settings myapi/settings.py STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 정적 파일 root 추가 INSTALLED_APPS = [ ... 'rest_framework',] INSTALLED_APPS에 quiz와 rest_framework를 추가해준다. 모델 생성하기 quiz/models.py

0

Django - Comment (댓글) view 구현하기

Comment (댓글) view 구현하기테스트 코드 작성 blog/tests.py # Comment를 생성한다.comment_000 = create_post(post_000, text='a test comment', author=self.author_obama) # Comment comments_div = main_div.find('div', id='comment-list') self.assertIn(comment_000.author.username, comments_div.text) self.assertIn(comment_000.text, comments_div.text) post_detail 수정하기 blog/templates/blog/post_detail.html <!-- Comment --><div id="comment-list">{% for comment in object.comment_set.all %} <div class="media mb-4"> <img class="d-flex mr-3 rounded-circle" src="http://placehold.it/50x50" alt=""> <div class="media-body"> <h5 class="mt-0">{{ comment.author }}</h5> {{ comment.get_markdwon_content | safe }} </div> </div>{% endfor %}</div> admin 사이트에서 comment확인할 수 있게 반영하기 blog/admin.py

0

Django - Comment (댓글) 작성창 구현하기

Comment (댓글) 작성창 구현하기forms.py 파일 생성하기 blog/ 해당 돌더에 forms.py 파일을 생성한다. from .models import Commentfrom django import formsclass CommentForm(forms.ModelForm): class Meta: model = Comment fields = {'text',} 테스트 코드 작성하기 blog/tests.py # 로그인하기login_success = self.client.login(username='smith', password='nopassword')self.assertTrue(login_success)# post를 이용하여 서버에 데이터를 보낸다.response = self.client.post( post_000.get_absolute_url() + 'new_comment/', {'text':'A test comment for the first comment'}, follow=True # redirect하는 것까지 확인을 해봐라)self.assertEqual(response.status_code, 200) views.py에 반영하기