Xml 구성 및 주석 기반 구성 [닫기]


131

최근에 작업하고있는 몇 가지 큰 프로젝트에서 하나 또는 다른 것을 선택하는 것이 점점 중요 해지는 것처럼 보입니다 (XML 또는 Annotation). 프로젝트가 성장함에 따라 일관성은 유지 관리에 매우 중요합니다.

내 질문은 Annotation 기반 구성에 비해 XML 기반 구성의 장점은 무엇이며 XML 기반 구성에 비해 Annotation 기반 구성의 장점은 무엇입니까?


@Componentand와 같은 주석을 가정하면 @Autowired잘못된 이분법입니다. JavaConfig 및 groovy 구성을 포함하여 구성을 작성하는 다른 방법이 있습니다 .
bacar


이것도 확인하시기 바랍니다 stackoverflow.com/questions/8428439/…
pramodc84

답변:


199

주석은 그 용도가 있지만 XML 구성을 죽이는 가장 좋은 방법은 아닙니다. 나는 두 가지를 혼합하는 것이 좋습니다!

예를 들어 Spring을 사용한다면 애플리케이션의 의존성 주입 부분에 XML을 사용하는 것이 전적으로 직관적입니다. 이것은 의존성을 필요로하는 코드에 어떤 종류의 주석을 사용하면 코드 가이 자동 구성을 인식하게하는 반면 코드를 사용하는 코드에서 코드의 의존성을 얻습니다.

그러나 트랜잭션 관리에 XML을 사용하는 대신 메서드를 주석이있는 트랜잭션으로 표시하는 것은 프로그래머가 알고 싶어하는 정보이기 때문에 완벽한 의미가 있습니다. 그러나 인터페이스가 SubtypeX 대신 SubtypeY로 주입 될 것입니다 .SubtypeX를 주입하려면 코드를 변경해야하지만 인터페이스 계약이 있기 때문에 클래스를 포함하지 않아야합니다. XML을 사용하면 XML 매핑을 변경하기 만하면되므로 매우 빠르고 쉽게 수행 할 수 있습니다.

나는 JPA 주석을 사용하지 않았으므로 얼마나 잘하는지 모르겠지만 XML로 데이터베이스에 Bean의 매핑을 유지하는 것이 좋습니다. 객체는 정보의 출처를 신경 쓰지 않아야하므로 정보로 할 수있는 일만 신경 써야합니다. 그러나 당신이 JPA를 좋아한다면 (나는 그것에 대한 경험이 없다), 그것을 위해 가십시오.

일반적으로 : 주석이 기능을 제공하고 그 자체로 주석 역할을하고이 주석없이 정상적으로 기능하기 위해 코드를 특정 프로세스에 연결하지 않으면 주석으로 이동합니다. 예를 들어, 트랜잭션으로 표시된 트랜잭션 메소드는 운영 로직을 종료하지 않으며 코드 레벨 주석으로도 사용됩니다. 그렇지 않으면이 정보가 XML로 표현되는 것이 가장 좋습니다. 결국 코드의 작동 방식에 영향을 주지만 코드의 주요 기능은 변경되지 않으므로 소스 파일에 속하지 않기 때문입니다.


큰 답변 주셔서 감사합니다! 사용할 것을 결정하는 데 어려움이 있습니다. 이 SO 답변 은 디커플링을 홍보 하고이 블로그 게시물 은 긴밀한 커플 링을 홍보한다고 말합니다! 당신의 대답은 실제로 문제를 분명히했습니다.
Mikayla Maki

5
나는이 조언을 다음과 같이 요약 할 것이다 : AOP에 주석을 사용한다 (트랜잭션은 양상으로 취급 될 수있다). 그러나 의존성 주입에는 사용하지 않는다.
bacar

1
이 답변이 요즘 여전히 주제입니까 (2015)?
sp00m

1
대부분의 경우, 대부분의 사람들은 주석이 선호되는 것 같습니다
Junchen Liu

31

여기에는 외부화 된 메타 데이터와 인라인 메타 데이터의 문제가 더 있습니다. 객체 모델이 한 가지 방식으로 만 지속되는 경우 인라인 메타 데이터 (예 : 주석)가 더 간결하고 읽기 쉽습니다.

그러나 각 응용 프로그램이 다른 방식으로 모델을 유지하려는 방식으로 다른 응용 프로그램에서 개체 모델을 재사용 한 경우 메타 데이터 (예 : XML 설명자)를 외부화하는 것이 더 적합합니다.

