분류 전체보기
[Spring] AOP 주의사항
[Spring] AOP 주의사항
2023.07.29스프링은 프록시로 AOP를 적용한다. 스프링 컨테이너는 실제 객체 대신 프록시를 스프링 빈으로 등록해 실제 객체를 직접 호출하는 문제가 발생하지 않을 것 같지만... 실제 객체 내부에서 메서드 호출 시 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생할 수 있다. @Slf4j @Component public class CallServiceV0 { public void external() { log.info("call external"); internal(); //내부 메서드 호출(this.internal()) } public void internal() { log.info("call internal"); } } @Slf4j @Aspect public class CallLogAspect { @B..
[Spring] 포인트컷 지시자
[Spring] 포인트컷 지시자
2023.07.28@Pointcut("execution(...)") 지금까지 포인트컷을 작성할 때는 AspectJ가 제공하는 execution 지시자를 사용해서 작성했다. execution 지시자를 가장 많이 사용하긴 하지만.. AspectJ는 다른 지시자도 제공한다. 포인트컷을 작성하는 방식을 살펴보자. execution execution(접근제어자? 반환타입 선언타입?메서드명(파라미터) 예외?) ?가 뒤에 붙어있으면 생략 가능함을 의미한다. 선언타입은 패키지명과 클래스명을 모두 포함하고 * 표현을 사용할 수 있다. pointcut.setExpression("execution(public String start.aop.member.MemberServiceImpl.hello(String))"); pointcut.setEx..
[Spring] AOP 적용
[Spring] AOP 적용
2023.07.27애플리케이션 로직은 핵심 기능과 부가 기능으로 나뉜다. 트랜잭션 관리, 보안, 로깅 등 부가기능은 애플리케이션 전반에 걸쳐 사용되는 횡단 관심사이고, 횡단 관심사를 효과적으로 처리하기 위해 AOP 기술이 도입됐다. AOP는 부가 기능을 핵심 기능에서 분리하고 한 곳에서 통합해서 관리한다. 부가 기능과 부가 기능을 어디에 적용할 지 선택하는 기능을 Aspect 라고 부르고, @Aspect 애너테이션으로 사용한다. AOP는 Aspect Oriented Programming 의 약자로 이름 그대로 애플리케이션을 바라보는 관점을 기능에서 횡단 관심사로 옮겨서 바라보는 패러다임이고, OOP의 부족한 부분을 보조하는 목적으로 도입됐다. AOP의 구현 중 AspectJ 프레임워크가 있다. 스프링도 AspectJ의 문..
[Spring] 빈 후처리기
[Spring] 빈 후처리기
2023.07.26AOP를 적용하기 위해 프록시 기술에 대해 알아봤는데... 프록시 기술을 적용해 기존 코드를 수정하지 않고 부가 기능을 적용할 수는 있었지만 추가로 수행해 줘야 하는 설정이 너무 많고 빈 등록도 @Configuration과 @Bean 애너테이션을 통해 수동으로 해 줘야 하는 문제점이 있었다. 요즘은 빈 등록을 ComponentScan 방식으로 수행하는데... ComponentScan을 사용하면 빈 등록 과정에 개발자가 개입할 공간이 없어 그대로 실제 클래스를 빈으로 등록할 수 밖에 없다. 이런 문제를 처리하기 위해 빈 후처리기가 도입됐다. (BeanPostProcessor) 빈 후처리기는 스프링이 빈으로 등록할 목적으로 생성한 객체를 등록하기 직전에 조작할 때 사용한다. 객체는 빈으로 등록되기 전 빈 후..
[Spring] 프록시 팩토리
[Spring] 프록시 팩토리
2023.07.24JDK 동적 프록시와 CGLIB를 동시에 사용하려면 InvocationHandler와 MethodInterceptor를 각각 중복해서 만들어서 관리해야 되나? 아니면 인터페이스가 있으면 JDK 동적 프록시를, 클래스만 있으면 CGLIB를 쓰는 방법은 없을까? 이런 요소들을 해결하기 위해 프록시 팩토리가 도입됐다. 팩토리 패턴은 디자인 패턴 중 하나로 객체 생성 로직을 서브 클래스에게 위임해 인스턴스의 생성을 호출하는 측과 실제 생성되는 인스턴스 측으로 분리하는 역할을 한다. 팩토리 클래스 : 인스턴스를 생성하는 메서드를 제공해 인스턴스를 반환한다. 동적 프록시 클래스 : 해당 클래스의 인스턴스는 팩토리로부터 생성된다. 프록시 팩토리를 도입해 중복을 줄일 수 있고 다른 동적 프록시 기술에 대한 확장성을 얻..
[Spring] 동적 프록시 기술
[Spring] 동적 프록시 기술
2023.07.23JDK 동적 프록시 기술이나 CGLIB 같은 프록시 생성 기술을 활용하면 프록시 객체를 동적으로 만들 수 있다. 이전처럼 프록시 객체를 계속해서 만들지 않고 하나만 만들고 동적 프록시로 적용해보자. 자바의 리플렉션 기술을 사용하면 클래스나 메서드의 메타데이터를 동적으로 획득하고 코드도 호출할 수 있다. @Slf4j static class Hello { public String callA() { log.info("callA"); return "A"; } public String callB() { log.info("callB"); return "B"; } } @Test void reflection1() throws Exception { Class classHello = Class.forName("hello...
[Spring] 프록시 패턴과 데코레이터 패턴
[Spring] 프록시 패턴과 데코레이터 패턴
2023.07.22메서드 실행 단위로 로그를 출력할 때 템플릿 메서드 패턴과 전략 패턴을 사용했지만, 기존 코드를 수정해야 한다는 문제점이 남아있다. 프록시를 사용하면 해당 문제를 해결할 수 있다. 네트워크에서의 프록시는 클라이언트와 서버 사이에서 중개자 역할을 수행한다. 클라이언트는 직접 서버와 통신하는 대신 프록시 서버를 통해서 실제 서버에 요청을 보내고, 프록시 서버는 해당 요청을 받아 실제 서버에 전달한다. 1. 캐싱 : 자주 요청되는 리소스를 캐시로 저장해 클라이언트에게 더 빠르게 응답한다. 2. 필터링 : 특정 서비스에 대한 접근을 차단하거나 제한한다. 3. 로드밸런싱 : 프록시 서버가 요청을 여러 서버에 분산시켜 서버 부하를 줄인다. 4. 보안 : 클라이언트의 실제 IP주소를 숨시고 프록시 IP주소를 사용해 ..
[Spring] 템플릿 메서드 패턴과 전략 패턴
[Spring] 템플릿 메서드 패턴과 전략 패턴
2023.07.19템플릿 메서드 패턴은 변하는 부분과 변하지 않는 부분을 분리하기 위해 사용되는 디자인 패턴이다. 하나의 메서드는 비즈니스 로직을 실행하는 부분과 비즈니스 로직의 실행 시간을 측정하는 부분으로 구성된다. 여기서 핵심 기능은 비즈니스 로직을 실행하는 부분이고, 실행 시간을 측정하는 부분은 부가적인 기능이다. 핵심 기능과 부가 기능을 분리해보자. public abstract class AbstractTemplate { public void execute() { long startTime = System.currentTimeMillis(); call(); long endTime = System.currentTimeMillis(); long resultTime = endTime - startTime; log.in..
[Spring] 로그 추적기와 쓰레드 로컬
[Spring] 로그 추적기와 쓰레드 로컬
2023.07.16public 접근제어자가 붙은 모든 메서드가 실행될 때 마다 로그를 찍어보자. 로그는 애플리케이션 로직에 영향을 끼쳐서는 안되고, 각 HTTP 요청을 구분할 수 있어야 한다. @Slf4j public class FieldLogTrace implements LogTrace { private static final String START_PREFIX = "-->"; private static final String COMPLETE_PREFIX = "
[Spring Web MVC] 로그인 처리 - Filter / Interceptor
[Spring Web MVC] 로그인 처리 - Filter / Interceptor
2023.07.11로그인 한 사용자에 한해서만 웹 페이지가 제공하는 서비스를 사용할 수 있어야 한다. 로그인 하지 않은 사용자가 특정 URL으로 접속을 시도할 경우 로그인을 하지 않아도 서비스를 사용할 수 있으면 안 된다. 컨트롤러에서 로그인 여부를 체크하는 로직을 하나하나 추가해서 작성하는 방법도 있지만, 이렇게 설계하면 나중에 로그인 관련 로직이 변경될 때 작성된 로직을 모두 수정해야 하는 불편함이 생긴다. 여기서의 로그인처럼 여러 로직에서 공통으로 관심이 있는 작업을 공통 관심사라고 한다. 웹과 관련된 공통 관심사는 서블릿 필터 또는 스프링 인터셉터를 사용해 한 번에 처리할 수 있다. Servlet Filter 필터는 수문장 역할을 한다. HTTP 요청 -> 서버 -> 필터 -> 디스패처 서블릿 -> 컨트롤러 서버는..
[Spring Web MVC] 로그인 처리 - Cookie / Session
[Spring Web MVC] 로그인 처리 - Cookie / Session
2023.07.10패키지 구조를 먼저 설계하자. 도메인과 웹을 분리했는데, 도메인은 시스템이 구현하는 핵심 비즈니스 업무 영역을 말한다. 나중에 웹을 다른 기술로 변경한다고 해도 도메인은 그대로 유지할 수 있어야 한다. (도메인은 웹에 의존하지 않고, 웹은 도메인에 의존한다.) 도메인 : 비즈니스 로직 (서비스, 리포지토리, 모델, 엔티티) 웹 : HTTP 요청 처리하고 응답 (컨트롤러, 필터, 리스너) public Member login(String loginId, String password){ // Optional findMemberOptional = memberRepository.findByLoginId(loginId); // Member member = findMemberOptional.get(); // if(m..
[Flutter] 애니메이션
[Flutter] 애니메이션
2023.06.25플러터의 애니메이션에는 두 가지 종류가 있다. 1. Explicit 애니메이션의 시작, 중지, 방향 등 모든 부분을 개발자가 직접 제어한다. Explicit 애니메이션은 일반적으로 시간에 따라 변하는 값이기 때문에 상태를 가지고 있다고 볼 수 있다. 따라서 Explicit 애니메이션을 구현하는 위젯은 대부분 StatefulWidget을 상속받는다. class _CategoriesScreenState extends State with SingleTickerProviderStateMixin { late AnimationController _animationController; @override void initState() { _animationController = AnimationController( v..