분류 전체보기 (33) 썸네일형 리스트형 [Microservice 전환기] 1. 기존 모놀리식 아키텍처 전체 구조와 전환 배경 현재 구조Nest js로 작성된 API 서버에 1개에 게시물 CRUD 기능과, 유저 정보, 인증, 관심 목록, 리뷰, 알림 모든 기능이 모조리 들어가있었다. 전환 배경이 정도의 프로젝트 규모까지는 모놀리식 구조로 운영하여도 별 문제가 없었다. 오히려 개발, 디버깅하기에 너무 편했다. 하지만 마지막에 추가된 관심 목록, 리뷰 기능을 개발할 때 모듈 간 종속성이 커서 애를 먹기도 하였고 1개의 서비스에 장애가 발생할 경우 전체 서비스로 장애가 번지다보니 제품 운영에 쉽지 않겠다고 생각이 들었다. 그 외에도 많은 장점이 있지만 서비스 간 독립성이 굉장히 크게 느껴졌기 때문에 전환하기로 결정했다. 설계한 Microservice 구조마이크로서비스를 구현해보기 전에 Microservice 강의를 수강하고 설계해본 .. Docker Compose와 Networking (feat. DNS) 컨테이너 간 HTTP 송/수신을 수행할 때 IP와 Port를 어떻게 지정해야되니?Docker Compose를 사용하면 컨테이너 간 통신을 하기 위해서 서비스 명을 도메인 이름으로 지정하여 네트워킹이 가능하다. 각 서비스를 기본적으로 브리지 네트워크에 연결하여, 네트워크 내에서 서비스 이름을 DNS를 통해 도메인 이름처럼 사용하여 통신할 수 있게한다. 여기서 의문점인 것은 브리지 네트워크는 무엇이며 컨테이너 간 도메인 이름을 어떻게 아는 것이지?? 브리지 네트워크란?브리지 네트워크는 기본적으로 하나의 물리적 네트워크 인터페이스를 여러 가상 네트워크 인터페이스로 분리하여, 각 컨테이너가 자신만의 네트워크 공간에서 동작하도록 합니다.독립적인 네트워크 공간브리지 네트워크는 컨테이너를 외부 네트워크로부터 격리각 .. 기록하는 것이란 시간도 없는데 언제 기록해어디에? 그리고 어떻게 뭐를 얼마나? 어우 귀찮아😒빨리 할 거 하자 온라인을 둘러보면 자신을 기록하는 사람들이 있다. 기록하는 사람들은 대부분 여러 근거를 대면서 기록하는 것을 권장한다. 그래서 직장을 다닐 무렵 나도 해야되나? 라는 생각이 들었었다. 하지만 자기계발, 커리어, 약속 등에 쓰이는 시간들은 항상 나를 앞으로 나아가게 한다고 생각하였지만 기록하는 시간은 지나온 길을 돌아보는 일이라고 생각했기 때문에 나를 성장시키지 않는다고 생각했다. 또한 나의 개인적인 생각을 논리정연하게 정리하고 글을 쓰는 일이 적다 생각보다 힘이 많이 쓰여서 더욱 그랬다. 그래서 기록과 나는 서서히 멀어졌고 시간이 흐르면서 직장인 4년차, 29살이 되었다. 내가 어떤 길로 가고 있었지? 직장인.. [CERT C/표현식] (5) NULL 체크의 중요성 의미 NULL은 포인터 변수가 잘못된 주소를 가리키지 않도록 위험성이 없는 0 번지 주소를 가지고 있어서 초기화를 하는 데 많이 쓰이곤 한다. 문자열과 포인터를 배워오면서 NULL의 개념에 대해서는 헷갈릴 수 밖에 없다. NULL 문자 ( \0 ), NULL pointer ( NULL ), NULL string ( "" )의 차이점에 대해서도 알아보자. 표기 설명 NULL 문자 "\0" 문자열의 끝을 의미하는 문자로 아스키 코드 값 '0'이다. NULL pointer NULL 0 번지를 의미하며 대부분 플랫폼에서 Read-Only 영역이나 예약 영역으로 보호받는 주소이다. 그러므로 잘못된 주소를 가리키지 않도록 위험성이 없는 0번지 주소를 가르키도록 초기화를 하는 것이다. NULL string "" 아무.. [CERT C/표현식] (4) 함수 반환 값의 중요성 의미 여러 API와 라이브러리에서 제공해주는 함수의 반환 값은 함수가 작업을 성공 또는 실패했는지를 판단할 수 있는 지표이다. 많은 사람들이 라이브러리를 사용할 때 사용하는 많은 함수들에 리턴값이 있고 그 리턴값들이 의미하는 값들을 처리해주는 것이 프로그램을 작성할 때 매우 중요하다. 동작 방식 man 명령어 (UNIX/LINNUX의 경우) 구글링, document를 통해 함수의 반환값을 확인하고 여러 상황에서 일어날 수 있는 반환값에 대한 처리를 해주어야한다. 문제 코드 1. 함수의 리턴 값을 반드시 확인하자 출력을 예상해보기 #include void myflush(); int main() { int age; printf("Input age : "); scanf("%d", &age); myflush().. [CERT C/표현식] (3) 포인터 연산 수행의 중요성 의미 포인터 연산은 주소에 대해서 연산을 하는 것을 의미하는데, 포인터에 더해지는 값은 자동적으로 포인터가 가리키는 데이터형으로 조정된다. 동작 방식 포인터 연산의 특징 (1) 주소상수 + 정수형 상수(n) -> 주소 상수 + (n * 주소상수에 해당하는 기억공간의 크기) (2) 주소상수 - 주소상수 -> 주소에 해당하는 기억공간 간의 첨자차이가 된다. 문제 코드 1. 단축 평가 방식을 신경써서 AND, OR 연산자를 사용하자. 출력을 예상해보기 #include #include #include #define BUFFER_SIZE 5 int getNumber(int *); int main() { int p; int buffer[BUFFER_SIZE]; int *bufptr = buffer; while(bu.. [CERT C/표현식] (2) 단축 평가 방식의 중요성 의미 단축 평가(short-circuit evaluation) 방식은 AND와 OR 논리 연산자에서 자주 사용되는 방식으로 첫 번째 피연산자로 평가가 완료되면 두 번째 피연산자는 평가하지 않고 끝내는 평가 방식이다. 동작 방식 연산자 좌측 피연산자 우측 피연산자 AND 거짓인 경우 평가 안함 OR 참인 경우 평가 안함 ※ 첫 번째 피연산자 평가가 완료가 되어서 뒤에 있는 피연산자가 실행되지 않으면서 원하지 않는 동작이 발생할 수 있다. 문제 코드 1. 단축 평가 방식을 신경써서 AND, OR 연산자를 사용하자. 출력을 예상해보기 #include #include #include #define BUF_SIZE 25 int getString(const char *, char **); int main() { i.. [CERT C/표현식] (1) 연산자 우선순위의 중요성 의미 연산자 우선순위란, C 언어에서 사용되는 수 많은 연산자들의 연산 순서를 의미한다. 보통 +, -보다 *, / 가 우선이고 비트 연산자 우선순위 정도까지 생각을 하는 분이 많을 것이라고 생각하는데 우리가 코드에서 보는 모든 기호에 우선순위가 부여되어있고 그 우선순위를 이해하다보면 포인터, 배열 등의 개념의 이해에 큰 도움이 될 것이다. 동작 방식 순위 명칭 연산자 결합방향 1 1차 연산자 () [] . -> -> 2 단항 연산자 + - ! ~ (type) sizeof ++ -- & * 4 가법 연산자 + - 5 Shift 연산자 > 6 관계 연산자 = 7 등가 연산자 == != 8 bit 곱 연산자 & 9 bit 차 연산자 ^ 10 bit 합 연산자 | 11 논리곱 연산자 && 12 논리합 .. 이전 1 2 3 4 5 다음 목록 더보기