주석이 더 멋지지만 둘 중 어느 것도 좋지 않으므로 둘 다 지원됩니다. 결과적으로 JPA와 같은 새로운 헤어 온 프레임 워크는 더 강조되는 경향이 있습니다. 네이티브 Hibernate와 같은보다 성숙한 API는 둘 다를 제공합니다. 둘 중 어느 것도 충분하지 않기 때문입니다.


13

나는 항상 주석 이 클래스가 무엇을 할 수 있는지 또는 다른 클래스 와 어떻게 상호 작용 하는지에 대한 일종의 지표로 생각 합니다.

반면에 스프링 XML 구성은 그저 구성입니다.

예를 들어 프록시의 IP 및 포트에 대한 정보는 XML 파일로 정의되며 런타임 구성입니다.

사용 @Autowire, @Element클래스와는 어떤 프레임 워크를 표시하는 것은 주석을 잘 사용하는 것입니다.

@Webservice주석에 URL을 넣는 것은 좋지 않습니다.

그러나 이것은 단지 내 의견입니다. 상호 작용과 구성 간의 경계가 항상 명확한 것은 아닙니다.


주석 및 주석 기반 구성 (Java config)은 서로 다른 두 가지이며 OP는 나중에 전자에 대해 이야기하는 동안 나중에 묻습니다.
Lucky

6

나는 몇 년 동안 Spring을 사용해 왔으며 필요한 XML의 양은 확실히 지루해졌습니다. Spring 2.5의 새로운 XML 스키마와 주석 지원 사이에서 나는 보통 다음과 같은 일을한다.

  1. "component-scan"을 사용하여 @Repository, @Service 또는 @Component를 사용하는 클래스를 자동로드하십시오. 나는 보통 모든 빈에 이름을 부여하고 @Resource를 사용하여 서로 연결한다. 이 배관은 자주 바뀌지 않으므로 주석이 의미가 있습니다.

  2. 모든 AOP에 "aop"네임 스페이스 사용 이것은 정말 잘 작동합니다. @Transactional을 모든 곳에 두는 것은 일종의 드래그이기 때문에 여전히 트랜잭션에도 사용합니다. 모든 서비스 또는 저장소에서 메소드에 대해 명명 된 포인트 컷을 작성하고 조언을 매우 빠르게 적용 할 수 있습니다.

  3. HibernateJpaVendorAdapter와 함께 LocalContainerEntityManagerFactoryBean을 사용하여 Hibernate를 구성합니다. 이를 통해 Hibernate는 클래스 경로에서 @Entity 클래스를 쉽게 자동 검색 할 수 있습니다. 그런 다음 LCEMFB를 참조하는 "factory-bean"및 "factory-method"를 사용하여 명명 된 SessionFactory Bean을 작성합니다.


5

주석 전용 접근 방식을 사용하는 데있어 중요한 부분은 "bean name"이라는 개념이 어느 정도 사라진다는 것입니다 (중요하지 않음).

Spring의 "bean names"는 구현 클래스에 대한 추가적인 추상화 수준을 형성합니다. XML을 사용하면 Bean 이름과 관련하여 정의되고 참조됩니다. 주석을 사용하면 클래스 / 인터페이스에서 참조됩니다. (빈 이름이 존재하더라도 알 필요는 없습니다)

불필요한 추상화를 제거하면 시스템이 단순화되고 생산성이 향상된다고 확신합니다. 들어 대형 프로젝트 나는 XML을 제거하기로 이익이 상당 할 수 있다고 생각합니다.


5

XML 기반 접근 방식에서는 가시성이 큰 승리라고 생각합니다. XML 문서를 탐색하기위한 다양한 도구 (예 : Visual Studio + ReSharper의 파일 구조 창)를 고려할 때 XML이 그렇게 나쁘지 않다는 것을 알았습니다.

확실히 혼합 접근법을 취할 수는 있지만 프로젝트의 새로운 개발자가 다른 객체가 구성되거나 매핑되는 위치를 알아내는 것이 어려울 수 있기 때문에 위험합니다.

몰라요 결국 XML 지옥은 나에게 그렇게 나쁘게 보이지는 않습니다.


4

어노테이션으로 구성 할 수없는 일부 옵션이 있으므로 구성하려는 모든 항목에 따라 다릅니다. 주석 측면에서 보면 :

  • 더하기 : 주석이 덜 어색하다
  • 빼기 : 주석이 잘 보이지 않습니다

