안녕하세요 터커님 또 다른 강의 잘보고 있습니다 다시 또 문제가 생겨 문의 합니다 아래 다른 댓글 junsub kim 님과 같은 문제인데 처음 서버를 실행 시키고 난 이후 디버그 종료를 해도 서버가 열려 있습니다 그래서 다시 내용 수정을 하고 저장을 해도 처음 해둔 상태입니다 인터넷을 찾아보니 cmd 에서 taskkill 로 포트번호를 찾아가서 없애니까 서버가 종료되고 다시 저장도 할 수 있던데 이방식 밖에 없는건가요? 영상에는 이런 화면이 없던데 다른방법이나 설정이있을까요? 초보자라 정말 한참을 찾아서 했는데 다른방법이 있을거 같네요 ㅠ 윈도우입니다.. ㅠㅠ
음 잘모르겠네요. 저는 겪어 보질 못해서... 디버그 종료를 해도 프로세스가 종료되지 않는다는 건가요? 아니시면 터미널에서 직접 실행한 다음에 종료해보는게 어떨까요? 이번 예제하고는 관계 없지만 캐싱 문제일 수 있습니다. 서버를 다시 띄울때 브라우져 캐쉬를 지워보는것을 추천드립니다. 또는 포트가 제대로 닫히지 않았을 수도 있습니다. 그럴땐 taskkill 로 죽이시거나 포트를 바꿔서 실행해보시는 것도 할 수 있습니다. 저는 겪어 보질 못해서 모르겠네요. 아마 다른 문제가 아닐가 싶습니다만..
터커님, 좋은 강의 감사드립니다! 강의 중 궁금한게 있는데요. 예전에는 서버사이드에서 전부 렌더링 해주는 방식이였는데 요즘엔 클라이언트 렌더 방식이라고 하셨잖아요. 그게 서버 사이드 부하를 줄이기 위해서 인가요? 그럼 클라이언트도 마찬가지로 동적 데이터 처리하면서 렌더링 하기 위해 자원이 들텐데, 왜 그렇게 바뀌었는지 궁금합니다.
여러가지 이유가 있습니다. 첫번째로는 반응성이 좋아집니다. 서버가 페이지를 모두 그리면 느리기 때문에 틀만 빠르게 보내고 내용은 동적으로 채워나가는 방식이라 기본틀을 사용자에게 빠르게 보여줄수 있습니다. 유튜브도 보시면 빠르게 틀을 그리고 내용은 동적으로 업데이트 되는걸 보실수 있습니다. 두번째로 부하 분산입니다. 서버에 부하가 집중되는 것보다 클라로 분산되는게 서버 유지에 도움이 되기 때문입니다. 세번째로 가능해진 면이 있습니다. 어떻게 보면 기술이 선도했다고 볼수 있는데, 예전 웹 기술 ASP.NET 이나 PHP 같은 경우 서버 렌더링 방식이었는데 jQuery 가 나오면서 동적 렌더링이 가능해진 면이 있습니다. 마지막으로 서버리스 방식이 가능해졌습니다. 이건 동적 렌더링이 보편화되고 나서 변화된 양상인데 이제 서버가 하는 일은 틀 제공과 내용을 채울 데이터 제공으로 나눠지게 되고, 이제 웹서버가 데이터만 전문으로 제공하는 웹서버 기능이 더 강화되었습니다. 그럼으로써 각 데이터별로 별도 서버가 가능해지고, 또 서버의 역할이 요청시 그에 맞는 데이터를 주는 방식으로 변화되다 보니, 항시 동작하는 서버에서 그때그때 반응하는 서버로 변화되면서 AWS Rambda 같은 서비스를 이용해서 서버 없는 서버가 가능해지게 되었습니다.
@@TuckerProgramming 기술 트렌드에 의한 변화가 일어나고, 그 변화가 서버 부담을 줄여주니 그렇게 됐다고 이해하겠습니다. ㅎㅎ 그나저나 오랜만의 좋은 강의 정말 감사드려요. 항상 기초 하고 웹 같은거 해 볼 만한 프로젝트가 있나 궁금했는데 정말 최적의 강의입니다! 물론 옛날거 다 까먹어서 인터페이스 다시 공부해야하네요 ㅎ
http.ListenAndServe(":3000", nil) 이렇게 구축 되었을 때 http.HandleFunc를 사용하는 이유에 대해 궁금해졌는데 알고 싶습니다. HandleFunc은 어떤 Handler를 등록하는 것이고, 어떤 경로에 해당하는 Request가 들어 왔을 때 어떤 일을 할 것인지 그 Handler를 등록하는 Function라는 것과 여기서는 초기경로인 "/"에 대한 Request가 왔을 때 어떤 일을 할 것 인지 지정한 것이라는 것과 실제로 Handler는 ServeHTTP라는 함수 하나를 가지고 있는 인터페이스로 type Handler interface { ServeHTTP(ResponseWriter, * Request) }
형태로 이루어져 있다는 건 알겠는데 안드로이드에서는 쓰레드 때문에 쓰는 것으로 알고 있는데 왜 Go에서는 HandleFunc을 사용하는지 궁금합니다.
@@cbs8727 그러니까 정리하자면 인터페이스를 써도 되는데 http.HandleFunc을 왜 쓰는가 이건가요? http.ListenAndServe 에서 핸들러를 직접등록해도 되고 http.HandleFunc로 하셔도 됩니다. 두개다 가능합니다. 여긴 첫번째 강의로 HandleFunc를 썼는데 뒷강의에는 핸들러를 등록하는 예제들을 넣었습니다. 안드로이드는 제가 안써봐서 잘모르겠네요. 근데 이건 웹클라이언트가 아니라 웹서버를 만드는 내용이라서 안드로이드에서 돌릴 일은 없을것 같습니다.
기다리고 있었습니다ㅎㅎ잘 보겠습니다. 그런데 저는 처음에 "/" 경로에 핸들러를 등록한 이후에 "/bar"라든지 "/foo"를 등록하고 나서 로컬서버에서 변화를 확인할 수 없는데 무엇이 잘못된 것일까요? 코드는 100% 일치하고 디버깅 없이 run했을 때도 오류 없이 수행됩니다.
좋은 질문입니다. 책을 사셨다니 책의 뒷부분의 "생각하는 프로그래밍" 편에 값타입과 포인터타입의 차이점에 대해서 적어뒀습니다. 이것을 이해하시기 위해서는 "인스턴스"라는 개념이 필요합니다. th-cam.com/video/wf_Vjg4oWz4/w-d-xo.html 여기에 인스턴스에 대해서 설명했습니다. ResponseWriter는 값타입이고 r 은 포인터 타입으로 사용하였죠. 웹핸들러는 중간에 여러 단계를 거쳐서 전달할 수 있는 구조를 가지고 있습니다. 이것을 미들웨어라고 하는데요, 예를 들면 요청된 값을 압축 해제하거나 암호를 복호화 한 다음에 실제 핸들러로 연결할 수 있습니다. 그러면 이들 미들웨어 레이어를 거치면서 실제 요청값을 변화시킬 필요가 있습니다. 즉, 압축을 해제한 다음 압축 해제된 요청으로 바꿔줄 필요가 있는 거죠. 그래서 하나의 인스턴스를 유지하면서 요청을 전달하기 위해서 포인터 타입을 사용한 것으로 생각됩니다.
다시 올리시는군요!!
기다렸습니다~~!!
감사히 잘 보겠습니다.
너무 감사드립니다. 너무 기다리고 있었습니다.
너무 간단해서 적잖이 놀랐습니다..;;;
헐헐헐 웹프로그래밍도 있었으면 했는데 너무감사드립니다 ㅠㅠㅠ
go 언어로도 요즘 게임도 많이 개발하는거 같아서 열심히 배워봅니다.
열심히 배워서 퇴사를 목표로 하는 반 칠십 다섯이 추천눌러봅니다.
이직 공부에는 알고리즘 공부가 좋아요. LeetCode 에서 Go 언어도 지원하니까 Go 공부도 할겸 LeetCode 문제를 많이 풀어보세요. 미디움 100제 이상 풀면 감이 오실겁니다.
@@TuckerProgramming 감사합니다.
드디어 웹프로그래밍 강의를 하시는 군요. 기대됩니다
으앗 드디어 ㅠㅠㅠ반갑습니다!!!!
안녕하세요 터커님 또 다른 강의 잘보고 있습니다
다시 또 문제가 생겨 문의 합니다 아래 다른 댓글 junsub kim 님과 같은 문제인데
처음 서버를 실행 시키고 난 이후 디버그 종료를 해도 서버가 열려 있습니다 그래서 다시 내용 수정을 하고 저장을 해도 처음 해둔 상태입니다
인터넷을 찾아보니 cmd 에서 taskkill 로 포트번호를 찾아가서 없애니까
서버가 종료되고 다시 저장도 할 수 있던데 이방식 밖에 없는건가요?
영상에는 이런 화면이 없던데 다른방법이나 설정이있을까요?
초보자라 정말 한참을 찾아서 했는데 다른방법이 있을거 같네요 ㅠ
윈도우입니다.. ㅠㅠ
음 잘모르겠네요. 저는 겪어 보질 못해서... 디버그 종료를 해도 프로세스가 종료되지 않는다는 건가요?
아니시면 터미널에서 직접 실행한 다음에 종료해보는게 어떨까요?
이번 예제하고는 관계 없지만 캐싱 문제일 수 있습니다. 서버를 다시 띄울때 브라우져 캐쉬를 지워보는것을 추천드립니다.
또는 포트가 제대로 닫히지 않았을 수도 있습니다. 그럴땐 taskkill 로 죽이시거나 포트를 바꿔서 실행해보시는 것도 할 수 있습니다.
저는 겪어 보질 못해서 모르겠네요. 아마 다른 문제가 아닐가 싶습니다만..
드디어 .. 드디어 ..!!
옹 요즘 학교 일이 바빠서 시간이 없는데 여유 생기면 이것도 몰아 봐야겠네요 ㅋㅋ
시작해보겠습니다!
감사합니다! 열심히 공부할게요
뜬금없이 죄송합니다만, 혹시 화면에서 손글씨 쓰는것처럼 하는 툴은 어떤거 추천하시나요?
타블렛 PC를 씁니다.
감사합니다! 잘 보겠습니다.!
소리좀 키워주세요 ㅠ
감사합니다 잘보겠습니다!!!
깊게 알려주셔서 좋네요
헝헝헝 열심히 볼께유
감사합니다!
터커님, 좋은 강의 감사드립니다!
강의 중 궁금한게 있는데요.
예전에는 서버사이드에서 전부 렌더링 해주는 방식이였는데
요즘엔 클라이언트 렌더 방식이라고 하셨잖아요.
그게 서버 사이드 부하를 줄이기 위해서 인가요? 그럼 클라이언트도 마찬가지로 동적 데이터 처리하면서 렌더링 하기 위해
자원이 들텐데, 왜 그렇게 바뀌었는지 궁금합니다.
여러가지 이유가 있습니다. 첫번째로는 반응성이 좋아집니다. 서버가 페이지를 모두 그리면 느리기 때문에 틀만 빠르게 보내고 내용은 동적으로 채워나가는 방식이라 기본틀을 사용자에게 빠르게 보여줄수 있습니다. 유튜브도 보시면 빠르게 틀을 그리고 내용은 동적으로 업데이트 되는걸 보실수 있습니다. 두번째로 부하 분산입니다. 서버에 부하가 집중되는 것보다 클라로 분산되는게 서버 유지에 도움이 되기 때문입니다. 세번째로 가능해진 면이 있습니다. 어떻게 보면 기술이 선도했다고 볼수 있는데, 예전 웹 기술 ASP.NET 이나 PHP 같은 경우 서버 렌더링 방식이었는데 jQuery 가 나오면서 동적 렌더링이 가능해진 면이 있습니다. 마지막으로 서버리스 방식이 가능해졌습니다. 이건 동적 렌더링이 보편화되고 나서 변화된 양상인데 이제 서버가 하는 일은 틀 제공과 내용을 채울 데이터 제공으로 나눠지게 되고, 이제 웹서버가 데이터만 전문으로 제공하는 웹서버 기능이 더 강화되었습니다. 그럼으로써 각 데이터별로 별도 서버가 가능해지고, 또 서버의 역할이 요청시 그에 맞는 데이터를 주는 방식으로 변화되다 보니, 항시 동작하는 서버에서 그때그때 반응하는 서버로 변화되면서 AWS Rambda 같은 서비스를 이용해서 서버 없는 서버가 가능해지게 되었습니다.
@@TuckerProgramming 기술 트렌드에 의한 변화가 일어나고, 그 변화가 서버 부담을 줄여주니 그렇게 됐다고 이해하겠습니다. ㅎㅎ 그나저나 오랜만의 좋은 강의 정말 감사드려요. 항상 기초 하고 웹 같은거 해 볼 만한 프로젝트가 있나 궁금했는데 정말 최적의 강의입니다! 물론 옛날거 다 까먹어서 인터페이스 다시 공부해야하네요 ㅎ
제일궁금한거닷
정말감사합니다 ㅠㅠ
터커님 강의 잘 보고 있습니다. 혹시 개인적인 공부 목적으로 강의 내용들 블로그에 정리하고 싶은데 가능할까요?
저야 좋지요. 동영상 퍼가기로 올리시면 됩니다.
@@TuckerProgramming 아 네 감사합니다. 글이나 이미지로 제가 정리해서 올릴려구요
타커님 제가 vs code 를 사용해 .go 파일을 컴파일 할려 해도 애러가 뜹니다.
그래서 ide를 이클립스로 바꿨는데 타커님은 go버전하고 vs code go 플러그인 버전하고, vs code 버전이 몇인가요?
이클립스가 자동완성기능이 좀 떨어져서요
HandleFunc을 사용하는 이유가 궁금합니다.
질문 의도를 잘 모르겠습니다. HandleFunc 는 Go http 패키지가 동작하는 방식입니다. Go http 패키지를 사용해서 웹서버를 만드실려면 HandleFunc 형태로 사용하셔야 합니다.
@@TuckerProgramming
질문이 너무 두서없이 드렸네요.
Go로 서버를 구축하면
package main
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello World")
})
http.ListenAndServe(":3000", nil)
이렇게 구축 되었을 때
http.HandleFunc를 사용하는 이유에 대해 궁금해졌는데 알고 싶습니다.
HandleFunc은 어떤 Handler를 등록하는 것이고,
어떤 경로에 해당하는 Request가 들어 왔을 때 어떤 일을 할 것인지 그 Handler를 등록하는 Function라는 것과
여기서는 초기경로인 "/"에 대한 Request가 왔을 때 어떤 일을 할 것 인지 지정한 것이라는 것과
실제로 Handler는 ServeHTTP라는 함수 하나를 가지고 있는 인터페이스로
type Handler interface {
ServeHTTP(ResponseWriter, * Request)
}
형태로 이루어져 있다는 건 알겠는데
안드로이드에서는 쓰레드 때문에 쓰는 것으로 알고 있는데
왜 Go에서는 HandleFunc을 사용하는지 궁금합니다.
@@cbs8727 그러니까 정리하자면 인터페이스를 써도 되는데 http.HandleFunc을 왜 쓰는가 이건가요? http.ListenAndServe 에서 핸들러를 직접등록해도 되고 http.HandleFunc로 하셔도 됩니다. 두개다 가능합니다. 여긴 첫번째 강의로 HandleFunc를 썼는데 뒷강의에는 핸들러를 등록하는 예제들을 넣었습니다. 안드로이드는 제가 안써봐서 잘모르겠네요. 근데 이건 웹클라이언트가 아니라 웹서버를 만드는 내용이라서 안드로이드에서 돌릴 일은 없을것 같습니다.
기다리고 있었습니다ㅎㅎ잘 보겠습니다.
그런데 저는 처음에 "/" 경로에 핸들러를 등록한 이후에 "/bar"라든지 "/foo"를 등록하고 나서 로컬서버에서 변화를 확인할 수 없는데 무엇이 잘못된 것일까요? 코드는 100% 일치하고 디버깅 없이 run했을 때도 오류 없이 수행됩니다.
자문자답입니다. 서버를 다운시킨 이후 다시 빌드해야 변경사항이 적용되는군요. 맥os기준으로 터미널에서 ctrl+C를 누르면 서버가 다운됩니다.
안녕하세요 저도 같은문제인거 같은데 윈도우인데 혹시 어떤방식으로 검색해야 해결 할 수 있을까요 ㅠㅠ
밑에 보이는 언리얼 엔진!
우왕
2021.01.04 시작
func (w http.ResponseWriter, r *http.Request)
여기에서 http.Request 는 왜 포인터 인가요?
책 구매후 열공 중입니다. 이거 이해 못하고 있습니다.
좋은 질문입니다. 책을 사셨다니 책의 뒷부분의 "생각하는 프로그래밍" 편에 값타입과 포인터타입의 차이점에 대해서 적어뒀습니다.
이것을 이해하시기 위해서는 "인스턴스"라는 개념이 필요합니다.
th-cam.com/video/wf_Vjg4oWz4/w-d-xo.html 여기에 인스턴스에 대해서 설명했습니다.
ResponseWriter는 값타입이고 r 은 포인터 타입으로 사용하였죠. 웹핸들러는 중간에 여러 단계를 거쳐서 전달할 수 있는 구조를 가지고 있습니다.
이것을 미들웨어라고 하는데요, 예를 들면 요청된 값을 압축 해제하거나 암호를 복호화 한 다음에 실제 핸들러로 연결할 수 있습니다.
그러면 이들 미들웨어 레이어를 거치면서 실제 요청값을 변화시킬 필요가 있습니다.
즉, 압축을 해제한 다음 압축 해제된 요청으로 바꿔줄 필요가 있는 거죠.
그래서 하나의 인스턴스를 유지하면서 요청을 전달하기 위해서 포인터 타입을 사용한 것으로 생각됩니다.