애노테이션은 애물단지다. 사용하기 편리해보이는 듯 하지만 이를 이용하도록 라이브러리나 프레임워크를 만든다면, 일반적인 자바의 타입 구조를 활용해서 만드는 것보다 몇배의 수고가 들어간다. 애노테이션은 타입 정보가 아니기 때문에 정보를 읽고 활용하려면 리플렉션 API를 사용해야 한다. 게다가 상속이나 구현을 통해서 정보가 전이되지도 않는다. 메타 애노테이션도 마찬가지다.

애노테이션을 이용해서 코드를 작성하도록 뭔가 만들어보려면 그래서 이런 애노테이션의 제약에 일정한 관례를 부여해야 한다.

스프링을 보자면,

컴포넌트 스캔에서는  클래스의 메타 애노테이션을 모두 뒤져서 @Component가 어느 단계라도 존재하면 빈 후보로 선택한다. 그래서 @Configuration만 달아도 스캔된다. @Configuration 애노테이션의 정의를 보면

@Component
public @interface Configuration {

처럼 @Component가 메타 애노테이션으로 달렸으니까.

그런데 메타 애노테이션에 뭔가 존재한다고 이게 자동으로 애노테이션에 상속되는 것이 아니니, 메타 애노테이션에 뭔가 있는지 알려면 리플렉션을 이용해서 계속 뒤져야 한다.  클래스와 인터페이스로 계층구조를 만들어면 타입정보가 상속되기 때문에 손쉽게 타입 체크를 하거나 다형성을 활용할 수 있는 것과 대조된다. 게다가 정해진 규칙도 없으니 만든 사람이 정한 규칙을 모르면 헷갈린다.

그래서 Josh Bloch은 인터페이스로 타입 정보를 넣을 수 있는데다 애노테이션을 사용하지 말라고 이펙 자바 2에서 경고하기도 했다.

또 다른 문제는 수퍼 메소드나 수퍼 클래스, 인터페이스 등에 붙은 애노테이션 정보가 자신에게도 적용되냐 이거다. 당연히 애노테이션에는 상속 개념이 없으니 될지 안될지는 그걸 활용하는 프레임워크나 라이브러리 개발자가 어떤 식으로 애토네이션 정보를 찾아가느냐에 달렸다. 수퍼에 있으면 상속을 하는지, 서브에도 달렸으면 오버라드를 하는지, 결합해서 새로운 조합을 만드는지, 에러를 내는지 등등은 순전히 개발자 맘이다.

@Transactional이나 @RequestMapping등을 생각해보면 될 것이다. @Transactional에 대체(fallback) 룰이 적용되는 것이지 @RM에서 상속시 서브 메소드/타입의 애노테이션 정보가 수퍼 것을 오버라이드하는지 어쩌고의 여부는 토스3 같은 쓸데 없어 보이는 것까지 다 다루는 하드코어 스프링 책을 보지 않으면 알기 쉽지 않을 것이다.

애노테이션에는 일관성도 없고 사용방식도 멋대로기 때문에 상당히 불편하다. API Doc을 종일 들여다 보면서 개발해야 실수 하지 않고 겨우 개발이 가능한 위험한 라이브러리를 다루는 느낌이다.

그래도 타입 정보를 이용하기 보다는 관례와 대충대충을 사랑하는 개발자들의 입맛에 잘 맞게 때문에 계속 사용될 듯 하다. 자바 코드는 무늬만 놔두고 애노테이션만 왕창 넣어서 사용하는 프로그래밍 방법이 나올지도 모르겠다. 요즘 작성하는 하이버네이트 엔티티 클래스에선 애노테이션이 나머지 코드보다 양이 많다. Lombok으로 G/S까지 없앴으니 필드 뿐인데 거기에 관계 정보, 매핑 정보, 스키마 정보, 검증 정보 등의 코드와 XML등을 대체해준다는 각종 메타 정보가 듬뿍 달라 붙는다.

애노테이션은 이제 DSL로 사용되는 것 같다.  새로운 애노테이션 종류가 나오면 새로운 언어를 익히는 마음으로 문법과 용법(usage) 등을 익혀야 할 것이다.

내가 애노테이션 정보를 직접 가져와 사용할 필요가 있을 때는 스프링에 있는 AnnotationUtils의 findAnnotation() 메소드를 애용한다. 이 메소드는 @RequestMapping을 비롯한 여러 애노테이션을 다룰 때 사용된다. 메소드/타입 정보와 애노테이션을 파라미터로 받아서 메소드/타입에 해당 애노테이션이 있는지 찾아 있으면 그 정보를 돌려준다. 없으면 수퍼 타입/메소드에 애노테이션이 있는지 Object까지 올라가면서 몽땅 뒤진다.

그래서 이 findAnnotation()을 사용해서 애노테이션 정보를 다루는 기능은 수퍼 클래스/메소드에 동일한 타입의 애노테이션이 있는 경우 마치 오버라이딩한 것처럼 보인다. 수퍼에만 있으면 그걸 사용하는데 서브에도 또 있으면 먼저 발견하니까 수퍼는 그냥 무시하기 때문에 그렇게 보일 뿐이지 상속되는 거나 오버라이드 되는 건 아니다.

대충 스프링에는 이런 오버라이딩 비스무리한 관계가 있지만 모든 애노테이션에 대해서 다 그렇다고 볼 수는 없고, 애노테이션 정보를 메소드와 타입 레벨의 것을 조합되서 사용되기도 하고, 조합했을 때 OR로 하기도 하고 AND로 하기도 하고, 모든 가능한 조합을 다 만들기도 하고, 한쪽을 배제하고 다른 쪽의 정보를 우선하기도 한다. 꼼꼼하게 애노테이션을 이용하는 프레임워크가 아니면 잘못 사용해도 에러를 내지도 않는다. 아무튼 애물단지다.

오늘의 결론은 "애노테이션을 사용하도록 프레임워크나 라이브리를 만드는 개발자들은 애노테이션 사용 방법에 대해서 문서 좀 제대로 만들란 말이야!"

맨날 소스 뒤져가며 어떻게 사용해야 할지 찾기 정말 피곤해.

Related posts:

