본문 바로가기

Spring

(183)
[Spring MVC] Thymeleaf - 입력 폼 이번 장에서는 타임리프의 스프링 통합 기능 중 입력 폼에 대해서 알아본다. 모든 코드는 깃 허브(링크) 에 올려두었다. 개요 타임리프는 크게 기본 메뉴얼과 스프링 통합 메뉴얼 2가지 메뉴얼을 제공한다. 타임리프는 스프링 없이도 동작하지만, 스프링과 통합을 위해 다양한 기능을 제공하며 이러한 이유로 많은 백엔드 개발자가 타임리프를 선택하고 있다. 스프링 통합으로 인해 추가되는 기능은 아래와 같다. 스프링의 SpringEL 문법 ${@myBean.doSomething()}처럼 스프링 빈 호출 지원 편리한 폼 관리를 위한 추가 속성 th:object th:field, th:errors, th:errorclass 폼 컴포넌트 기능 checkbox, radio button, List등을 편리하게 사용할 수 있는 ..
[Spring MVC] Thymeleaf - Fragment & Layout 이번 장에서는 타임리프의 템플릿 조각과 레이아웃 기능에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 내용은 강의나 공식문서에서 확인한다. 모든 코드는 깃 허브(링크) 에 올려두었다. 개요 웹 페이지를 개발할 때 페이지마다 중복되는 공통 영역들이 많이 있다. 상단 영역이나 하단 영역등등 여러 페이지에서 함께 사용하는 영역들이 있다. 이런 부분을 코드를 복사해서 사용한다면 변경 시 여러 페이지를 다 수정해야 하므로 비효율 적이다. 타임리프는 이러한 문제를 해결하기 위해 템플릿 조각(Template Fragment)과 레이아웃(Layout)기능을 지원한다. Fragment 예시 Controller @GetMapping("/fragment") public String f..
[Spring MVC] Thymeleaf - Other Function 이전 장(링크) 에서는 타임리프의 텍스트와 표준 표현식 구문에 대해서 알아보았다. 이번 장에서는 그 이외의 기능들에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 내용은 강의나 공식문서에서 확인한다. 모든 코드는 깃 허브(링크) 에 올려두었다. Attribute 타임리프는 주로 HTML 태그에 th:* 속성을 지정하는 방식으로 동작한다. th:*로 속성을 적용하면 기존 속성을 대체하며 기존 속성이 없는 경우 새로 만든다. 예제 Controller @GetMapping("/attribute") public String attribute() { return "basic/attribute"; } attribute.html 속성 설정 속성 추가 - th:attrappend..
[Spring MVC] Thymeleaf - Text & Expression 이번 장에서는 타임리프의 텍스트와 표준 표현식 구문에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 내용은 강의나 공식문서에서 확인한다. 모든 코드는 깃 허브(링크) 에 올려두었다. 개요 타임리프는 서버에서 HTML 파일을 동적으로 렌더링해주는 SSR(Server Side Rendering) 용도로 사용된다. 네츄럴 템플릿으로 순수 HTML을 최대한 유지하는 특징이 있다. 순수하다는 의미는 타임리프로 작성한 파일이 HTML을 유지하기 때문에 웹 브라우저에서 파일을 직접 열어도 내용을 확인할 수 있다는 의미이다. 또한 서버를 통해 뷰 템플릿을 거치면 동적으로 변경된 결과를 확인할 수 있다. JSP와 유사한 템플릿은 생성된 웹 브라우저를 통해 소스코드를 확인해보면 HT..
[Spring Cloud] Prometheus & Grafana 대시보드 이전 장(링크) 에서는 Prometheus와 Grafana를 설치하는 방법에 대해서 알아보았다. 이번 장에서는 Grafana에 Dashboard를 추가하여 이전보다 데이터를 더 편리하게 확인할 수 있도록 수정해본다. 모든 소스 코드는 깃 허브 (링크) 에 올려두었다. Grafana Dashboard 우리는 Grafana에 JVM(Micrometer), Prometheus, Spring Cloud Gateway 세 개의 Dashboard를 추가할 것이다. JVM(Micrometer) 부터 하나씩 추가해보도록 한다. JVM(Micrometer) Get this dashboard 확인 아래의 주소로 접속하여 Dashboard를 추가하기 위해 Get this dashboard에 나와있는 코드 번호를 확인하도록 ..
[Spring Cloud] Prometheus & Grafana 설치 이번 장에서는 우리의 서비스를 모니터링하기 위한 툴인 Micrometer에 대해서 알아본다. 모든 소스 코드는 깃 허브 (링크) 에 올려두었다. Turbine Server Turbine Server는 마이크로서비스에 설치된 Hystrix 클라이언트의 스트림 메시지를 아래와 같이 통합한다. Turbine Server는 설정 파일에 정의되어 있는 msa-service-order, msa-service-member, msa-service-delivery와 같은 Hystrix 클라이언트들의 스트림 메시지를 수집한다. 이후 Hystrix Dashboard를 통해 클라이언트로 부터 전달받은 스트림을 시각화한다. 하지만 Hystrix와 Turbine Server는 스프링 클라우드 최신 버전에는 더 이상 쓰이지 않다...
[Reactive Programming] Completable Future Spring WebFlux Series - 14 이전 장(링크) 에서는 Callback 지옥의 코드를 리펙토링하는 방법에 대해서 알아보았다. 이번 장에서는 CompletableFuture에 대해서 알아본다. 모든 코드는 깃 허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 개요 오늘은 스프링 5.0의 Reactive Streams의 바로 직전 단계이며 자바 8에 추가된 CompletableFuture에 대해서 알아본다. 우리는 지금까지 자바와 스프링의 비동기 기술에 대해서 오래된 기술부터 나름 최신의 기술까지 알아보았다. 이번 장에서는 마지막으로 CompletableFuture를 알아보면서 자바와 스프링의 비동기 기술에 대한 정리를 마무리한다. 이번 장을 이해하기 위해서는 이전에 알아보..
[Reactive Programming] Callback Hell 해결 Spring WebFlux Series - 13 이전 장(링크) 에서는 AsyncRestTemplate과 DeferredResult를 통해서 외부 API를 호출할 때 발생하는 블록킹 문제를 해결하였다. 이번 장에서는 블록킹 문제를 해결하면서 등장한 Callback Hell이라는 문제를 해결해보도록 한다. 모든 코드는 깃 허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 개요 이번 장에서는 이전에 작성한 코드에 새로운 기능을 추가하는 것이 아니라 Callback Hell을 해결하기 위하여 코드를 리펙토링 하는 시간을 가져볼 것이다. @GetMapping("/my-service/async-complex-with-logic/{idx}") public DeferredResult complexA..