본문 바로가기

Java/Spring

(23)
gRPC 사용법, gRPC 예제 코드 실행해보기, 원리는 몰라도 gRPC 입문은 가능하다 (grpc java example) 이 포스트는 springcamp2017에서 grpc발표를 하신 오명운님의 발표 자료 및 github소스를 참고해서 작성한 것입니다. gPRC의 장점 service 정의가 단순하다 여러 프로그래밍 언어나 플랫폼에서 사용이 가능하다 양방향 스트리밍 데이터 처리가 가능하다 rpc의 장점으로 빠르다 grpc는 rpc프레임워크를 구글이 쉽게 사용할 수 있도록 만든 것이다. rpc는 remote procedure call로 말 그대로 원격에 정의된 프로시져를 호출하는 것이다. 원격의 프로시져를 호출하는 클라이언트 입장에서는 그 방법이 내부의 메서드를 호출하는 것과 다르지 않아서 사용이 간편하다. 이번 포스트의 핵심은 예제 소스를 돌려보면서 grpc의 기능들을 맛보는 것이 핵심이다. 따라서 gRPC의 장점이나 내부에..
자바 Enum 실무에 적용 경험 공유하기 (properties에서 enum mapping, default value 사용하기) 우아한 형제들 기술블로그의 enum과 관련된 글을 예전에 읽었는데 이번에 적용할 수 있는 기회가 생겨서 적용해봤습니다. (상세한 활용은 링크를 통해서 학습하면 좋을 것 같습니다.) Enum 어디에 적용했는가? 평소에는 static final 대신 상수로 적용해야할 값들이 있을 때 주로 사용했었다. 그런데 이번에는 똑같이 상수지만, 조금 특별하게 사용했다. 상황을 설명하면, 어떤 PUBSUB의 메세지 처리 플랫폼(ex. kafka)을 이용해야하는데, 거기에 publish할 때 쓰는 메세지의 타입이 3가지가 있고, 그 3가지중에 하나를 설정 파일에서 정의하면, 그 설정 기준으로 publish하기 전에 방식을 적용해야하는 상황이다. (결론 -> 설정 파일에 쓰인 값 적용하기) pubsub: messageTyp..
Protocol Buffer 원리로 배우는 고성능 직렬화, 역직렬화 전략! Protocol Buffer 예제 테스트(구글이 쓰는 이유가 있었네) 프로토콜 버퍼가 무엇인가 프로토콜 버퍼(Protocol Buffer = protobuf)란 직렬화 데이터 구조다. (XML, JSON과 유사) 직렬화 데이터 구조를 알려면 직렬화(Serialization)가 뭔지 알아야한다. 꽤 긴데 천천히 설명해보겠다. 우선, 컴퓨터가 데이터를 저장할 때 결국은 0과 1을 나타내는 비트(bit)로 표현해야 한다는 것을 알아야한다. 데이터를 파일에 쓰든 네트워크에 쓰든 결국에는 0과 1인 비트로 표현해야 한다. 요약하면 "데이터 표현(저장) = 바이트(1Byte = 8bit)"다. UTF-8 문자열 인코딩을 생각해보자. 만약 "hello"라는 문자 데이터를 다른 서버에 보낼 때 어떻게 될까? h,e,l,l,o 각각에 대한 인코딩을 통해 16진수로 표현하면 68(h) 65..
How does @Async work? @Async를 지금까지 잘 못 쓰고 있었습니다(@Async 사용할 때 주의해야 할 것, 사용법) @Async in Spring boot 스프링 부트에서 개발자에게 비동기 처리를 손쉽게 할 수 있도록 다양한 방법을 제공하고 있다. 대세는 Reactive stack, CompletableFuture를 쓰겠으나 역시 가장 쉬운 방법으로는 @Async annotation을 적용하는 것이다. 그래서 필자도 @Async를 비동기 작업이 필요한 메서드에 덕지덕지 발라놨으나 제대로 작동하지 않는 것을 알게 되었고 주의해야 할 내용과 잘 회피하는 방법(?)을 생각해봤다. @Async 사용법 많은 블로그에도 정리가 잘 나와있는 방법이다. 1. @EnableAsync로 @Async를 쓰겠다고 스프링에게 알린다. 2. 비동기로 수행되었으면 하는 메서드위에 @Async를 적용한다. 스프링 가이드에도 마찬가지로 설명해준다...
@Scheduled 사용법, 스케줄러 커스터마이징을 통한 제어(+스케줄러에 등록한 작업 중지하는 방법, 배치 효과, 정확한 주기 작업 사용법) @Scheduled 사용법 주기적인 작업이 있을 때 @Scheduled 애노테이션을 사용하면 쉽게 적용할 수 있다. ex) linux의 crontab 1. @EnableScheduling Annotation을 적어서 스케줄링을 사용한다는 것을 알린다. @EnableScheduling @SpringBootApplication public class SchedulerApplication { public static void main(String[] args) { SpringApplication.run(SchedulerApplication.class, args); } } 2. 하위 패키지의 클래스에서 주기적으로 수행해야할 메서드 위에 @Scheduled Annotation을 붙인다. @Scheduled(fix..
spring boot yaml 파일에 쓰기! jackson-dataformat-yaml을 이용한 방법(snakeyaml? how to write to yaml file in spring boot) Spring boot에서 yaml 파일에 쓰기 Spring boot에서 보통 application.yml 파일이나 application.properties 파일에 설정값들을 적고 @ConfigurationProperties을 이용해서 Bean으로 등록해서 사용하는 게 일반적이다. 그래서 그런지 yaml 파일에 쓰는 것은 인터넷에 많이 안 나온다. 아래에서 아주 간단하게 써볼 예정이다. 필자가 yaml 파일에 쓰는 것을 생각하게된 이유는 서버 애플리케이션 운영 중에 설정 값을 변경하고 싶고, 서버 애플리케이션이 꺼졌다가 다시 실행되더라도 설정 값을 유지하고 싶었기 때문이다. 간단하게 데이터베이스에 설정 값을 저장하면 되지만...? 필자는 서버 애플리케이션을 개발하지만 DB를 내 마음대로 달 수가 없는 환경..
Springboot hystrix 사용기 (hystrix로 마이크로 서비스 간의 서비스 호출 실패를 방지해보자) Hystrix란? hystrix는 netflix에서 만든 라이브러리로 마이크로 서비스 아키텍처에서 분산된 서비스간 통신이 원활하지 않은 경우에 각 서비스가 장애 내성과 지연 내성을 갖게하도록 도와주는 라이브러리다. 결국 키워드는 통신 문제 극복이다. 라이브러리 적용 배경 기존의 모놀리틱 아키텍처에서는 A모듈의 A메서드에서 B모듈의 B메서드를 호출할 때, 이 메서드 호출에 실패하는 것은 아예 고려하지 않았다. 그럴 일이 없었기 때문이다. 그런데 마이크로 서비스 아키텍처에서는 다르다. 주문 서비스가 배송 서비스의 API를 호출했을 때 실패할 수 있다는 것이다. 위와 같은 상황에서 별다른 처리를 안했다면 배송 서비스에 문제가 있다는 이유로 주문 서비스도 어디선가 문제가 생기게 될 것이고, 주문 서비스를 호출하..
스프링 애플리케이션이 시작, 종료될 때 수행할 메서드 지정하는 방법 + 스프링 빈(Bean)이 생성, 소멸될 때 수행할 메서드 지정하는 방법(graceful 종료, CommandLineRunner, ApplicationListener, InitializingBea.. 스프링 애플리케이션 시작과 끝 스프링(스프링부트)으로 애플리케이션을 개발했을 때, 애플리케이션이 시작할 때 어떤 동작을 하고 싶은 경우가 있고, 반대로 애플리케이션이 종료되기 직전에 어떤 동작을 하고 싶은 경우가 있다.예를들면 어떤 Configuration에서 값을 가져와서 초기 값을 설정한다든지, 애플리케이션이 종료되기 전에 하던 작업과 객체들을 우아하게(graceful) 종료한다든지 하는 작업들이다.더 쉽게 표현하면 애플리케이션 입장에서의 생성자와 소멸자가 필요할 때가 있다는 것이다.이 문제를 스프링에서는 인터페이스로 아주 쉽게 제공해준다.뿐만 아니라 Spring bean이 생성될 때와 삭제될 때 수행하는 메서드를 구현할 수 있게 인터페이스로 제공한다.아래에 코드를 보자!1234567891011121..