spring boot project를 docker image로 만들 때 jib build를 사용한다. mvn -B -U clean deploy jib:build multi module project인 경우 전체 모듈 중 일부만 jib build 할 대상이 될 것이다. 이런 경우 -pl 옵션으로 대상 모듈을 따로 지정하여 jib build 하게 된다. 이 경우 다음과 같이 명령이 나뉜다. mvn -B -U clean deploy mvn -B -pl 모듈1,모듈2 jib:build 이 설정으로도 문제없이 동작하지만 모듈이 추가되거나 삭제될 경우 위의 ci 설정도 매번 변경해주어야 한다. 좀 더 나은 방법으로 package 시 jib build도 같이 수행해 주도록 설정을 할 수 있다. https://gith..
소개 https://docs.spring.io/spring-session/reference/index.html Spring Security를 사용하여 로그인을 하면 기본 설정이 세션 정보를 해당 application의 ConcurrentMap에 들고 있게 된다. 단일 서버가 아닌 여러 대의 서버로 운영하고 있다면 세션 정보를 여러 서버가 같이 공유할 수 있어야 한다. Spring Session은 사용자의 session 정보를 공유하기 위한 API 및 구현체를 제공한다. Spring Session은 Redis, JDBC, Hazelcast, MongoDB에 대한 모듈을 제공한다. (Apache Geode는 문서에 따로 나와 있는데 왜 에 대한 지원은 3.0.0에 보이지 않았다.) 이 글을 작성하는 당시(2..
thymeleaf도 하도 오래간만에 보니 새로 배우는 느낌이어서 정리하면서 써보려고 한다. FE, BE가 완전히 분리되지 않는다는 게 단점이지만 반대로 보면 Thymeleaf가 BE와 연동이 매우 쉽다는 것이 장점이기도 하다. Spring Boot에서 Thymeleaf 사용하기 기본 사용 Spring Boot에서 Thymeleaf를 사용하려면 다음 dependency를 추가하면 된다. org.springframework.boot spring-boot-starter-thymeleaf 이 dependency를 추가하면 Spring Boot AutoConfigure는 Thymeleaf를 사용할 수 있는 기본적인 설정을 제공해 준다. 현재 spring-boot-starter-thymeleaf는 thymeleaf..
소개 Spring Boot Actuator까지 설정하고 Actuator의 내용을 /actuator/* 주소를 호출하여 확인하는 것까지 진행하였었다. 각각의 application을 일일이 조회하여 확인하는 것은 가장 단순한 방법이고 여러 application의 상태를 한 곳에서 모니터링하는 것이 좋다. metric 정보를 수집하여 관리하는 방법은 다양하다. 유료로 제공하는 경우도 있고 오픈 소스로 사용하기 좋은 것도 많다. Spring Boot Admin는 오픈소스로 로그를 따로 저장하지 않고 단순하게 조회할 때마다 현재 상태를 확인할 수 있는 UI를 제공해 준다. Spring이 제공하는 공식 오픈소스는 아니고 codecentric에서 제공하는 오픈 소스이다. https://github.com/codece..
소개 Spring Boot Actuator는 application을 모니터링하고 관리하는데 도움이 되는 여러 추가 기능을 제공한다. Http endpoint나 JMX를 통해 application을 관리하고 모니터링할 수 있다. auditing, health 및 metric 수집을 application에 자동으로 적용한다. Spring Boot Actuator에 대한 안내는 document의 Production-ready Features 섹션으로 안내되고 있다. https://docs.spring.io/spring-boot/docs/current/reference/html/index.html https://docs.spring.io/spring-boot/docs/current/reference/html/a..
개인적인 공부를 진행한 과정을 정리한 내용입니다. 구성 개요 MSA로 유저 정보를 제공하는 security api 서버와 그걸 사용하는 서버를 구성하려고 한다. 두 서버 모두 Spring Security를 사용하지만 security api를 제공하는 서버는 외부에 노출되지 않는다는 전제 조건으로 응답을 하고 사용하는 서버는 앞단 웹 서버라고 가정해 본다. 별도로 구성하지 않고 되도록 Spring Security의 기본 설정을 사용한다고 가정해서 진행한다. 서버 구성은 다음과 같다. security api server - api 서버, 인증 정보를 저장/응답하는 역할 담당 gate server - 호출하여 인증을 처리하는 서버 제공하려는 기능은 다음과 같다. 일반적인 user password를 사용한 로그..
Spring Cloud OpenFeign 소개 eureka에 여러 application이 등록되었으면 이제 이 정보를 사용하여 호출을 할 수 있게 된다. msa를 사용하게 되면 각 서버들 간 호출의 종속성을 끊어 사용할 수 있다. 도메인도 마찬가지인데 이렇게 끊어놓은 각 서버 간 호출을 매번 restTemplate을 사용하여 작성하면 작성하는 것도 일이고 유지보수 하는 것도 일이다. https://github.com/OpenFeign/feign OpenFeign을 사용하면 api 호출 설정을 간소화하여 interface 선언만으로 호출을 관리할 수 있게 된다. 이런 방식을 선언적 웹 서비스 클라이언트(declarative web service client)라고 한다. Feign은 Neflix OSS 프로..
Eureka 소개 msa를 구성하면 각 application은 서비스 상황에 따라 트래픽이나 부하가 증가할 경우 인스턴스를 추가로 생성하거나, 반대로 트래픽이나 부하가 감소할 경우 인스턴스를 줄이는 등 microservice에 대한 개별 관리를 하게 되고 이러한 확장과 축소를 수동이 아닌 자동으로 처리를 하여 빈번하게 변화하게 된다. 수시로 변하는 환경을 감지하고 로드 밸런싱을 할 수 있어야 각 msa 간 연계를 관리할 수 있다. 이렇게 동적으로 변하는 환경을 감지하기 위해 Service Discovery 기능을 제공하는 것이 Eureka Server이다. 각 application은 Eureka Client를 통해 Eureka Server로 스스로의 정보를 전달한다. Eureka Server는 이렇게 전..
Spring Boot 2.7.8로 업그레이드하는 경우 mysql-connector-java 의존성을 찾지 못해 에러가 발생하는 것을 볼 수 있다. 이는 Spring Boot 2.7.8의 dependency management에서 더 이상 mysql-connector-java를 관리하지 않기 때문이다. https://github.com/spring-projects/spring-boot/releases/tag/v2.7.8 기존 mysql:mysql-connector-java의 groupId가 "mysql" 단일 단어로 이루어진 채 오래 동안 유지된 레거시 형태인데 이를 reversed domain의 형태인 "com.mysql"로 변경을 하기 위해서라고 한다. https://blogs.oracle.com/my..
Spring Framework web의 기존 에러 처리 기존 Spring Framework를 사용하여 웹을 구현하면 기본적으로 제공되는 에러 처리를 사용한 에러 응답 결과는 다음과 같은 형태였다. { "timestamp":1417379464584, "status":400, "error":"Bad Request", "exception":"org.springframework.web.bind.MethodArgumentNotValidException", "message":"Validation failed for argument at index 0 in method: public org.springframework.http.ResponseEntity test.UserController.testUser(test.U..