분류 전체보기 100

[네트워크] TCP/IP 흐름 제어 와 혼잡 제어

1. 흐름 제어 (Flow Control) 흐름 제어는 송신자와 수신자 간의 데이터 전송 속도를 조절하여 수신자가 처리할 수 있는 속도로 데이터를 보내는 기법    해결 방법1) Stop and Wait매번 전송한 패킷에 대해 확인 응답(ACK)을 받아야만 그 다음 패킷을 전송하는 방법장점 - 각 데이터 프레임에 대한 확인 응답을 받기 때문에, 데이터 손실이나 오류를 발견하고 재전송이 가능단점 - 패킷을 하나씩 보내기 때문에 비효율적      동작 방식 1. 송신자(sender)는 첫 번째 데이터 프레임을 수신자(receiver)에게 전송 2. 송신자는 해당 데이터 프레임에 대한 확인 응답(ACK)을 받을 때까지 대기 3. 수신자는 데이터 프레임을 받고, 확인 후 확인 응답(ACK)을 송신자에게 전송 4..

CS/네트워크 2024.09.13

추상 클래스와 인터페이스 언제 쓸까?

새로운 프로젝트가 시작되고, 프로젝트 구성에 따라 추상 클래스나 인터페이스를 적용하려 한다. 어떻게 사용하면 좋을지 정리하려고 한다.  1. 추상 클래스 (Abstract Class) 추상 클래스는 일반 메서드(구현이 있는 메서드)와 추상 메서드(구현이 없는 메서드) 둘 다 가질 수 있다.추상 클래스는 다른 클래스가 상속받아 사용할 수 있다. 단, 추상 클래스는 객체화 할 수 는 없다.추상 클래스는 그 추상 클래스를 상속받아서 기능을 이용하거나 확장시키는데 있다.다중 상속의 모호성 때문에 추상 클래스 하나만 상속 받을 수 있다. (extends 예약어 사용)추상 클래스는 필드를 가질 수 있다. abstract class Animal { // 추상 메서드 (구현이 없음) abstract void..

Java/Java 2024.09.05

[내 코드가 그렇게 이상한가요?] 7장-컬렉션:중첩을 제거하는 구조화 테크닉

1. 이미 존재하는 기능을 다시 구현하지 말기  개선 전) 중첩 코드 존재(for문 안에 if절)boolean hasPrisonKey = false;//items는 List 자료형for(Item each : items){ if(each.name.equals("감옥 열쇠")){ hasPrisonKey = true; break; }}  개선 후) 컬렉션 사용(anyMatch)boolean hasPrisonKey = items.stream().anyMatch( item -> item.name.equals("감옥 열쇠"));   이처럼 anyMatch 메서드를 알고 있으면, 복잡한 로직을 직접 구현하지 않아도 됩니다. 반대로 모르면 로직을 직접 구현해야 하므로, 코드가 쓸데없이 복잡해집..

API, 라이브러리, 프레임워크 차이점

처음 개발을 시작했을 때 API, 라이브러리, 프레임워크 개념이 와닿지가 않았다.이제 처음보다 많은 걸 접해봤으니, 이제 헷갈리지 않도록 예시를 통해 정리해두려고 한다.    1. API란?API는 Application Programming Interface의 약자이다. 즉, 요청과 응답을 사용하여 소프트웨어들이 통신하는 방법이다.두 개 이상의 소프트웨어 컴포넌트 사이에서 상호 작용 할 수 있도록 정의된 인터페이스를 뜻한다.URL을 통해 서버에 접속해서 필요한 부분을 요청하여 응답을 받으며 이용할 수 있다.예시 - JPA(Java와 DB 사이에서 연결해주는 매개체), Google Maps API더보기API를 사용하는 이유 1. 서버와 DB에 직접적인 접근 방지2. 표준화된 요청만 받을 수 있도록   2...

개발/개발노트 2024.08.13

[알고리즘] 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS)