  1. 유쾌한 이슈처리 재촉 메일

Facebook comments:

to “스프링 3.1 (9) 애노테이션은 상속되지 않는다?”

  1. 이제 클래스 이름을 몰라도 되긴하지만, 아직도 확장할 방법은 보이질 않죠. @EnableHello 애노테이션에 속성을 추가하고, 그 애노테이션 정보를 활용해서 빈 정보를 조작할 수 있습니다.

  2. 이제 클래스 이름을 몰라도 되긴하지만, 아직도 확장할 방법은 보이질 않죠. @EnableHello 애노테이션에 속성을 추가하고, 그 애노테이션 정보를 활용해서 빈 정보를 조작할 수 있습니다.

  3. Very nice post. I just stumbled upon your weblog and wished to say that I’ve truly enjoyed surfing around your blog posts. In any case I will be subscribing to your feed and I hope you write again soon!

  4. Heya i抦 for the first time here. I found this board and I find It truly useful & it helped me out a lot. I hope to give something back and help others like you aided me.

  5. 애노테이션은 애물단지다. 사용하기 편리해보이는 듯 하지만 이를 이용하도록 라이브러리나 프레임워크를 만든다면, 일반적인 자바의 타입 구조를 활용해서 만드는 것보다 몇배의 수고가 들어간다. 애노테이션은 타입 정보가 아니기 때문에 정보를 읽고 활용하려면 리플렉션 API를 사용해야 한다. 게다가 상속이나 구현을 통해서 정보가 전이되지도 않는다. 메타 애노테이션도 마찬가지다.

  6. 자바 1.5의 enum 타입은 말 그대로 상수를 정의한다. C 언어의 enum은 정수형과 그 값이 혼횽되지만 자바는 아예 별도의 객체 타입이 되도록 한다. 그래서 enum을 다른 말로 하면 specialized final static class 라고 이야기할 수 있다. enum에서 정의한 세부 값들은 그 각각의 final static 유형의 객체가 된다. 여기에서 중요한 포인트는 이놈들이 객체라는 점이다.

  7. 애노테이션은 애물단지다. 사용하기 편리해보이는 듯 하지만 이를 이용하도록 라이브러리나 프레임워크를 만든다면, 일반적인 자바의 타입 구조를 활용해서 만드는 것보다 몇배의 수고가 들어간다. 애노테이션은 타입 정보가 아니기 때문에 정보를 읽고 활용하려면 리플렉션 API를 사용해야 한다. 게다가 상속이나 구현을 통해서 정보가 전이되지도 않는다. 메타 애노테이션도 마찬가지다.

  8. It is perfect time to make some plans for the future and it is time to be happy.
    I have read this post and if I could I desire to suggest you
    some interesting things or tips. Perhaps you can
    write next articles referring to this article. I want to read more things about it!

    my page debt advice – blog.bitcomet.com -

  9. It’s going to be finish of mine day, but before ending I am reading this impressive paragraph to improve my experience.

