공백으로 구분해서 입력 여러개 받기

n, m, k = map(int, input().split()) 위와 같이 구현할 수 있다. split()을 통해 공백 단위로 나누어 str의 리스트를 만들게 됩니다. 각 요소를 int형으로 변환하기 위해 map() 을 사용하게 되는데 map()의 리턴 타입은 map 이라는 클래스입니다. 참고 자료 https://www.programiz.com/python-programming/methods/built-in/map https://mjmjmj98.tistory.com/83

2024-09-15 · 1 min · 39 words

객체지향의 사실과 오해

협력하는 개체들의 공통체 협력하는 사람들 역할과 책임 역할: 커피를 주문하는 손님, 주문을 받는 캐시어, 커피를 제조하느 바리스타 책임 손님: 커피를 주문할 책임 캐시어: 손님의 주문을 받는 책임 바리스타: 주문된 커피를 제조하는 책임 협력: 커피 주문 요청과 응답 커피주문이라는 협력은 손님이 커피를 제공해 줄 것을 캐시어에게 요청하는 것이다. 캐시어는 주문된 커피를 제조해줄 것을 요청한다. 바리스타는 커피를 제조한후 제조가 완료됐음을 캐시어에게 알려주는 것으로 캐시어의 요청에 응답한다. 캐시어는 진동벨을 울려 손님에엑 주문된 커피가 준비됐음을 알림으로써 손님의 주문에 응답한다....

2024-09-15 · 18 min · 3801 words

개행 문자

운영체제마다 개행을 나타내는 특수 문자가 다르다. 리눅스, 유닉스, 맥은 , 윈도우는 \r 를 사용한다. 플랫폼에 독립적인 코드를 작성하고 싶다면 %n 을 사용하거나 System.lineSeparator() 메소드를 사용해야된다. 참고 자료 https://www.baeldung.com/java-string-newline

2024-09-15 · 1 min · 28 words

개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴

들어가기 지저분해지는 코드 단순한 if-else 블록의 복사 붙여넣기의 반복은 코드를 복잡하게 만들며, 개발자가 코드를 추가하거나 수정할 위치를 찾는데 점점 오랜 시간이 걸리게 된다. 심한 경우 코드를 추가하지 않고 눌가하는 경우도 발생한다. 수정하기 좋은 구조를 가진 코드 객체 지향 기법을 적용하면 소프트웨어를 더 쉽게 변경할 수 이쓴 유연함을 얻을 수 있게 되고 이는 곧 요구 사항의 변화를 더 빠르게 수용할 수 있다는 것을 뜻한다. 소프트웨어의 가치 새로운 요구 사항을 적용하기 어려우면 소프트웨어는 점점 뒤쳐지게 되는데, 이는 결곡 소프트웨어의 죽음으로 이어질 수 잇다....

2024-09-15 · 14 min · 2867 words

가능한 모든 순열 구하기

직접 구현하려고 하는데, 이미 파이썬에서 제공하고 있었다. import itertools inp_list = [4, 5, 6] permutations = list(itertools.permutations(inp_list)) print(permutations) [(4, 5, 6), (4, 6, 5), (5, 4, 6), (5, 6, 4), (6, 4, 5), (6, 5, 4)] 순열 길이의 기본값은 입력 값의 길이가 된다. 만약 길이를 직접 지정하려면 파라미터를 추가하면 된다. import itertools inp_list = [1, 2, 3] permutations = list(itertools.permutations(inp_list, r=2)) print(permutations) [(4, 5), (4, 6), (5, 4), (5, 6), (6, 4), (6, 5)] 참고 자료 https://www....

2024-09-15 · 1 min · 77 words

XML 빈 등록 vs 어노테이션 빈 등록

XML 장점: 애플리케이션을 구성하는 빈과 의존관계, 설정 등을 통제하고 관리하기 쉽다. 단점: XML 문서를 관리하기 때문에 개발 속도가 느려진다. 어노테이션 장점: 복잡한 XML 문서 생성과 관리가 필요없이 개발속도를 향상 시킬 수 있다. 단점: XML처럼 상세한 메타정보 항목을 지정할 수 없고, 클래스당 한 개 이상의 빈을 등록할 수 없다.

2024-09-15 · 1 min · 48 words

Workbench에서 ERD Diagram 만들기

