44,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
Stateless 이해
안녕하세요 항상 강의 잘 듣고 있습니다! HTTP가 무상태 특성을 갖는 이유가 HTTP의 구조인 클라이언트 서버 구조가 하나의 요청과 응답안에서만 데이터를 유지하는 Request, Response 구조이기 때문인가요?
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
URI, URL의 차이..?
이번 강의를 듣고 URI는 자원을 식별, URL은 자원의 위치를 알려주는 것으로 이해했습니다. 강의 자료의 예제 중에서 "https://www.google.com/search?q=hello&hl=ko"가 URL이라고 하셨는데 "https://www.google.com/search"가 자원의 위치를 나타내주는 URL이자 URI이고 (URI가 URL의 상위 개념이기 때문에) "https://www.google.com/search?q=hello&hl=ko"는 특정 위치에 있는 자원을 식별하는 주소이기 때문에 정확히 말하면 URI라고 하는 게 맞지 않나요? URL이라고 부르는 이유가 통상적으로 URL이라고 부르기 때문인가요??
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
DNS, 도메인 질문
안녕하세요 강의 정말 잘 듣고 있습니다! DNS가 IP주소를 도메인으로 변환해서 도메인 서버에 넣고 클라이언트가 도메인 주소로 요청할 수 있도록 하는 것이라고 하셨는데 도메인이라는 게 기억하기 어려운 IP주소를 기억하기 쉽게 문자로 만든 주소인가요??
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
데이터 전달 질문
앞의 강의인 TCP,UDP 그림에는 Ethernet frame, IP, TCP로 HTTP를 감싸서 서버로 보내는데 이번강의 그림에서는 그냥 TCP/IP패킷에 HTTP감싸서 보내는 그림만 있습니다. 이 둘의 차이점이 무엇인가요?
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
HTTP 응답 메시지
안녕하세요. 강의 잘 듣고 있습니다. 응답메시지를 보면 content-type과 데이터를 보낸다고 하는데 이게 쫌 헷갈려서요. 개발자도구에서 네트워크 탭을 보면 확인 가능한 많은 파일들 때문에저는 response시에 content-type과 html 파일, js 파일등등을 보낼줄 알았는데 데이터라고 하셔서 저 파일등은 그럼 어떻게 나타내지는건지 궁금합니다. 아니면 제가 생각하고 있는 데이터와 강사님이 말씀하신 데이터의 정의가 다른건가 싶기도 하구요. 감사합니다.
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
HTTP 헤더: Host
안녕하세요 HTTP 헤더에서 Host 의 역할 -> 하나의 서버(200.200.200.2) 안에서 여러 도메인(aaa.com, bbb.com, ccc.com) 을 처리해야 할 때 구분해주는 것. 이렇게 설명을 해주셨는데, 하나의 서버 안에서 200.200.200.2 안에서 각각의 어플리케이션 연결은 포트로 하는 것과 어떻게 다른가요? 미리 감사합니다.
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
패킷 관련 질문입니다!
안녕하세요, 영한님 스프링 핵심원리 완강 후 바로 HTTP 강의를 듣기 시작했습니다! 평소 네트워크 관련 지식이 부족하다고 생각 하고 있었는데 강의 첫 부분부터 질문이 생겨버렸네요 ㅎㅎ.. [질문1] 패킷이란게 네트워크에서 데이터를 주고 받을 때 데이터를 일정묶음으로 나눠놓은 것을 말하는건가요? [질문2] 데이터를 패킷 단위로 나눠서 전송하는 이유가 데이터를 나누지 않고 한 번에 보낼 경우 나머지 컴퓨터들은 기다리게되고, 만약 에러가 발생하면 데이터를 처음부터 다시 보내야하는 문제가 있기 때문에 데이터를 패킷 단위로 나눠서 여러 대의 컴퓨터들과 동시다발적으로 데이터를 주고받으면서 전송하기 위해서라고 알고 있는데 제대로 이해하고 있는 게 맞는지 궁금합니다!
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
실제 사용 예
강사님 안녕하십니까 강의 재밌게 잘 보고 있습니다. 제가 검색을 잘못하는 것인지, 원하는 답이 안나와서 이렇게 질문드립니다,, POST 기반 등록, PUT 기반 등록, HTML FORM(특히 컨트롤 URI)가 코드로 실제 어떻게 사용이 되는지 실제 예를 보고 좀 더 이해하고 싶은데 혹시 검색 키워드나 알 수 있는 방법이 있을까요.,? 수준 낮은 질문 죄송합니다..
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
인코딩 관련해서 질문있습니다.
밑의 이미지에서 데이터가 UTF-8로 인코딩 후 gzip으로 인코딩 되는 총 2번의 인코딩 과정을 거치는 것ㅇ; 맞나요?
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
TCP 3 way handshake 질문
안녕하십니까 강사님 복습을 하던 중에 헷갈리는 부분이 있어 질문드립니다. pdf에서 3 way handshake 설명이 클라이언트와 서버 사이에서 이뤄지는 그림이 있습니다. 그런데 위의 사진인 프로토콜 계층에서 Hello라는 HTTP 메시지가 TCP/IP 으로 둘러쌓이지 않습니까?? 출발지, 도착지 IP, PORT 등으로 말입니다. 그렇다면 저 사이에서는 3 way handshake가 일어나는건지 너무 궁금합니다,, 아닌 것 같은데 ,, 확실하게 알고 싶어 질문드립니다!! 읽어주셔서 감사합니다
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
분할 전송과 범위 전송에 대해
질문이 있습니다. 분할 전송의 경우 청크로 나뉘어 먼저 전송을 한다고 하셨는데, 그럼 각 분할된 청크마다 tcp로 감싸서 보내는지 궁금합니다. 그렇다면, 각 청크의 tcp에 순서정보는 필요없는지요. -- 범위 전송은 과거 대용량 파일이나 게임을 다운받을 때 구글드라이브나 다운로드.exe 에서 특정범위 부터 다시 다운로드 받는 걸 몇번 본적이 있는데, 그것과 같은 동작인지 궁금합니다.
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
HTTP 에러 코드, 메시지
안녕하세요. HTTP 에러코드, 메시지에 대해서 궁금합니다. 정해진 에러코드(404, 304 등 )에 대해서 강의를 통해서 잘 들었습니다. 그런데 프로젝트를 하다보면 이렇게 정해진 코드 이외에 팀원들끼리 약속해서 새로운 에러코드(ex. 450), 메시지(ex. 필수 파라미터 안 넣었음) 를 약속할 수 있잖아요? 그렇다면, 강의에서 말씀하신 정해진 에러코드를 커스텀 ? 또는 어느 상황때에 우리가 정해진 에러코드를 반환해줘야 한다 => 이 말은 정해진 코드들 역시 저희가 임의대로 다 조작을 할 수가 있다는 말인가요? 즉, 404 Not Found 라는 메시지는 다른 문맥적 의미(해당하는 리소스가 없다는 이외의 의미) 로 반환을 할 수가(기능적인 가능성에 대해서 궁금합니다. 물론 그럴일은 없겠지만) 있다는 말인가요? 흠, 요지는 우리가 인터넷에서 보는 흔한 404 Not Found 라는 메시지는 각각의 수많은 서버들이 모두다 공통적으로 임의로 약속해서 일부러 그런 코드를 반환하는 것인지, 아니면 이미 내부스펙으로 정의를 해놔서 (약속을 따로 하지 않아도) 자동으로 HTTP 에서 내뱉는 코드인지 궁금합니다. 이해가 잘 안되어서 오히려 질문도 좀 뒤죽박죽이네요. 죄송합니다. 아 그리고 강의는 언제나 감사하게 잘 듣고 있습니다. 감사합니다.
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
GET/POST를 제외한 method의 전송 방식은 무엇인가요?
언제나 좋은 강의 감사합니다! 덕분에 정말 즐겁게 공부하고 있습니다. GET method는 브라우저에서 주소를 입력하고 엔터를 치게되면 해당 URL으로 GET method가 호출되는 것으로 알고있습니다. POST method는 HTML form을 통해서 제출하면 사용자가 입력한 내용이 POST method로 호출되는 것으로 알고 있습니다. 그렇다면 PUT/PATCH/DELETE/OPTIONS 등등의 다른 method를 호출하려면 어떤 식으로 요청을 보내야 합니까? (배민홈페이지에서 댓글을 지우고 싶을 때 삭제버튼을 클릭하면 HTML form이 DELETE라는 method로 호출되는 것입니까? 아니면, JavaScript에서 버튼에 대한 이벤트 핸들러를 통해서 해당 method를 부여하게 되는 것입니까? 만약 JS를 통한 방식이라면 GET과 POST를 제외한 모든 메소드를 웹 브로우저에서 부르려면 필수적으로 JS를 거쳐야 하는 것입니까?) (죄송합니다.. 글이 정리가 안되었네요ㅠㅠ)
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
port 에대한 질문..
안녕하세요 ㅎㅎ 웹 서버의 경우 포트가 http는 80 https 는 443이라고 하셨는데 , 우리가 유튜브로 음악을 듣는 동시에 네이버로 검색을 한다면 둘다 웹 서버를 이용하는 것이고 창이 2개 띄어져 있을텐데 둘다 80 또는 443으로 접속하는 건가요?(중복으로) 아니면 중복 포트는 불가능하니 다른 포트로 접속을 하게 되는건가요? 예를들어 하나는 80 하나는 xx
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
패킷 순서에 대해 질문이 있습니다.
패킷이 크면 전송할 때 조각내서 보낸다고 이해했습니다. 또한, tcp 에 조각낸 패킷의 순서정보 또한 같이 보내는 걸루요 서버 입장에서 받은 패킷과 tcp 순서 정보를 맞춰서, 순서가 잘못됬다고 패킷을 보낸 클라이언트한테 다시 요청하는 부분의 필요성이 이해가 가지 않습니다. 서버가 조각난 패킷의 순서가 잘못됬다는 걸 인지 했다면, 클라이언트 - 서버간 수많은 노드를 거쳐서 다시 보내는 것보다, 서버 내에서 순서정보를 가지고 패킷을 다시 맞추는게 더 좋은게 아닌 건가요..? 패킷이 크면 클수록 저런 왕복을 여러번 해야할 것 같아서요. http 를 공부하는게 처음이라 잘못된 질문일 수 있습니다.
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
컨트롤 URI 부분 질문드립니다.
안녕하세요:) 아래의 컨트롤 URI 부분에 질문에 있어서 질문드립니다. orders/{orderId}/start-delivery 위의 컨트롤 URI 를 아래와 같이 바꾸고 orders/{orderID} 해더에 아래와 같은 문장을 추가하여 해결하는 방법이 URI 는 리소스만을 생각한다는 부분에서 맞는 것 같다고 생각되는데 start-delivery: true 위의 생각이 업계에서 올바르게 사용될 수 있는 방법인지, 아니라면 어떤 부분이 문제인지 답변 부탁드립니다! 개인적인 생각으로 Header 부분이 거대해질 수 있다는 문제가 있을 것 같지만 URI 정의상으로는 어떻게든 Header 에 넣어서 요청을 보내는 것이 옳다고 생각하여 질문드립니다.
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
no-cache부분의 응답에 대해 질문드립니다.
no-cache에서 원서버에 요청시 데이터의 변경이 일어나지 않았을시 false로 304를 내보내는걸로 이해했는데요 원서버와의 네트워크 문제로 연결이 안될시 프록시 서버가 오래된 데이터라도 보여주자라고 해서 응답을 내릴시 똑같이 데이터가 변경이 안되었으니 오래된 데이터 즉 브라우저 내의 캐시를 사용하라고 304를 내보내야되는거 아닌가요? 200을 내보내면 데이터가 수정되었다는 뜻이고 원서버로부터 다시 받아야하는거 아닌가요? 이부분이 이해가 안가서 질문드립니다.
- 미해결모든 개발자를 위한 HTTP 웹 기본 지식
이미지 데이터 다운로드
제가 웹 지식이 없다보니 이미지 데이터 다운로드 부분에서 혼란이 옵니다. 앱 같은 경우는 DB에 저장되어 있는 이미지가 저장된 url을 클라이언트에게 보내주고 클라이언트가 해당 이미지를 로딩하는 방식을 많이 사용하는 걸로 알고 있습니다. 영한님이 설명해주시는 것을 보면, http header와 함께 이미지 데이터도 바이트코드로 같이 보내주는 것처럼 들리는데 웹 브라우저에게 데이터를 줄 때는 앱과 다른 방식으로 보내는 건가요?
- 미해결모든 개발자를 위한 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 웹 기본 지식
delete 메서드 사용
안녕하세요. 강의 정말 잘 보고 있습니다. 실무에서 실제로 delete 메서드를 사용하는지 궁금합니다. 요즘은 데이터가 돈이라서 삭제를 요청한 값이라도 해당 데이터 상태 값만 invalid 처리하기 때문에 delete 메서드는 안 쓰고 이럴 경우 patch를 쓴다는 글을 어느 블로그에서 본 적이 있는 거 같은데 요즘 실무에서도 그렇게 하나요? (아니면 가치있는 정보만 선별해서 살릴지 말지를 결정하나요? 예를 들어 대용량 파일 같은 경우는 용량을 많이 먹어서 지우는 게 나은 거 같기도 하네요...