들어가며 프로젝트를 진행하면서 프론트엔드 개발자분들이 API가 안 돼요!! 하지만 프론트엔드와 백엔드 코드 모두 문제가 없어 보이는 경우가 이따금 있었다. 에러문을 자세히 보면 localhost에서 해당 링크에 접근하는데 CORS policy에 의해 blocked 되었다고 나온다. 여기서 CORS란 무엇이고 어떤 이유로 우리를 이렇게 고생시키는 걸까? CORS란? CORS는 함축 단어로 풀어보면 Cross-Origin Resource Sharing이라는 단어로 이루어져 있다. 이 문작을 직역 하면 "교차 출처 리소스 공유 정책"이라고 해석할 수 있는데, 여기서 교차 출처라고 하는 것은 (엇갈린) 다른 출처를 의미한다. 여기서 출처란 어떤 것을 의미하는지 간단하게 살펴보자 출처(Origin)란? 우리는 어..
들어가며 Spring Cloud Gateway를 공부하던 중 SCG는 Spring webFlux로 동작한다는 사실을 알게 되었다. 그럼 Spring webFlux가 뭐지? Spring webFlux는 Spring 5에서 새롭게 추가된 모듈로 client, server에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈이라고 한다. non-blocking에 reactive stream을 지원하며 Spring MVC의 Tomcat과 달리 Netty를 사용한다고 한다. Netty의 공식홈페이지에 가면 다음과 같이 설명하고있다. Netty는 유지 관리 가능한 고성능 프로토콜 서버 및 클라이언트의 신속한 개발을 위한 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크입니다. 비동기(async), non..
스프링 클라우드 게이트웨이 (Spring Cloud Gateway) Spring Cloud Gateway는 API Gateway 중 하나이다. [MSA] API Gateway API Gateway란? MSA는 여러 개의 프로젝트를 분리한다. 그럼 모든 요청에 대한 동일한 처리를 해야 할 때는 어떻게 해야 할까? API의 모든 요청에 대한 로그 파일을 만들고 싶다. 모든 요청에 대해 인 brightstarit.tistory.com 다시 말해, Spring Reactive 환경에 구현된 API Gateway다. API Gateway의 구현체로는 Spring Cloud Gateway를 제외하고도 Zuul과 AWS API Gateway 등이 있다. 다만, 차이점에서 볼 수 있는 것처럼 Spring Cloud G..
API Gateway란? MSA는 여러 개의 프로젝트를 분리한다. 그럼 모든 요청에 대한 동일한 처리를 해야 할 때는 어떻게 해야 할까? API의 모든 요청에 대한 로그 파일을 만들고 싶다. 모든 요청에 대해 인증 및 권한을 부여하고 싶다. 들어온 요청을 적절한 서버에 전달하고 싶다. 위와 같은 문제를 해결하기 위해 등장하는 것이 바로 API Gateway이다. API Gateway의 동작방식 해당 구조는 Spring Cloud Gateway의 플로우인데, 이는 API Gateway의 한 종류이다. API Gateway는 하나의 모든 클라이언트의 요청이 하나의 서버로 들어와 해당 서버에서 요청이 정제되거나 조작되어 각자 목적에 맞는 서비스를 찾아가도록 도와준다. 또한 각 서버에서 적절한 로직을 수행한 뒤..
Spring Cloud Netflix Eureka Spring Cloud Netflix Eureka는 Client-Side discovery 방식의 Service Discovery중 하나이다. [MSA] Service Discovery Service Discovery란? MSA와 같은 분산 환경에서의 동작은 서비스 간의 원격 호출(API 호출)로 구성되며, 원격 호출은 각 서비스의 ip 주소와 port를 기반으로 요청된다. 클라우드 환경에서는 서비스가 aut brightstarit.tistory.com Service Discovery의 기능은 크게 2가지이다. 등록 : microservice를 사용할 수 있도록 등록해준다. 검색 : Api Gateway 혹은 라우터에게 그 서비스들을 알려주도록 검색하는 ..
Service Discovery란? MSA와 같은 분산 환경에서의 동작은 서비스 간의 원격 호출(API 호출)로 구성되며, 원격 호출은 각 서비스의 ip 주소와 port를 기반으로 요청된다. 클라우드 환경에서는 서비스가 autoScaling 등에 의해 동적으로 생성되거나, 컨테이너 기반의 배포로 인해서 서비스의 ip가 동적으로 변경되는 일이 잦아졌다. 이러한 변경은 클라우드에서 일어난 것이기 때문에 동적으로 변하는 ip를 수동으로 대응할 수는 없다. 때문에 클라우드 환경에서는 서비스 클라이언트가 서비스를 호출할 때, 서비스의 위치(ip 주소와 port)를 알아낼 수 있는 기능이 필요하다. 이것을 바로 Service Discovery라고 하며, 이를 구현하는 방법으로는 크게 Client Side Disco..
스트림(Stream)이란? 스트림(Stream)은 자바8 API에 새로 추가된 기능이다. 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 또한 스트림을 이용하면 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. 스트림은 소프트웨어 공학적으로 다음의 다양한 이득을 준다. 선언형으로 코드를 구현할 수 있다. 루프와 if 조건문 등의 제어 블록을 사용해서 어떻게 동작을 구현할지 지정할 필요 없이 '저칼로리의 요리만 선택하라' 같은 동작의 수행을 지정할 수 있다. filter, sorted, map, collect 같은 여러 빌딩 블록 연산을 연결해서 복잡한 데이터 처리 파이프라인을 만들 수 있다. 여러 연산을 파이프라인으로 연결해도 여전히 가독성과 명확성이 유지된다. ..
람다(Lambda)란? 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. 람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환형식, 발생할 수 있는 예외 리스트는 가질 수 있다. 람다는 다음과 같은 특징을 가지고 있다. 익명 : 보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다. 구현해야 할 코드에 대한 걱정거리가 줄어든다. 함수 : 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함한다. 전달 : 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. 간결성 : 익명 클래스처럼 많은 자질구례 한 코드를 구현할 필요가 없다. 람다는 세 부분으로 이루어진다. ..