그래프를 탐색하는 방법에는 깊이 우선 탐색(DFS)과 너비 우선 탬색(BFS)가 있습니다.   1. 깊이 우선 탐색(DFS) Root Node 혹은 다른 임의의 Node에서 최대한 깊이 내려간 뒤, 더 이상 깊이 갈 곳이 없을 경우 옆 Branch로 이동하는 탐색 방법입니다.  즉, 해당 분기를 완벽하게 탐색하는 방법입니다.   특징모든 노드를 방문하고자 하는 경우(완전 탐색)미로 찾기, 퍼즐 문제검색 속도는 너비 우선 탐색(BFS)에 비해서 느림모든 경로를 한 번에 탐색하지 않기 때문에 너비 우선 탐색(BFS)보다 메모리 사용량이 적을 수 있음   Java 코드 (Stack을 사용해서 구현)class Graph { private int V; // Number of vertices privat..

CS/알고리즘 2024.08.04

[캐시] 자바 애플리케이션에서의 캐싱

본 포스팅은 아래 영상을 보고 정리한 글입니다.   1. 캐싱이란? 캐시란? 데이터나 값을 미리 복사해 놓는 임시 장소     캐시가 왜 필요할까?   예전에 MP3를 사용을 했을 때 노래를 다운로드를 하여야 들을 수 있었습니다. 그런데 만약 음악을 들으려 할 때마다 다운로드하였던 노래도 다시 다운로드를 하아야 한다면 귀찮고, 시간이 오래 걸려서 아무도 사용하지 않을 것입니다.  다운로드하였던 노래를 MP3에 저장을 하고 즉 캐시 했다가 같은 노래를 들으려고 할 때 캐시해둔 노래를 사용하면 효율적입니다.  캐시에 데이터를 미리 복사해 놓으면 더 빠른 속도로 데이터에 접근할 수 있기 때문에 캐시를 사용합니다.     캐시 작동 방식   뽀로로가 어느 교육 분야의 크루인지 조회를 하기 위해서 바로 서버에 데..

Java/Java 2024.07.31

[자료구조] Set (Java) & HashSet이 정렬이 되는 이유

Set (Java)   Set 이란? Set은 수학적 집합을 표현한 중복되지 않은 요소들의 집합이다.이를 통해 교집합, 합집합, 차집합 등을 구현할 수 있다.     Set 특징- 입력된 데이터의 순서를 보장하지 않는다.- 데이터의 중복을 허용하지 않는다.- 인덱스가 없기 때문에 Iterator를 사용해서 조회한다.    Set은 언제 사용하는지? 1) 중복된 데이터 제거 2) 특정 값이 존재 여부 확인    - HashTable로 구현되어있기 때문에, 특정 값이 존재하는지 여부를 빠르게 조회할 수 있습니다. 3) 집합 연산    - 합집합, 교집합, 차집합 등의 연산이 가능합니다.     Java - Set 인터페이스 구현 클래스 1) HashSet- 입력 순서를 보장하지 않으며, 데이터 중복을 허용하..

CS/자료구조 2024.07.27

[Timescaledb] Materialized View로 통계 조회 속도 개선 방법

Timescaledb를 적용하면서 1분, 1시간, 1일 통계 데이터 조회를 어떻게 해야 성능이 좋을지 고민을 했다.  첫 번째는 1분, 1시간, 1일 통계 데이터를 내서 별도의 테이블에 insert를 하는 방법이다. 이전에 사용하던 방식이라 로직을 크게 수정할 필요는 없었다. 하지만 수집되는 데이터 양이 많아서 동시에 같은 테이블을 insert를 하고 web에서는 select를 하게 되면 속도가 엄청 느려졌다.   두 번째 방법으로는 Materialized view를 활용하는 것이다. 통계 데이터 조회 속도를 높이기 위해 time_bucket을 사용해 Materialized View를 생성한다.    View는 알고 있었지만 Materialized View를 처음 알게 돼서 정리해보려고 한다. (이 포스..

개발/DB 2024.07.26

[자료구조] 트라이(Trie)

트라이(Trie)     예를 들면 다음에서 검색어를 찾을 때 위 그림과 같이 연관된 단어를 찾아주거나, 자동 완성시켜줄 때 트라이(Trie) 자료구조를 사용한다. 즉, 트라이(Trie) 는 문자열을 저장하고 탐색하는데 유용한 트리 자료구조이다. 검색을 뜻하는 Retrieval의 중간 음절에서 따와 Trie라고 불린다. 또 다른 이름은 Redix Tree, Prefix Tree이다.        트라이(Trie)의 작동 원리  springboot, springcloud, spirngmvc, sports라는 문자열을 저장해보자. 그럼 아래와 같이 트리가 구성이 된다.   사전에서 단어를 찾을 때와 비슷하게 sports를 찾으면 s -> sp -> spo -> spor -> sport -> sports 이렇..

CS/자료구조 2024.07.19

[내 코드가 그렇게 이상한가요?] 6장-조건 분기 : 미궁처럼 복잡한 분기 처리를 무너뜨리는 방법

1. 조건 분기가 중첩되어 낮아지는 가독성 [문제]//살아 있는가if(0    여러 개의 조건을 판정하기 위해서 if 조건문 내부에 if 조건문, 그리고 내부에 또 if 조건문을 넣는 식으로 if 조건문을 중첩했습니다. 어떤 조건을 만족할 때 어떤 로직이 처리되는지 이해하는 것만으로도 많은 시간을 낭비합니다.     [해결] 1) 조기 리턴으로 중첩 제거하기 조기 리턴은 조건을 만족하지 않는 경우 곧바로 리턴하는 방법입니다.//조건 로직if(member.hitPoint    조기 리턴의 장점은 중첩이 제거되어 가독성이 좋아졌습니다. 또 다른 장점은 바로 조건 로직과 실행 로직을 분리할 수 있다는 것입니다.   예를 들어 아래와 같은 로직 추가 되었다고 합시다.멤버가 테크니컬포인트(TP)를 가짐 - 조건 ..