▶ 3일 계획
=> 공부 관련
1) 수업(18일 수업) 내용 복습
2) MVC 강의 결제
3) 스프링 기술 완강
4) MVC 강의 수강
=> 취준
1) 리팩토링 마무리 후 깃 푸쉬
2) 미흡 질문 답변 채우기(한 문장으로 정리)
3) 수강 강의 내용 노션 정리
▶ 문제 정리
1. JoinPoint & PointCut의 개념 혼동
조인포인트가 메타적인 정보라고 생각하면 되고 포인트컷이 좀 더 구체적인 적용 지점이다!
2. MVC 리팩토링에서 Computer 객체 주입 시점의 문제
▶ 개인 공부
데이터 바인딩 추상화: Converter와 Formatter
public class EventConverter {
public static class StringToEventConverter implements Converter<String, Event> {
@Override
public Event convert(String source) {
return new Event(Integer.parseInt(source));
}
public static class EventToStringConverter implements Converter<Event, String>{
@Override
public String convert(Event source) {
return source.getId().toString();
}
}
}
}
=> Event, String Type간의 컨버팅하는 메서드를 오버라이드한 모습
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
EventService eventService;
@Override
public void run(ApplicationArguments args) throws Exception {
eventService.createEvent();
eventService.publishEvent();
eventService.deleteEvent();
}
}
=> service 객체로 메서드 호출
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface PerfLogging {
}
=> 타겟 메서드를 위한 에너테이션 정의
@Retention의 속성
1. Runtime 시 까지 유지
2. Class 바이트 코드 로드 될 때까지 유지
3. Source 소스 코드 상태 유지
● 강의 정리 ●
데이터 바인딩 추상화: Converter와 Formatter
Converter
● S 타입을 T 타입으로 변환할 수 있는 매우 일반적인 변환기.
● 상태 정보 없음 == Stateless == 쓰레드세이프
● ConverterRegistry에 등록해서 사용
public class StringToEventConverter implements Converter<String, Event> {
@Override
public Event convert(String source) {
Event event = new Event();
event.setId(Integer.parseInt(source));
return event;
}
}
Formatter
● PropertyEditor 대체제
● Object와 String 간의 변환을 담당한다.
● 문자열을 Locale에 따라 다국화하는 기능도 제공한다. (optional)
● FormatterRegistry에 등록해서 사용
public class EventFormatter implements Formatter<Event> {
@Override
public Event parse(String text, Locale locale) throws ParseException {
Event event = new Event();
int id = Integer.parseInt(text);
event.setId(id);
return event;
}
@Override
public String print(Event object, Locale locale) {
return object.getId().toString();
}
}
ConversionService
● 실제 변환 작업은 이 인터페이스를 통해서 쓰레드-세이프하게 사용할 수 있음.
● 스프링 MVC, 빈 (value) 설정, SpEL에서 사용한다.
● DefaultFormattingConversionService
● FormatterRegistry
● ConversionService
● 여러 기본 컴버터와 포매터 등록 해 줌.
스프링 부트
● 웹 애플리케이션인 경우에 DefaultFormattingConversionSerivce를 상속하여 만든 WebConversionService를 빈으로 등록해 준다.
● Formatter와 Converter 빈을 찾아 자동으로 등록해 준다
SpEL (스프링 Expression Language)
스프링 EL이란?
● 객체 그래프를 조회하고 조작하는 기능을 제공한다.
● Unified EL과 비슷하지만, 메소드 호출을 지원하며, 문자열 템플릿 기능도 제공한다.
● OGNL, MVEL, JBOss EL 등 자바에서 사용할 수 있는 여러 EL이 있지만, SpEL은 모든 스프링 프로젝트 전반에 걸쳐 사용할 EL로 만들었다.
● 스프링 3.0 부터 지원.
SpEL 구성
● ExpressionParser parser = new SpelExpressionParser()
● StandardEvaluationContext context = new StandardEvaluationContext(bean)
● Expression expression = parser.parseExpression(“SpEL 표현식”)
● String value = expression.getvalue(context, String.class)
문법
● #{“표현식"}
● ${“프로퍼티"}
● 표현식은 프로퍼티를 가질 수 있지만, 반대는 안 됨. ○ #{${my.data} + 1}
● 레퍼런스 참고
실제로 어디서 쓰나?
● @Value 애노테이션
● @ConditionalOnExpression 애노테이션
● 스프링 시큐리티
○ 메소드 시큐리티, @PreAuthorize, @PostAuthorize, @PreFilter, @PostFilter ○ XML 인터셉터 URL 설정 ○ ...
● 스프링 데이터
○ @Query 애노테이션
● Thymeleaf ● ...
스프링 AOP: 개념 소개
Aspect-oriendted Programming (AOP)은 OOP를 보완하는 수단으로, 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법.
AOP 주요 개념
● Aspect와 Target
● Advice
● Join point와 Pointcut
AOP 구현체
● https://en.wikipedia.org/wiki/Aspect-oriented_programming
● 자바 ○ AspectJ ○ 스프링 AOP
AOP 적용 방법
● 컴파일
● 로드 타임
● 런타임
스프링 AOP: 프록시 기반 AOP
스프링 AOP 특징
● 프록시 기반의 AOP 구현체
● 스프링 빈에만 AOP를 적용할 수 있다.
● 모든 AOP 기능을 제공하는 것이 목적이 아니라, 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제에 대한 해결책을 제공하는 것이 목적.
프록시 패턴
● 왜? (기존 코드 변경 없이) 접근 제어 또는 부가 기능 추가
● 기존 코드를 건드리지 않고 성능을 측정해 보자. (프록시 패턴으로)
문제점
● 매번 프록시 클래스를 작성해야 하는가?
● 여러 클래스 여러 메소드에 적용하려면?
● 객체들 관계도 복잡하고...
그래서 등장한 것이 스프링 AOP
● 스프링 IoC 컨테이너가 제공하는 기반 시설과 Dynamic 프록시를 사용하여 여러 복잡한 문제 해결.
● 동적 프록시: 동적으로 프록시 객체 생성하는 방법
○ 자바가 제공하는 방법은 인터페이스 기반 프록시 생성. ○ CGlib은 클래스 기반 프록시도 지원.
● 스프링 IoC: 기존 빈을 대체하는 동적 프록시 빈을 만들어 등록 시켜준다.
○ 클라이언트 코드 변경 없음. ○ AbstractAutoProxyCreator implements BeanPostProcessor
스프링 AOP: @AOP
애노테이션 기반의 스프링 @AOP 의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
애스팩트 정의
● @Aspect
● 빈으로 등록해야 하니까 (컴포넌트 스캔을 사용한다면) @Component도 추가.
포인트컷 정의
● @Pointcut(표현식)
● 주요 표현식
○ execution ○ @annotation ○ bean
● 포인트컷 조합
○ &&, ||, !
어드바이스 정의
● @Before
● @AfterReturning
● @AfterThrowing
● @Around
참고
● https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aoppointcuts
Null-safety
스프링 프레임워크 5에 추가된 Null 관련 애노테이션
● @NonNull
● @Nullable
● @NonNullApi (패키지 레벨 설정)
● @NonNullFields (패키지 레벨 설정)
목적
● (툴의 지원을 받아) 컴파일 시점에 최대한 NullPointerException을 방지하는 목적
◎ GitHub
▶ 수업 내용
Spring MVC
Controller 클래스
- 클라이언트 요청을 처리하기 위한 기능을 제공하는 클래스 - 웹프로그램@Request Mapping 에너테이션을 클래스에 선언하면 Controller 클래스의 모든 요청 처리 메서드의 요청 URL 주소앞부분에 공통적으로 포함되는 URL 주소를 설정 가능
MyBatis Framework에서 로그를 제공되는 Spring 로그 구현체로 기록되도록 설정하는 방법
1. Log4Jdbc Log4j2 JDBC4 라이브러리를 프로젝트에 빌드 처리 - pom.xml
2. DataSource 관련 클래스를 spring bean으로 등록한 bean 엘리먼트에서 driverClassName 필드값과 URL 필드값을 변경하여 인젝션 처리 - root-context.xml
3. [src/main/resources] 폴더에 log4jdbc.log4j2.properites 파일 작성
4. [src/main/resources] 폴더의 log4j.xml 파일에서 로그 이벤트에 대한 기록 설정
- jdbc.sqltiming : SQL 명령 실행시간(ms) 기록
- jdbc.audit : ResultSet 관련 정보를 제외한 모든 JDBC 관련 정보 기록
- jdbc.resultset : ResultSet 관련 정보를 포함한 모든 JDBC 관련 정보 기록
- jdbc.resultsettable : ResultSet 관련 정보를 테이블(표) 형식으로 기록
- jdbc.connection : Connection 관련 정보를 기록 - Open or Close
Spring Framework를 이용하여 테스트 프로그램을 작성해 모듈(단위 프로그램) 테스트 하는 방법
1. junit 라이브러리와 spring-test 라이브러리를 프로젝트에 빌드 처리 - pom.xml
⇒ junit 라이브러리와 spring-test 라이브러리의 scope 엘리먼트 주석 처리
2. [src/test/resources] 폴더의 log4j.xml 파일 변경
3. [src/test/java] 폴더에 테스트 클래스 작성 - 테스트 메서드 이용하여 모듈 테스트
pom.xml
https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4
- DAO 관련 Framework에서 발생되는 로그를 Spring Log 구현체에게 전달하는 라이브러리
Test
- 테스트 프로그램은 DAO 클래스 또는 Service 클래스의 메서드를 검사할 목적으로 작성
- 테스트 메서드를 호출하여 실행하기 위한 클래스(Clazz)를 설정하는 에너테이션
- value 속성 : 테스트 메서드를 호출하기 위한 클래스(clazz)를 속성값으로 설정 - 다른 속성이 없는 경우 속성값만 설정
- SpringJUnit4ClassRunner : Spring Container (ApplicationContext 객체)를 생성하여 Spring Bean을 제공하여 테스트 프로그램을 실행하는 클래스
- 테스트 클래스에서 사용될 Spring Bean이 등록된 Bean Configuration File 에너테이션
- locations 속성 : Bean Configuration File을 배열의 요소로 설정하여 속성값으로 설정
- ⇒ Bean Configuration File 경로는 file 접두어를 사용하여 파일 시스템 경로로 표현
- 테스트 메서드를 설정하는 에너테이션
- ⇒ Runner 클래스에 의해 호출되어 명령이 실행되는 메서드
- WebApplicationContext 객체(Spring Container)를 이용하여 Spring Bean을 관리하도록 설정하는 에너테이션
- 요청과 응답을 가상으로 제공하기 위한 클래스
- 테스트 메서드 호출 전 실행될 명령을 작성한 메서드에 설정하는 에너테이션 - 초기화 작업
- MockMvcBuilder 객체를 만드는 메서드
- build() : MockMvc 객체를 반환하는 메서드
- 가상으로 웹프로그램을 요청하는 메서드
- ⇒ ResultActions 객체 반환 (요청에 대한 처리 결과를 저장한 객체)
- MockMvcRequestBuilders.get(String urlTemplate, Object... uriVars)
- ⇒RequestBuilder 객체 반환 (웹프로그램의 요청정보를 저장한 객체)
- ResultActions.addReturn() : 요청 처리 메서드의 결과를 MvcResult 객체로 반환하는 메서드
- @RunWith
'레거시' 카테고리의 다른 글
2022.04.16 의 기록 (0) | 2022.04.16 |
---|---|
2022-04-13의 기록 (0) | 2022.04.13 |
2022.03.17의 기록 (2) | 2022.03.17 |
2022.03.16의 기록 (0) | 2022.03.16 |
2022.03.15의 기록 (0) | 2022.03.15 |