[To Do List]
1. 리플렉션이란?
- 리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API
2. 객체지향
- 객체지향이란? 객체간의 관계를 통해 메세지를 주고받아 프로그램을 작성하는 방법.
- 모듈화
3. 금요일 할것 : 이메일 전달프로그램 ->
월요일(14) 테스트프로그램 나갈 예정
화요일(15) -> Spring MVC 들어갈 예정
[공부 정리]
**결합도가 높은 프로그램 예시
결합도가 높을수록 유지보수의 효율성이 낮아진다 ㅠㅠ
**결합도가 낮은 프로그램 예시
인터페이스를 통한 의존성 주입으로 결합도가 낮은 프로그램을 만들어준다 (DI)
byType 속성값 사용 유의점
- 필드의 자료형이 인터페이스인 경우, 자식클래스의 빈객체가 여러개 등록된 경우, 의존관계 설정시 UnsatisfiedDEpendencyException 예외가 발생한다.
Constructor 속성값
- 의존관계를 설정하기 위한 매개변수가 있는 생성자가 반드시 선언되어 있어야 한다.
[의존관계를 Annotation만으로 구현해보기]
bean Configuration file 만들때 [next] 누르고 beans와 context 체크해주고 밑에 파일 총 두개 추가해준다.
@Component : 클래스를 Spring Bean으로 등록하기 위한 어노테이션
-> 기본적으로 클래스명을 beanName으로 자동 설정하며 value 속성을 사용하여 beanName을 변경 가능
-단순하게 빈으로만 등록해줌 ( 기능이 아주 단순함! -> 고로 이걸 안쓰고 밑의 어노테이션을 사용한다)
@Autowired : 스프링 빈 객체로 의존관계를 자동 설정하는 어노테이션
-> 빈 엘리먼트의 autowire 속성의 [byType] 속성값과 동일한 방법으로 의존관계 설정
- 필드에 setter 메소드를 선언하지 않아도 Setter Injection 기능을 제공한다.
- 객체를 만들때 리플렉션기능을 이용하고, 접근지정자에 상관이 없다.
(문제점)
필드의 자료형이 인터페이스인 경우 자식클래스의 스프링빈 객체가 여러개 있다면 의존관계 설정시 UnsatisfiedDEpendencyException 예외가 발생한다.
(해결법-1)
스프링빈으로 등록된 자식클래스 중 하나의 beanName을 필드명과 같은 이름으로 변경한다.
->자식클래스의 스프링빈 객체가 여러개 있는경우 autowire 속성의 [byName]과 같은 방법으로 의존관계를 설정
(해결법-2)
@Qualifier(" ") :의존관계를 설정하기 위한 스프링 빈 객체를 선택하기 위한 어노테이션
-> @Autowireed 어노테이션에 종속된 어노테이션
-> 의존관계가 주입되었다.
- value 속성 : 의존관계를 설정하기 위한 스프링빈 객체의 beanName을 속성값으로 설정
@Repository (권장) : 클래스를 Spring bean으로 등록하기 위한 어노테이션
- @Component와 역할이 비슷하다? X
- 트랜잭션 매니저가 관리 가능하게끔 도와준다. (Commit or Rollback)
@Service : Service 클래스를 스프링빈으로 등록하기 위한 어노테이션
- 주로 예외를 발생하는 역할을 한다. -> exceptionHandler 가 받아서 처리!!!
AOP
메소드에 중복코드가 존재할경우 , 중복코드 대신 사용될 메소드 선언
-> 중복코들르 최소화하여 유지보수 효율성 증가
추상화 -> 어떤 대상을 클래스로 표현하려는것.
모듈화
객체지향을 만들때는 웬만하면 모듈화 클래스를 사용하는것이 좋다.
AOP(관점 지향 프로그래밍) : 로그처리(위버 라이브러리가 따로 필요함), 보안, 트랜잭션관리, 예외사항처리(나머지 세개는 위버가 내장되어있어서 따로 필요하지 않음) (횡단관심) 필요한 시점에 핵심코드를 삽입하여 동작
1.핵심관심 Core Concerns
2.횡단관심 Crosscutting Concerns (예- 로그처리,보안,트랜잭션관리,예외사항처리)
3.프록시클래스
포인트컷(필요한 시점)에 핵심관심모듈+횡단관심모듈 합쳐진다.
AspectJ의 기능
AOP의 용어
joinpoint : 어떤메소드에 호출할지(어디에)
pointcut :
advice : 횡단관심클래스 (무엇을)
weaving : 섞는것.(합쳐서)
aspect : (를 만든다)
흐름
★★서비스클래스는 dao 클래스를 필드로 갖는게 핵심이다!!
Advice 클래스 - 횡단관심모듈(Crosscutting Concern Module)이 선언된 클래스
- 횡단관심코드 : 핵심관심코드 전 또는 후에 실행될 보조적인 명령
-> 로그처리, 보안(권한)처리,트랜잭션 처리,예외처리 등의 명령
-
★★핵심인지 횡단인지 구분해서 메소드로 만들어줄줄 알아야 한다.
타겟메소드(핵심관심모듈 중에서도 포인트컷으로 지정된 메소드)
타겟메소드(핵심관심모듈)의 명령실행 전에 삽입되어 실행될 명령을 작성한 메소드 = 횡단관심모듈
=> JoinPoint : before Advice
JoinPoint : 핵심관심모듈을 기준으로 횡단관심모듈이 삽입될 위치를 표현한다.
before advice : 주로 void로 선언한다.
public void beforeLog() {
logger.info("[before]핵심관심코드 동작 전 삽입되어 실행될 횡단관심코드");
}
[AspectJ 를 통해 AOP를 설정해주자]
**xml의 Namespace를 설정해주자
<aop:config>
config : Spring AOP(AspectJ)를 구현하기 위한 상위 엘리먼트
<aop:aspect>
aspect : 핵심관심모듈에 횡단관심모듈을 원하는 위치(JoinPoint)에 삽입되어 실행되도록 설정하는 엘리먼트
-> 핵심관심모듈을 PointCut을 사용해서 타겟메소드로 설정
ref속성 : 횡단관심모듈이 선언된 스프링빈 객체의 beanName을 속성값으로 설정한다.
<aop:before>
before : 타겟메소드 앞에 횡단관심모듈을 삽입하기 위한 엘리먼트 - joinPoint
method 속성 : 횡단관심모듈 중 삽입되어 실행될 횡단관심모듈의 메소드명을 속성값으로 설정한다.
pointcut 속성 : execution 또는 within 중 하나를 속성값으로 설정.
-> 핵심관심모듈 중 원하는 메소드를 타겟메소드로 지정하기위한 정보를 속성값으로 설정
execution 속성값 : pointcut 표현식을 이용하여 타겟메소드 지정 -> 확장성이 조금 더 좋다~
within 속성값 : 클래스(스프링 빈)의 모든 메소드(핵심관심모듈)를 타겟메소드로 지정
=> 클래스 대신 인터페이스 사용 불가능
->pointcut 속성값으로 연산자 사용이 가능합니다 : !(NOT), &&(AND), ||(OR)
pointcut-ref 속성 : pointcut 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
->타겟메소드를 지정하는 정보를 제공받아 사용
[Weaver lib 설정을 pom.xml에서 해주어야한다]
log4j.xml도 바꿔줘야한다
★★★[ execution 속성값을 이용하여 타겟메소드를 지정하는 방법 ]
형식)execution([접근지정자] 반환형 [패키지명.클래스명.]메소드명(자료형,자료형,...))
=> 메소드의 머릿부를 표현하여 타겟메소드 지정 - pointcut 관련 패턴문자 사용 가능
=> 클래스 대신 인터페이스 사용 가능
=> 반환형 또는 매개변수의 자료형이 클래스인 경우 패키지를 포함하여 표현
pointcut 관련 패턴문자 : ..(0개 이상), *(1개 이상), +(0개 또는 1개)
★★★[ within 속성값을 이용하여 타겟메소드를 지정하는 방법 ]
형식)within(패키지명.클래스명)
=> Spring Bean으로 등록된 클래스의 모든 메소드를 타겟메소드로 지정
=> 클래스명은 pointcut 관련 패턴문자 사용 가능
=> 클래스 대신 인터페이스 사용 불가능
<aop:before method="beforeLog" pointcut="within(xyz.itwill07.aop.StudentDAOImpl)"/>
<aop:pointcut>
pointcut : 핵심관심모듈을 타겟메소드로 지정하기 위한 엘리먼트
-> pointcut 설정을 재사용하여 유지보수의 효율성 증가
expression 속성 : execution 또는 within 중 하나를 속성값으로 설정한다.
id 속성 : pointcut을 구분하기 위한 식별자를 속성값으로 설정
이런식으로 많이 씁니다
<aop:pointcut expression="execution(* xyz.itwill07.aop.StudentDAO.*(..))" id="studentDAOPointcut"/>
<aop:before method="beforeLog" pointcut-ref="studentDAOPointcut"/>
<aop:after>
after : 타겟메소드 뒤에 횡단관심모듈을 삽입하기 위한 엘리먼트
-> 타겟메소드에서 발생되는 예외와 상관없이 횡단관심모듈이 무조건 삽입된다
<aop:after-returning>
after Returning : 타겟메소드 뒤에 횡단관심모듈을 삽입하기 위한 엘리먼트
-> 타겟메소드가 정상적으로 실행된 경우만!!! 횡단관심모듈이 무조건 삽입된다, 예외발생시 발생 (x)
<aop:after-throwing> 주로 예외처리에 사용된다
after-throwing : 타겟메소드의 명령 실행 후에 삽입되어 실행될 명령을 작성한 메소드
->타겟메소드에서 예외가 발생된 경우 삽입되어 실행
타겟메소드의 명령실행 전후에 삽입되어 실행될 명령을 작성한 메소드
=> joinPoint : Around Advice
public Object aroundLog(ProceedingJoinPoint joinPoint) throws Throwable {
logger.info("[around]핵심관심코드 동작 전 삽입되어 실행될 횡단관심코드");
Object object=joinPoint.proceed();//타겟메소드 호출 - 핵심관심코드 실행
logger.info("[around]핵심관심코드 동작 후 삽입되어 실행될 횡단관심코드");
return object;
}
★★★<aop:aroud>★★★ 이걸 제일 많이 씀
around : 타겟메소드(핵심관심모듈) 앞과 뒤에 횡단관심모듈을 삽입하기 위한 엘리먼트
☆☆☆☆자식객체로 주입하지않고 인터페이스 객체로 주입하여도 , 컨테이너가 자식객체로 연결해줌☆☆☆☆
<bean class="xyz.itwill07.aop.StudentServiceImpl" id="studentService">
<property name="studentDAO" ref="studentDAO"/>
</bean>
mysql??
'일기장 > 하루 정리' 카테고리의 다른 글
220310 [목] 검색 동적 Query 완성, Mapper 입력 (0) | 2022.03.10 |
---|---|
220309 [수] MySql , query 짜기 (0) | 2022.03.09 |
220307 [월] DI , Spring Ioc , 파이널 회의 (0) | 2022.03.07 |
220303 [목] 멋쟁이사자 자소서 , 메이븐 (0) | 2022.03.03 |
220302 [수] 부트스트랩(마이페이지) / 멋쟁이사자 자소서 / 동적 sql (0) | 2022.03.02 |