분류 전체보기
-
mysql에서 조회 최적화를 위한 인덱스대용량 데이터 & 트래픽/대용량 처리를 위한 mysql 2024. 3. 5. 22:03
인덱스란 정렬된 데이터를 가지는 새로운 테이블을 의미한다. 일반적인 테이블은 PK 값으로 저장이 되기 때문에 특정 컬럼 (ex. 나이) 등으로 검색하는데 시간이 오래 걸리는데, 인덱스를 생성해놓으면 나이로 정렬된 새로운 테이블을 만들어 놓고 PK 값으로 매핑한다. 인덱스의 자료구조 Tree - 트리 높이에 따라 시간 복잡도가 결정 - 트리의 높이를 최소화하기 위해 B+ Tree를 사용 B+ Tree의 장점 - 삽입 / 삭제 시 항상 균형을 이룸 - 하나의 노드가 여러 개의 자식 노드를 가질 수 있음 - 리프노드에만 데이터가 존재 (연속적인 데이터 접근 시 유리함) 하지만 인덱스를 사용하는 것은 조회의 성능은 높일 수는 있지만 쓰기나 수정, 삭제의 성능은 낮출 수 있으므로 잘 고려해서 사용해야 한다. 클러..
-
대용량 시스템에 대한 이해대용량 데이터 & 트래픽/대용량 처리를 위한 mysql 2024. 3. 3. 22:09
어플리케이션은 간단하게 클라이언트 - 서버 - 데이터베이스로 이루어진다. 하지만 요즘에는 트래픽이 많아짐에 따라 클라이언트 - 웹 서버 - 웹 애플리케이션 서버 - 데이터베이스로 서버를 2개로 나누기도 한다. 웹 서버에서는 정적인 호스팅을 해주고 웹 애플리케이션 서버에서는 동적인 작업들을 해주며 서버를 효율적으로 사용하고, 관심사의 분리도 이룰 수 있다. 위의 사진처럼 대용량 트래픽을 다루기 위해 많은 서버와 캐시, 데이터베이스, 비동기 큐를 사용한다. 이전의 프로젝트에서 이러한 방식은 사용하지 않았는데, 취업을 하기 전에 대용량 트래픽을 다루는 경험을 할 수는 없겠지만 경험이 아니더라도 공부는 할 수 있으므로 강의를 통해 학습하려고 한다. 스케일업과 스케일 아웃 대용량 트래픽에서 많은 요청을 처리하기 ..
-
리스트 조회 시 페이징으로 특정 데이터만 조회프로젝트/법잘알 2024. 2. 23. 20:57
리스트를 조회할 때 fetch join을 사용했다 하더라도 시간이 많이 소요된다. 저번 포스팅에서 데이터를 임의로 30만개를 생성했다고 했는데, 30만개를 실제로 한 번에 get할 일은 거의 없다. 때문에 페이징을 진행하여 원하는 갯수만큼의 데이터를 가져오게 되는데 페이징을 할 때 계속 시간이 오래 걸리는 문제가 생겼다. @Override public Page findAllSuggestion(Category category, Boolean likeCount, Pageable pageable) { JPAQuery query = queryFactory .selectFrom(suggestion) .leftJoin(suggestion.user, user).fetchJoin() // fetch join 제거 .l..
-
조회 시 N+1 문제 해결로 쿼리 최적화프로젝트/법잘알 2024. 2. 23. 20:41
기능 개발을 할 때에는 쿼리에 대해 고려하지 않고 일단 개발을 진행했다. 개발을 완료하고 테스트를 하는 과정에서 쿼리를 호출할 때 N+1 문제가 발생하는 것을 확인했다. SuggestionController @GetMapping("/list") public ResponseEntity suggestionList( @AuthenticationPrincipal PrincipalDetails principal, @RequestParam(name = "category", required = false, value = "category") String category, @RequestParam(name = "likeCount", required = false) Boolean likeCount) { List allS..
-
프론트엔드, 디자인 추가 및 채팅 시스템 완성백엔드 관련 강의 공부/채팅 시스템 - mongo db 2024. 2. 23. 00:15
프론트엔드와 디자인을 javascript로 완성을 했다. 프론트엔드와 디자인은 강의의 코드를 참조해서 했다. 위의 사진처럼 채팅방에서 대화를 할 수 있다. 자신의 채팅은 오른쪽에 파란색으로 나오며, 자신의 채팅이 아닌 채팅은 왼쪽에 회색으로 나온다. 이번에 공부를 하면서 배운 점은 SSE 프로토콜에 의한 방식이다. HTTP와는 다르게 데이터를 한 번 post하거나 get하는 것으로 끝내는게 아니라 계속해서 데이터를 Flux 형태로 받아와서 사용자간의 채팅 시스템이 이루어질 수 있엇다, 채팅은 웹소켓을 많이 쓰는데 이번에는 웹소켓을 사용하지 않고 SSE 프로토콜과 mongo db를 사용했다. mongo db와 SSE 프로토콜을 사용해서 비동기 통신을 통해 계속해서 데이터를 받아왔다. 창을 2개 띄워놓고 채..
-
mongo db로 채팅에 데이터를 입력백엔드 관련 강의 공부/채팅 시스템 - mongo db 2024. 2. 22. 20:06
mongo db를 이용해서 데이터를 넣고 조회하는 기능을 해 볼 것이다. application.yml spring: data: mongodb: host: localhost port: 27017 database: chatdb mongo db 설정을 해주는데, 기본 포트가 27017이다. Chat.class @Data @Document(collection = "chat") // mongo db - collection 이름 지정 public class Chat { @Id private String id; private String msg; private String sender; private String receiver; private Integer roomNum; private LocalDateTime c..
-
mongo db를 사용하는 이유백엔드 관련 강의 공부/채팅 시스템 - mongo db 2024. 2. 22. 16:23
프로젝트할 때 가장 많이 사용했던 mysql와 같은 RDBMS의 장점은 테이블 간의 참조로 인한 데이터의 공유이다. Nosql인 mongo db는 컬렉션이 JSON 형태로 저장된다. mongo db에서는 테이블이 아니라 '컬렉션'이라고 한다. mongo db는 컬렉션과 문서라는 용어가 있는데, 문서는 아래의 JSON 형식의 key-value 쌍을 가지는 Binary-JSON 문서이다. 컬렉션은 문서들의 집합이라고 생각하면 된다. user : [ { id : 1, username : aaa, Phone : 010-1111-1111 }, { id : 2, username : bbb, Phone : 010-2222-2222 } ] 문서는 컬렉션에 위와 같은 형태로 저장된다. mongo db는 FK로 인한 외래..
-
영속성 컨텍스트 분리로 인한 비밀번호 수정 불가프로젝트/법잘알 2024. 2. 11. 18:10
UserController @PreAuthorize("hasRole('ROLE_USER')") @PatchMapping("/change/password") public ResponseEntity updatePassword( @AuthenticationPrincipal PrincipalDetails principal, @RequestBody ChangePasswordRequestDto request) { userService.updatePassword(principal.getUser(), request.getPassword(), request.getNewPassword()); return ResponseEntity.ok().build(); } UserService @Transactional public v..