본문 바로가기

Develop

(317)
[MSA] Service Discovery 이전에 config server,client에 대한 간략 구성을 했다. 이와같이 한개의 application.yml을 통해서 서버 구성을 하는 것이아니라 별도로 파일로 가지고있고, config server는 이 파일들을 client들에게 전달, client는 서버에게 요청하여, 이 파일을 받고세팅, 새로고침이 필요하다면 액츄에이터를 활용해서 새로고침하였다. Service Discovery? 서로 다른 서버에서 호스팅 되는 여러 서비스로 구축되어 서로 커뮤니케이션한다. 서비스를 사용하기 위해서 정상 서비스 중인 인스턴스에 대한 서비스 탐색이 필요하다. 어떤 인스턴스를 사용할건지, 인스턴스가 증가하면 어떤 로드 밸런싱 기준으로 어떤 인스턴스로 갈 것인지까지 정하는 것이 중요하다. Netfilx OSS에서 제..
[MSA] Spring Cloud Config Spring Cloud Config 가 필요한 이유 Microservice에 대한 변경 반영 및, 각 구성별로 다른 환경정보들을 가지고 있어야 한다. 각각의 마이크로서버들은 이 config를 적용해서 사용한다. MicroService의 각각 구성에 대한 공통된 config 파일이라고 보면된다. config server 를 pom.xml에 의존성을 추가해준다. 이 서버에서 읽을 서버정보를 외부 git에 저장해놓고, configServer는 이 정보를 읽어서 사용한다. 어떻게 읽어오는지 체크해보자 위 처럼 설정하고 서버 기동, url 호출하면, 해당 파일의 정보를 받을 수 있다. 깃에서 파일 환경에 대한 정보를 가져오는데, 깃에서 변경하고, 실시간 반영을 바란다면? 액츄에이터를 사용하고, refresh엔드포..
[MSA] MSA 구조의 이해 MSA 구조의 장점, 단점에 대한 정리 개인적인 생각으로는 기술이 급변하고 계속해서, 빠른 서비스를 위한 기술들이 나옴에 따라 MSA로 변경하는 것은 좋다. 예를들어서, 신기술과 이전기술의 속도 차이가 3초이상난다고한다면 특정 트래픽이나 성능효과를 받을 수있는 서비스 모듈을 변경해야하는데 모놀리틱한 아키텍쳐인경우 전체 변경을 해야한다는 단점이 있어, 변경 비용이 크다. 물론 MSA도 단점이 있지만 추후 확장성을 고려하였을때, 해당으로 변경하는 것은 아주 중요하다고 생각한다. API GateWay : 대표적으로 Zuul, Spring Cloud Gateway 가 존재한다. 서로 동작하는 방식이 다르다. 이외 MSA에서 지목되는 단점들을 커버하기 위한 기술들이다.
[Spring] initBinder initBinder는 컨트롤러 레벨에서 들어오는 요청에 다양한 설정이 가능하다 WebDataBinder를 파라미터로 받는 메소드를 사용하고, 특정 컨트롤러 단에서 바인딩이나, 검증 설정을 변경하고 싶을때 사용한다. @InitBinder(“Event”) 요로케 쓰면 Event객체에 대해서만 가능하다 추가로, webDataBinder를 통해서, 커스텀 에디터(특정 날짜필터)등록이 가능하다 만약에 , id에 대한 바인딩을 막고싶다면, 해당 과 같이 선언하게 되면 바인딩은 Null로 잡히게된다. 만약에 특정 객체에 대해서 검증에 대한 벨리데이션을 추가하고싶다면, support에 정의하고 validate에서 사용하면된다. 그리고 이닛바인더에서, event로 한정하고 벨리데이터를 추가하면된다. 벨리데이터를 빈으로 ..
[Spring] SessionLocaleResovler 다국어 처리에 대한 값을 지정할 수있다. 예를 들면, Session에 로케일 정보를 넣을수 있는데 이런식으로 사용할 수 있다. 스프링 5부터는 LocaleResolver이라는 인터페이스를 사용할 수 있다. 구현체로는 SessionLocaleResolver 가 있는데 이는 httpsession에 locale정보를 저장한다. 컨트롤러에서 직접 세션에 로케일 정보를 넣어줄 수도있지만 인터셉터로 이를 구현할 수 도있다. 단, 인터셉터로 이를 구현할때는, 파라미터로 언어값을 넘겨줘야한다. 이런식으로 인터셉터에 대한 빈 선언과, 인터셉터에 추가를 해준다. 메시지 파일은 이렇게 basenames라는 이름으로, message.messageSource로 하게되면, 기본 이름이 된다. 이는 다국어에 필요한 파일이 50개라..
[Spring] HandlerInterceptor prehandle, posthandle, afterCompletion Filter의 경우, DispatcherServlet이 실행되기 전에 수행되므로, Spring Context에 접근하기 어렵다. 하지만 인터셉터의 경우는, Dispatcher수행 이후에 실행이된다 따라서, Spring Context에 용이하게 접근할 수 있다. Spring 에서 작성위치는 servlet-context에 작성한다. Spring boot에서는 WebMvcConfigurerAdapter를 상속, 어떤 컨트롤러를 어떤 url에 매핑할지 정의 인터셉터는 handlerInterceptorAdapter를 상속 받아서 구현 (deprecated) -> HandlerInterceptor를 impl해서 사용 url 기반으로 제어한다. (..
[Springboot] logging 전략 관련 주저리... log4j -> logback 성능이 더 좋고, 메모리도 적게 사용한다. Spring profile을 사용할 수 있다. springboot starter-web에 포함 log4j -> logback -> log4j2 로 진화했다. @SLF4J는 프레임워크 대부분에서 어떤 방식으로든 구현되는 표준화된 API를 제공한다. 이 API를 통해 코드 안바꾸고, 로깅 프레임워크를 변경할 수 있다. sysout은? PrintStream 클래스의 println()의 내부구조에 동기화처리, 쓰레드당 한개만 쓸수 있다. 그래서 쓰레드하나가 쓰고있으면, 다른 쓰레드에서 Block이 걸리게된다. -정리- log4j와 같은 다양한 로깅 프레임워크에 대한 추상화 역할을 하는 라이브러리이다. 컴파일 시 하나의 로깅 프레임워크와 바..
[Spring] HandlerInterceptor HandlerInterceptor는, 특정한 URI 호출을 가로채는 역할을 한다. 이를 이용하여, 기존 컨트롤러의 로직을 수정하지 않고도, 사전이나 사후 제어가 가능하다. preHandle 지정된 컨트롤러의 동작 이전에 수행할 동작 posthandle 지정된 컨트롤러의 동작 이후에 처리할 동작 Spring MVC의 dispatcher Servlet이 화면을 처리하기 전에 동작 afterCompletion DispatcherServlet이 화면을 처리한 후에 동작 Filter 와 Interceptor의 차이는 Dispathcher Servlet이 실행된 이전이냐, 후이다의 차이다. 추가로 Filter는 웹 애플리케이션 내 동작하기 때문에 Spring context에 접근하기 어렵다. 반면 인터셉터는 스프링..