기존에 존재하던 데이터베이스의 ERD Diagram 자동 생성하기 설명 Workbench의 Reverse Engineer 기능을 이용하면 된다. Database => Reverse Enginner 예시 만들어진 ERD Diagram을 최신화 하기 설명 Database => Synchronize model 예시 alter table `test`.`member` add column `phone_number` varchar(20); 참고 자료 https://medium.com/@tushar0618/how-to-create-er-diagram-of-a-database-in-mysql-workbench-209fbf63fd03 https://dba.stackexchange.com/questions/25900/mysql-workbench-how-to-refresh-eer-diagram

2024-09-15 · 1 min · 41 words

when vs whenever

배경 테스트 코드를 보니 원래 알고있던 when()함수가 아니라 whenever()함수를 사용하고 있었다. Kotlin에서 when을 사용하면 문제점 Kotiln에는 이미 when이라는 예약어가 있기 때문에 백틱을 사용해서 호출해야된다. val mockBookService = Mockito.mock(BookService::class.java) Mockito.`when`(mockBookService. inStock(100)).thenReturn(true) mockito-kotlin 라이브러리에서 이것이 번거롭기 때문에 whenever라는 함수를 제공해주고 있다. whenever(mockBookService.inStock(100)).thenReturn(true) 참고 자료 https://www.baeldung.com/kotlin/mockito

2024-09-15 · 1 min · 43 words

WebSocket을 사용하는 서버는 수평적 확장을 어떻게 할까

