스프링 클라우드 게이트웨이 (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..
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)란? 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. 람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환형식, 발생할 수 있는 예외 리스트는 가질 수 있다. 람다는 다음과 같은 특징을 가지고 있다. 익명 : 보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다. 구현해야 할 코드에 대한 걱정거리가 줄어든다. 함수 : 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함한다. 전달 : 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. 간결성 : 익명 클래스처럼 많은 자질구례 한 코드를 구현할 필요가 없다. 람다는 세 부분으로 이루어진다. ..
배경 어떤 상황에서 일을 하든 소비자 요구사항은 항상 바뀐다. 변화하는 요구사항은 소프트웨어 엔지니어링에서 피할 수 없는 문제다. 이렇게 시시각각 변하는 사용자 요구사항에 어떻게 대응해야 할까? 특히 우리의 엔지니어링적인 비용이 가장 최소화될 수 있으면 좋을 것이다. 그뿐 아니라 새로 추가한 기능은 쉽게 구현할 수 있어야 하며 장기적인 관점에서 유지보수가 쉬워야 한다. 동작 파라미터화(behavior paramterization)를 이용하면 자주 바뀌는 요구사항에 효과적으로 대응할 수 있다. 동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다. 이 코드 블록은 나중에 프로그램에서 호출한다. 즉, 코드 블록의 실행은 나중으로 미뤄진다. 변화에 대응하는 코드를 구현하는 것은 어..
Runtime Data Area 런타임 데이터 영역(Runtime Data Area)은 실제 클래스 파일이 적재되는 곳으로 JVM이 OS로 부터 자바 프로그램 실행을 위한 데이터와 명령어를 저장하기 위해 할당받는 메모리 공간이다. 메소드 영역 가장 먼저 데이터가 저장됨 클래스 로더에 의해 로드된 클래스, 메소드 정보와 클래스 변수 정보 저장 클래스 변수 남발 시 메모리 공간 부족할 수 있음 Java 7의 경우 부족할 수 있었으나 Java 8부터는 개선됨 프로그램 시작부터 종료될 때까지 메모리에 적재 명시적 null 선언 시 GC가 청소 모든 스레드가 공유함 힙 영역 런타임 시 결정되는 참조 자료형이 저장됨 런타임 시 결정됨에 따라 동작 중의 문제(범위 초과 참조 등)가 발생할 코드임에도 문법의 문제는 아..
JPA를 사용하는데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다. JPA는 다양한 매핑 어노테이션을 지원하는데 크게 4가지로 분류할 수 있다. 객체와 테이블 매핑 : @Entity, @Table 기본 키 매핑 : @Id 필드와 컬럼 매핑 : @Column 연관관계 매핑 : @ManyToOne, @JoinColumn 객체와 테이블 매핑 @Entity JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야한다. 속성 name : JPA에서 사용할 엔티티 이름을 지정한다. 보통 기본값인 클래스 이름을 사용한다. 만약 패키지에 이름이 같은 엔티티 클래스가 있다면 이름을 지정해서 충돌하지 않도록 해야 한다. 주의사항 기본 생성자는 필수다(파라미터가 없는 public 또는..