전체 글 (82) 썸네일형 리스트형 [웹 관련] CORS 에러, 더 이상 두렵지 않아! Simple vs Preflight 웹 프론트엔드 개발을 하다가 API를 호출했는데, 브라우저 콘솔에 빨간 글씨로 나타나는 공포의 메시지를 본 적 있으신가요?ACCESS TO FETCH AT 'HTTPS://API.EXAMPLE.COM/DATA' FROM ORIGIN 'HTTPS://MY-AWESOME-SITE.COM' HAS BEEN BLOCKED BY CORS POLICY...이 CORS 에러는 우리를 좌절하게 만들지만, 사실은 우리를 지켜주는 고마운 '보안 요원'입니다. 이 보안 요원이 어떻게 일하는지, 그리고 Simple 요청과 Preflight 요청은 무엇인지 제대로 이해하면 더 이상 CORS 에러가 두렵지 않을 겁니다. 시작하기 전에: CORS는 왜 필요할까? - SOP 이야기 CORS를 이해하려면 먼저 브라우저의 기본 보안 정.. [k8s] 서버는 몰라도 괜찮아! 개발자를 위한 k8s 첫걸음 요즘 개발자에게 "코드를 작성하는 것"은 시작에 불과할 때가 많습니다. 내가 만든 애플리케이션이 어떻게 배포되고, 어떻게 사용자에게 서비스되는지 이해하는 것이 점점 중요해지고 있죠. 그 중심에는 바로 **쿠버네티스(Kubernetes)**가 있습니다."k8s", "컨테이너 오케스트레이션" 등 어려운 용어 때문에 지레 겁먹기 쉽지만, 사실 쿠버네티스는 개발자가 인프라 걱정 없이 개발에만 집중할 수 있도록 도와주는 아주 고마운 도구입니다.이 글에서는 복잡한 관리자의 관점이 아닌, 서비스를 만드는 개발자의 관점에서 쿠버네티스의 핵심 개념들을 알기 쉽게 풀어보겠습니다. 거대한 '오피스 빌딩'을 하나 짓는다고 상상해보세요. 모든 것이 훨씬 간단해질 겁니다. 클러스터, 노드, 네임스페이스, pod 이렇게 4가지 키.. [아키텍처] 스토리지 vs 데이터베이스, 아직도 헷갈리시나요? "우리 서비스 데이터는 S3(오브젝트 스토리지)에 저장하고, 사용자 정보는 RDS(데이터베이스)에 저장해요."IT 업계에 있다 보면 '스토리지'와 '데이터베이스'라는 단어를 매일같이 듣게 됩니다. 두 단어 모두 '데이터를 저장한다'는 공통점 때문에 많은 분들이 그 차이를 모호하게 알고 있거나, 심지어 같은 것이라고 생각하기도 합니다.데이터베이스 서버는 물리적으로 특별한 기계일까요? 스토리지가 있는데 왜 굳이 데이터베이스가 필요할까요? 오늘, 이 모든 궁금증을 '거대한 창고'와 '체계적인 도서관'이라는 비유를 통해 명확하게 풀어보겠습니다. 스토리지(Storage) - 데이터를 '보관'하고 '입출고'하는 거대한 창고 먼저 스토리지의 세계로 들어가 보죠. 스토리지를 한마디로 정의하면 데이터 자체의 내용이나 의.. [서버 아키텍처] 내 서비스 지켜 - GSLB와 DNS Round Robin 파헤치기 안녕하세요! 대규모 서비스를 운영하다 보면, 한 곳의 데이터센터에만 서버를 두는 것은 위험합니다. 데이터센터 한 곳에 정전이나 네트워크 장애가 발생하면 서비스 전체가 멈춰버리는, 이른바 단일 장애점(SPOF)이 되기 때문이죠.그래서 많은 서비스들은 서울과 부산, 혹은 미국 동부와 서부처럼 지리적으로 떨어진 여러 데이터센터에 동일한 서버를 복제하여 배포하는 다중화(Redundancy) 구성을 합니다.여기서 한 가지 질문이 생깁니다. "사용자가 도메인에 접속할 때, 서울 서버로 보낼지, 부산 서버로 보낼지 우찌 결정할 수 있을까요?"이 문제를 해결하는 대표적인 기술이 바로 DNS Round Robin과 GSLB(Global Server Load Balancing)입니다. 1. 가장 간단한 방법: DNS .. [GoLang] Go 언어의 상속? 아니, '임베딩'에 대하여 Java, C++, Python 같은 객체 지향 언어에 익숙한 개발자들이 Go를 처음 접할 때 가장 당황하는 것 중 하나는 '상속(inheritance)' 키워드가 없다는 점입니다. "그러면 코드 재사용은 어떻게 하고, 타입은 어떻게 확장하라는 거지?" 라는 질문이 자연스럽게 따라옵니다.Go는 '상속보다 조합(Composition over Inheritance)'이라는 고전적인 설계 원칙을 언어적으로 풀어낸, 아주 우아하고 실용적인 기능인 **임베딩(Embedding)**을 제공합니다. 이번 포스트에서는 Go의 임베딩이 무엇인지, 어떻게 사용하는지, 그리고 왜 상속과 다른지에 대해 자세히 알아보겠습니다. 임베딩(Embedding)이란? - 이름 없는 필드의 마법Go에서의 임베딩은 한 구조체 안에 다른 구.. [GoLang] 함수와 메서드, 완벽히 파헤치기 (feat. 값 vs 포인터 리시버) 안녕하세요! Go 언어를 처음 배울 때, func 키워드는 여기저기서 보이는데 어떤 건 '함수'라고 하고 어떤 건 '메서드'라고 해서 헷갈릴 때가 있습니다. 저 또한 그랬습니다. 특히 다른 객체 지향 언어(Java, Python 등)의 클래스에 익숙하다면, 데이터(필드)는 struct 안에 정의하는데 왜 행동(함수)은 밖에 따로 정의해서 연결하는지, 그리고 왜 어떤 메서드는 (t T) 이고 다른 메서드는 (t *T) 인지 궁금증이 생깁니다.이번 포스트에서는 그 궁금증을 해결하기 위해, 제가 이해한 내용을 바탕으로 Go의 함수와 메서드의 차이, 그리고 값/포인터 리시버의 핵심적인 차이점을 명확하게 정리해보려고 합니다. 1. 기본 단위, '함수(Function)'Go에서 함수는 특정 타입에 소속되지 않은, .. [GoLang] Select, Reflection, Sync, Context SelectHTTP GET으로 두개의 URL을 가지고 먼저 반환된 URL을 반환하여 "경쟁"하는 SebSiteRacer라는 함수를 만들어야 한다고 하자. 10초 이내에 반환되는 항목이 없으면 오류를 반환해야 함. 어떻게 해야할까? => 경쟁을 하게끔 하려면 고루틴을 쓰되 채널링을 안 쓰면 되지 않을까 싶음.1 http 관련 네트워크 통신을 써야 하므로 net/http 라이브러리를 쓰면 될 것이고2 net/http/httptest를 통해 테스트를 하면 될 것. 우선 이를 테스트 하기 위해서 테스팅 함수부터 만듦. 아래의 함수는 분명 완벽하지 않으나, 예제들에서 지속적으로 강조하는 건 "완벽하지 않은 코드를 짜라. 완벽 추구했다가는 내일이 되도 못 짠다"는 거다. 무조건 일단 짜고 보라는 것.package .. [GoLang] 포인터와 맵, 의존성 주입, 동시성 포인터코딩 처음 짤때 배우고 이후에 쓸 일이 솔직히 잘 없었는데, 다시 돌아왔음. 아래와 같은 코드가 있다고 하면func TestWallet(t *testing.T) { wallet := Wallet{} wallet.Deposit(10) got := wallet.Balance() fmt.Printf("address of balance in test is %v \n", &wallet.balance) want := 10 if got != want { t.Errorf("got %d want %d", got, want) }}func (w Wallet) Deposit(amount int) { fmt.Printf("address of balance in Dep.. 이전 1 2 3 4 ··· 11 다음