문제가 되는 이유 수평적 확장 관점에서 REST API와 WebSocket의 가장 큰 차이점은 아무래도 상태 관리다. REST API는 서버에서 상태를 저장하지 않기 때문에 스케일 아웃을 하는데 문제가 없다. 하지만 WebSocket의 경우에는 서버에서 세션을 저장하고 가지고 있어야한다. 따라서 클라이언트가 기존에 세션을 저장해둔 서버(BACKEND #1)가 아닌 다른 서버(BACKEND #2)로 메시지를 보낸다면 세션을 저장하고 있지 않기 때문에 처리하지 못할 것이다. 처리 방법 #1: Sticky Session Sticky Session이란 클라이언트가 첫 요청을 보낸 시점에 로드 밸런서에서 특정 서버를 하나 지정해서 처리하게 해주고, 이 클라이언트는 이후의 요청들을 전부 이전에 처리해준 서버에게 보내도록 하는 기법이다....

2024-09-15 · 1 min · 200 words

WebSocket 설정

http { map $http_upgrade $connection_upgrade { default upgrade; '' close; } upstream websocket { server 192.168.100.10:8010; } server { listen 8020; location / { proxy_pass http://websocket; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; } } } 참고 자료 https://www.nginx.com/blog/websocket-nginx/

2024-09-15 · 1 min · 43 words

WebRTC에서현재 전송받고 있는 트랙의 코덱 정보 받아오기

RTCPeerConnection.getStats() 메서드를 호출하면, 현재 커넥션의 통계 데이터와 트랙의 정보들을 받을 수 있다. 출력을 해보면 stream이나 codec, trasnport 등 다양항 type의 정보를 오는 것을 확인할 수 있다. 각 type의 의미들은 https://developer.mozilla.org/en-US/docs/Web/API/RTCStats/type에서 확인이 가능하다. {id: 'RTCMediaStreamTrack_receiver_1', timestamp: 1659319122459, type: 'track', trackIdentifier: '181e51a6-8bc6-4a88-8bc0-8d5019f6564c', remoteSource: true, …} {id: 'RTCMediaStreamTrack_receiver_2', timestamp: 1659319122459, type: 'track', trackIdentifier: '08aa011f-13c7-44e8-b8b8-3e2f1da4bad5', remoteSource: true, …} {id: 'RTCMediaStream_xANDdH976y0iJdwry5rJCIUjy5hVDVPInSSM', timestamp: 1659319122459, type: 'stream', streamIdentifier: 'xANDdH976y0iJdwry5rJCIUjy5hVDVPInSSM', trackIds: Array(2)} {id: 'RTCPeerConnection', timestamp: 1659319122459, type: 'peer-connection', dataChannelsOpened: 0, dataChannelsClosed: 0} {id: 'RTCRemoteOutboundRTPAudioStream_1158860338', timestamp: 1659319120593, type: 'remote-outbound-rtp', ssrc: 1158860338, kind: 'audio', …} {id: 'RTCTransport_0_1', timestamp: 1659319122459, type: 'transport', bytesSent: 60504, packetsSent: 1208, …} {id: 'RTCCodec_0_Inbound_0', timestamp: 1659319123459, type: 'codec', transportId: 'RTCTransport_0_1', payloadType: 0, …} {id: 'RTCCodec_0_Inbound_103', timestamp: 1659319123459, type: 'codec', transportId: 'RTCTransport_0_1', payloadType: 103, …} {id: 'RTCCodec_0_Inbound_105', timestamp: 1659319123459, type: 'codec', transportId: 'RTCTransport_0_1', payloadType: 105, …} 우리가 필요한 것은 전송받고 있는 비디오 코덱 정보이므로 아래와 같이 조건문을 작성할 수 있다....

2024-09-15 · 1 min · 198 words

WebRTC에서 통신에서 사용할 비디오 오디오 코덱

WebRTC를 이용해 코덱 별 성능 테스트를 위해서, 사용할 코덱의 종류를 바꿨어야했다. RTCRtpTransceiver를 통해 사용할 코덱을 수정할 수 있다. RTCRtpTransceiver RTCRtpSender와 RTCRtpReceiver 쌍을 관리하는 인터페이스다. 각각은 트랙을 인코딩하고 remote peer에 전송하는 것을 관리하는 역할, 트랙을 디코딩하고 remote peer를 전송 받는 것을 관리하는 역할이 있다. codecPreferences setCodecPreferences() 메서드를 호출하면 Transceiver의 코덱을 설정할 수 있게된다. codecPreferences는 선호하는 순서대로 코덱을 나열해서 입력할 수 있다. 참고 자료 https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpTransceiver

2024-09-15 · 1 min · 63 words

WebRTC 알아보기

목표 WebRTC가 무엇인지 이해한다. WebRTC의 전체적인 구조를 이해한다. WebRTC 통신을 하기 위한 전체적인 과정을 이해한다. WebRTC란? WebRTC는 P2P 통신을 지원해주는 웹 표준이다. 오픈소스이기 때문에 지속적으로 발전되고 있다. 대부분의 최신 브라우저에서 사용가능하다. 브라우저뿐만아니라 모바일 애플리케이션에서도 사용가능하다. WebRTC는 주로 음성, 영상 통화에서 사용되고 그 뿐만 아니라 다양한 데이터를 전달할 때 사용할 수 있다. 서버를 통해 데이터를 받아야되는 WebSocket과 달리, P2P 통신으로 이루어지기 때문에 서버 과부하 문제를 해결할 수 있고, 개인 정보 보호의 이점도 가지고 있다....

2024-09-15 · 2 min · 215 words

WebRTC API 시작하기

WebRTC를 사용하기 위해서 JavaScript로 제공하고 있는 API들을 알아본다. 크게 두 기지 기능으로 나눌 수 있다. P2P 연결: 두 피어 간의 연결 설정 및 제어. WebRTC에 해당하는 영역. 미디이 캡쳐 기기: 동영상 카메라, 마우스, 화면 캡처 등. WebRTC를 사용하기 위해 함께 자주 사용되는 WebAPI P2P 연결 기본적으로 RTCPeerConnection 인터페이스에서 처리한다. P2P 연결이 진행되기 위해서는 Signaling이라는 과정이 필요하다. Signaling WebRTC에서는 다양한 데이터를 전송할 수 있기 때문에, 전송할 데이터 형식을 피어 간에 공유해야된다. 이렇게 전송 할 데이터의 형식과 상대 피어의 위치를 알아내는 과정을 signaling이라고 부른다....

2024-09-15 · 3 min · 573 words

webpack에서 오류 발생시 화면 가리지 않도록 하기

배경 webpack에서는 기본적으로 오류가 발생하면 화면을 가려서 사용하지 못 하도록한다. 빠른 개발을 위해서 이를 비활성화 하기 위해서 아래와 같은 설정을 했지만 적용되지 않았다. vue.config.js module.exports = { devServer: { overlay: false, }, }; 문제 해결 webpack 버전이 올라가면서 사양이 바뀌었다. vue.config.js module.exports = { devServer: { client: { overlay: false, }, }, }; vue.config.js 파일은 vue-cli에서 프로젝트에서 webpack에 대한 설정을 추가할 수 있기 때문에 webpack.config.js를 사용하지 않아도 된다. 따라서, vue-cli보다 webpack 문서를 읽어보는 것이 더 정확하다....

2024-09-15 · 1 min · 81 words

WebMvcConfigurer

WebMvcConfigurer 를 구현하면, WebMvc의 설정을 할 수 있다. addViewControllers 를 통해 정적인 웹을 url에 매핑 시킬 수 있다. @Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("home"); } } addInterceptors 를 통해 오는 요청에 인터셉트를 할 수 있다. @Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LocaleChangeInterceptor()); registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**"); registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*"); } } addArgumentResolvers를 통해 커스텀 어노테이션을 인자로 매핑시킬 수 있다....

