> For the complete documentation index, see [llms.txt](https://wannaqueen.gitbook.io/spring5/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wannaqueen.gitbook.io/spring5/spring-boot/undefined-1/30..md).

# 30. 메시징 by sh

### 30. Messaging

**Spring 프레임 워크는 `JmsTemplate`을 사용하는 JMS API의 단순화 된 사용에서 메시지를 비동기 적으로 수신하는 완전한 인프라 스트럭처에 이르기까지 메시징 시스템과의 통합을위한 광범위한 지원을 제공합니다.** Spring AMQP는 'Advanced Message Queuing Protocol'과 비슷한 기능을 제공하며 Boot는 `RabbitTemplate`및 RabbitMQ에 대한 자동 구성 옵션도 제공합니다. 또한 Spring Websocket에서 기본적으로 STOMP 메시징을 지원하며, Spring Boot는 시작과 초기 설정을 통해 자동 구성을 지원합니다.

### 30.1 JMS

**`javax.jms.ConnectionFactory` 인터페이스는 JMS 브로커와 상호 작용하기위한 `javax.jms.Connection`을 만드는 표준 방법을 제공합니다.** Spring은 ConnectionFactory를 JMS와 함께 사용하기 위해 필요하지만 일반적으로 직접 사용하지 않아도되며 더 높은 수준의 메시징 추상화에 의존 할 수있습니다 (자세한 내용은 Spring Framework 참조 문서의 [relevant section](https://docs.spring.io/spring/docs/4.1.5.RELEASE/spring-framework-reference/htmlsingle/#jms) 참조). 또한 Spring Boot는 메시지를 보내고 받기 위해 필요한 인프라를 자동으로 구성합니다.&#x20;

{% hint style="info" %}
JMS (Java Message Service)

* 비동기식 메시징을 위한 표준 API.

비동기식 메시징: 어떤 애플리케이션에서 다른 에플리케이션으로 간접적으로 메시지를 보내고 응답은 기다리지 않는 통신 방식.
{% endhint %}

{% hint style="info" %}
JMS의 핵심 개념&#x20;

* 메시지 중개자 (Message Broker)&#x20;
  * 애플리케이션에서 메시지를 전송할 때 메시지를 건네받는 역할을 하는 것. 지정된 목적지로 확실하게 메시지를 전달하는 책임을 맡아 주므로 전송자가 바로 자신의 일로 돌아갈 수 있게 해준다.
* 목적지 (Destination)
  {% endhint %}

#### 30.1.1 HornetQ 지원

**Spring Boot는 클래스 패스에서 HornetQ를 사용할 수 있음을 감지하면 `ConnectionFactory`를 자동으로 구성 할 수 있습니다. 브로커가 있으면 내장 된 브로커가 시작되고 자동으로 구성됩니다** (mode 등록 정보가 명시 적으로 설정되지 않은 경우). 지원되는 모드는 다음과 같습니다. "`embedded`" (임베디드 브로커가 필요하며 명시적으로 클래스 경로에서 브로커를 사용할 수없는 경우 오류가 발생하도록 지정하기 위해)와 `netty`전송 프로토콜을 사용하여 브로커에 연결하는 "`native`" 입니다. 후자가 구성되면 스프링 부트는 기본 설정으로 로컬 시스템에서 실행중인 브로커에 연결하는 `ConnectionFactory`를 구성합니다.&#x20;

{% hint style="info" %}
HornetQ

* 멀티 프로토콜, 임베드, 고성능 클러스터 비동기 메시징 시스템을 구축할 수 있는 오픈소스 프로젝트
  * 자바로 만들어져 있으며 JMS 보다 뛰어난 성능을 가지고 있고, POJO 기반 디자인, 고사용성, 유연한 클러스터링, 관리 측면에서 사용하기 좋다.
    {% endhint %}

| ![\[Note\]](https://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/htmlsingle/images/note.png)                                                                      |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`spring-boot-starter-hornetq`을 사용하고 있다면 기존 HornetQ 인스턴스에 연결하는 데 필요한 종속성과 JMS와 통합 할 Spring 인프라가 제공됩니다.** `org.hornetq:hornetq-jms-server`를 애플리케이션에 추가하면 임베디드 모드를 사용할 수있습니다. |

**HornetQ 구성은 `spring.hornetq.*`의 외부 구성 등록 정보에 의해 제어됩니다.** 예를 들어, `application.properties`에 다음 섹션을 선언 할 수 있습니다.&#x20;

```
spring.hornetq.mode=native
spring.hornetq.host=192.168.1.210
spring.hornetq.port=9876
```

브로커를 임베드 할 때 지속성을 사용할지 여부와 사용 가능하게 할 대상 목록을 선택할 수 있습니다. 기본 옵션을 사용하여 쉼표로 구분 된 목록으로 지정할 수 있습니다. 고급 큐 및 주제 구성 각각에 대해 `org.hornetq.jms.server.config.JMSQueueConfiguration` 또는 `org.hornetq.jms.server.config.TopicConfiguration` 유형의 Bean을 정의 할 수 있습니다.&#x20;

지원되는 옵션에 대한 자세한 내용은 [`HornetQProperties`](https://github.com/spring-projects/spring-boot/tree/v1.2.2.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/hornetq/HornetQProperties.java)를 참조하십시오.&#x20;

JNDI 조회가 전혀 필요하지 않으며 대상은 HornetQ 구성의 'name'속성 또는 구성을 통해 제공된 이름을 사용하여 이름에 대해 확인됩니다.

#### 30.1.2 ActiveMQ 지원

**또한 Spring Boot는 클래스 패스에서 ActiveMQ를 사용할 수 있음을 감지하면 `ConnectionFactory`를 구성 할 수 있습니다. 브로커가있는 경우 포함 된 브로커가 시작되고 구성됩니다** (브로커 URL이 구성을 통해 지정되지 않은 경우).&#x20;

{% hint style="info" %}
ActiveMQ

JMS를 지원하는 클라이언트를 포함하는 브로커, 자바 뿐만 아니라 다양한 언어를 이용하는 시스템 간의 통신을 가능하게 함. 또한 클러스터링 기능 및 DB 그리고 FileSystem을 통해 각 시스템 간의 일관성 및 지속성을 유지시켜 줌.

즉, 클라이언트 간 메시지를 송수신할 수 있는 오픈 소스 Broker(JMS 서버)
{% endhint %}

**ActiveMQ 구성은 `spring.activemq.*`의 외부 구성 등록 정보에 의해 제어됩니다.** 예를 들어, `application.properties`에 다음 섹션을 선언 할 수 있습니다.

```
spring.activemq.broker-url=tcp://192.168.1.210:9876
spring.activemq.user=admin
spring.activemq.password=secret
```

지원되는 옵션에 대해서는 [`ActiveMQProperties`](https://github.com/spring-projects/spring-boot/tree/v1.2.2.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQProperties.java)를 참조하십시오.

기본적으로 ActiveMQ는 대상이 아직 존재하지 않는 경우 대상을 생성하므로 대상은 제공된 이름과 비교하여 확인됩니다.

#### 30.1.3 JNDI ConnectionFactory 사용

**Application Server에서 응용 프로그램을 실행중인 경우 Spring Boot는 JNDI를 사용하여 JMS `ConnectionFactory`를 찾으려고 시도합니다.** 기본적으로 `java:/JmsXA`및 `java:/XAConnectionFactory` 위치가 점검됩니다. 대체 위치를 지정해야하는 경우 `spring.jms.jndi-name` 속성을 사용할 수 있습니다.&#x20;

{% hint style="info" %}
연결 팩토리 또는 대상과 같은 메시지 제공자에 대한 구성 정보를 얻기 위해 JNDI를 사용
{% endhint %}

```
spring.jms.jndi-name=java:/MyConnectionFactory
```

#### 30.1.4 메시지 전송

**Spring의 `JmsTemplate`은 자동으로 구성되므로 직접 bean에 autowire 할 수 있습니다.**

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

    private final JmsTemplate jmsTemplate;

    @Autowired
    public MyBean(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    // ...

}
```

| ![\[Note\]](https://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/htmlsingle/images/note.png)                                                                                  |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`JmsMessagingTemplate`](https://docs.spring.io/spring/docs/4.1.5.RELEASE/javadoc-api/org/springframework/jms/core/JmsMessagingTemplate.html)(Spring 4.1의 새로운 기능)은 비슷한 방식으로 삽입 될 수 있습니다. |

#### 30.1.5 메시지 수신

**JMS 인프라가 존재할 때 모든 Bean에 `@JmsListener` 주석을 달아 청취자 엔드 포인트를 작성할 수 있습니다.** `JmsListenerContainerFactory`가 정의되어 있지 않은 경우, 디폴트의 `JmsListenerContainerFactory`가 자동적으로 설정됩니다.&#x20;

다음 구성 요소는 `someQueue`대상에 리스너 끝점을 만듭니다.&#x20;

```java
@Component
public class MyBean {

    @JmsListener(destination = "someQueue")
    public void processMessage(String content) {
        // ...
    }

}
```

자세한 내용은 [the javadoc of `@EnableJms`](https://docs.spring.io/spring/docs/4.1.5.RELEASE/javadoc-api/org/springframework/jms/annotation/EnableJms.html)을 확인하십시오.&#x20;
