[Spring Masters] 스프링 AOP 학습 참가 시험 문제 공개

Spring AOP 학습 이전에 필수로 알고 있어야 할 스프링 지식들을 확인하는 시험입니다. 24시간 안에 답을 적어서 저에게 메일로 제출해주세요.

1.    FactoryBean에 대해서 설명하세요.
2.    FactoryBean에서 getObject()가 돌려주는 객체 말고, FacotryBean 자체를 받아오려면 어떻게 해야 하나요?
3.    BeanFactory와 ApplicationContext의 공통적인 Life-cycle 클래스들의 나열하고 각자의 역할들을 설명하세요.
4.    Bean을 생성하고 소멸시킬 때 특정 메소드를 호출하는 방법에는 어떤 것들이 있으며, 그 방법 들 중에 어떤 방법이 더 좋을지, 이유와 함께 설명하세요.
5.    Bean들 사이에서 Circular Dependency가 있을 경우 어떤 일이 발생하는지, 그리고 해결할 수 있는 방법들을 나열해 주세요.
6.    Autowiring을 사용하여 byType으로 빈을 주입할 때, 같은 타입의 빈이 두 개 이상일 때 어떤 현상이 발생하나요?
7.    Lookup method injection과 Arbitrary method replacement가 무엇인지 설명하세요.
8.    @Autowired는 빈의 타입을 사용하여 종속성을 주입합니다. 이 때, 같은 타입의 빈이 여러 개라면, 어떻게 해야 하나요?
9.    <context:component-scan> 설정을 등록해보세요. 기본 패키지는 me.whiteship 이며, 단, org.springframework.stereotype.Controller 애노테이션이 붙어있는 것들은 컴포넌트 스캔 대상에서 제외합니다.
10.    <tx:annotation-driven transaction-manager=”transactionManager”/> 이 빈 설정에는 불필요한 설정이 있습니다. 그 설정이 무엇이며 이유가 뭔가요?

다음은 OX 퀴즈입니다.

11.    웹 서버에서 동작할 스프링의 Singleton Scope 빈은 반드시 Thread-Safe 해야 한다.
12.    스프링에서 선언적인 트랜잭션 관리를 할 때는 반드시 Proxy(CGLib이던 JDK의 Proxy건)를 사용해야 한다.
13.    ApplicationContext는 모든 Singleton 스코프의 빈을 초기에 생성한다.
14.    JtaTransactionManager는 nested transactions을 지원한다.
15.    ApplicationContext – B가 ApplicationContext – A를 상속하고 있을 때, 즉 A가 부모, B가 자식 관계일 때, A에 있는 빈이 B에 있는 빈을 참조할 수 있다.

마지막으로 Spring Masters에서 스프링 AOP 학습을 하려는 이유와 목적이 무엇인지 말씀해주세요. 수고하셨습니다.

시험을 치르고자 하시는 분들은 저에게 메일을 주시면 위와 동일한 문제를 담고 있는 워드 파일을 보내드립니다. 시험 방식은 오픈북이며, 시간 제한은 24시간입니다. 오늘 보내드리면, 적어도 내일 저녁까지는 제 메일 함으로 와야 합니다. 그럼 제가 답변들을 검토한 다음 피드백과 함께 참가 가능 여부를 메일로 보내드리겠습니다.

위 문제들이 너무 쉽다고 스터디도 쉽게 보시면 안 됩니다. 위 문제들을 풀 수 있느냐가 중요 한 게 아닙니다. 이 시험은 스프링 AOP 스터디 참가 조건 중 하나 일 뿐이라는걸 알아주세요.

본 글에 댓글로 질문에 대한 답변이나 또 다른 질문을 하시는 건 자제해주세요. 경우에 따라서는 삭제할 수도 있습니다. 😉

Spring Masters. 첫 번째 스터디 주제는. Spring AOP

스프링 AOP는 스프링 프레임워크의 IoC와 더불어 핵심 기능 중에 하나 입니다. 스프링 트랜잭션이 바로 이 스프링 AOP를 기반으로 구현되어 있죠. Cross-Cutting Concern이라고 들어보셨나요? 로깅, 보안, 트랜잭션 등등 사방에 흩어져있는 코드를 하나의 Aspect로 모아서 좀 더 OO스러운 개발을 가능케 한다는 것이 핵심 개념입니다.

