Loading...
Spring Framework Reference Documentation 7.0.2의 Controlling the Management Interface of Your Beans의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
이전 섹션의 예제에서,
bean의 관리 인터페이스를 거의 제어하지 못했습니다. Export된 각 bean의 모든 public
프로퍼티와 메서드가 각각 JMX 애트리뷰트와 오퍼레이션으로 노출되었습니다. Export된 bean의
어떤 프로퍼티와 메서드가 실제로 JMX 애트리뷰트와 오퍼레이션으로 노출될지에 대해 보다
세밀하게 제어하기 위해, Spring JMX는 bean의 관리 인터페이스를 제어하기 위한
포괄적이고 확장 가능한 메커니즘을 제공합니다.
MBeanInfoAssembler API내부적으로, MBeanExporter는 org.springframework.jmx.export.assembler.MBeanInfoAssembler API의
구현체에 위임하며, 이 구현체는 노출되는 각 bean의 관리 인터페이스를 정의하는 역할을
담당합니다. 기본 구현체인
org.springframework.jmx.export.assembler.SimpleReflectiveMBeanInfoAssembler는
관리 인터페이스를 정의하는데, 이 인터페이스는 (이전 섹션의 예제에서 본 것처럼)
모든 public 프로퍼티와 메서드를 노출합니다.
Spring은 MBeanInfoAssembler 인터페이스의
두 가지 추가 구현체를 제공하며, 이를 사용하면 소스 수준 메타데이터나 임의의 인터페이스를
사용하여 생성되는 관리 인터페이스를 제어할 수 있습니다.
MetadataMBeanInfoAssembler를 사용하면, 소스 수준 메타데이터를 사용하여 bean의
관리 인터페이스를 정의할 수 있습니다. 메타데이터의 읽기는
org.springframework.jmx.export.metadata.JmxAttributeSource 인터페이스에 의해 캡슐화됩니다.
Spring JMX는 기본 구현체를 제공하는데, 이는 Java 애노테이션을 사용하는
org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource입니다. 올바르게
동작하기 위해서는 MetadataMBeanInfoAssembler를 JmxAttributeSource 인터페이스의
구현체 인스턴스로 반드시 설정해야 하며, 기본값은 없습니다.
Bean을 JMX로 export 대상으로 표시하려면, bean 클래스에 @ManagedResource 애노테이션을
붙여야 합니다. 오퍼레이션으로 노출하고자 하는 각 메서드에는 @ManagedOperation
애노테이션을 붙여야 하고, 노출하고자 하는 각 프로퍼티에는 @ManagedAttribute
애노테이션을 붙여야 합니다. 프로퍼티에 애노테이션을 붙일 때, write-only 또는 read-only
애트리뷰트를 만들기 위해 각각 setter나 getter의 애노테이션을 생략할 수 있습니다.
@ManagedResource가 붙은 bean은 public이어야 하며, 오퍼레이션이나 애트리뷰트를 노출하는 메서드도 public이어야 합니다.
다음 예제는 우리가 Creating an MBeanServer에서 사용했던
JmxTestBean 클래스의 애노테이션 버전을 보여줍니다.
1package org.springframework.jmx; 2 3@ManagedResource( 4 objectName="bean:name=testBean4", 5 description="My Managed Bean", 6 log=true, 7 logFile="jmx.log", 8 currencyTimeLimit=15, 9 persistPolicy="OnUpdate", 10 persistPeriod=200, 11 persistLocation="foo", 12 persistName="bar") 13public class AnnotationTestBean { 14 15 private int age; 16 private String name; 17 18 public void setAge(int age) { 19 this.age = age; 20 } 21 22 @ManagedAttribute(description="The Age Attribute", currencyTimeLimit=15) 23 public int getAge() { 24 return this.age; 25 } 26 27 @ManagedAttribute(description="The Name Attribute", 28 currencyTimeLimit=20, 29 defaultValue="bar", 30 persistPolicy="OnUpdate") 31 public void setName(String name) { 32 this.name = name; 33 } 34 35 @ManagedAttribute(defaultValue="foo", persistPeriod=300) 36 public String getName() { 37 return this.name; 38 } 39 40 @ManagedOperation(description="Add two numbers") 41 @ManagedOperationParameter(name = "x", description = "The first number") 42 @ManagedOperationParameter(name = "y", description = "The second number") 43 public int add(int x, int y) { 44 return x + y; 45 } 46 47 public void dontExposeMe() { 48 throw new RuntimeException(); 49 } 50 51}
위 예제에서, AnnotationTestBean 클래스가 @ManagedResource로 애노테이션되어 있고,
이 @ManagedResource 애노테이션이 여러 애트리뷰트 집합으로 설정되어 있는 것을 볼 수
있습니다. 이 애트리뷰트들은 MBeanExporter가 생성하는 MBean의 다양한 측면을 설정하는 데
사용될 수 있으며, Spring JMX Annotations에서 더 자세히 설명합니다.
age와 name 두 프로퍼티 모두 @ManagedAttribute로 애노테이션되어 있지만,
age 프로퍼티의 경우에는 getter 메서드에만 애노테이션이 붙어 있습니다.
이로 인해 두 프로퍼티 모두 관리 인터페이스에 managed 애트리뷰트로 포함되지만,
age 애트리뷰트는 read-only가 됩니다.
마지막으로, add(int, int) 메서드는 @ManagedOperation으로 애노테이션되어 있는 반면,
dontExposeMe() 메서드는 그렇지 않습니다. 이로 인해 MetadataMBeanInfoAssembler를
사용할 때 관리 인터페이스에는 오직 하나의 오퍼레이션 (add(int, int))만
포함됩니다.
AnnotationTestBean클래스는 어떤 Java 인터페이스도 구현할 필요가 없습니다. JMX 관리 인터페이스는 전적으로 애노테이션에서 파생되기 때문입니다.
다음 설정은 MBeanExporter가 MetadataMBeanInfoAssembler를 사용하도록 설정하는
방법을 보여줍니다:
1<beans> 2 3 <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> 4 <property name="assembler" ref="assembler"/> 5 <property name="namingStrategy" ref="namingStrategy"/> 6 <property name="autodetect" value="true"/> 7 </bean> 8 9 <!-- will create management interface using annotation metadata --> 10 <bean id="assembler" 11 class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler"> 12 <property name="attributeSource" ref="jmxAttributeSource"/> 13 </bean> 14 15 <!-- will pick up the ObjectName from the annotation --> 16 <bean id="namingStrategy" 17 class="org.springframework.jmx.export.naming.MetadataNamingStrategy"> 18 <property name="attributeSource" ref="jmxAttributeSource"/> 19 </bean> 20 21 <bean id="jmxAttributeSource" 22 class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/> 23 24 <bean id="testBean" class="org.springframework.jmx.AnnotationTestBean"> 25 <property name="name" value="TEST"/> 26 <property name="age" value="100"/> 27 </bean> 28 29</beans>
위 예제에서, MetadataMBeanInfoAssembler bean은 AnnotationJmxAttributeSource 클래스의
인스턴스로 설정되어 있고, assembler 프로퍼티를 통해 MBeanExporter에 전달됩니다.
이것이 Spring이 노출하는 MBean에 대해 애노테이션 기반 관리 인터페이스를 활용하는 데
필요한 전부입니다.
다음 표는 Spring JMX에서 사용할 수 있는 애노테이션을 설명합니다:
| Annotation | Applies to | Description |
|---|---|---|
@ManagedResource | Classes | Class의 모든 인스턴스를 JMX managed 리소스로 표시합니다. |
@ManagedNotification | Classes | Managed 리소스가 발생시키는 JMX notification을 나타냅니다. |
@ManagedAttribute | Methods (only getters and setters) | Getter 또는 setter를 JMX 애트리뷰트의 한쪽 절반으로 표시합니다. |
@ManagedMetric | Methods (only getters) | Getter를 JMX 애트리뷰트로 표시하며, metric임을 나타내는 descriptor 프로퍼티를 추가합니다. |
@ManagedOperation | Methods | 메서드를 JMX 오퍼레이션으로 표시합니다. |
@ManagedOperationParameter | Methods | 오퍼레이션 파라미터에 대한 description을 정의합니다. |
Table 1. Spring JMX annotations
다음 표는 이러한 애노테이션에서 사용할 수 있는 몇 가지 공통 애트리뷰트를 설명합니다. 각 애노테이션에 대한 자세한 내용은 Javadoc을 참고하십시오.
| Attribute | Applies to | Description |
|---|---|---|
objectName | @ManagedResource | MetadataNamingStrategy가 managed 리소스의 ObjectName을 결정하는 데 사용됩니다. |
description | @ManagedResource, @ManagedNotification, @ManagedAttribute, @ManagedMetric,<br>@ManagedOperation, @ManagedOperationParameter | 리소스, notification, 애트리뷰트, metric 또는 오퍼레이션의 description을 설정합니다. |
currencyTimeLimit | @ManagedResource, @ManagedAttribute, @ManagedMetric | currencyTimeLimit descriptor 필드의 값을 설정합니다. |
defaultValue | @ManagedAttribute | defaultValue descriptor 필드의 값을 설정합니다. |
log | @ManagedResource | log descriptor 필드의 값을 설정합니다. |
logFile | @ManagedResource | logFile descriptor 필드의 값을 설정합니다. |
persistPolicy | @ManagedResource, @ManagedMetric | persistPolicy descriptor 필드의 값을 설정합니다. |
persistPeriod | @ManagedResource, @ManagedMetric | persistPeriod descriptor 필드의 값을 설정합니다. |
persistLocation | @ManagedResource | persistLocation descriptor 필드의 값을 설정합니다. |
persistName | @ManagedResource | persistName descriptor 필드의 값을 설정합니다. |
name | @ManagedOperationParameter | 오퍼레이션 파라미터의 display name을 설정합니다. |
index | @ManagedOperationParameter | 오퍼레이션 파라미터의 index를 설정합니다. |
Table 2. Spring JMX annotation attributes
AutodetectCapableMBeanInfoAssembler Interface구성을 더 단순화하기 위해, Spring은 AutodetectCapableMBeanInfoAssembler 인터페이스를
포함하고 있는데, 이 인터페이스는 MBeanInfoAssembler 인터페이스를 확장하여 MBean
리소스의 자동 감지에 대한 지원을 추가합니다. MBeanExporter를
AutodetectCapableMBeanInfoAssembler 인스턴스로 설정하면, 이 인스턴스는 JMX로
노출할 bean의 포함 여부에 대해 "vote"할 수 있습니다.
AutodetectCapableMBeanInfo 인터페이스의 유일한 구현체는
MetadataMBeanInfoAssembler이며, 이는 ManagedResource 애트리뷰트가 붙은 어떤 bean이든
포함하도록 vote합니다. 이 경우 기본 접근 방식은 bean 이름을 ObjectName으로
사용하는 것이며, 그 결과 다음과 같은 설정이 됩니다:
1<beans> 2 3 <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> 4 <!-- notice how no 'beans' are explicitly configured here --> 5 <property name="autodetect" value="true"/> 6 <property name="assembler" ref="assembler"/> 7 </bean> 8 9 <bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler"> 10 <property name="attributeSource"> 11 <bean class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/> 12 </property> 13 </bean> 14 15 <bean id="testBean" class="org.springframework.jmx.AnnotationTestBean"> 16 <property name="name" value="TEST"/> 17 <property name="age" value="100"/> 18 </bean> 19 20</beans>
위 설정에서, 어떤 bean도 MBeanExporter에 전달되지 않았다는 점을 주목하십시오.
그러나 AnnotationTestBean은 여전히 등록되는데, 이는 @ManagedResource로
애노테이션되어 있고 MetadataMBeanInfoAssembler가 이를 감지하여 포함하도록
vote하기 때문입니다.
이 접근 방식의 유일한 단점은 이제 AnnotationTestBean의
이름이 비즈니스 의미를 갖게 된다는 점입니다. 이 문제는
Controlling ObjectName Instances for Your Beans에 설명된 대로 ObjectNamingStrategy를 설정하여 해결할 수 있습니다.
또한 Using Source-level Metadata: Java Annotations에서
MetadataNamingStrategy를 사용하는 예제도 볼 수 있습니다.
MetadataMBeanInfoAssembler 외에도, Spring은 InterfaceBasedMBeanInfoAssembler를
포함하고 있으며, 이를 사용하면 인터페이스 집합에 정의된 메서드 집합을 기반으로
노출되는 메서드와 프로퍼티를 제한할 수 있습니다.
표준적인 MBean 노출 메커니즘은 인터페이스와 단순한 네이밍 스킴을 사용하는 것이지만,
InterfaceBasedMBeanInfoAssembler는 네이밍 컨벤션의 필요성을 제거하고, 둘 이상의
인터페이스를 사용할 수 있게 하며, bean이 MBean 인터페이스를 구현해야 할 필요를 제거함으로써
이 기능을 확장합니다.
앞에서 보여준 JmxTestBean 클래스에 대한 관리 인터페이스를 정의하는 데 사용되는
다음 인터페이스를 고려해 보십시오:
1public interface IJmxTestBean { 2 3 public int add(int x, int y); 4 5 public long myOperation(); 6 7 public int getAge(); 8 9 public void setAge(int age); 10 11 public void setName(String name); 12 13 public String getName(); 14 15}
이 인터페이스는 JMX MBean에서 오퍼레이션과 애트리뷰트로 노출되는 메서드와 프로퍼티를 정의합니다. 다음 코드는 Spring JMX가 이 인터페이스를 관리 인터페이스 정의로 사용하도록 설정하는 방법을 보여줍니다:
1<beans> 2 3 <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> 4 <property name="beans"> 5 <map> 6 <entry key="bean:name=testBean5" value-ref="testBean"/> 7 </map> 8 </property> 9 <property name="assembler"> 10 <bean class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler"> 11 <property name="managedInterfaces"> 12 <value>org.springframework.jmx.IJmxTestBean</value> 13 </property> 14 </bean> 15 </property> 16 </bean> 17 18 <bean id="testBean" class="org.springframework.jmx.JmxTestBean"> 19 <property name="name" value="TEST"/> 20 <property name="age" value="100"/> 21 </bean> 22 23</beans>
위 예제에서, InterfaceBasedMBeanInfoAssembler는 어떤 bean에 대해서도 관리
인터페이스를 구성할 때 IJmxTestBean 인터페이스를 사용하도록 설정되어 있습니다.
InterfaceBasedMBeanInfoAssembler에 의해 처리되는 bean은 JMX 관리 인터페이스를
생성하는 데 사용되는 인터페이스를 구현할 필요가 없다는 점을 이해하는 것이 중요합니다.
위 경우에는, IJmxTestBean 인터페이스가 모든 bean에 대한 모든 관리 인터페이스를
구성하는 데 사용됩니다. 많은 경우, 이는 원하는 동작이 아니며, 서로 다른 bean에 대해
서로 다른 인터페이스를 사용하고자 할 수 있습니다. 이 경우, interfaceMappings
프로퍼티를 통해 InterfaceBasedMBeanInfoAssembler에 Properties 인스턴스를 전달할 수
있으며, 각 entry의 key는 bean 이름이고 value는 해당 bean에 사용할 인터페이스 이름의
comma-separated list입니다.
managedInterfaces나 interfaceMappings 프로퍼티 중 어느 쪽을 통해서도 관리
인터페이스가 지정되지 않은 경우, InterfaceBasedMBeanInfoAssembler는 bean을
리플렉션하여 그 bean이 구현한 모든 인터페이스를 사용해 관리 인터페이스를 생성합니다.
MethodNameBasedMBeanInfoAssemblerMethodNameBasedMBeanInfoAssembler를 사용하면 JMX에 애트리뷰트와 오퍼레이션으로
노출할 메서드 이름 목록을 지정할 수 있습니다. 다음 코드는 예시 설정을 보여줍니다:
1<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> 2 <property name="beans"> 3 <map> 4 <entry key="bean:name=testBean5" value-ref="testBean"/> 5 </map> 6 </property> 7 <property name="assembler"> 8 <bean class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler"> 9 <property name="managedMethods"> 10 <value>add,myOperation,getName,setName,getAge</value> 11 </property> 12 </bean> 13 </property> 14</bean>
위 예제에서, add와 myOperation 메서드는 JMX 오퍼레이션으로 노출되고,
getName(), setName(String), getAge()는 JMX 애트리뷰트의 적절한 절반으로
노출됩니다. 위 코드에서 메서드 매핑은 JMX에 노출되는 bean에 적용됩니다.
Bean 단위로 메서드 노출을 제어하기 위해서는, MethodNameMBeanInfoAssembler의
methodMappings 프로퍼티를 사용하여 bean 이름을 메서드 이름 목록에 매핑할 수 있습니다.
Exporting Your Beans to JMX
Controlling ObjectName Instances for Your Beans