8-비동기 메시지 전송하기

이전 장에서는 REST를 사용한 동기화 통신을 알아봤다. 비동기 메시징은 애플리케이션 간에 응답을 기다리지 않고 간접적으로 메시지를 전송하는 방법이다. JMS로 메시지 전송하기 JMS(Java Message Service): 두 개 이상의 클라이언트 간에 메시지 통신을 위한 공통 API를 정의하는 자바 표준 JMS가 나오기 전에는 메시지 브로커들이 각자 나름의 API를 갖고 있어서, 애플리케이션의 메시징 코드가 브로커 간에 호화되지 않았다. 메시지 브로커: 클라이언트 간에 메시지 통신을 중개하는 역할 JMS를 사용하면 이것을 준수하는 모든 궇녀 코드가 공통 인터페이스를 통해 함께 작동할 수 있다....

2024-09-15 · 8 min · 1516 words

8-네트워크의 전체 흐름 살펴보기

랜 카드에서의 데이터 전달과 처리 웹 브라우저에 URL을 입력하고 엔터키를 누르면 일어나는 과정 TCP 3-way 핸드셰이크가 일어난다. HTTP request 메시지를 만든다. 전송 계층으로 전달된다. TCP 헤더가 붙어서 출발지 포트 넘버, 목적지 포트 넘버 등이 추가된다. (세그먼트) 네트워크 계층으로 전달된다. IP 헤더가 붙어서 출발지 IP, 목적지 IP 주소 등이 추가된다. (IP 패킷) 데이터 링크 계층으로 전달된다. 이더넷 헤더와 트레일러가 붙어서 출발지 MAC, 목적지 MAC 주소 등이 추가된다.(이더넷 프레임) 물리 계층으로 넘어가서, 랜 카드가 전기 신호로 변환 시킨다....

2024-09-15 · 2 min · 252 words

8-고차 함수 파라미터와 반환 값으로 람다 사용

고차 함수 고차 함수: 다른 함수를 인자로 받거나 함수를 반환하는 함수 함수 타입 코틀린의 타입 추론으로 인해 변수 타입을 지정하지 않아도 람다를 변수에 대입할 수 있다. 반환 타입이 널이 될 수 있는 타입 var canReturnNull: (Int, Int) -> Int? = { x, y -> null } 함수 타입 전체가 널일 될 수 있는 타입 var funOrNull: ((Int, Int) -> Int)? = null 함수 타입에서 파라미터 이름을 지정할 수도 있다. 타입 검사 시 무시되고, 파라미터 이름이 꼭 함수 타입 선언의 파라미터 일므과 일치하지 않지만, 코드 가독성이 좋아지고 IDE 코드 자동 완성을 사용할 수 있다....

2024-09-15 · 5 min · 972 words

8-가상 메모리의 기초

가상 메모리의 개요 가상 메모리 시스템 가상 메모리(virtual memory): 크기가 다른 물리 메모리에서 일관되게 프로세스를 실행할 수 있는 기술. 가상 메모리 시스템의 모든 프로세스는 물리 메모리와 별개로 0번지부터 시작하는 연속된 메모리 공간을 가진다. 논리 주소 vs 가상 주소 논리 주소는 물리 메모리에 존재하는 위치의 주소를 프로세스 관점에서 지정하는 방식이다. 가상 주소는 물리 메모리 공간이 아닌 가상의 주소 공간을 가진다. 가상 메모리에서 메모리 관리자가 사용할 수 있는 메모리의 전체 크기는 물리 메모리와 스왑 영역을 합한 크기다....

2024-09-15 · 6 min · 1097 words

77486

날짜: 2022년 3월 11일 오후 11:20 코드 Algorithm/77486.py at main · Junroot/Algorithm 풀이 위상 정렬을 사용했다. 위상 정렬을 사용하기 위해서 멤버 이름으로 id를 찾거나 id로 이름을 찾아야되는 경우가 있어서, dictionary를 2개 사용했다. 위상 정렬로 수수료를 계산할 때 2가지 문제가 있었다. 현재 멤버의 수익의 10%를 그대로 부모 멤버에게 주면 오답이 된다. 자신의 자식 멤버에게서 받은 수수료를 각각 10%씩 구하고 일의자리 아래는 버림해야되기 때문에, 자식으로부터 받은 수수료를 바로 더하지 않고, 리스트로 관리해야됐다....

2024-09-15 · 1 min · 98 words

77485

날짜: 2022년 3월 23일 오후 10:09 코드 Algorithm/77485.py at main · Junroot/Algorithm 풀이 시뮬레이션 문제기 때문에 복잡한 알고리즘은 필요없다. 나는 움직여야되는 방향이 같은 숫자끼리 묶어서 한번에 움직이도록 처리했다. 다른 사람 풀이 다른 사람 풀이를 보니 stack을 활용했다. 시계방향으로 숫자들을 stack에 넣으면서 stack의 제일뒤보다 한 칸앞의 숫자로 행렬의 값을 변경하면 시계방향으로 한 칸씩 이동한 모습이 된다. 최소값은 stack 내부의 최소값만 생각하면 되므로 훨씬 깔끔했다.

