본문 바로가기

전체 글

(178)
[Spring] 서버 간 통신하기: WebClient WebClient 일반적으로 실제 운영환경에 적용되는 애플리케이션은 정식 버전으로 출시된 스프링 부트의 버전보다 낮은 경우가 많기 때문에 RestTemplate을 많이 사용하고있다. 하지만 최신 버전에서는 RestTemplate이 지원 중단되어 WebClient를 사용할 것을 권고하고 있다. Spring WebFlux는 HTTP 요청을 수행하는 클라이언트로 WebClient를 제공한다. WebClient는 리액터(Reactor) 기반으로 동작하는 API이다. 리액터 기반이므로 스레드와 동시성 문제를 벗어나 비동기 형식으로 사용할 수 있다. WebClient 특징 논블로킹(Non-Blocking) I/O를 지원 리액티브 스트림(Reactive Streams)의 백 프레셔(Back Pressure)를 지원 ..
[Spring] 서버 간 통신하기: RestTemplate 스프링에서 다른 서버로 웹 요청 보내기: RestTemplate과 WebClient 최근에 개발되는 서비스들은 마이크로서비스 아키텍처(MSA) 를 주로 채택하고 있습니다. MSA는 말 그대로 애플리케이션이 가지고 있는 기능(서비스)이 하나의 비즈니스 범위만 가지는 형태입니다. 각 애플리케이션은 자신이 가진 기능을 API로 외부에 노출하고, 다른 서버가 그러한 API를 호출해서 사용할 수 있게 구성되므로 각 서버가 다른 서버의 클라이언트가 되는 경우도 많습니다. 스프링에서는 다른 서버로 웹 요청을 보내고 응답을 받을 수 있게 도와주는 RestTemplate 와 WebClient가 있습니다. 이 글에선 RestTemplate에 대해 살펴보겠습니다. RestTemplate RestTemplate은 스프링에서 ..
[CS] 시간 복잡도란 시간 복잡도(Time Complexity)란 시간 복잡도(Time Complexity)란 알고리즘을 실행하는데 걸리는 시간을 입력 길이의 함수로 정의한 것입니다. 알고리즘의 각 문장을 실행하는데 걸리는 시간을 측정하는 것이 아니라 알고리즘에서 연산의 수가 증가하거나 감소할 때 실행 시간의 변화(증가 또는 감소)에 대한 정보를 제공하는 것입니다. Big O 표기법으로 시간복잡도 계산하기 시간 복잡도는 입력 길이의 함수로 나타나는 시간입니다. 여기에는 입력 데이터 크기(n)와 시간에 대한 연산 수(N) 사이에 관계가 존재합니다. 이 관계는 시간 복잡도의 성장 속도(Order of growth)로 표기되며, O(n) 형태와 같은 표기법을 사용합니다. 여기서 O는 성장 속도를 나타내고 n은 입력 길이입니다. B..
[DataStructure] Map과 Hash Table Map key-value pair들을 저장하는 ADT(Abstract Data Type)이다. key는 중복되지 않고 value는 중복될 수 있다. associative array, dictionary라고 불리기도 한다. Hash Table Hash Table(해시 테이블)은 Hash function(해시 함수)과 Array을 활용한 Map 자료 구조이며, 모든 데이터에 상수 시간 접근이 가능하다. 해시 함수의 역할은 데이터를 고정된 크기의 데이터로 변환하는 것으로, 해시 테이블에서는 데이터를 정수 값으로 변환하는 함수다. 해시 함수를 통해 값이 할당된 인덱스에 데이터를 저장하며, 배열의 크기로 모듈러 연산을 통해 인덱스 위치 지정한다. Hash Collision Hash Collision(해시 충돌)은..
[Study] 오픽노잼으로 OPIC을 공부해보자 (7가지 규칙, 4가지 카테고리, RP, 실전 팁, 서베이 토픽 고르기 등) *이 글은 유튜브 오픽노잼의 영상을 훑어보고 이것만 알면 되겠다 싶은 내용들을 요약한 글입니다.OPIC의 7가지 규칙1. 질문하지 말기. 질문할 거면 대답이 필요 없는 질문을 해라 질문을 인정하는 대답이 더 좋다. 예를 들어, 저의 집이 알고싶어요? 보단 우리 집에 대해 알고 싶은 거군요 ㅇㅋㅇㅋ 2. 불편하고 어려운 단어 쓰지말고 자기한테 편하고 자신감 있는 단어 쓰기 예를 들어, 4-storey house 보단 My home is really small This place → it's a very small place 3. 한 문장에서 같은 단어 반복하지 말기 This place is a very small place → My place is very small 비유법 쓰면 좋음, like ~~ 4...
[DataStructure] Array, List와 Array List, Linked List 배열(Array) 메모리의 연속된 공간에 값이 채워져 있는 형태의 자료구조 이다. 배열의 값은 인덱스를 통해 참조할 수 있으며, 선언한 자료형의 값만 저장할 수 있다. 배열은 동적으로 값을 삽입하거나 삭제하려면 본래의 값들을 이동시켜야 하는 과정이 필요해서 시간이 소요된다. 리스트(List) 리스트는 값과 포인터를 묶은 로드라는 것을 포인터로 연결한 자료구조이다. 리스트는 인덱스가 없으므로, 값에 접근하기 위해 Head 포인터에서 순서대로 접근해야 한다. 접근 시간은 느리지만, 데이터 삽입과 삭제 연산 속도는 빠르다. ADT(Abstract Data Type)에서 List는 순서가 있고 중복을 허용하는, 값들을 저장하는 추상 자료형으로 사용된다. Set이나 Map을 사용하는게 더 적절한 상황이 아니라면 ..
[DataStructure] Array, Dynamic Array, Associative Array Array(배열) 배열은 같은 타입의 데이터를 연속된 메모리 공간에 저장하는 자료 구조이다. 각 데이터는 인덱스로 접근 가능하며, 인덱스는 배열에서 오프셋 개념으로 이해된다. 인덱스는 0부터 시작하여 각 원소에 대한 위치를 가리킨다. 데이터는 연속된 메모리 공간에 할당되며, 인덱스는 해당 위치를 가리킨다. 이러한 동작 원리로 배열은 같은 타입의 데이터를 메모리에 연속적으로 저장한다. 2차원 배열은 메모리상 1차원으로 표현되며, 각 행은 메모리 주소로 구성됨. 연속적인 메모리 공간으로 데이터를 저장하면 CPU 캐시를 통해 데이터 접근 시간을 단축할 수 있음. 객체를 배열에 저장하는 경우 객체 배열은 각 객체의 레퍼런스를 연속적인 메모리 공간에 저장하고, 실제 객체들은 메모리에 띄엄띄엄 저장됨. Dynami..
[Spring] 스프링 액추에이터(Actuator) 스프링 부트 액추에이터 스프링 부트 액추에이터는 HTTP 엔드포인트나 JMX(Java Management Extensions)를 활용해 애플리케이션을 모니터링하고 관리할 수 있는 기능을 제공한다. JMX(Java Management Extensions)는 실행 중인 애플리케이션의 상태를 모니터링하고 설정을 변경할 수 있게 해주는 API 액추에이터를 사용하려면 다음과 같이 spring-boot-starter-actuator의존성을 추가해야 한다. Maven org.springframework.boot spring-boot-starter-actuator Gradle dependencies { implementation 'org.springframework.boot:spring-boot-starter-actu..