2024-09-15 · 1 min · 134 words

WebFlux 기초 이해하기

목표 리액티브 프로그래밍을 이해한다. Spring WebFlux 내부 동작 방식을 이해한다. 리액티브 프로그래밍 리액티브 프로그래밍 비동기 이벤트 처리와 데이터 스트림에 대한 아이디어를 기반으로 한다. 비동기 이벤트 처리는 다른 이벤트 처리를 차단하지 않는다는 것을 의미한다. 이벤트 큐와 병렬 이벤트 처리를 도입하여 성능과 확장성을 향상시킨다. 기본적으로 리액티브 프로그래밍은 3가지 구성요소를 가진 옵저버 패턴이다.(RxJava 기준) Observable: 데이터 스트림을 표현한다. 한 스레드에서 다른 스레드로 전달할 수 있는 데이터를 담는다. Observer: Observable이 방출하는 데이터 스트림을 소비한다. Observable이 데이터를 방출할 때마다 데이터를 통해 작업을 수행하거나 예외를 던진다....

2024-09-15 · 3 min · 509 words

WebClient로 URL parameter 보내기

목표 Spring 에서 제공하는 WebClient로 HTTP 요청을 보낼 때, URL parameter를 전송하는 방법을 알아본다. parameter 보내기 webClient.get() .uri(uriBuilder - > uriBuilder .path("/products/") .queryParam("name", "{name}") .build("asdf+asdf")) .retrieve() .bodyToMono(String.class) .onErrorResume(e -> Mono.empty()) .block(); 위와 같이 작성하면 /products?name=asdf%2asdf 로 요청이 보내지는 것을 확인할 수 있다. 주의점 아래와 같이 쿼리 파라미터를 넘기면 예상치 못한 방식으로 URL 인코딩이 될 수 있기 때문에 주의해야된다. 아래와 같이 요청을 보내면 ‘+’ 문자가 URL 인코딩 되지 않고 요청이 보내진다. /products%3Fname=asdf+asdf 반대로 ‘?...

2024-09-15 · 1 min · 168 words

WAS에서 IP 차단 체크할 때, 웹 서버 IP 확인하는 문제 해결

HTTP 요청을 보낸 사람의 IP를 확인해서 DB에 등록되어 있는 사용자만 허가되도록 구현했다. 하지만 WAS가 HTTP를 받았을 때 항상 IP가 웹 서버(NGINX)의 IP로 인식되는 문제가 있었다. 문제 해결 WAS는 중간에 있는 리버스 프록시의 IP를 인식하는 문제가 있었다. 보통 요청을 보낸 Client의 IP 를 확인하기 위해서 X-Forwarded-For 헤더를 사용한다고 한다. 이를 구현하기 위해서는 크게 2가지 작업이 필요했다. 리버스 프록시 서버인 NGINX 설정 변경 WAS에서 X-Forwarded-For 헤더를 확인하도록 수정 NGINX 설정 변경 nginx에서는 $proxy_add_x_forwarded_for 라는 변수를 제공한다....

2024-09-15 · 1 min · 163 words

vue-router에서 뒤로가기 구현 방법

목표 vue-router에서 뒤로가기 구현 방법을 이해한다. vue-router의 2가지 모드 hash mode url에 ‘#‘을 사용해서 URL이 변경되어도 페이지가 리로딩되지 않도록 하는 모드 history mode history.pushState를 사용해서 URL이 변경되어도 페이지가 리로딩되지 않도록 하는 모드 참고: https://developer.mozilla.org/en-US/docs/Web/API/History/pushState 서버 설정에 따라, 404 에러가 발생할 수 있으므로 웹 서버 설정을 확인해봐야된다. 뒤로가기 구현법 this.$router.push: 히스토리 스택에 새로운 경로로 이동할 수 있다. this.$router.go: 히스토리 스택을 이동할 수 있다. // go forward by one record, the same as router....

2024-09-15 · 1 min · 105 words