본문 바로가기

Develop197

네트워크 기초 네트워크 노드(node)와 링크(link)가 서로 연결되어 있거나 연결되어 있지 않은 집합체를 의미합니다. 더보기 노드는 서버, 라우터, 스위치 등 네트워크 장비를 의미 링크는 유선, 무선을 의미 처리량(throughput) 링크를 통해 전달되는 단위 시간단 데이터양을 의미합니다. 단위로는 bps(bits per second)를 사용합니다. 더보기 대역폭 : 주어진 시간 동안 네트워크 연결을 통해 흐를 수 있는 최대 비트 수 지연 시간(latency) 요청이 처리되는 시간을 말하며, 어떤 메시지가 두 장치 사이를 왕복하는 데 걸린 시간을 의미합니다. 네트워크 토폴로지(network topology) 노드와 링크가 어떻게 배치되어 있는지에 대한 방식, 연결 형태를 의미합니다. 트리(tree) 토폴로지 - .. 2023. 7. 12.
[Spring Data JPA] N+1 문제를 해결하기 위한 방법(JPQL의 fetch join, @EntityGraph, ...) 먼저, N+1 문제란 무엇일까? ORM(Object-Relational Mapping) 기술을 사용하는 경우에 발생할 수 있는 문제로,연관 관계가 있는 데이터를 조회할 때, N번의 쿼리가 추가적으로 발생하는 것을 말합니다.더보기ORM 기술에는 익히 들어본 Spring Data JPA, Hibernate 등이 있습니다    표현 방식의 측면에서 N+1 문제와 1+N 문제의 상황으로 나눌 수 있습니다.(둘은 같은 개념이고 나가는 쿼리 수도 동일합니다)  다음 예시를 통해 살펴봅시다.  N+1 문제 (일대다 관계) : 하나의 부서에는 여러 명의 직원이 존재하고, 모든 부서를 조회하는 상황 한 번의 쿼리로 모든 부서를 조회이후, 각 부서별로 N번의 쿼리를 추가로 실행하여 각 부서의 직원 정보를 조회→ 부서 조회.. 2023. 6. 26.
AWS EC2 터미널 - 애플리케이션 빌드 과정 중 멈춤 현상 해결 프리티어 계정을 사용중이고, 배포하기 위해 EC2 터미널에서 애플리케이션을 빌드하는 과정에서 항상 76%, test 빌드 단계에서 실행 시간만 늘어날 뿐, 다음 과정으로 넘어가질 않았습니다. 구글링을 해보던 중, 메모리 부족 현상을 해결하기 위한 swap 메모리를 할당하는 방법이 있었습니다. 속는셈치고 한 번 방법을 따라해보았고, 빌드 과정만 10분이상 지나도 되질 않던 것이 1분만에 빌드되었습니다. swap 메모리란? '가상 메모리 또는 페이징이라고도 불리는 swap 메모리는 시스템의 사용 가능한 메모리 용량을 확장하기 위해 사용되는 기술이다. RAM의 확장으로 사용할 수 있으므로, 활발하게 사용되지 않는 데이터를 저장하기 위한 추가 공간을 제공한다.' 과정은 다음과 같습니다. 일단, EC2 연결을 진.. 2023. 6. 7.
로컬에서 생성한 MySQL 데이터베이스를 마이그레이션하기 Gyul-Box 프로젝트를 진행하면서, 제주도 지역의 동마다의 주거 공간들을 데이터베이스에 넣어야 했다. 배포를 진행한 후에 많은 양의 데이터를 집어넣으려 했지만, 많은 데이터의 통신은 AWS 과금 발생의 위험이 있다는 팀원의 조언이 있었다. 팀원과 상의 후 내린 결론은 MySQL 데이터베이스에 일단 많은 양의 데이터를 로컬에서 넣어준 뒤, AWS RDS로 마이그레이션하기로 결정했다. 마이그레이션하는 과정을 따라가보자. 1. RDS 인스턴스 생성 RDS 인스턴스를 생성한다. default인 보안 그룹 설정에서 사용하는 DB 벤더 유형을 적용하고, 모든 트래픽의 IPv4 접근들을 허용한다. - 백업한 데이터를 RDS 데이터베이스로 가져올 때, connect 에러가 발생하기 때문 2. 데이터베이스 백업 및 .. 2023. 6. 6.
연결된 그룹 개수 찾기(DFS) 1. 각 노드의 방문 여부를 체크할 배열 생성 2. 각 노드에 연결된 노드를 추가할 배열 리스트를 추가 3. 각 노드에 연결된 노드들을 찾아 각 노드의 배열 리스트에 추가 4. 방문하지 않은 노드일 경우, dfs 진행 및 count 1 증가 dfs - 1. 방문할 노드인 경우 즉시 탈출, - 2. 해당 노드를 방문한 걸로 바꾸기 - 3. 연결된 노드들을 순회하면서 방문하지 않은 노드가 있다면, dfs 진행 class Solution { static List graph = new ArrayList(); static boolean[] visited; public int solution(int n, int[][] computers) { // 1 visited = new boolean[n]; // 2 for (.. 2023. 4. 25.
너비 우선 탐색(BFS) vs 깊이 우선 탐색(DFS) 일단, 둘을 다음 그림을 통해 이해해보자. 너비 우선 탐색(BFS) 특징 depth는 0이 아닌 1부터 시작 노드 수가 적고 깊이가 얕은, 검색 대상의 규모가 작은 경우, 유리하다. 큐 이용 장점 답이 되는 경로가 여러 개인 경우에, 최단 경로를 보장한다. 최단 경로가 존재하면, 어느 한 경로가 무한히 깊어진다 하더라도, 최단 경로를 반드시 찾을 수 있다. 단점 DFS에 비해 저장 공간의 필요성이 크다. DFS와는 달리 큐를 이용해서 다음에 탐색할 노드를 저장하므로, 노드의 수가 많을수록 필요 없는 노드들까지 저장해야 하기 때문이다. 최악의 경우에는 모든 경로를 다 살펴봐야 한다. 깊이 우선 탐색(DFS) 특징 depth는 0이 아닌 1부터 시작 검색 대상의 규모가 클 경우, 유리하다. 재귀, 스택 이용.. 2023. 4. 25.
서버에서 내려주는 에러 메시지를 직접 정의해야만 하는 이유 1차원적으로 개발자가 에러 메시지를 마음대로 컨트롤할 수 없음이 제일 큰 문제이다. 이유를 좀 더 상세하게 풀어보자. 스프링 프레임워크에서 기본으로 제공되는 형식화된 StatusCode, ErrorMessage로 응답을 내려주기 때문에, 소통하는 상대 서버나 클라이언트가 이해할 수 없다. 또, 상호 간에 정해놓은 에러 메시지에 대한 규칙이 깨질 수 있다. 에러 메시지를 서버에서 커스텀하게 정의해주지 않게 되면, 스프링 프레임워크에 종속적인 에러 메시지를 가져다 쓰게 되는 것이고 자연스레 개발자는 스프링 프레임워크에 의존적이게 되는 것이다. 어느 날 갑자기 스프링 프레임워크가 특정 에러에 대한 업데이트를 한다면, 갑자기 클라이언트에서 예상치 못한 장애가 발생할 수 있게 된다. 또 다른 이유로는 의도치 않게.. 2023. 4. 22.
Java 에러 - Exception in thread "main" java.util.regex.PatternSyntaxException 다음과 같이, "+"를 구분자로 split() 메서드를 이용해서 문자열을 분리하려 했다. 에러 메시지는 다음과 같았다. 구글링을 통해 확인해보니, ?, *, +, (, ), [, ], {, } 와 같은 일부 특수 문자를 replace(), replaceAll(), split() 메서드의 구분자나 기준으로 사용할 때 발생하는 에러라고 한다. 해결방안은 위 특수문자 앞에 역슬래쉬 2개(\\)를 같이 넣어주면 가볍게 해결할 수 있다. // example String str = "123+456"; String[] strArr = str.split("\\+"); // 역슬래쉬 = 원화 표시 // strArr = ["123", "456"] ++ 위 특수문자 양 옆에 대괄호([])로 감싸줘도 가능하다. // exam.. 2023. 3. 20.
우선순위 큐(Priority Queue)를 공부하면서 Queue는 먼저 선입선출(FIFO)이라는 특징을 가지는 구조이다. (Stack은 후입선출 - LIFO) 그럼 우선순위 큐는? 우선순위 큐는 말 그대로 우선순위가 높은 데이터를 먼저 뽑아내는 구조를 말한다. 그럼 여기서 의아할 게 어떤 기준을 가지고 우선순위를 정하는 걸까 싶은데, 단순히 요소의 크기를 우선순위를 잡고 오름차순, 내림차순 정렬을 할 수 있고, 우선순위 큐의 타입을 배열로 지정한다면, 특정 요소의 크기순으로 우선순위 기준을 잡을 수도 있다. Queue pq = new PriorityQueue(Comparator.comparingInt(o -> o[1])); (pq라는 우선순위 큐에는 int타입의 1차원 배열이 들어가게 되고, 배열의 1번째 인덱스의 값을 기준으로 정렬이 된다) Java에서 .. 2023. 3. 6.