더 중요한 것은 당신에게 달려 있습니다 ...

일반적으로 한 가지 방법을 선택하고 닫힌 일부 제품에 사용하는 것이 좋습니다.

(예외 : XML 기반 구성을 선택하는 경우 @Autowire 주석을 사용하는 것이 좋습니다. 혼합 방식이지만 가독성과 유지 보수성 모두에 도움이됩니다)



3

내가 틀렸을 수도 있지만 Java의 @Tag 및 C #의 [Attribute]에서와 같이 Annotations는 컴파일 타임 옵션이며 XML은 런타임 옵션이라고 생각했습니다. 그것은 나에게 동등하지 않으며 다른 장단점이 있다고 말합니다.


주석은 컴파일 타임 일이라는 사실은 주석 기반 구성의 전문가이지만 주석과 xml은 모두 구성 방법 이며이 맥락에서 동일한 것을 달성합니다. 예. 클래스에서 주석을 사용하는 대신 XML 파일에서 최대 절전 모드 매핑을 구성합니다.
abarax

아, 혼란 스러워요. 이 질문은 클래스 메타 데이터 이상의 데이터 구성을 설명하고 있다고 오해했습니다.
ARKBAN

3

또한 혼합이 최선이라고 생각하지만 구성 매개 변수의 유형에 따라 다릅니다. Spring도 사용하는 Seam 프로젝트를 진행 중이며 일반적으로 다른 개발 및 테스트 서버에 배포합니다. 그래서 나는 나누었습니다.

  • 서버 특정 구성 (서버의 리소스에 대한 절대 경로와 유사) : Spring XML 파일
  • 다른 Bean의 멤버로 Bean 삽입 (또는 많은 Bean에서 Spring XML 정의 값 재사용) : 주석

가장 큰 차이점은 변경되는 모든 서버 별 구성을 위해 코드를 다시 컴파일 할 필요가 없으며 xml 파일 만 편집한다는 것입니다. 또한 관련된 모든 코드를 이해하지 못하는 팀 구성원이 일부 구성 변경을 수행 할 수 있다는 이점도 있습니다.


2

DI 컨테이너의 범위에서 주석 기반 DI가 Java 주석 사용을 남용한다고 생각합니다. 즉, 프로젝트에서 널리 사용하지 않는 것이 좋습니다. 프로젝트에 DI 컨테이너의 힘이 정말로 필요한 경우 Xml 기반 구성 옵션과 함께 Spring IoC를 사용하는 것이 좋습니다.

단위 테스트를 위해서라면 개발자는 코딩에 Dependency Inject 패턴을 적용하고 EasyMock 또는 JMock과 같은 조롱 도구를 사용하여 종속성을 우회해야합니다.

DI 컨테이너를 잘못된 컨텍스트에서 사용하지 마십시오.


2

항상 특정 Java 구성 요소 (클래스, 메소드 또는 필드)에 링크 될 구성 정보는 주석으로 표시하기에 적합한 후보입니다. 구성이 코드 목적의 핵심 인 경우 주석은 특히 효과적입니다. 주석에 대한 제한으로 인해 각 구성 요소가 하나의 구성 만 가질 수있는 것이 가장 좋습니다. 여러 구성, 특히 주석이 포함 된 Java 클래스 외부의 조건에 맞는 구성을 처리해야하는 경우 주석이 해결하는 것보다 많은 문제를 일으킬 수 있습니다. 마지막으로 Java 소스 코드를 다시 컴파일하지 않으면 주석을 수정할 수 없으므로 런타임에 재구성 할 수있는 것은 주석을 사용할 수 없습니다.

다음 링크를 참조하십시오. 그들은 또한 유용 할 수 있습니다.

  1. 주석 대 XML, 장점 및 단점
  2. http://www.ibm.com/developerworks/library/j-cwt08025/

1

이것은 전형적인 '구성 대 컨벤션'질문입니다. 개인적인 취향은 대부분의 경우에 답을 지시합니다. 그러나 개인적으로 컨벤션보다 Configuration (즉, XML 기반)을 선호합니다. IMO IDE는 사람들이 종종 건물과 연결하고 XML 기반 접근 방식을 유지하는 일부 XML 지옥을 극복하기에 충분히 강력합니다. 결국, 구성 (XML 구성 파일을 빌드, 유지 및 배포하기위한 유틸리티 구축)의 이점이 장기적으로 Convention보다 중요하다는 것을 알았습니다.


