묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, flask 배포) [풀스택 Part3]
질문있습니다
좋은 강의 감사합니다. 너무 기본적인 질문이라 민망한데, nginx는 nginx.conf, apache는 http.conf 등 어떤 특정 컨테이너의 설정파일을 어떻게 알 수 있나요? 도커 허브에가서 확인하는 건가요??
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
send 에 lock걸어 주는 것에 질문있습니다.
wsasend가 멀티쓰레드환경을 보장하지 않아 lock을 걸어준다고 하셨는데 어떤부분을 보장하지 않는 건가요? 버퍼문제라면 혹시 이번 수업의 코드는 임시로 event마다 독립적인 버퍼를 가지게 했으니 lock을 안걸어주어도 되나요? wsarecv 는 멀티쓰레드환경에서 문제가 발생하지 않나요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
port 에대한 질문..
안녕하세요 ㅎㅎ 웹 서버의 경우 포트가 http는 80 https 는 443이라고 하셨는데 , 우리가 유튜브로 음악을 듣는 동시에 네이버로 검색을 한다면 둘다 웹 서버를 이용하는 것이고 창이 2개 띄어져 있을텐데 둘다 80 또는 443으로 접속하는 건가요?(중복으로) 아니면 중복 포트는 불가능하니 다른 포트로 접속을 하게 되는건가요? 예를들어 하나는 80 하나는 xx
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
패킷 순서에 대해 질문이 있습니다.
패킷이 크면 전송할 때 조각내서 보낸다고 이해했습니다. 또한, tcp 에 조각낸 패킷의 순서정보 또한 같이 보내는 걸루요 서버 입장에서 받은 패킷과 tcp 순서 정보를 맞춰서, 순서가 잘못됬다고 패킷을 보낸 클라이언트한테 다시 요청하는 부분의 필요성이 이해가 가지 않습니다. 서버가 조각난 패킷의 순서가 잘못됬다는 걸 인지 했다면, 클라이언트 - 서버간 수많은 노드를 거쳐서 다시 보내는 것보다, 서버 내에서 순서정보를 가지고 패킷을 다시 맞추는게 더 좋은게 아닌 건가요..? 패킷이 크면 클수록 저런 왕복을 여러번 해야할 것 같아서요. http 를 공부하는게 처음이라 잘못된 질문일 수 있습니다.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
no-cache부분의 응답에 대해 질문드립니다.
no-cache에서 원서버에 요청시 데이터의 변경이 일어나지 않았을시 false로 304를 내보내는걸로 이해했는데요 원서버와의 네트워크 문제로 연결이 안될시 프록시 서버가 오래된 데이터라도 보여주자라고 해서 응답을 내릴시 똑같이 데이터가 변경이 안되었으니 오래된 데이터 즉 브라우저 내의 캐시를 사용하라고 304를 내보내야되는거 아닌가요? 200을 내보내면 데이터가 수정되었다는 뜻이고 원서버로부터 다시 받아야하는거 아닌가요? 이부분이 이해가 안가서 질문드립니다.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
웹과 앱의 상태코드
안녕하세요. 양질의 강의 잘 듣고 있습니다. 안드로이드와 스프링 쪽만 건드려봐서 저는 웹 쪽의 지식이 거의 없습니다. 스프링으로 API를 만들어서 웹이 아닌 애플리케이션클라리언트에게 데이터를 넘길 때도 지금 설명하시는 HTTP 상태코드 스펙(100번대 ~ 200번대)을 사용하나요? 지금 약간 혼동이 오는 게 제가 옛날에 교육 받은 곳에서는 아래와 같이 상태 코드를 직접 만들어서 클라이언트와 통신했거든요.. 그럼 아래와 같은 방식으로 하는 건 업계에서 쓰이는 표준을 지키지 않은 건가요? (아래 코드는 상태 코드와 요청에 대한 응답 예시입니다.) package com.example.demo.config;import lombok.Getter;/** * 에러 코드 관리 */@Getterpublic enum BaseResponseStatus { /** * 1000 : 요청 성공 */ SUCCESS(true, 1000, "요청에 성공하였습니다."), /** * 2000 : Request 오류 */ // Common REQUEST_ERROR(false, 2000, "입력값을 확인해주세요."), EMPTY_JWT(false, 2001, "JWT를 입력해주세요."), INVALID_JWT(false, 2002, "유효하지 않은 JWT입니다."), INVALID_USER_JWT(false,2003,"권한이 없는 유저의 접근입니다."), EMPTY_REQUEST_DATA(false, 2004, "요청한 값이 DB에 없습니다(empty)"), // users USERS_EMPTY_USER_ID(false, 2010, "유저 아이디 값을 확인해주세요."), USERS_NO_LOGIN(false, 2011, "로그인을 해주세요"), USERS_INVALID_USER(false, 2012, "존재하지 않거나 적절하지 않은 사용자입니다. 유저 상태를 확인해주세요."), // [POST] /users POST_USERS_EMPTY_EMAIL(false, 2015, "이메일을 입력해주세요."), POST_USERS_INVALID_EMAIL(false, 2016, "이메일 형식을 확인해주세요."), POST_USERS_EXISTS_EMAIL(false,2017,"중복된 이메일입니다."), POST_USERS_INVALID_GENDER(false, 2018, "잘못된 성별입니다."), POST_USERS_EXISTS_NICKNAME(false, 2019, "중복된 닉네임입니다."), /** * 3000 : Response 오류 */ // Common RESPONSE_ERROR(false, 3000, "값을 불러오는데 실패하였습니다."), // [POST] /users DUPLICATED_EMAIL(false, 3013, "중복된 이메일입니다."), FAILED_TO_LOGIN(false,3014,"없는 아이디거나 비밀번호가 틀렸습니다."), /** * 4000 : Database, Server 오류 */ DATABASE_ERROR(false, 4000, "데이터베이스 연결에 실패하였습니다."), SERVER_ERROR(false, 4001, "서버와의 연결에 실패하였습니다."), //[PATCH] /users/{userIdx} MODIFY_FAIL_USERNAME(false,4014,"유저네임 수정 실패"), PASSWORD_ENCRYPTION_ERROR(false, 4011, "비밀번호 암호화에 실패하였습니다."), PASSWORD_DECRYPTION_ERROR(false, 4012, "비밀번호 복호화에 실패하였습니다."), /* * 5000: webtoons * */ INTEREST_WEBTOON_STATUS_INVALID(false, 5001, "알람 설정을 하기 위해, 관심 웹툰으로 우선 등록을 해주세요"), INVALID_EPISODE_IN_WEBTOON(false, 5002, "해당 웹툰에 속한 에피소드가 아닙니다."), INVALID_STARSCORE_VALUE(false, 5003, "별점 값을 다시 확인해주세요"), ALREADY_EXISTS_STARSCORE(false, 5004, "이미 별점이 존재합니다"), WEBTOONS_INVALID_WEBTOON(false, 5005, "존재하지 않는 웹툰이거나 적절하지 않는 요청입니다. 값을 확인해주세요"), EPISODES_INVALID_EPISODE(false, 5006, "존재하지 않는 에피소드이거나 적절하지 않는 요청입니다. 값을 확인해주세요"), HISTORIES_INVALID_HISTORY(false, 5007, "요청하신 기록이 존재하지 않습니다. 다시 확인해주세요"), NO_PAID_EPISODE(false, 5008, "구매가 필요한 에피소드입니다. 구매 후 이용해주세요"); // 6000 : 필요시 만들어서 쓰세요 private final boolean isSuccess; private final int code; private final String message; private BaseResponseStatus(boolean isSuccess, int code, String message) { this.isSuccess = isSuccess; this.code = code; this.message = message; } { "isSuccess": true, "code": 1000, "message": "요청에 성공하였습니다.", "result": { "webtoonInfo": { "webtoonIdx": 1, "color": "#FF001D", "webtoonProfileImageUrl": "https://imageUrl_신의탑_434×330", "webtoonName": "신의탑", "author": "SIU", "synopsis": "자신의 모든 것이었던 소녀를 쫓아 탑에 들어온 소년 그리고 그런 소년을 시험하는 탑", "genre": "판타지", "age": "12세 이용가", "day": "월요웹툰", "totalInterestNum": 8, "isInterested": null, "alarm": null, "paidEpisodeNum": 3 }, "episodeList": [ { "episodeIdx": 6, "thumbnailImageUrl": "https://image~~", "title": "3부 75화", "date": "16일 후 무료", "avgStarScore": null, "isWatched": null, "isPaid": null, "isLastWatchedEpisode": null, "cookie": 2 }, { "episodeIdx": 5, "thumbnailImageUrl": "https://image~~", "title": "3부 74화", "date": "9일 후 무료", "avgStarScore": null, "isWatched": null, "isPaid": null, "isLastWatchedEpisode": null, "cookie": 2 }, { "episodeIdx": 4, "thumbnailImageUrl": "https://image~~", "title": "3부 73화", "date": "2일 후 무료", "avgStarScore": null, "isWatched": null, "isPaid": null, "isLastWatchedEpisode": null, "cookie": 2 }, { "episodeIdx": 3, "thumbnailImageUrl": "https://image~~", "title": "3부 72화", "date": "21.06.13", "avgStarScore": "5.55", "isWatched": null, "isPaid": null, "isLastWatchedEpisode": null, "cookie": 0 }, { "episodeIdx": 2, "thumbnailImageUrl": "https://image~~", "title": "3부 71화", "date": "21.06.06", "avgStarScore": "5.80", "isWatched": null, "isPaid": null, "isLastWatchedEpisode": null, "cookie": 0 }, { "episodeIdx": 1, "thumbnailImageUrl": "https://image~~", "title": "3부 70화", "date": "21.05.30", "avgStarScore": "4.50", "isWatched": null, "isPaid": null, "isLastWatchedEpisode": null, "cookie": 0 } ] } }
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
근데 목적지 포트와 목적지 IP는 어떻게 아는거죠?
서버에서 응답을 넘겨줄 때는 패킷에 출발지 포트, 출발지 아이피가 적혀 있어서 가능하다는 것을 알겠습니다. 하지만 클라이언트에서 서버로 데이터 전송 시 아이피와 포트번호를 어떻게 알고 보내는 건가요? 아이피는 https://www.google.com << 이 도메인 이름인건가요? 그렇다면 포트는 어떻게 알고 보내죠..? ----------------------------------------------- 추가적으로 질문을 하면서 갑자기 또 궁금한게 생겼습니다. 여기서 말하는 클라이언트와 서버라는게 이해가 잘 가지 않습니다. 예를들어, 프로그램을 짠다고 했을때 제가 아는건 html,css,javascript의 front 쪽에서 Java, oracle 등 back으로 데이터를 넘겨주고, 그 데이터를 처리한 값을 다시 front로 넘겨주는 걸로 알고 있습니다. 이때, front가 클라이언트, back이 서버가 되는게 아닌가요..? 근데 마치 예시에서는 클라이언트가 이 컴퓨터, 서버는 저 컴퓨터 같은데 이런 개념이 잡히지가 않네요. 혹시 이부분에 대해 도움 받을 수 있을까요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
프록시 캐시 서버에 관련해 질문 있습니다.
안녕하세요. 개발자님. 만약에 no-cache, must-revalidate 등을 쓴다면 프록시 서버를 거쳐도 무조건 원 서버에 확인이 필요하니까 클라이언트의 웹 브라우저와 원서버가 직접 연결이 된 경우보다 프록시 서버가 있는 쪽이 오히려 더 비효율적일 수도 있을거 같네요. 이 부분에 대해서 궁금합니다. 감사합니다.
-
해결됨20년 경력자의 알기쉬운 컴퓨터네트워크
복수의 ostf
안녕하세요, 질문이 하나 더 생겼습니다^^;; 이번 강의를 듣고 실습을 좀 해봤는데요, 아래와 같이 세팅을 해봤어요. R1 에서: 1. gi0/0/0.10 세팅 및 gi0/0/0.20 세팅완료후 encapsulation 명렁어로 트렁킹 선언가지 다 마쳤구요, 2. 스위치에서 vlan 설정 및 트렁킹 설정까지 다 마쳤습니다. 테스트 해본결과 vlan 10 에 컴과 vlan 20 의 컴이 핑 교환하구요. 3. ospf 라우팅 프로토콜을 이용하여 vlan 10 네트워크와 vlan 20 네트워크 주소를 R2 라우터로 넘겼습니다. 그리고 R2에서: 1. 각 인터페이스에 IP 설정 완료후 2. 서버에도 IP 설정 완료. 3. ospf 라우팅 프로토콜을 이용하여 203.203.203.0 네트워크를 R1 으로 넘겼습니다. 결과는 R1 의 컴터들 (vlan 10 과 20) 과 R2 에 서버가 잘 통신합니다 (일단 첫번째 테스트 성공 !!) 문제는 R3인데요, R2 와 R3을 시리얼 통신으로 연결했고 IP 설정을 모두 마쳤습니다. 그런데 막상 ospf 를 설정하려고 하니, R2 에서 어떤 네트워크를 넘겨야 하는지 잘 모르겠네요. 테스트를 해봤는데... R2 에서: R2(config) # router ospf 13 R2(config-router) # network 202.202.202.2 0.0.0.0 area 2 R2(config-router) # network 204.204.204.1 0.0.0.0 area 0 그리고 R3 에서: R3(config) # router ospf 13 R3(config-router) # network 205.205.205.1 0.0.0.0 area 2 R3(config-router) # network 204.204.204.2 0.0.0.0 area 0 이렇게 세팅했더니 R2에서 R3에 연결되있는 서버는 통신됩니다 (205.205.205.2). 그런데 R1에 붙어있는 vlan10 과 vlan20 컴터들이 R3 에 연결된 서버 (205.205.205.2) 와 통신하려면 어떻게 설정해야 하나요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
안녕하세요. 이번강의 정리중에 궁금증이 있어서 질문드립니다.
안녕하세요. 개발자님 아래 질문에서도 확인했는데, 그 글과 답변을 보고도 모호해서 저도 비슷한 내용으로 질문 남깁니다. 1. 현재 RFC723x HTTP에서는 헤더로 - General 헤더 : 메시지 전체에 적용되는 정보, 예) Connection: close - Reuquest 헤더 : 요청을 보낼때 포함하는 정보, 예) User-Agent: Mozilla/5.0 (Macintosh; ..) - Response 헤더 : 응답에 들어가는 정보, 예) Server: Apache - Representation 헤더 : 표현 데이터(바디) 정보 이렇게 4가지로 쓰고, 이렇게 정리하면 되는게 맞나요? 이전 버전이 폐기되고 723x를 설명 해주실때, 바로 BODY 부분으로 넘어가신거 같아서 약간 정리가 안됩니다. 2. 이전 버전과 차이가 entity -> representation으로 명칭이 바뀐거 같은데, HTTP BODY에 대한 설명은 거의 같은 것 같아 보입니다. 말 그대로 명칭만 바뀐 것인지 어떤게 중점적으로 바뀐 것인지 궁금합니다. 3. HTTP 전송 시 헤더 + 바디로 보내는 것 같은데, 요청시 request Header + (general헤더 + representation 헤더 + message body), 응답 시 response Header + (general헤더 + representation 헤더 + message body) 이렇게 보내는 건가요..? 모든게 요청 아니면 응답 같은데, request header 나 response 헤더는 요청이냐 응답이냐에 따라 필수적으로 포함되는 것 같고, representation header와 general header는 message body가 있느냐, 요청/응답과 상관 없이 보낼 정보가 있느냐에 따라 포함될 수도 있고 포함되지 않을 수도 있을 것 같다 정도로 이해했는데 잘 이해한게 맞는건지 궁금합니다. 날도 많이 덥고 코로나도 심한데 건강 유의하시길 바라고 늘 좋은 일 많으시길 바랍니다!
-
해결됨모든 개발자를 위한 HTTP 웹 기본 지식
Socket 방식으로 통신하는게 TCP 프로토콜을 직접 사용하는 경우인가요??
안녕하세요, 강사님! 강의를 듣다가 궁금한 게 생겨서 질문드립니다. 1분 14초에서 보면 실무에서 통신할 때 TCP 프로토콜을 직접 사용해서 통신하는 경우가 없다. 게임 서버 같은 경우에나 그런 방식을 사용한다고 하셨습니다. 두 방식의 장단점이 뭐가 있을지 궁금해서 인터넷을 찾아보는데, HTTP 방식과 Socket 방식의 장단점을 비교한 글들이 많더라구요!! Socket 방식은 온라인 게임 등에 사용된다고 하던데, 혹시 Socket 방식으로 통신하는게 TCP 프로토콜을 직접 사용하는 경우인가요?? 강의 정말 재밌게 듣고 있고, 덕분에 공부하는 게 재밌습니다! 학자형으로 공부하는 스타일이라 지치고 이해가 안되는 경험들이 많은데, 강사님 덕분에 많은 걸 배웁니다. 감사합니다 :)
-
해결됨20년 경력자의 알기쉬운 컴퓨터네트워크
실제 현장에서
안녕하세요, 지금까지 여러가지 각종 라우팅 프로토콜을 배웠는데요, 실제 현장 업무에서는 어떤 라우팅 프로토콜이 보편적으로 가장 많이 사용되나요? 강의에서 설명해 주신 바로는 static routing protocol은 작은 규모에만 사용될수 있고, eigrp 같은 경우는 씨스코 장비 전용이라고 하셨는데요, 그럼 실제 현장에서는 작은 규모는 static 을 애용하고 씨스코 장비 사용시는 eigrp 만 사용하나요? 아님 작은 규모던 씨스코 장비사용중이던 간에 다른 종류 (예: 가장 많이 사용한다고 말씀해주신 ospf) 같은 것도 사용할수 있나요? 실제 현장에서는 어떠한지 궁금합니다.
-
해결됨20년 경력자의 알기쉬운 컴퓨터네트워크
Trunk 세팅 (ISL)
또 한가지 질문이 있습니다. 영상에서는 ISL 에 대한 세팅은 설명이 없는데요, 혹시 씨스코 장비끼리 ISL 로 트렁킹을 세팅할 경우에 대한 설명도 부탁드려도 될까요? 아니면 참고 자료라도 알려주시면 감사하겠습니다.
-
해결됨20년 경력자의 알기쉬운 컴퓨터네트워크
Trunk 선언 및 세팅
안녕하세요, 질문이 있습니다. 강의에서 15분 38초에 라우터에서 encapsulation 명령어를 사용할때요, 여기서는 그냥 어떠한 Trunking 프로토콜을 쓰겠다!! 라고 단지 선언만 하는 건가요? 영상을 계속보니 실제 트렁킹 세팅은 스위치에서 이루어 지는데, 그럼 원래 트렁킹 세팅은 L2 에서만 이루어지고 (switchport mode trunk 커맨드로) L3 장비에서는 단지 dot1Q 와 ISL 중 어떤걸 쓸지 선언만 하는 건가요? 아니면 라우터에서도 트렁킹을 세팅하는 방법이 따로 있는지 궁금합니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send의 Lock
안녕하세요. 항상 질 좋은 강의 감사합니다! 복습중에 이해가 안가는 부분이 있어 질문 드립니다. ServerCore의 Send부분 입니다. 제가 다음과 같이 이해를 했습니다. Send를 호출해서 Lock을 걸은 스레드가 RegisterSend를 호출하고, 여기서 pending이 true 라면 그대로 종료하면서 Lock을 풀고, 이후에 Send를 호출한 스레드는 Queue에만 담고 종료한다. 나중에 다른 스레드로 OnSendCompleted가 비동기로 호출되면, Queue를 확인해서 일감이 있다면 바로RegisterSend를 호출해서 처리한다. 일단 이렇게 이해하는게 맞는건지 궁금합니다. 만약 맞다면 Queue에 일감이 있어 OnSendCompleted를 비동기로 실행한 스레드가 RegisterSend를 호출하면, Send에는 Lock이 안 걸려있는 상태 이니 RegisterSend가 동시에 두 번 호출될 수 있지 않나요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
WSAWaitForMultipleEvents 에 대해 약간 궁금한 것이 있습니다.
조금 이해를 못한 부분이 있습니다. while문을 돌면서 WSAWaitForMultipleEvents에 도달했을 때 timeout 조건을 WSA_INFINITE로 걸게 되면 이 지점에서 block되는 것과 같아지나요? 그러면 비동기 논블락 소켓을 사용하는 이점이 사라지게 되는 것인지 문득 궁금해졌습니다. 더불어서 혹시 취업 특강은 다음 주에 나오는걸까요..? ㅎㅎ
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
Http 메서드 중 Post가 잘 이해가 가지 않습니다.
Post가 요청 데이터 처리를 한다고 하셨는데 이 데이터 처리가 무엇을 의미하는지 잘 모르겠습니다 .. Get은 데이터를 보여주고, 다른 메서드는 수정 및 삭제 등등 하는데 Post는 처리한다는게 정확하게 무슨 의미인지 잘 모르겠습니다.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
지속연결과 put 메서드 질문드립니다
HTTP에서 맨 처음에 클라이언트-서버가 연결하고 있으면 서버가 계속 연결을 유지해야 하니까 자원이 많이 낭비돼서 비 연결성으로 요청 -> 응답 -> 종료 이렇게 바꿨는데 이러면 너무 오래걸리니까 지속 연결을 사용한다는데 결국 지속 연결 사용하면 맨 처음 자원이 많이 낭비 되던 시절로 돌아간 건가요?
-
해결됨모든 개발자를 위한 HTTP 웹 기본 지식
HTTP와 포트
안녕하세요. 이 분야에 대해 개념이 잘 안잡혀 질문이 다소 황당하더라도 이해 부탁드립니다. 제가 만약 웹으로 유튜브랑 네이버를 동시에 사용중이면 둘 다 웹이므로 HTTPS 이고, 그러면 둘 다 제 컴퓨터의 443번 포트 하나에 연결되는 건가요? 저는 뭔가 유튜브랑 네이버에서 받고자 하는 데이터가 다르니까 구분되기 위해 서로 다른 포트를 부여해야 할 것 같아서요.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
delete, patch에 대해서
안녕하세요 영한님 좋은 강의 해주셔서 감사합니다! 만약, 사이트 내에 member가 탈퇴했을 때 실제 db에서 member를 지우지는 말고 member 테이블의 delete_type 칼럼을 1로 바꿔주세요 라는 요구사항이 들어왔다면 이 경우에는 요청 api를 URI : members/{id} METHOD : DELETE 로 하는게 맞을까요? 아니면 URI : members/{id} METHOD : PATCH 로 해야 하는게 맞을까요?