하지만.. 왜 잘 사용을 안하죠? 이유는 여러 가지가 있지만, Aspect를 작성하는게 프레임워크 관점이니 프레임워크 만드는 사람 아니면 일반 개발자들은 몰라도 된다?.. 이런건 사실 이유로 꼽기 싫습니다. 학습자의 입장에서 나는 일반 개발자고, 너는 프레임워크 만들거고. 이런 구분이 필요한가요? 잘 안 사용하는 핵심적인 이유는 AOP를 잘 모르기 때문입니다. 간단한 AOP도 어떻게 만들지를 모르니까. 응용은 당연히 못 하는거죠. 스케이트보드로 따지면, 알리도 못하는데 팝샤빗을 할 수 있겠습니까?(혹시 알리 하실 줄 아시는 분 있으면 저 개인지도좀 부탁드리곘습니다. (__)/ 알리하게 되면 맛난거 사드릴께요.)

그럼 정말 그렇게 유용한가요? 네. 당연히 유용하죠. JDBC랑 Hibernate를 둘 다 쓰는 애플리케이션을 생각해볼까요? 하이버네이트를 제대로 사용하고 있다면 JDBC 쿼리를 날리기 전에 DB와 SessionContext를 동기화해줘야 한다는 사실을 알고 있을 겁니다. 저런 코드를 모든 DAO에 하드코딩하면 코드가 얼마나 지져분해질지 상상이 되나요? 저런걸 바로 AOP로 깔끔하게 처리할 수 있습니다. 이런걸 스프링 AOP 레퍼런스 읽으면서 상상이나 해보셨나요? 전 못했었습니다. 또 있습니다. 하이버네이트의 예외를 잡아서 DataAccessException으로 바꿔주는 Aspect를 만들어 두면, 굳이 스프링이 제공하는 HbiernateTemplate 같은 클래스를 사용하지 않아도 됩니다. 좀 더 non-invasive하게 스프링을 사용할 수 있는거죠.순수하게 하이버네이트로만 DAO를 구현할 수 있는 겁니다. 코드가 더 깔끔해지더군요. 이렇게 활용할 수 있는 방법은 정말 당야합니다. 다만, 잘 몰라서 활용하지 못하는 거죠.

그럼 본격적으로 Spring AOP 스터디에 대해 구상한 것을 정리해보겠습니다.

Spring AOP 스터디 만의 참가 자격은 다음과 같습니다.

  • 스프링 마스터즈 기본 참가 조건을 지킬 수 있어야 합니다.
  • 스프링 기초는 갖추고 있어야 합니다.
  • Spring tx를 사용해 본 경험이 있어야 합니다.

Spring AOP 스터디에서 할 일

  • Spring AOP 학습 – 레퍼런스(필수), 빨간책 마지막판(필수), 기타 참고자료(옵션)
  • Spring AOP 레퍼런스 Implementation. – 레퍼런스에 있는 모든 경우의 수를 직접 테스트 코드로 구현합니다.
  • Spring AOP 직접 구현해보기 – Spring AOP 2.0 이전 버전과 비슷한 녀석들을 직접 구현해 봅니다.

Spring AOP 스터디 방식

  • 스터디 참가 신청을 받습니다.
  • 사전 심의를 합니다. 스터디 참가 신청을 하신 분들에게 시험지를 나눠드릴 것이고, 그 시험을 통과해야 스터디에 참여하실 수 있습니다.
  • Spring AOP 학습은 나눠서 발표합니다. 분량을 나눠서 하루에 끝냅니다. AOP만 공부하는거라 얼마 안 됩니다. 영어책으로 학습을 못하는 분들은 참여하시면 안 됩니다.
  • Reference Implementation – 각자가 레퍼런스의 모든 예제를 구현합니다. 세 번으로 나눠서 할 생각입니다. 레퍼런스 기준으로 7장 먼저 하고, 그 다음에 6장. 마지막은 최종 점검.
  • Spring AOP 직접 구현은 한 번으로 끝냅니다. 세부 과제 목록을 만들어서 역시 각자 구현을 하고, 최대한 많은 과제를 수행한 사람이 스프링 AOP 스터디 1인자가 됩니다.
  • 모든 스터디의 결과물은 온라인으로 공개합니다. 저작권은 그때가서 생각해 봐야겠습니다.
  • 회비는 한 방에 10만원 씩 걷습니다. 한 번 걷은 회비는 절대로 안 돌려줍니다. 오히려 빠져나갈 때 벌금을 물을까도 생각 중입니다. 남는 돈은 회비로 탕진 합니다. 물론 회비 지출내역은 투명하게 관리합니다.