6
'구성 대 컨벤션'이이 문제와 직각이라고 생각합니다. 주석과 XML 파일에는 사용을 크게 단순화하는 합리적인 기본값 (컨벤션)이 많이 있습니다. 실제 차이점은 컴파일 타임 대 런타임 및 코드 내 vs 코드 외입니다.
HDave

1

둘 다 사용합니다. 대부분 XML이지만 공통 클래스에서 상속하고 공통 속성을 갖는 Bean이 많으면 수퍼 클래스에서 주석을 사용하므로 각 Bean에 대해 동일한 속성을 설정할 필요가 없습니다. 나는 약간의 제어 괴물이기 때문에 자동 배선하는 대신 @Resource (name = "referredBean")을 사용합니다 (원래의 referBean과 동일한 클래스의 다른 bean이 필요할 경우 많은 문제를 피할 수 있습니다) .


1

내 경험에 따르면 주석 구성에 대한 장단점이 있습니다.

  • JPA 구성은 한 번만 수행되고 일반적으로 자주 변경되지 않기 때문에 주석 구성을 선호합니다. 더 큰 구성 그림을 볼 가능성에 대한 우려가있을 수 있습니다.이 경우 MSQLWorkbench 다이어그램을 사용합니다.
  • Xml 구성은 응용 프로그램의 더 큰 그림을 얻는 데 매우 좋지만 런타임까지 일부 오류를 찾는 것이 번거로울 수 있습니다. 이 경우 Spring @Configuration 주석은 더 큰 그림을 볼 수 있고 컴파일 시간에 구성을 확인할 수 있기 때문에 더 나은 선택으로 들립니다.
  • Spring 구성에 관해서는 두 가지 접근법을 결합하는 것을 선호합니다 : @Configuration 사용 주석을 Services 및 Query 인터페이스와 함께 하고 context : component-scan base-package = "..."와 같은 dataSource 및 spring 구성 항목에 대한 xml 구성을 사용하십시오
  • 그러나 xml 구성은 전체 비즈니스 프로세스의 더 큰 그림을 보는 것이 매우 중요하므로 흐름 구성 (Spring Web Flow 또는 Lexaden Web Flow)과 관련하여 Java 주석을 사용합니다. 그리고 주석 접근 방식으로 구현하는 것은 번거 롭습니다.

Java 어노테이션과 구성 지옥을 최소화하는 필수 xml 최소 방법을 결합하는 것이 좋습니다.


1

Spring Framework의 경우 @Component 주석을 사용하고 "component-scan"옵션을 설정하여 Spring에서 Java Bean을 찾을 수 있도록 XML에서 또는 모든 Bean을 XML로 정의 할 필요가 없도록하는 아이디어가 마음에 든다. JavaConfig. 예를 들어, 인터페이스를 통해 다른 클래스에 연결하기 만하면되는 상태 비 저장 싱글 톤 Java Bean의 경우이 방법이 매우 효과적입니다. 일반적으로 Spring Bean의 경우 Bean 정의를 위해 대부분 Spring XML DSL에서 멀어졌으며 이제는 구성에 대한 컴파일 시간 검사 및 일부 리팩토링 지원을 얻기 때문에 JavaConfig 및 Spring Annotations 사용을 선호합니다. Spring XML 구성을 사용하지 마십시오. JavaConfig / Annotations가 XML 구성을 사용하여 사용할 수있는 작업을 수행 할 수 없다는 것을 발견 한 드문 경우에 두 가지를 혼합합니다.

어느 정도 도메인 모델 클래스에 주석을 위반 최대 절전 모드 ORM을 위해 나는 여전히 XML 매핑 파일을 선호합니다 (아직 JPA를 사용하지 않은) 깨끗한 아키텍처 . 지난 몇 년 동안 제가 채택한 계층 구조 스타일 입니다. 이 위반은 코어 계층이 Hibernate 또는 JPA 라이브러리와 같은 지속성 관련 항목에 의존해야하고 도메인 모델 POJO를 지속성이 적은 무지로 만들기 때문에 발생합니다. 실제로 코어 계층은 다른 인프라에 전혀 의존하지 않아야합니다.

그러나 Clean Architecture가 "차 한 잔"이 아닌 경우 별도의 XML 매핑 파일에 비해 도메인 모델 클래스에서 Hibernate / JPA 주석을 사용하면 이점 (편의성 및 유지 관리 성 등)이 확실히 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.