최근에 작업하고있는 몇 가지 큰 프로젝트에서 하나 또는 다른 것을 선택하는 것이 점점 중요 해지는 것처럼 보입니다 (XML 또는 Annotation). 프로젝트가 성장함에 따라 일관성은 유지 관리에 매우 중요합니다.
내 질문은 Annotation 기반 구성에 비해 XML 기반 구성의 장점은 무엇이며 XML 기반 구성에 비해 Annotation 기반 구성의 장점은 무엇입니까?
최근에 작업하고있는 몇 가지 큰 프로젝트에서 하나 또는 다른 것을 선택하는 것이 점점 중요 해지는 것처럼 보입니다 (XML 또는 Annotation). 프로젝트가 성장함에 따라 일관성은 유지 관리에 매우 중요합니다.
내 질문은 Annotation 기반 구성에 비해 XML 기반 구성의 장점은 무엇이며 XML 기반 구성에 비해 Annotation 기반 구성의 장점은 무엇입니까?
답변:
주석은 그 용도가 있지만 XML 구성을 죽이는 가장 좋은 방법은 아닙니다. 나는 두 가지를 혼합하는 것이 좋습니다!
예를 들어 Spring을 사용한다면 애플리케이션의 의존성 주입 부분에 XML을 사용하는 것이 전적으로 직관적입니다. 이것은 의존성을 필요로하는 코드에 어떤 종류의 주석을 사용하면 코드 가이 자동 구성을 인식하게하는 반면 코드를 사용하는 코드에서 코드의 의존성을 얻습니다.
그러나 트랜잭션 관리에 XML을 사용하는 대신 메서드를 주석이있는 트랜잭션으로 표시하는 것은 프로그래머가 알고 싶어하는 정보이기 때문에 완벽한 의미가 있습니다. 그러나 인터페이스가 SubtypeX 대신 SubtypeY로 주입 될 것입니다 .SubtypeX를 주입하려면 코드를 변경해야하지만 인터페이스 계약이 있기 때문에 클래스를 포함하지 않아야합니다. XML을 사용하면 XML 매핑을 변경하기 만하면되므로 매우 빠르고 쉽게 수행 할 수 있습니다.
나는 JPA 주석을 사용하지 않았으므로 얼마나 잘하는지 모르겠지만 XML로 데이터베이스에 Bean의 매핑을 유지하는 것이 좋습니다. 객체는 정보의 출처를 신경 쓰지 않아야하므로 정보로 할 수있는 일만 신경 써야합니다. 그러나 당신이 JPA를 좋아한다면 (나는 그것에 대한 경험이 없다), 그것을 위해 가십시오.
일반적으로 : 주석이 기능을 제공하고 그 자체로 주석 역할을하고이 주석없이 정상적으로 기능하기 위해 코드를 특정 프로세스에 연결하지 않으면 주석으로 이동합니다. 예를 들어, 트랜잭션으로 표시된 트랜잭션 메소드는 운영 로직을 종료하지 않으며 코드 레벨 주석으로도 사용됩니다. 그렇지 않으면이 정보가 XML로 표현되는 것이 가장 좋습니다. 결국 코드의 작동 방식에 영향을 주지만 코드의 주요 기능은 변경되지 않으므로 소스 파일에 속하지 않기 때문입니다.
여기에는 외부화 된 메타 데이터와 인라인 메타 데이터의 문제가 더 있습니다. 객체 모델이 한 가지 방식으로 만 지속되는 경우 인라인 메타 데이터 (예 : 주석)가 더 간결하고 읽기 쉽습니다.
그러나 각 응용 프로그램이 다른 방식으로 모델을 유지하려는 방식으로 다른 응용 프로그램에서 개체 모델을 재사용 한 경우 메타 데이터 (예 : XML 설명자)를 외부화하는 것이 더 적합합니다.
주석이 더 멋지지만 둘 중 어느 것도 좋지 않으므로 둘 다 지원됩니다. 결과적으로 JPA와 같은 새로운 헤어 온 프레임 워크는 더 강조되는 경향이 있습니다. 네이티브 Hibernate와 같은보다 성숙한 API는 둘 다를 제공합니다. 둘 중 어느 것도 충분하지 않기 때문입니다.
나는 항상 주석 이 클래스가 무엇을 할 수 있는지 또는 다른 클래스 와 어떻게 상호 작용 하는지에 대한 일종의 지표로 생각 합니다.
반면에 스프링 XML 구성은 그저 구성입니다.
예를 들어 프록시의 IP 및 포트에 대한 정보는 XML 파일로 정의되며 런타임 구성입니다.
사용 @Autowire
, @Element
클래스와는 어떤 프레임 워크를 표시하는 것은 주석을 잘 사용하는 것입니다.
@Webservice
주석에 URL을 넣는 것은 좋지 않습니다.
그러나 이것은 단지 내 의견입니다. 상호 작용과 구성 간의 경계가 항상 명확한 것은 아닙니다.
나는 몇 년 동안 Spring을 사용해 왔으며 필요한 XML의 양은 확실히 지루해졌습니다. Spring 2.5의 새로운 XML 스키마와 주석 지원 사이에서 나는 보통 다음과 같은 일을한다.
"component-scan"을 사용하여 @Repository, @Service 또는 @Component를 사용하는 클래스를 자동로드하십시오. 나는 보통 모든 빈에 이름을 부여하고 @Resource를 사용하여 서로 연결한다. 이 배관은 자주 바뀌지 않으므로 주석이 의미가 있습니다.
모든 AOP에 "aop"네임 스페이스 사용 이것은 정말 잘 작동합니다. @Transactional을 모든 곳에 두는 것은 일종의 드래그이기 때문에 여전히 트랜잭션에도 사용합니다. 모든 서비스 또는 저장소에서 메소드에 대해 명명 된 포인트 컷을 작성하고 조언을 매우 빠르게 적용 할 수 있습니다.
HibernateJpaVendorAdapter와 함께 LocalContainerEntityManagerFactoryBean을 사용하여 Hibernate를 구성합니다. 이를 통해 Hibernate는 클래스 경로에서 @Entity 클래스를 쉽게 자동 검색 할 수 있습니다. 그런 다음 LCEMFB를 참조하는 "factory-bean"및 "factory-method"를 사용하여 명명 된 SessionFactory Bean을 작성합니다.
주석 전용 접근 방식을 사용하는 데있어 중요한 부분은 "bean name"이라는 개념이 어느 정도 사라진다는 것입니다 (중요하지 않음).
Spring의 "bean names"는 구현 클래스에 대한 추가적인 추상화 수준을 형성합니다. XML을 사용하면 Bean 이름과 관련하여 정의되고 참조됩니다. 주석을 사용하면 클래스 / 인터페이스에서 참조됩니다. (빈 이름이 존재하더라도 알 필요는 없습니다)
불필요한 추상화를 제거하면 시스템이 단순화되고 생산성이 향상된다고 확신합니다. 들어 대형 프로젝트 나는 XML을 제거하기로 이익이 상당 할 수 있다고 생각합니다.
리팩토링 및 다른 코드 변경과 비교할 다른 측면이 있습니다. XML을 사용하는 경우 모든 XML 컨텐츠를 처리해야하므로 리팩토링에 많은 노력이 필요합니다. 그러나 주석을 사용할 때는 쉽습니다.
내가 선호하는 방법은 주석이없는 Java 기반 구성입니다. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java
내가 틀렸을 수도 있지만 Java의 @Tag 및 C #의 [Attribute]에서와 같이 Annotations는 컴파일 타임 옵션이며 XML은 런타임 옵션이라고 생각했습니다. 그것은 나에게 동등하지 않으며 다른 장단점이 있다고 말합니다.
또한 혼합이 최선이라고 생각하지만 구성 매개 변수의 유형에 따라 다릅니다. Spring도 사용하는 Seam 프로젝트를 진행 중이며 일반적으로 다른 개발 및 테스트 서버에 배포합니다. 그래서 나는 나누었습니다.
가장 큰 차이점은 변경되는 모든 서버 별 구성을 위해 코드를 다시 컴파일 할 필요가 없으며 xml 파일 만 편집한다는 것입니다. 또한 관련된 모든 코드를 이해하지 못하는 팀 구성원이 일부 구성 변경을 수행 할 수 있다는 이점도 있습니다.
항상 특정 Java 구성 요소 (클래스, 메소드 또는 필드)에 링크 될 구성 정보는 주석으로 표시하기에 적합한 후보입니다. 구성이 코드 목적의 핵심 인 경우 주석은 특히 효과적입니다. 주석에 대한 제한으로 인해 각 구성 요소가 하나의 구성 만 가질 수있는 것이 가장 좋습니다. 여러 구성, 특히 주석이 포함 된 Java 클래스 외부의 조건에 맞는 구성을 처리해야하는 경우 주석이 해결하는 것보다 많은 문제를 일으킬 수 있습니다. 마지막으로 Java 소스 코드를 다시 컴파일하지 않으면 주석을 수정할 수 없으므로 런타임에 재구성 할 수있는 것은 주석을 사용할 수 없습니다.
다음 링크를 참조하십시오. 그들은 또한 유용 할 수 있습니다.
이것은 전형적인 '구성 대 컨벤션'질문입니다. 개인적인 취향은 대부분의 경우에 답을 지시합니다. 그러나 개인적으로 컨벤션보다 Configuration (즉, XML 기반)을 선호합니다. IMO IDE는 사람들이 종종 건물과 연결하고 XML 기반 접근 방식을 유지하는 일부 XML 지옥을 극복하기에 충분히 강력합니다. 결국, 구성 (XML 구성 파일을 빌드, 유지 및 배포하기위한 유틸리티 구축)의 이점이 장기적으로 Convention보다 중요하다는 것을 알았습니다.
내 경험에 따르면 주석 구성에 대한 장단점이 있습니다.
Java 어노테이션과 구성 지옥을 최소화하는 필수 xml 최소 방법을 결합하는 것이 좋습니다.
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 주석을 사용하면 이점 (편의성 및 유지 관리 성 등)이 확실히 있습니다.
@Component
and와 같은 주석을 가정하면@Autowired
잘못된 이분법입니다. JavaConfig 및 groovy 구성을 포함하여 구성을 작성하는 다른 방법이 있습니다 .