Spring AOP 스터디 일정

  • 1차(시작) : Spring AOP 학습. 발표.
  • 2차(1차 시점 2주후) : Spring Reference 7장 Implementation.(Spring AOP Classic)
  • 3차(2차 시점 2주후) : Spring Reference 6장 Implementation.(Spring @AOP)
  • 4차(3차 시점 1주후) : Spring Reference Implementation 최종.
  • 5차(4차 시점 1주후) : Spring AOP 직접 구현하기. 수행 과제 증명 및 발표.

대충의 계획은 위와 같습니다. 하실 분들은 댓글이나 의견을 주시기 바랍니다.

Spring Masters 참가 조건

스프링 마스터즈 스터디는 타의 추종을 불허할 만큼의 스프링 지식을 습득하는 것을 목표로 합니다. 타의 추종을 불허할 만큼이란.. 공부한 내용과 관련된 주제에 관해서 누가 물어보면, 정확하고 다양한 답변을 해 줄 수 있어야 합니다. 즉, 스프링 전문가를 목표로 하시는 분들이랑 같이 스터디를 하고 싶습니다. 구체적으로 아래와 같은 조건을 가지고 있습니다.

1. 스프링을 잘 알아야 합니다.

Spring is about choice. 따라서 스프링 AOP만 해도 aspect를 구현하고 사용할 수 있는 방법이 상당히 여러가지 있습니다. ORM-hibernate만 봐도 하이버로 DAO 구현할 방법이 세 가지 정도 있습니다. 각각의 방법을 모두 알고 그 장담점을 파악하고 있어야 합니다. 그래야 최소한 스프링을 좀 안다. 라고 할 수 있다고 생각합니다. 그냥 API 사용법 공부하실 분들은 스프링 마스터즈에서 스터디 하실 필요가 없습니다. 그런 분들은 그냥 레퍼런스를 보거나 책을 보시면 됩니다.

2. 코딩을 할 수 있어야 합니다.

머리로 알고 있는 것과 코딩을 할 수 있는 건 천지 차이입니다. 스타크래프트를 볼 때 말로는 이래라 저래라 잘 하면서 직접 플레이는 못하는 사람을. ‘입스타’라고 부릅니다. ‘입개발’ 하실 분이랑은 같이 스터디할 생각이 없습니다. 스프링의 많은 경우의 수를 전부 코딩으로 증명할 생각입니다. 그래야 기억에도 잘 남고, 어쩌면 레퍼런스에서 이론적으로 말한 내용이 틀렸을 수도 있는데, 그걸 알아낼 수도 있죠. 스타를 처음 해보는 사람이랑 빌드 테크트리를 연구한 다던가, 그 장단점을 파악할 수는 없습니다. 어느 정도 단축키도 알고 있고, 전투 중에도 물량을 꾸준히 뽑아낼 수 있는 정도의 수준은 필요합니다.

3. 스터디가 최우선이어야 합니다.

오늘은 회사일이 많아서.. 집안에 일이 있어서.. 친구랑 약속이 있어서.. 라는 이유로 한 번이라도 스터디에 불참 할 여지가 있는 분들이랑은 역시나 같이 스터디를 할 생각이 없습니다. 우선순위, 가치관 문제지만, 적어도 스터디 기간 중에는 자기가 가진 최대한을 쏟아 부울 수 있는 사람하고만 같이 할 겁니다. 스터디 목적은 학습이지, 취미 생활이나 친목도모가 아닙니다. 그동안 공부 한 걸 발언하고, 평가 받고, 평가 해주고, 질문 할 수 있으려면 공부를 많이 해야 합니다. 공부를 할 시간이 없는 분들(가정일이나 연애나 회사일이 스터디보다 중요하신 분들)은 그렇게 하기 힘듭니다. 따라서 학생인 경우가 가장 좋은데, 일부 직장인들 중에도 저같이 특수한 근무 환경(눈치 볼 사람 없고, 출퇴근 자유, 프로젝트 한가함)이신 분들이라면 가능하실 겁니다.

이 정도 되면, 많은 분들이 참가 신청을 하시진 않겠죠? ㅎㅎ 원하던 바입니다. 마스터가 아무나 될 수 있는거면 마스터라고 할 수 없겠죠.