Django - admin 추가하기
admin 계정 만들기python manage.py createsuperuser admin 페이지에 blog의 Post를 반영하기 blog/admin.py from django.contrib import adminfrom .models import Post# Register your models here.admin.site.register(Post)
admin 계정 만들기python manage.py createsuperuser admin 페이지에 blog의 Post를 반영하기 blog/admin.py from django.contrib import adminfrom .models import Post# Register your models here.admin.site.register(Post)
blog 앱 만들기 & Post 모델 만들기 & admin에 추가하기블로그 앱 만들기프로젝트 밑에 startapp 명령어를 통해 blog 앱을 만들어 줍니다. python manage.py startapp blog Post 모델 만들기 blog/model.py from django.db import modelsfrom django.contrib.auth.models import User# Create your models here.class Post(models.Model): # 제목 title = models.CharField(max_length=30) # 내용 content = models.TextField() # 작성 일자 create = models.DateTimeField() # 저자 author = models.ForeignKey(User) blog 앱 추가하기 mysite/setting.py
목차 Django - 블로그 post list와 post detail 페이지에 카테고리 추가하기 Django - Comment (댓글) 작성창 구현하기 Django - Comment (댓글) view 구현하기 Django - Comment (댓글) 모델 구현하기 Django - 로그인 사용자만 접속 가능하게 하기 Django - Post 작성 화면 / 기능 구현하기 Django - Post 수정 화면 / 기능 구현하기 Django - 마크다운적용하기, tag field에 공란 허용하기 Django - Post Detail 개선사항 도출하고 Test 코드 만들기 Django - Category 페이지 만들기 (slugField) Django - 사소한 문제들 해결(불필요한 내용 삭제하기; category 복수형 수정하기 (categorys -> categories)) Django - 블로그 post에 카테고리 추가하기 Django - 블로그 post에 카테고리 추가하기 Django - 블로그 post에 카테고리 추가하기 Django - read more 버튼 동작하게 하기, post_detail 페이지 개선하기 Django - HTML 분리해서 관리하기 Django - Post Detail 페이지 테스트 코드 작성하기 Django - Post List 페이지 테스트 코드 작성하기 part A Django - Post Detail 페이지 만들기 Django - template(html)에서 if문 사용하기 Django - 사진 업로드를 위한 ImageField와 업로드된 파일 관리 방법 Django - Bootstrap Grid Django - navigation bar 만들기 Django - static File 관리하기 bootstrap 적용을 위해 Django - FBV -> MBV 블로그 포스트 리스트 Django - MTV 구조 맛보기 model, views, templates 사용하기 Django - 지역(시간) 세팅 수정하기, Post 개선하기 str Django - blog 앱 만들기 & Post 모델 만들기 Django - 장고 시작하기 장고 설치하기pip install django 장고 프로젝트 시작하기django 를 설치하면 django-admin 명령어를 사용할 수 있습니다. 설치된 django-admin 에 startproject 명령어를 사용하면 새롭게 장고 프로젝트를 시작할 수 있습니다. django-admin startproject mysite 새로운 장고 프로젝트에 들어가면 manage.py 파일이 있습니다. runserver 명령어를 사용하면 장고 서버를 실행할 수 있습니다. python manage.py runserver
참고 https://create-react-app.dev/docs/adding-typescript/ React TypeScript 사용하기create react app 명령어에 --template typescript 파라미터만 추가해주면 초기 구성이 타입스크립트로 설정되는 것을 확인할 수 있다. # npm 사용npx create-react-app my-app --template typescript# yarn 사용yarn create react-app my-app --template typescript
목차 Spring Web Socket - Chat 프로그램 만들기 1 Spring Web Socket - STOMP (Simple Text Oriented Message Protocol) 네트워크 - Web Socket 참고 https://docs.spring.io/spring-framework/docs/4.3.x/spring-framework-reference/html/websocket.html https://www.baeldung.com/websockets-spring STOMP (Simple/Stream Text Oriented Message Protocol) WebSocket 기반 프로토콜이며 Client 와 Server 가 negotiate 하기 위한 sub-protocol 이 정의 돼 있다. STOMP 은 메세징 전송을 효율적으로 하기 위해 탄생한 Text 지향 프로토콜 이며 Message Payload에는 Text or Binary 데이터를 포함 해 전송할 수 있다. 또한 sub-protocol 이 정의 돼 있어 Client 에서 서버로 전송할 메시지 유형, 형식, 내용등이 정의 돼 있다. pub/sub 구조로 되어있어 메세지를 전송하고 메세지를 받아 처리하는 부분이 확실히 정해져 있기 때문에 개발자 입장에서 명확하게 인지하고 개발할 수 있는 이점이 있다. 또한 STOMP를 이용하면 메세지의 헤더에 값을 줄 수 있어 헤더 값을 기반으로 통신 시 인증 처리(ChannelInterceptor) 를 구현하는 것도 가능하며 STOMP 스펙에 정의한 규칙만 잘 지키면 여러 언어 및 플랫폼 간 메세지를 상호 운영할 수 있다. 만약 Spring에서 지원하는 STOMP를 사용하면 Spring WebSocket 어플리케이션은 STOMP Broker로 동작하게 된다. STOMP (Simple Text Oriented Message Protocol) 구성 SimpAnnotationMethod Client 로 부터 전달 받은 Message 를 처리한다. clientInboundChannel WebSocket client 로부터 전달 받은 메시지를 전송해준다. clientOutboundChannel Server 메시지를 WebSocket Client 에 전송해준다. brokerChannel Server 내부에서 사용하는 Channel, Message Broker 에 메시지를 전송해준다.
목차 Spring Boot - StreamingResponseBody Spring Boot - ResourceRegion Spring Boot - 파일 다운로드 서비스 구현하기 Spring Boot - 파일 업로드 서비스 구현하기 Spring Boot - Resource 추상화 Spring Boot - MultipartFile 에서 발생하는 예외 처리 Spring Boot - MultipartFile 를 이용한 파일 업로드 Spring Boot - Part 객체를 이용한 파일 업로드 참고 https://www.baeldung.com/spring-mvc-sse-streams StreamingResponseBody Spring 에서 제공하는 비동기 요청 처리를 위한 객체, 응답값을 Byte 로 변환해 Streaming 형태로 줄 때 사용하는 객체 @GetMapping("/video3")public ResponseEntity<StreamingResponseBody> handleRbe() throws FileNotFoundException { File file = new File("/Users/dongwoo-yang/spring-file/mysong.mp4"); InputStream inputStream = new FileInputStream(file); StreamingResponseBody stream = out -> { byte[] data = new byte[1024]; int length = 0; while((length = inputStream.read(data)) >= 0){ out.write(data, 0, length); } inputStream.close(); out.flush(); }; HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "video/mp4"); headers.add("Content-Length", Long.toString(file.length())); return ResponseEntity.ok().headers(headers).body(stream);}
목차 Spring Boot - Actuator + Prometheus + Grafana Spring Boot - 메시지 국제화 MessageSource Spring Boot - WebMvcConfigurer Spring Boot - @SpringBootApplication 알아보기 참고 https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator https://www.baeldung.com/spring-boot-actuators https://docs.spring.io/spring-boot/docs/2.1.8.RELEASE/reference/html/production-ready.html https://covenant.tistory.com/244 https://devbksheen.tistory.com/182 Spring Boot - Actuator Actuator 는 별도의 구현 없이 Metric 정보, 트래픽 정보, 데이터 베이스 등 운영환경에서 Application 상태 정보에 접근 할 수 있는 기능을 제공하고, HTTP 와 JMX 를 이용해 접근할 수 있다. https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.endpoints 공식 문서에서 Actuator 가 지원하는 End Point 를 확인할 수 있다. Actuator 의존성 추가implementation 'org.springframework.boot:spring-boot-starter-actuator' 의존성을 추가한 뒤 Spring Application 을 실행 시킨 후 http://localhost:8080/actuator 로 접속하면 현재 Application 에서 End Point 들을 확인할 수 있다.
목차 Spring Boot - StreamingResponseBody Spring Boot - ResourceRegion Spring Boot - 파일 다운로드 서비스 구현하기 Spring Boot - 파일 업로드 서비스 구현하기 Spring Boot - Resource 추상화 Spring Boot - MultipartFile 에서 발생하는 예외 처리 Spring Boot - MultipartFile 를 이용한 파일 업로드 Spring Boot - Part 객체를 이용한 파일 업로드 Http Range Request 서버에서 클라이언트로 HTTP 메시지 중 일부만 전송할 수 있도록 허용하는 기술 대용량의 미디어 파일, 파일 전송 중 일시 정지 및 다시 시작이 가능하다 Client 가 Range Header 를 통해 특정 리소스의 일부를 요청하면 서버가 그 부분만 전송하는 방식으로 동작한다. Server 가 Range Request 를 지원하면 Response Http Header 에 Content-Range 가 존재한다. HTTP Range 요청에 대한 정상 응답 코드로는 PARTIAL_CONTENT(206) 을 반환한다. Range 요청에 대한 응답 값이 Body 에 담겨져 있다. Spring Boot - ResourceRegion HttpRange 는 Range Header 정보를 담든 객체다. Request Header 로부터 정보를 얻어올 수 있다. ResourceRegion 는 전달 받은 Resource 객체 로부터 Range 범위 만큼 나눠 가져오는 객체다. @RestController@Slf4jpublic class VideoController { @GetMapping(value = "/video") public ResponseEntity<ResourceRegion> streamVideo(@RequestHeader HttpHeaders headers) throws IOException { UrlResource video = new UrlResource("file:/Users/dongwoo-yang/spring-file/mysong.mp4"); ResourceRegion resourceRegion; final long size = 1000000L; long contentLength = video.contentLength(); Optional<HttpRange> optional = headers.getRange().stream().findFirst(); HttpRange httpRange; if (optional.isPresent()) { httpRange = optional.get(); long start = httpRange.getRangeStart(contentLength); long end = httpRange.getRangeEnd(contentLength); long rangeLength = Long.min(size, end - start + 1); resourceRegion = new ResourceRegion(video, start, rangeLength); } else { long rangeLength = Long.min(size, contentLength); resourceRegion = new ResourceRegion(video, 0, rangeLength); } return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT) .contentType(MediaTypeFactory.getMediaType(video).orElse(MediaType.APPLICATION_OCTET_STREAM)) .body(resourceRegion); }} 서버에서 전송해주는 Resource Size 가 1 MB(1000000) 로 잡혀 있어 1 MB 씩 부분적으로 응답받는 것을 확인할 수 있다.
Index 란?인덱스는 데이터베이스에서 테이블의 검색 속도를 높이기 위한 자료 구조 입니다. 인덱스는 테이블의 컬럼을 기반으로 만들어지며, 이를 사용하여 특정 데이터를 빠르게 찾을 수 있습니다. 일반적으로 인덱스는 B-트리나 해시 테이블과 같은 자료 구조를 사용하여 구현됩니다. B-트리 인덱스는 매우 일반적인 인덱스 유형으로, 테이블의 키 값이 정렬된 트리 구조를 사용하여 저장됩니다. 이 구조는 검색, 삽입 및 삭제 작업에 대해 매우 효율적입니다. 해시 인덱스는 테이블의 키 값을 해시 함수를 사용하여 저장하며, 빠른 검색 속도를 제공하지만 범위 검색이나 정렬 기능이 없습니다. 인덱스를 사용하면 특정 행을 검색하는 데 걸리는 시간이 줄어듭니다. 특히 대량의 데이터가 있는 경우 검색 성능을 향상시키는 데 매우 유용합니다. 그러나 인덱스는 테이블의 크기와 관련하여 저장 공간을 차지하므로 인덱스를 너무 많이 사용하면 데이터베이스 성능이 떨어질 수 있습니다. 또한 인덱스를 사용하면 데이터를 삽입, 수정 또는 삭제할 때 추가 작업이 필요하므로 데이터베이스 성능에 영향을 미칠 수 있습니다. 따라서 인덱스는 데이터베이스의 검색 성능을 향상시키는 데 매우 유용하지만, 사용에 주의해야 합니다. 적절한 인덱스를 사용하면 데이터베이스의 성능을 최적화할 수 있습니다. Index Scan 종류 Table Full Scan : 테이블 전체 탐색 Index Unique Scan : 인덱스 수직 탐색 Index Full Sacn : 인덱스 전체 탐색 Index Range Scan : 인덱스 범위 탐색 Index Skip Scan : 인덱스 스킵 탐색 Table Full Scan - 테이블 전체 스캔 전체 테이블의 모든 레코드를 검색하는 방식