본문 바로가기

개발

(81)
rabbitmq 를 왜 써야 하는지 프로젝트를 하면서 rabbitmq, activemq 등 뒤에 MQ라고 붙은 단어들을 많이 들어왔다. 난 모르니깐 그냥 넘어가야지, 머 그냥 Message Queue 아닌가 하고 넘어갔는데 이번에 발표 준비를 하면서 한번 제대로 해보자라는 마음이 생겼다. 일단 카카오 메시징 서버 직군에서 지원 자격중에 MQ에 대한 경험이 들어가 있다. 엄청난 트레픽을 받는 네이버 웹툰에서도 웹 서비스 인프라 이해 쪽에 Message Queue에 이해를 원하는 자격 요건도 볼 수 있다. 이 두가지 사례만 봐도 Mq에 대한 이해는 선택이 아닌 필수로 다가 오고 있다. 어차피 알아두어야 할 기술 확실히 알아 두자. * rabbitmq가 필요한 이유 기존 상태의 문제점 -> 애플리케이션과 강하게 결합되어 있으면 db서버가 응답할..
vaadin 이란 Vaadin에는 UX, 성능 및 액세스 가능성에 맞게 웹 구성 요소가 포함되어 있다. 즉, 멋진 앱을 더 빠르게 만들 수 있습니다. 구성 요소는 모든 프레임 워크에서 사용할 수있는 표준 HTML 요소로 빌드된다. Vaadin은 Java로 웹 애플리케이션을 개발하는 가장 빠른 방법이다. 서버와 브라우저 간의 통신을 자동화하고 모든 Vaadin 구성 요소에 대한 고급 구성 요소 API를 제공한다. Creating CRUD UI with Vaadin15분의 시간만 있으면 가능하다. 간단한 JPA를 사용한 Vaadin UI를 만들 것이다. CRUD 기능을 완벽하게 갖춘 앱과 필터링 예제가 있다.Create the backend services스프링 예제에 나와있는 Accessing Data with JPA과 차..
rabbitmq tutorial 3 - routing Routing메시지 중 일부만 구독할 수 있게 해줄 겁니다. 예를 들어, 중요한 오류 메시지만 로그 파일에 전송(디스크 공간을 절약하기 위해)할 수 있으며, 동시에 콘솔에 있는 모든 로그 메시지를 print 할 수 있다. Bindings 이전 예에서 우리는 이미 바인딩을 만들고 있었다. 다음과 같은 코드를 리콜할 수 있음:channel.queueBind(queueName, EXCHANGE_NAME, "");binding은 exchange과 queue 사이의 관계다. queue는 이 exchange의 메시지에 관심이 있다. binding은 추가적인 routingKey 매개변수를 취할 수 있다. basic_publish 매개 변수와의 혼동을 피하기 위해 우리는 그것을 바인딩 키라고 부른다. 다음과 같이 키로..
rabbitmq tutorial 3 - Publish/Subscribe Publish/Subscribe이전에서 work queue 를 만들어 봤다. work queue 뒤에 있는 가정은 각 작업이 정확히 한 명의 작업자에게 전달된다. 이 부분에서 이번에는 완전히 다른 것을 할 것이다. 여러 Consumer들에게 메시지를 전달할 것이다. 이걸 publish/subscrib 패턴이라고 한다. 패턴을 설명하기 위해 간단한 로깅 시스템을 구축하자. 이 프로그램은 두 개의 프로그램으로 구성된다. 첫 번째 프로그램은 로그 메시지를 내보내고 두 번째 프로그램은 로그 메시지를 수신하고 출력한다. logging 시스템에서 수신기 프로그램의 모든 실행중인 사본은 메시지를 받을 것이다. 이렇게 하면 하나의 receiver를 실행하고 로그를 디스크로 보낼 수 있다. 동시에 다른 수신기를 실행하고..
rabbitmq tutorial 2 - Work Queues 와 Round Robbin Work Queues하나의 work queue를 만들고 이 큐는 여러 worker에게 시간이 많이 드는 작업을 분배하는데 사용된다. work queue는 resource-intensive한 일은 즉시 수행하지 않고, 완료 될 때까지 기다리지 않는다. 대신에 그 일을 나중에 하도록 일정을 잡는다. 작업을 메시지로 캡슐화하여 대기열에 보내고, 백그라운드에서 실행 중인 작업자 프로세스가 작업을 시작하고 최종적으로 작업을 실행한다. 이 개념은 짧은 HTTP 요청 기간 동안 복잡한 태스크를 처리할 수 없는 웹 응용 프로그램에서 특히 유용하다. 처음에는 간단한 hello world 였는데, 이제 복잡한 작업을 나타내는 문자열을 보내보자. 이미지나 PDF 파일 같은 실제 작업이 없으므로 Sread.sleep() 함수..
rabbitmq tutorial 1 - Docker로 띄우고 hello world 찍어보기 목표 : 도커로 RabbitMq 를 간단히 설치하고 hello world 를 찍어보기. 도커에서 다음 명령어로 이미지를 받고 컨테이너를 실행한다. - 기본 포트 15672->8080으로 설정했음. - 아이디/비밀번호 : admin/admin으로 설정 docker run -d --name rabbitmq -p 5672:5672 -p 8080:15672 --restart=unless-stopped -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:management - 참고 : https://hub.docker.com/_/rabbitmq 처음 docker로 run을 하면 이미지가 없어서 받아옴. Unable to find image..
@EnableAspectJAutoProxy 와 proxyTargetClass 속성 @EnableAspectJAutoProxy(proxyTargetClass = true) spring aop 구현 방식 - 프록시 방식(정확하게 다이나믹 프록시) Spring AOP uses either JDK dynamic proxies or CGLIB to create the proxy for a given target object.aspectJ aop 구현 방식 - BCI(Byte Code Instumentation)이란 Java의 Byte Code에 직접 수정 AspectJ의 @Aspect 어노테이션을 사용 가능하게 해준다. XML로 표현되는 같은 역할을 한다. 사용하기 위해서는 @Configuration 클래스를 써야한다. 위에 어노테이션을 사용하면 bci 방식으로 aop가 진행되는게 아니라 프록..
for each 돌면서 list 삭제 할때 문제. ConcurrentModificationException 다음과 같은 역할을 하는 메소드가 있다. 실제 테스트를 실행했더니 java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) at java.util.ArrayList$Itr.next(ArrayList.java:831) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(De..