2024-09-15 · 1 min · 63 words

7662

편집 시간: 2022년 2월 16일 오후 4:02 코드 Algorithm/7662.py at main · Junroot/Algorithm 풀이 실패한 풀이: Node 클래스 만들기 최대 힙과 최소 힙을 두 개 마련해두고, 삭제 될 때 해당 숫자가 삭제되었다고 표시만 하면되기 때문에, 힙의 각 노드들을 아래와 같이 클래스로 만들어 deleted 필드를 두려고했다. class Node: def __init__(self, data): self.data = data self.deleted = False 하지만 한 가지 문제가 있었다. heapq 라이브러리는 최대 힙을 만들 수 없다. 그래서 일반적인 힙 문제에서는 음수를 취하여 힙에 추가하는데 현재는 최소 힙과 최대 힙이 노드를 공유하고 있어야되기 때문에 불가능하다....

2024-09-15 · 1 min · 122 words

7579

편집 시간: 2022년 3월 31일 오후 9:53 코드 Algorithm/7579.py at main · Junroot/Algorithm 풀이 처음에는 아래와 같은 방식으로 dp로 풀려고 했다. 아래에서 f(i, m)의 정의는 0번째부터 i번째까지 앱으로 메모리 m을 비우기위한 최소 cost를 뜻한다. $$ f(i, m) = min(f(i-1,m-m_i)+c_i,f(i-1,m)) $$ 하지만, m의 범위가 10,000,000 까지기때문에 이 방법을 사용할 수 없다. 그래서 i와 cost를 사용해서 dp로 접근해봤다. $$ f(i,c)=max(f(i-1,c-c_i)+m_i,f(i-1,c)) $$ c의 범위는 0에서 10000까지라서 최대 100 * 10000번 계산으로 계산할 수 있다....

2024-09-15 · 1 min · 80 words

7576

편집 시간: 2022년 2월 9일 오후 6:43 코드 Algorithm/7576.py at main · Junroot/Algorithm 풀이 bfs를 이용해서 모든 토마토를 탐색하면 된다. 시간을 출력해야되기 때문에 큐에 시간 정보도 같이 저장했다. 다른 방법으로는 현재 큐에 담겨있는 값들을 같은 시간에 방문하는 토마토라고 해두고, 그 개수만큼만 루프를 돌면 주기가 한번 돌았다고 계산하면 된다. 모든 토마토가 익었는지 확인해기 위해서 마지막에 박스 전체를 확인해봐도 되고, 익지 않은 토마토의 개수를 카운팅해도 된다.

2024-09-15 · 1 min · 64 words

72416

날짜: 2022년 6월 21일 오전 11:00 코드 Algorithm/72416.py at main · Junroot/Algorithm 풀이 DP를 이용해서 문제를 풀었다. 점화식을 구하는 과정이 이 문제의 가장 어려운 부분이다. get_min_cost(leader_index): leader_index의 하위 직원들의 최소 비용 리더를 워크샵에 참여 시키는 경우: 해당 리더가 팀장으로 속해있는 팀의 팀원들을 기준으로 다시 계산. 리더가 속해있는 팀의 팀원이 워크 샵에 참여시키는 경우: 해당 팀원이 팀장으로 속해있는 팀은 계산할 필요가 없어진다. 이 점화식을 이용해 계산을 하고 메모이제이션을 적용하면 제한 시간내에 해결할 수 있다....

2024-09-15 · 1 min · 73 words

72415

날짜: 2022년 5월 30일 오후 3:02 코드 Algorithm/72415.py at main · Junroot/Algorithm 풀이 여러개의 소문제로 나눠서 해결했다. 카드 쌍을 지우는 순서를 모두 탐색해보는 백트래킹 A위치에서 B위치로 이동하는 최단 경로 구하기 1번은 재귀함수를 이용해서 구현하면되고, 2번은 bfs를 사용했다.

2024-09-15 · 1 min · 37 words

72414

날짜: 2022년 6월 1일 오후 9:38 오답: o 코드 Algorithm/72414.py at main · Junroot/Algorithm 풀이 틀린 풀이 시간이 최대 99시간 59분 59초로 360000초 까지 밖에 없다는 것을 인지했지만, 모든 로그를 360000크기의 배열에 값을 더해주는 것은 360000 * 300000 라는 시간복잡도가 발생할 것으로 보여 이 방법을 사용하지 않았다. 그래서 처음에는 로그들을 시작시간으로 정렬하여 시작 시간마다 누적 재생시간을 계산했는데 이 방법은 누적 재생시간을 매번 새로 계산해야돼서 시간 초과가 발생헀다. 맞는 풀이 결국 다른 사람 풀이를 봤는데, 처음에 언급한 방법을 활용하는 것이었다....

2024-09-15 · 1 min · 122 words

72413

날짜: 2022년 5월 26일 오후 7:39 코드 Algorithm/72413.py at main · Junroot/Algorithm 풀이 플로이드 워셜을 사용해서 각 지점 사이의 요금을 계산해두고, 무지와 어피치가 택시를 따로 타는 모든 경우를 비교해서 최소값을 찾으면 된다.