  10. I have been browsing on-line greater than three hours lately, but I never discovered
    any interesting article like yours. It is beautiful value sufficient for me.
    Personally, if all website owners and bloggers made good content as you did,
    the internet will be a lot more helpful than ever
    before.

    My blog – finance resource (Annis)

  11. Hey would you mind letting me know which hosting company you’re using? I’ve loaded your blog
    in 3 completely different web browsers and I must say this blog loads
    a lot quicker then most. Can you suggest a good internet hosting provider at a honest price?
    Cheers, I appreciate it!

    My website – debt advice

  12. Hello Web Admin, I noticed that your On-Page SEO is is missing a few factors, for one you do not use all three H tags in your post, also I notice that you are not using bold or italics properly in your SEO optimization. On-Page SEO means more now than ever since the new Google update: Panda. No longer are backlinks and simply pinging or sending out a RSS feed the key to getting Google PageRank or Alexa Rankings, You now NEED On-Page SEO. So what is good On-Page SEO?First your keyword must appear in the title.Then it must appear in the URL.You have to optimize your keyword and make sure that it has a nice keyword density of 3-5% in your article with relevant LSI (Latent Semantic Indexing). Then you should spread all H1,H2,H3 tags in your article.Your Keyword should appear in your first paragraph and in the last sentence of the page. You should have relevant usage of Bold and italics of your keyword.There should be one internal link to a page on your blog and you should have one image with an alt tag that has your keyword….wait there’s even more Now what if i told you there was a simple WordPress plugin that does all the On-Page SEO, and automatically for you? That’s right AUTOMATICALLY, just watch this 4minute video for more information at. Seo Plugin

  13. I admire what you have done here. I love the part where you say you are doing this to give back but I would assume by all the comments that is working for you as well. Do you have any more info on this?

  14. thank you for share!

  15. Browse Around THESE Guys
    [url=http://www.silangfushi.com/templets/kors-veste-en-cuir353.html]sac michael kors[/url]
    sac michael kors

  16. iwc腕時計自動巻…

    {All you should do|Checklist of great practices|Do the following} to discover more about watch before you are left out….

  17. As far as noreasterbybirth’s last sentence. Ms. Pelosi was speaking of the American people, not the congress. The congress debated the bill for months. It is not in the same vein as Cheney-bush launching wars in order to figure out what was next. I am sure the American people were kept up to speed on that? Right? http://forum.dr-emami-medspa.com/member.php?action=profile&uid=21393

  18. bagstokyo.org…

    The main reason why not a single person is raving about watch {and|and as a consequence|and therefore|and as an outcome} something that one {should do|ought to accomplish} right away….

  19. Those things Every one Need To Know Regarding The bag Internet business
    グッチ腕時計 http://watches.thahouse.org/グッチ-japan-3.html

  20. Poor diet dental seo to the sensitiveness of the tissues.
    It is indicated for patients with Parkinson’s disease.
    With average trading volume of 10, 000 or less.
    Traditionally marriages in India have several advantages for the pet lovers and owners the most important meal of the day at
    Cowboy Badlands in West Beaumont, Texas. The risk of
    developing selenosis and experiencing symptoms such as
    runny nose, cough and dental seo fever.

    my website; webpage

  21. Browse Around THIS WebSite
    [url=http://redhot.com.my/news/fashion.php?p=9155]burberry mens sneakers-burberry-on clearance sale[/url]
    burberry mens sneakers-burberry-on clearance sale

  22. japan assists every one of us by simply including several unique functions and functions. This is a unvaluable thing for every enthusiast of japan.

  23. gucci belts cheap authentic 스프링 3.1 (9) 애노테이션은 상속되지 않는다? » Toby’s Epril

  24. gucci diaper handbag purse 스프링 3.1 (9) 애노테이션은 상속되지 않는다? » Toby’s Epril

  25. Navigate To This Site
    [url=http://mensbootsoutlet.com]mens uggs[/url]
    mens uggs

  26. cheap boots 스프링 3.1 (9) 애노테이션은 상속되지 않는다? » Toby’s Epril

  27. Look At This Web-site
    [url=http://fakebootsonsale.com]fake ugg boots for sale[/url]
    fake ugg boots for sale

  28. There are many factors that come down into picking the right cheap neopoints accessories for
    cheap neopoints on the go. We believe the Game Smart
    initiative by working with cheap neopoints consoles like x box or play station
    3 or online games. If Haswell can do this with ease and efficiency and also
    you can visit the slots of Vegas casino.

    Feel free to visit my blog: buy neopoints – http://www.oscrawl.com -

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha