![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ0p4U%2FbtrG8Rnj5YG%2FTPUdeQP9vxoDcCLcbZWyxk%2Fimg.png)
아파치 카프카의 주요 구성 요소는 주키퍼라고 하는 상위에 있는것과 아래의 카프카 클러스터로 구성되어 있습니다. 카프카 클러스터 내에는 여러개의 브로커들로 구성되어 있습니다. 카프카 브로커는 토픽과 파티션을 유지 및 관리를 해주는 소프트웨어 카프라 브로커란? 카프카 서버라고 부르기도 함 토픽 내의 파티션들을 분산, 유지 및 관리 각각의 브로커들은 ID로 식별됨 (단, ID는 숫자) 토픽의 일부 파티션들을 포함 → 토픽 데이터의 일부분을 갖을 뿐 데이터 전체를 갖고 있지 않음 카프카 클러스터 : 여러개의 브로커들로 구성됨 클라이언트는 특정 브로커에 연결하면 전체 클러스터에 연결됨 최소 3대 이상의 브로커를 하나의 클러스로 구성해야함 → 이왕이면 안정성을 위해서 4대 이상을 권장함 파티션도 번호를 가지고 있고..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCu987%2FbtrG8zUKBTe%2FrdGYQLYLPV9rIvIVu7pak0%2Fimg.png)
Apache Kafaka의 주요 요소 - Topic, Partition, Segment 토픽은 파일이나 디렉토리처럼 눈에 보이는게 아닌 논리적인 표현 Producer: 메세지를 생산(Produce)해서 Kafka의 Topic으로 메세지를 보내는 애플리케이션 Consumer: Topic의 메세지를 가져와서 소비(Consume)하는 애플리케이션 Consumer Group: Topic의 메세지를 사용하기 위해 협력하는 Consumer들의 집합 하나의 Consumer는 하나의 Consumer Group에 포함되며, Consumer Group 내의 Consumer들은 협력하여 Topic의 메세지를 분산 병렬 처리함 프로듀서와 컨슈머 동작방식 프로듀서와 컨슈머 애플리케이션은 서로 알지 못한다. 그저 각각의 고유의 ..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwfNQx%2FbtrG8RfLZOT%2FY7p7BY13i5wbHvpqaAZrkk%2Fimg.png)
스프링 부트에서 컨피그 서비스 사용법 1 Spring에서 제공하는 Environment를 활용하는 방법이다.Legacy( Spring3.x) 에서 사용한 방법과 동일하다.사용법 2가 스프링 부트에서 권장하는 방법이다.@Slf4j@Servicepublic class TempService { @Autowired private ConfigurableEnvironment environment; public void test() { environment.getProperty("gateway.test"); }} 스프링 부트에서 컨피그 서비스 사용법 2 스프링부트에서 지원하는 @ConfigurationProperties를 활용하는 방법이다.스프링 부트에서 설정이 편리해진 이유 ..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVZK4P%2FbtrG4dp426X%2FOoDpkN8gexoElXno0qi4g0%2Fimg.png)
싱글턴 패턴이란 인스턴스를 하나만 만들어 사용하기 위한 패턴이다. 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등과 같은 경우 인스턴스를 여러 개 만들게 되면 불필요한 자원을 사용하게 되고, 프로그램이 예상치 못한 결과를 낳을 수 있다. 싱글턴 패턴은 오직 인스턴스를 하나만 만들고 그것을 계속해서 재사용한다. 싱글턴 패턴을 적용할 경우 의미상 두 개의 객체가 존재할 수 없다. 이를 구현하려면 객체 생성을 위한 new에 제약을 걸어야 하고, 만들어진 단일 객체를 반환할 수 있는 메서드가 필요하다. 따라서 필요한 요소들이 3가지가 필요하다. new를 실행할 수 없도록 생성자에 private 접근 제어자를 지정한다. 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다. 유일한 단일 객체를 참조할 정적 ..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frcx3E%2FbtrEYhhWBEi%2FJbyHP5b5ZkDQ5O0VJqV1Q1%2Fimg.png)
프록시(proxy)는 대리자, 대변인이라는 뜻을 가진 단어이다. 대리자/대변인이라고 하면 다른 누군가를 대신해 그 역할을 수행하는 존재를 말한다. 뉴스에는 항상 청와대 대변인, 백악관 대변인 등등 다양한 대변인이 등장한다. 디자인 패턴에서도 이렇게 대리자/대변인이 등장합니다. 우선 대리자를 사용하지 않고 직접 호출하는 코드를 보면 Service라는 클래스를 호출하는 ClientWithNoProxy라는 클래스는 대변인의 존재를 사용하지않은 즉, 프록시 패턴을 적용하지 않은 클래스이다. Service클래스에서 직접적으로 runSomething 메소드를 호출해서 서비스 호출!!! 이라는 결과를 보여준다. 그럼 프록시 패턴이 적용된 경우를 보면, 프록시 패턴의 경우 실제 서비스 객체가 가진 메서드와 같은 이름의..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnKjOo%2FbtrEnRkC5aM%2FRhz9PbDRgWg2ghnfpLX9Q1%2Fimg.png)
Lombok으로 스프링에서 DI(의존성 주입)의 방법 중에 생성자 주입을 임의의 코드없이 자동으로 설정해주는 어노테이션이다. @RequiredArgsConstructor는 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 줍니다. 새로운 필드를 추가할 때 다시 생성자를 만들어서 관리해야하는 번거로움을 없애준다. (@Autowired를 사용하지 않고 의존성 주입) 예시)@RequiredArgsConstructor 를 사용한 예시@RestController@RequiredArgsConstructor@RequestMapping("/example")public class RequiredArgsConstructorControllerExample { private fina..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS1b4N%2FbtrD18Tjw7h%2FIETUhz9ECj8IO1kbbbEtx0%2Fimg.png)
AdapterPattern 어댑터를 생각해보면 흔히 사용하는 휴대폰 충전기의 어댑터를 생각해 볼 수 있다. 어댑터는 220V라는 콘센트에 서로 다른 종류의 충전기가 휴대폰과 전원 콘센트 사이에서 둘을 연결해주는 변환기의 역할을 수행해 준다. 데이터 베이스에서 다양한 데이터베이스 시스템을 공통의 인터페이스인 ODBC 또는 JDBC를 이용해서 조작할 수 있는데, ODBC/JDBC 가 어댑터 패턴을 사용해서 다양한 데이터베이스 시스템을 단일한 인터페이스로 조작할 수 있게 해주기 때문이다. 어댑터 패턴이 적용되지 않은 코드 ClientWithNoAdapter 클래스에서 main() 메서드를 보면 sa1 참조 변수와 sb1 참조 변수를 통해 호출하는 각 메서드가 비슷한 일을 하지만 메서드명이 다르다.(sa1은 r..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQAm2L%2FbtrCNN4u2M4%2FSD13reomcanjwBnaAyEKGK%2Fimg.png)
이전에 임시 저장한 게 날아가서 그냥 처음부터 다시 작성을...당시 취준을 했던 때로 돌아가서 생각을 해보면 이력서에 지원하는 회사들에서는 나름에 기준이 있었습니다. 크게 나누어서 SW 회사들은 SI, SM, 솔루션, 서비스 회사들로 나누어져 있다고 생각합니다. 이 중에서 제가 회사를 선택하는 기준이었습니다. 서울에 있는 소프트웨어 회사인가안정적으로 월급을 지급할 수 있는 회사인가 (재무가 튼튼한 회사)성장을 하고 있는 회사인가 그리고 마지막으로기왕이면 자사 서비스를 가지고 있는 서비스 회사를 가고 싶다는 생각을 가지고 있었습니다.보통의 취준생들은 어느 정도의 불안과 초조함을 가지고 있다고는 생각하지만, 돌이켜 생각해보면 2020년 4월에 수료할 당시에는 코로나로 인하여 저의 급한 성격에 불을 질렀습니다..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZRRdT%2FbtrA54GFdwL%2Fbkcs83jmzJgbM7QrhQ0sJ1%2Fimg.jpg)
안녕하세요이번에 이직을 하게 되어서 제가 이제까지 개발자가 되기 위한 여정들을 한번 포스팅해볼까 합니다.다른 이직하는 포스팅들도 읽고 재미있기도 했고 다른 분들의 이야기를 통해서 그분들의 경험을 간접적으로나마 체험할 수 있는 블로그 게시글들을 많이 접했기에 저도 저의 이야기를 한번 해보려고 합니다.1. 23살 전역을 하다때는 바야흐로 2017년 전역을 하고 9월 7일 전역을 하자마자 2학년 2학기로 칼 복학을 하였습니다.복학을 하고 본과인 생명과학과에서 열심히 공부를 했지만 흥미를 찾지 못했었습니다.전역하고 나서는 공부에 모든 것을 올인하겠다며 열심히 했지만 흥미를 못 찾았기에 열심히 노력해도 성적이 그만큼 따라주지를 않았습니다...2. 컴공 복수 전공하다대학교 입학할 때 원래는 컴퓨터공학과를 가려고 했..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlgLWF%2FbtrzQWcYiri%2F8OhojZq6dBBJ5xADkXy79k%2Fimg.png)
엔진엑스(Nginx)는 Igor Sysoev라는 러시아 개발자가 동시접속 처리에 특화된 웹 서버 프로그램이다. Apache보다 동작이 단순하고, 전달자 역할만 하기 때문에 동시접속 처리에 특화되어 있습니다. 이런 엔진엑스는 정적 파일을 처리하는 HTTP 서버로서의 역할 을 할 수 있는데 Vue로 만들어진 프로젝트 파일 빌드해서 엔진엑스로 올려보는 작업을 해보겠습니다. 해당 작업은 윈도우로 하며 도커를 사용하기 때문에 도커 데스크탑을 설치해줘야 합니다. https://dreamcoding.tistory.com/72 [도커 docker] docker 설치 및 사용하기 안녕하세요 이번에는 도커 설치법 및 사용에 대한 포스팅을 해볼까 합니다. https://dreamcoding.tistory.com/61 버추얼..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwLnnB%2FbtrzGhVu0E3%2F02pTFrQdDqf4mHAz37Bltk%2Fimg.png)
MYSQL에서는 특정 문자를 기준으로 SPLIT해서 해당 값을 여러 열로 나누어야 할 일이 발생했을때 사용하는 방법을 작성해보겠습니다. 위와같이 THRESHOLD라는 컬럼이 파이프라인( | )으로 이루어져 있다고 했을때 해당 " | "를 기준으로 컬럼을 나누고 싶다고 가정했을때 SUBSTRING_INDEX(문자열, 구분자, 구분자의 index) SUBSTRING_INDEX함수를 통해서 해당 값을 나눌 수 있습니다. 문자열을 시작 or 끝부터 index번째 구분자까지 자르는 것입니다. index가 양수일 경우 문자열의 첫부분부터,index가 음수일 경우 문자열의 뒷부분부터 자르게됩니다. THRESHOLD의 문자열 값을 구분자 " | "에 따라 나누어 출력한다고 했을때 THRESHOLD 값 예) 1000|..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqljn0%2FbtryJX9Yces%2FqqUyMid6QRH7Y1thQMYKBk%2Fimg.png)
만약 엘라스틱 서치에서 RDBMS에서 처럼 GroupBy로 묶으려면 해당 필드를 subAggregation형태로 쿼리DSL을 만들어 주면 된다. SQL SELECT * FROM example WHERE wantField = 3 GROUP BY field1, field2, field3 Query DSL GET example*/_search? { "size": 0, "query": { "bool": { "filter": [ { "term": { "wantField": { "value": 3, "boost": 1 } } } ], "adjust_pure_negative": true, "boost": 1 } }, "aggs": { "agg1": { "terms": { "field": "field1" }, "agg..