2024-09-15 · 1 min · 32 words

72412

날짜: 2022년 5월 26일 오후 7:37 코드 Algorithm/72412.py at main · Junroot/Algorithm 풀이 처음에는 db를 생각해서 점수를 기준으로 데이터를 한번 거르고, 그 중에서 값을 필터링했다. 하지만 이 방법은 시간 초과가 발생했다. 두 번째로 생각한 것은 개발언어, 직군, 경력, 소울푸드의 조합이 3_2_2*2 밖에 되지 않기 때문에 이를 이용해서 1차적으로 분류하고 점수별 필터링을 바이너리 서치로 구하는 방법을 사용했다. 이방법을 사용하면 각 속성별로 분류하는 과정을 꽤 줄일 수 있어서 시간초과가 발생하지 않았다.

2024-09-15 · 1 min · 69 words

72411

날짜: 2022년 5월 26일 오후 7:35 코드 Algorithm/72411.py at main · Junroot/Algorithm 풀이 course 에 주어진 길이들의 조합을 dictionary를 이용해 개수를 센다. 길이별로 나눠서 세면 쉽게 구할 수 있다.

2024-09-15 · 1 min · 29 words

72410

날짜: 2022년 5월 25일 오후 6:23 코드 Algorithm/72410.py at main · Junroot/Algorithm 풀이 단순 구현 문제다. 문제 조건에 맞게 구현해주면 된다.

2024-09-15 · 1 min · 21 words

7-응용 계층 애플리케이션에 데이터 전송하기

응용 계층의 역할 서비스를 요청하는 측을 클라이언트, 서비스를 제공하는 측을 서버라고 한다. 클라이언트에서 제공하는 애플리케이션과 서버에서 사용하는 서버 프로그램 간에 통신하기 위해 응용 계층의 프로토콜을 사용한다. 응용 계층의 주요 프로토콜에는 HTTP, FTP, DNS, SMTP, POP3 등이 있다. 웹 서버의 구조 (웹 사이트 접속) WWW는 W3나 웹이라고도 불린다. WWW는 HTML, URL, HTTP라는 세가지 기술이 사용된다. HTML은 하이퍼텍스트를 작성하는 마크업 언어로 태그를 사용하여 문장 구조나 이미지 파일을 표시한다. 하이퍼텍스트로는 문장이나 이미지를 표시하거나 하이퍼링크를 사용할 수 있다....

2024-09-15 · 2 min · 292 words

7-연산자 오버로딩과 기타 관례

관례(convention): 어떤 언어 기능과 미리 정해진 이름의 함수를 연결해주는 기법 예: 어떤 클래스 안에 plus라는 이름의 메소드를 정의하면 그 클래스의 인스턴스에 대해 + 연산자를 사용할 수 있다. 이유: 기존 자바 클래스를 코틀린 언어에 적용하기 위함 산술 연산자 오버로딩 이항 산술 연산 오버로딩 연산자를 오버로딩하는 함수 앞에는 꼭 operator 키워드가 있어야 한다. data class Point(val x: Int, val y: Int) { operator fun plus(other: Point): Point { return Point(x + other....

2024-09-15 · 8 min · 1660 words

7-손쉬운 기능명세 작성법 3강 하지만 어떻게

누가 명세를 작성합니까? 팀 내에 프로그래머가 n명 있다면, 상호 대화 경로는 결국 O(n^2)이 된다. 마이크로소프트 사에서는 마스터 프로그래머 개념을 사용했다. 마스터 프로그래머가 모든 코드를 작성하는 책임이 있으며, 부하 프로그래머로 이뤄진 팀은 단순히 ‘코드 조력자’로 이용한다. 모든 개발자가 서로 이야기할 필요가 없으며, 모든 부하 프로그래머는 상간인 프로그램 관리자 한 명과 이야기하면 되기 때문이다. 상호 대화 복잡성은 O(n)으로 줄어들 것이다. 하지만 누구도 단순한 코드 조력자로만 남기를 원하지 않았다. 프로그램 관리자를 어떻게 뽑을까요? 코드 개발자를 프로그램 관리자로 승급시키지 마세요....

2024-09-15 · 1 min · 154 words

7-비용 줄이기

최적화를 초기 단계에서부터 하는 것은 얻는 것보다 잃는 것이 많은 경우가 많다. 가독성과 성능 사이에서 트레이드 오프가 발생할 때, 개발하는 컴포넌트에서 무엇이 더 중요한지 스스로 답할 수 있어야 한다. 불필요한 객체 생성을 피하라 객체 생성은 언제나 비용이 들어간다. JVM에서는 하나의 가상 머신에서 동일한 문자열을 처리하는 코드가 여러개 있다면, 기존의 문자열을 재사용한다. Integer나 Long처럼 박스화한 기본 자료형도 작은 경우에는 재사용한다. (기본적으로 Int는 -128~127 범위를 캐시해 둔다.) 객체 생성 비용은 항상 클까?...

2024-09-15 · 5 min · 1043 words