묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
HTTP API에서의 파일 전송에 대해 궁금한 것이 있습니다.
JSON 요청-응답을 통한 조작을 하는 서버를 개발하고 싶은데, 회원 프로필같이 사진파일을 전송해야 하는 경우가 생기는데 이러한 부분을 어떻게 처리하는 것이 좋을지 모르겠습니다. 예를 들어 저는 Vue와 같은 프레임워크에 axios로 ajax 요청을 보내서 multipart/form-data 형식으로 파일을 보내고 싶은데 이렇게 보낸 요청에 대한 결과를 JSON으로 받아도 괜찮고, 가능한건가요?? 또 반대로 프로필 사진을 받는 요청을 한다고 가정했을때, 일반적으로 JSON으로 통신하는 API서버로 구축을 했을 때 파일은 어떤 방식으로 내려받아야 되는건지 궁금합니다. 파일을 받는 메커니즘이 따로 있는건가요?? 가장 헷갈리는 부분은 HTTP API로 구현했을때의 파일전송 관련한 부분입니다.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
안녕하세요. 강의를 듣던 중에 궁금한 내용이 있어 질문 남깁니다.
해당 강의에서는 HTTP 표준에 대해 설명하시면서, 과거 1999년에 발표된 RFC2616을 사용했다가 해당 표준이 폐기가 되면서 지금은 RFC7230~7235을 사용한다고 말씀해주셨는데요. 이처럼 개발하는데에 있어서 HTTP 등과 같은 프로토콜이나 기타 기술들에 대한 크고 작은 변화가 생겼을 때, 어떻게해야 빠르게 그런 정보들을 수집할 수 있을까요? 김영한 강사님의 팁이나 노하우가 있다면 한번 소개해주실 수 있나요..?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
템플릿 문법적인 질문입니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 위와 같은 내용에서 typename 이 TypeAt 앞에 선언된 이유가 무엇인지 알 수 있을까요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
무상태성에 대해 질문드립니다.
안녕하세요 영한님 강의 잘 듣고있습니다 ! 다름이 아니라 '무상태'에 대해 헷갈리는 부분이 있는데요, 결국 상태를 저장할지 말지 결정하는 주체는 서버라고 이해가 되는데 그럼 HTTP를 사용해서 통신을 하는 경우, 서버측에서는 '아 이건 HTTP 규약을 따르는거니까 아무것도 저장하지 않아야지' 라고 판단하는건가요 ? 즉, '무상태 프토토콜'이라는게 상태를 저장하지 않는 것을 '지향하는' 규약이기 때문에 이미 약속이 되어있어서 서버측에서도 저장을 하지 않는건가요 ? 그리고, 만약 세션을 사용해서 서버측에 클라이언트 상태를 저장하거나 하는 경우 HTTP의 stateless한 특성이 사라지게 되는건가요 ??
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
연산자 오버로딩 하는 부분에서 이해가 가지 않는 코드가 있습니다.
operator T* () const { return _ptr; } 연산자 오버로딩 부분 중에 이 부분이 있는데, 다른 것은 앞에 반환 타입이 정해져있는데 이전 C++의 연산자 오버로딩 강의 때는 못본 것 같은데, 이렇게 반환 타입을 따로 정해두지 않는 문법이 있는건가요? 아, 추가로 질문이 있습니다. TSharedPtr에서 Set, Release를 inline 함수로 선언하는 이유가 T가 RefCountable라고 명시를 해두지 않았기 때문에 RefCountable의 멤버함수를 함수 안에서 사용할 수 없어서 인라인 함수로 선언한다고 이해하면 될까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
함수 포인터 질문드립니다!
1) using FuncType = Ret(*)(Args...);일 때, 매개변수로 FuncType func를 주는 것과 Ret(*func)(Args...)를 주는 것은 완전히 동일하다고 봐도 되나요? 찾아본다고 찾아봤는데 익명 함수 포인터라는 단어는 없고, 기본적으로 함수이름을 붙여서 사용하는 것만 설명이 되있어서 백퍼센트 확신을 하기가 힘드네요 2) using FuncType = Ret(*)(Args...) 와 using FuncType = std::function<Ret(Args...)>가 의미상으로는 완전히 동일하다고 봐도 되나요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
캐시 삭제 관련 질문입니다.
만료시간이 지난 후에도 캐시를 제가 직접 삭제하지 않는 이상 삭제 안되나요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
복습중에 질문이 생겨 글을 쓰게 되었습니다.
HTTP는 비연결지향 프로토콜이고 TCP는 연결지향 프로토콜이며 IP는 비연결지향 프로토콜인데...그럼 어떻게 동작이 되는 것인지 궁금증이 생겨 질문을 남기게 되었습니다. (네트워크 전송방식에 대한 이해가 얕아 위와같은 궁금증이 생긴것 같습니다. 혹시, 네트워크 전송방식 혹은 웹 애플리케이션의 작동 흐름에 대해 디테일하게 알 수 있는 도서를 추천해주시면 정말 감사하겠습니다!!) 항상 좋은 강의 감사합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Iocp 함수 관련 질문 드립니다!
WSAGetOverlappedResult 함수의 4번째 매개변수인 fWaitAll 불리언값의 경우 기본적으로 false를 사용하지만, 하나만 깨우거나 전부 깨우거나 개별 설정을 할 수 있는데요. 복습하다 보니까 GetQueuedCompletionStatus의 경우 iocp핸들, recvLen포인터 같은것, 컴플리션키 포인터, overlapped포인터, 시간 을 매개변수로 받는데 여기는 fWaitAll을 설정하는 부분이 없더라구요. 궁금한 점은 GetQueuedCompletionStatus는 내부적으로 fWaitAll을 false로 가지고 처리되는 함수인가요? 검색해서 찾아보니 GetQueuedCompletionStatus 역시 IO Completion Queue에 처리결과가 삽입되는 순간 깨어나는 시스템이고 이게 Alertable Wait와는 조금 다른 매커니즘이라는 것 까지는 알겠는데 자세하게는 잘 모르겠어서 디폴트로 false인 fWaitAll 플래그를 가지고 처리되는건지 아닌지를 잘 모르겠습니다..ㅠ
-
해결됨모든 개발자를 위한 HTTP 웹 기본 지식
DNS 관련 질문입니다.
nslookup 같은 툴을 이용해서 google.com을 조회하면 172.217.175.78 IP를 확인할 수 있는데요. 이 주소를 443 포트와 결합하여 브라우저에서 접근하면 에러 메시지가 나타나서 80번 포트와 결합하여 접근해야 하는데 이동하는 페이지는 HTTPS로 보호가 되어있는 것으로 확인됩니다. 이 경우에는 HTTPS 연결을 하되 포트만 80번 포트를 사용하는 것인지 아니면 80번 포트로 접근하면 리다이렉트를 통해 다른 IP주소의 443 포트로 연결해주는 것인지 궁금합니다~ 그리고 리다이렉트 시나리오가 맞다면 이런식으로 리다이렉트를 시켰을 때 이점이 무엇인지도 궁금합니다~
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
내용이 생각보다 되게 어렵네요. 학습 방법에 대한 질문을 드립니다
처음에 해당 강의를 전부 이해하고 넘어가는 것이 좋을까요 아니면 아 이런게 있나보다 하고 일단 끝까지 간 다음에 큰 틀을 대강 이해하고 여러 번 반복해서 숙달하는게 나을까요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
검색 엔진에서 변경 인지 관련
안녕하세요 김영한 팀장님! 검색 엔진 등에서 변경을 인지한다는 의미가 와닿지 않아서 문의드립니다. 예시처럼 영구 변경된 URL이 있을 경우 사용자가 이전 URL로 요청하게 되면, 최초 1회 영구 리다이렉션으로 새로운 Location 응답 -> 브라우저에서 자동으로 리다이렉트해서 변경된 URL로 요청을 진행한다고 이해했습니다. 1) 이후에도 사용자는 URL 변경됨을 인지하지 못하므로 (자동 리다이렉트로 인해) 기존 URL로 계속 요청을 하게 될 텐데 이를 브라우저에서 새로운 경로를 쿠키등의 형태로 가지고 있어, 서버의 리다이렉션 없이 새로운 경로로 Request를 보낸다는 의미인가요? 2) 1)이 맞다면, 정확히는 '검색 엔진'이 아닌, 브라우저에서 변경을 인지하는게 아닐까요? 검색 엔진은 네이버 / 구글같은 검색 웹사이트를 의미하는 것으로만 알고 있는데, 웹사이트 자체가 이러한 기능을 가진다는 것과, 강의 내용과 연관성에 대해 조금 의문이 들어서 문의드렸습니다. 얕은 지식을 가지고 있어 너무 기본적인 질문을 드리는 거 같네요 ㅠㅠ 양해 부탁 드립니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
소켓에 바로 메세지를 보내는게 아니라 버퍼를 만들어서 넣어주고 주고받는 이유가 있나요?
수신과 송신 버퍼를 둘 다 가지고 있고 거기에 일단 메시지를 넣어서 보내거나 버퍼를 통해서 받고 있는데 버퍼를 사용하는 이유가 소켓이 바로 메세지를 받지 못하고 대기하는 경우나 병목이 있을 경우를 대비해서 그런건가요?
-
미해결풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, 배포까지) [풀스택 Part3]
nginx 버전 문제에 관해 질문드립니다.
안녕하세요 도커강의 듣고 있는 학생입니다. 현재 웹서버 이해와 도커로 웹서버 구축하기의 nginx 웹서버 설정 이해 1 을 듣고있는데요, 3분 38초쯤 나오는 nginx 설치하는 부분에 있어서 질문이 있습니다. apt-get install nginx=1.18.0-0ubuntu1 명령어로 nginx를 install 하는데, 다음과 같은 에러가 나옵니다. E: Version '1.18.0-0ubuntu1' for 'nginx' was not found 다음과 같은 에러가 나옵니다. 위 버전 말고 다른 버전을 설치해야할까요? 추가: 방금 명령어를 버전 빼고 입력했는데, 해당 버전의 nginx가 설치되었습니다. apt-get install nginx로 1.18.0 버전 설치된걸 확인했는데, 뒤에 버전명 입력하면 위 에러가 뜨는 이유가 궁금합니다.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
헤더의 변화?에 대한 질문
안녕하세요 선생님 강의 항상 잘 듣고 있습니다! 헤더가 결과적으로 어떻게 변경된건지 모호한 부분이 있어서 질문드립니다. 강의안에 따르면, 1. 예전 헤더 정의 2. 폐기? 3. 새 헤더 정의 이전 4가지 분류가 아예 사라진 건가요 도메인만 표현으로 바뀐건가요? 즉 현재 헤더는 1. general 2. request 3. reponse 4. representation 인건가요 아님 representation 하나인건가요? 아니면 헤더==표현헤더이고 표현헤더 = 표현 메타데이터+페이로드 메타데이터 인건가요? 궁금해서 헤더를 살펴보니 다음과 같았습니다. 오히려 representation만 없더라구요 ㅠㅠ query string parameters가 전달하려는 데이터, 즉 representation인건가요?
-
해결됨모든 개발자를 위한 HTTP 웹 기본 지식
stateless, stateful의 장단점이 납득이 안됩니다..
안녕하세요 선생님! 이해가 안되는 부분이 있어서 질문 남깁니다! stateless의 장점을 언급하실 때, "상태를 유지하지 않으면 서버가 바뀌어도 된다. 그렇기 때문에 서버가 확장될 수 있다." 라고 이해했습니다. 반대로 stateful의 단점을 언급하실 때, "상태를 유지하면 서버가 바뀌면 안된다. 그렇기 때문에 서버가 확장될 수 없다"라고 하셨는데 이 부분이 이해가 안됩니다. 1. 서버가 바뀌면 안되는 것과 서버가 확장될 수 없는 것이 무슨 상관인지 모르겠습니다..ㅠㅠ 기존 요청은 기존 서버와 연결을 유지하고, 새로 추가된 요청들은 새로운 서버와 연결해주는 방식으로 서버를 확장할 순 없나요?? 2. 대부분 서비스는 세션 등으로 로그인 유지를 하고 있지 않나요? 그럼 대부분 서비스는 서버가 확장될 수 없나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라이언트에서 보낸 데이터가 다 도착하지 않았을 때...? 처리하는 부분이 있는건가요?
클라이언트에서 보낸 데이터가 다 도착하지 않았을 때 다음 데이터가 올 때까지 기다린 후 처리한다고 말씀하셨는데, 이 부분이 코드 어디에 구현되어있는건가요...? 위에 있는 코드를 나름대로 해석해보니 1. OnWrite()는 _recvArgs.Buffer에 들어있는 데이터만큼 _recvBuffer의 _writePos를 증가시킨다. 2. OnRecv()한 데이터(_recvArgs.Buffer에 들어있는 데이터)의 크기를 processLen에 담는다. 3. processLen의 크기만큼 _readPos를 증가시킨다. 라고 이해했는데, 클라이언트에서 보낸 데이터가 완전한지 불완전한지 딱히 판단하는 부분은 없어보이고 그냥, [1.데이터가 들어온만큼 _writePos를 증가시킨다 2. 처리한다 3. 처리한만큼 _readPos를 증가시킨다]를 실행시킨거같아서요!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
에러가 발생합니다..
dummyClient측에서 sendAsync를 하려고 할 때.. 에러가 발생합니다. 에러 내용 Unhandled exception. System.ObjectDisposedException: Cannot access a disposed object. Object name: 'System.Net.Sockets.Socket'. at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken) at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e) at ServerCore.Session.RegisterSend() in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/ServerCore/Session.cs:line 71 at ServerCore.Session.Send(ArraySegment`1 sendBuff) in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/ServerCore/Session.cs:line 57 at DummyClient.GameSession.OnConnected(EndPoint endPoint) in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/DummyClient/Program.cs:line 20 at ServerCore.Connector.OnConnectCompleted(Object sender, SocketAsyncEventArgs args) in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/ServerCore/Connector.cs:line 42 그리고 찍히는 로그가.. 좀 이상한 것 같은데요.. [From Server]: 메시지 OnDisconnected: [fe80::1%1]:7777 OnConnected: [fe80::1%1]:7777 이러고 나서 바로 위 에러가 나버립니다. 도저히 원인을 찾을 수 없을 것 같아서 질문 남겨드립니다..
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
Host가 Port같은 느낌인건가요?
앞의 강의에서 Port를 설명해주실때, Ip가 아파트라면 Port는 상세주소라고 설명해주셨습니다. 이번 강의를 들으면서 Host도 여러개의 어플리케이션중에 어떤 어플리케이션으로 보낼지 정해주는 의미로 이해를 하였습니다. 그렇다면, Port와 Host는 비슷한 개념인건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
job queue 흐름에 관하여 질문있습니다
안녕하세요 항상 좋은 강의 잘 듣고 있습니다. jobqueue에 대해서 궁금한 점이 생겨 질문드리게 되었습니다. 질문1) 예를 들어 ABCDE쓰레드가 거의 동시에 C_Chat 패킷을 핸들링할 경우, C_ChatHandler 가 아래와 같고("패킷을 받았습니다" 메세지 전송 추가) Push의 lock에 접근한 순서가 문자 순서대로 A가 1번 B가 2번...이라면 A쓰레드는 Flush를 수행한 후 클라이언트에게 "패킷을 받았습니다를" 보내주고 나머지 BCDE쓰레드들은 Flush를 수행하지 않고 큐에 넣기만 하고 "패킷을 받았습니다"라는 메세지를 보내게 되는 게 맞나요? 질문2) 위 내용이 맞다면 A쓰레드는 단지 1등으로 Push의 lock에 접근했다는 이유로 Flush(요리)를 수행하고, 응답("패킷을 받았습니다"라는 메시지 Send // Push로 등록한 action이 아닌 Push 이후의 흐름들)을 Flush수행 시간만큼 늦게 보내게 되는 것인데 뭔가 불합리?하다고 느껴집니다. 이런 정책을 많이 사용하나요?