일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 백트래킹
- Logback
- docker-compose
- 트리
- spring boot
- spring cloud
- BFS
- 이분 탐색
- 구간 트리
- 달팽이
- Spring Cloud Config
- 이분 매칭
- 유레카
- 플로이드 와샬
- Java
- 게이트웨이
- Zuul
- Gradle
- 스프링 시큐리티
- 구현
- 스택
- 완전 탐색
- 도커
- 다익스트라
- 비트마스킹
- 주울
- 서비스 디스커버리
- ZuulFilter
- dp
- 메모이제이션
- Today
- Total
목록spring boot (10)
Hello, Freakin world!
이번 글에서는 주울로 들어오는 url을 라우팅하는 방법에 대해 살펴보겠습니다. 1. 서비스 디스커버리를 이용한 자동 경로 매핑 유레카가 연결돼있다면 기본적으로 동작하는 방식입니다. 아무런 설정이 없다면 이 방식으로 동작합니다. 이 방식은 유레카에 등록된 서비스 ID(applciation.name)을 이용해 url을 자동 매핑합니다. 직접 확인해볼까요? application.yml server: port: 9000 # eureka eureka: instance: prefer-ip-address: true client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka # a..
Zuul 이란? 간단하게 말하자면 넷플릭스에서 제공하는 게이트웨이 오픈소스 라이브러리다. Gateway 란? 게이트웨이란 MSA에서 클라이언트에게 분산된 서비스의 단일 진입점이 되는 프록시(리버스 프록시)서버다. MSA에서 보안, 로깅과 같은 횡단 관심사를 각 서비스에 적용하려면 코드 중복해서 사용해야 된다. 이러면 유지보수하기가 힘들어지는데, 그래서 단일 진입점인 게이트웨이에 보통 구현하게 된다. 클라이언트가 여러 서비스의 물리적 주소를 알 필요 없이 게이트웨이 주소만 알면 되는것도 장점이다. 목적 이번 글에서는 간단하게 Zuul을 유레카와 연결하고, 자동 생성된 경로들을 스프링 액츄에이터에서 제공하는 엔드 포인트로 확인하면서 마무리할 것이다. 그리고 게이트웨이 아래에 연결되는 서비스들은 서비스 디스커..
스프링 이니셜라이저를 이용해 아래와 같은 의존성을 가지는 프로젝트를 생성합니다. plugins { id 'org.springframework.boot' version '2.4.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'springboot.cloud' version = '1.0.0' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } ext { set('springCloudVersion', "2020.0.1") } depend..
[Eureka] 서비스 검색하기 - DiscoveryClient [Eureka] 서비스 디스커버리에 서비스 등록하기 시나리오 간단하게 유레카 서버와 유레카에 등록되는 서비스 서버를 띄운다. 그리고 유레카 서버의 대시보드를 활용해 서비스 서버가 등록되는지 javachoi.tistory.com 이전 글에서는 인위적으로 서비스 간 통신에 DiscoveryClient 객체만 사용하도록 했다. 그로 인한 단점은 두 가지였다. 1. 로드 밸런싱 방식을 직접 구현해야 됐다. 2. 서비스 url을 직접 조립해서 약간 번거로웠다. 스프링에서 제공하는 간편한 방식으로 개선해보자. 멤버 서비스 수정 먼저 시동 클래스에 @EnableDiscoveryClient를 없앤다. import org.springframework.boo..
도커를 이용해 위 그림처럼 동일한 인스턴스로 구성된 클러스터를 만들어보자. 우선 서비스를 만들기 위해 스프링 이니셜라이저를 이용해 프로젝트를 생성. build.gradle plugins { id 'org.springframework.boot' version '2.4.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'springboot.study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spr..
[Eureka] 서비스 디스커버리에 서비스 등록하기 시나리오 간단하게 유레카 서버와 유레카에 등록되는 서비스 서버를 띄운다. 그리고 유레카 서버의 대시보드를 활용해 서비스 서버가 등록되는지 확인해본다. 유레카 서버 스프링 이니셜라이 javachoi.tistory.com 지난 글에서 서비스를 등록해봤으니 이제 서비스 검색을 구현해보자. 아키텍쳐 전체적인 아키텍쳐는 다음 그림과 같다. 각 서비스는 시작과 동시에 유레카 서버에 등록된다. 서비스끼리 서로를 호출할 때 유레카 서버가 이를 중개해 라우팅해준다. 이 때문에 각 서비스 인스턴스는 서로의 물리적인 위치를 몰라도 된다. 유레카 클라이언트는 리본을 사용해 클라이언트측 로드 밸런싱을 수행한다. 이를 위해 서비스 레지스트리를 로컬에 캐싱하고 주기적으로 유레카 ..
다음의 컨트롤러 계층의 메서드가 있다고 가정합니다. @ToString @NoArgsConstructor @Getter public class ItemCreateDto { @NotNull private String name; @NotNull private Integer price; @NotNull private Integer stockQuantity; private List details; } @PostMapping("/items") public String create(@RequestBody ItemCreateDto createDto) { System.out.println(createDto); return "created"; } 웹 POST 요청 바디의 JSON객체가 ItemCreateDto에 제대로 바..
validation 이라는 주제로 이렇게 시간을 오래 끌줄은 몰랐다. 순전히 개인적인 욕심 때문이기도 하다. 목표는 컨트롤러 메서드에서 validation 코드를 분리하는 것이었다. 처음에는 @InitBinder 메서드를 이용하는 방법을 생각했다. @InitBinder 메서드는 context로부터 WebDataBinder 인스턴스를 주입받을 수 있다. 이 인스턴스에 validator를 추가할 수 있는데, 뭔가 이상했다.(혹시 버그가 있는걸까?) validator가 호출되지 않아야하는 타입에서 자꾸 호출되면서 예외를 던졌다.(단위 테스트에서는 분명히 제대로 작동하는데도!) 자질구레한 버그들이 자꾸 생겨서 일단 이 방식은 쓰지 않기로 했다. 위 방식을 쓰지 않겠다는 말은 컨트롤러 메서드의 본문이 시작되기 이..
참조 : https://docs.spring.io/spring/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html#aop-introduction-defn Aspect : 다수 클래스를 가로지르는 관심사를 모듈화한 것이다. 객체지향에서의 클래스와 같은 개념이다. 스프링에서 aspect는 두 가지 방식으로 구현된다. - schema-based approach (xml을 기반으로 한 방식인듯? 하다) - annotation approach Join Point : 메서드가 실행되고 있는 동안의 시점을 의미한다. AOP 프레임워크의 어느 특정 기능에 대한 용어가 아니다! 예를 들어, 특정 메서드가 실행되기 전에서 끝나기 까지의 그런 시점들을 총징하는 용어다..
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest class ValuetestApplicationTests { @Value("Default") private String defaultValue; @Value("1") private int one; @Value("true") private boolean maybeTrue; @Value("${hello}"..