1. AOP란 무엇입니까?
관점 지향 프로그래밍(Aspect Oriented Programming)의 약자. 로깅(logging)이나 트랜잭션의 전파정책(propagation) 등 일일이 호출하지 않아도 마치 Servlet의 필터(filter) 처럼 일정한 시점에 관점을 호출하도록 메타데이터(설정 정보)에서 지정하면 AOP 컨테이너(가령 스프링 컨테이너)에 의해 자동으로 호출되는 모듈을 작성할 수 있는데 이것이 관점(aspect)이라는 객체이다. 스프링은 aspectJ 라는 관점지향 언어를 사용하여 spring aop 의존성 정보를 통해서 관점 지향 프로그램을 작성할 수 있다.
https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:fdl:aop:aspectj
egovframework:rte:fdl:aop:aspectj [eGovFrame]
@AspectJ는 Java 5 어노테이션을 사용한 일반 Java 클래스로 관점(Aspect)를 정의하는 방식이다. @AspectJ 방식은 AspectJ 5 버전에서 소개되었으며, Spring은 2.0 버전부터 AspectJ 5 어노테이션을 지원한다. Spring
www.egovframe.go.kr
주안점) AOP의 용어들에 유의하여 구분하여 숙지합니다. ex) 포인트컷, 조인트 포인트, 관점, 어드바이스 등
관련 질문) 프로젝트 수행시 AOP를 어떤 식으로 적용하셨습니까?
DAO 메서드들에서 트랜잭션 적용시 트랜잭션 전파정책(https://cafe.naver.com/gdjava1/514)을 AOP 어드바이스(advice)를 활용하여 XML 혹은 애너테이션을 사용하여 서비스(Service)단에서 적용하였고 경우에 따라 전파정책은 간단하게 @Transactional을 활용할 수 있었습니다.
https://cafe.naver.com/gdjava1/514
제어의 역행(역전) : IoC(DI)-1
대한민국 모임의 시작, 네이버 카페
cafe.naver.com
2. IoC(DI)란 무엇입니까?
모든 어플리케이션은 비지니스 로직을 수행하기 위해 서로 협업하는 둘 또는 그 이상의 클래스들로 이뤄진다.
전통적으로 각 객체는 협업할 객체의 참조(reference)를 취득해야 하는 책임이 있다. 이것이 의존성(dependency)이다. 이는 결합도가 높으며 테스트하기 어려운 코드를 만들어 낸다.
IoC(제어의 역전)를 적용함으로써 객체들은 시스템 내의 각 객체를 조정하는 어떤 외부의 존재에 의해 생성 시점에서 의존성을 부여 받는다. 즉 의존성이 객체로 주입(inject)된다는 말이다.
IoC(제어의 역전)는 한 객체가 협업해야 하는 다른 객체의 참조관계를 이루는 방법에 대한 책임(제어권)의 역행이라고 부르기도 한다.
결국 이러한 프로그래밍 방식은 좋은 프로그래밍의 조건인 "모듈의 응집도는 높이고 결합도는 낮추라"는 명제를 충실히 이행하기 위해 나온 프로그래밍 방식입니다.
JSP 컨테이너로 주로 사용하는 톰캣의 경우에도 이러한 IoC가 적용되는데 메타데이터(설정 정보)에 해당되는 부분에 각종 자바 빈 객체를 XML 혹은 애너테이션 등으로 등록하여 의존성 정보를 주입하고 톰캣이라는 IoC 컨테이너가 이러한 정보를 결합하도록 자체적인 결합성을 약화시켜서 모듈을 분리하고 제어가 용이하도록 조치합니다. 결국 톰캣도 이러한 IoC 프로그래밍 방식으로 구성된 컨테이너 프로그램인 것을 확인할 수 있습니다.
스프링에서도 애너테이션이나 XML 그리고 Spring Boot 프로그램에서는 텍스트 정보(properties 파일)로 의존성 정보를 주입하여 결합성을 약화하고 이를 스프링 IoC 컨테이너 기능이 필요에 의해서 주입된 의존성 정보(자바 빈)을 와이어링(wiring) 혹은 주입(injection)하여 프로그래밍할 수 있도록 지원합니다.
메이븐(maven), 그레이들(gradle)은 주로 조금더 큰 단위인 라이브러리를 대상으로 의존성 정보로 주입 관리하는 컨테이너로서의 역할을 담당합니다.
3. 관련 질문) 프로젝트 진행시 IoC를 어느 정도 수준에서 사용해 보았는가?
스프링 과목을 학습할 때 XML, 애너테이션(annotation) 등에서 의존성 정보(자바 빈, 각종 설정 정보, 메이븐의 경우는 jar 라이브러리 등)를 생성/주입한 것을 예시로 들면 되겠습니다. 각종 자바 빈(Java Bean) 컴포넌트(DAO, Service, Controller, 기타 각종 유틸리티 컴포넌트들)를 사용해본 경험을 찬찬히 얘기하면서 작업시 고충을 약간 섞어서 얘기하면 좋은 답변이 될 수 있습니다.
'기술면접' 카테고리의 다른 글
[기술면접준비] REST API 란? (REST, REST API, RESTful API) (0) | 2022.05.09 |
---|---|
기술면접준비(5)_ 자주 나오는 기술문제 (0) | 2021.06.23 |
기술면접준비(4)_100선-1 (0) | 2021.06.09 |
기술면접준비(3)_MVC패턴/ model-1과 model-2차이점 (0) | 2021.06.07 |
기술면접준비(1)_VO/DAO/DTO/트랜잭션 (2) | 2021.06.07 |