분류 전체보기 274

스프링 고급편 - 실전예제

✔️ 예제 만들기유요한 스프링 AOP 만들기@Trace : 애노테이션으로 로그 출력@Retry : 애노테이션으로 예외 발생시 재시도 ExamRepository@Repositorypublic class ExamRepository { private static int seq = 0; /** * 5번에 1번 실패하는 요청 */ public String save(String itemId) { seq++; if (seq % 5 == 0) { throw new IllegalStateException("예외 발생"); } return "ok"; }} ExamService@Service@RequiredArgsC..

스프링 고급편 - 포인트컷

✔️ 포인트컷 지시자(Pointcut Designator) : PCD애스팩트J는 포인트 컷을 편리하게 표현하기위한 특별한 표현식을 제공@Pointcut("execution(* hello.aop.order..*(..))")execution : 메서드 실행 조인 포인트를 매칭within : 특정 타입 내의 조인 포인트를 매칭args : 인자가주어진 타입의 인스턴스인 조인 포인트  this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트 target : Target 객체(스프링 AOP 프록시가 가리키는 실제 대상)를 대상으로 하는 조인 포인트@target : 실행 객체의클래스에주어진 타입의 애노테이션이 있는 조인 포인트    @within : 주어진 애노테이션이있는 타입 내 조인 포인트..

스프링 고급편 - 스프링 AOP 구현

✔️ 구현@Slf4j@Aspectpublic class AspectV1 { @Around("execution(* hello.aop.order..*(..))") public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joinPoint.getSignature()); return joinPoint.proceed(); }}AspectV1을 만든다. @Around : 포인트 컷 부분에 해당* 모든 타입, hello.aop.order 패키지와 그 하위 패키지(..)를 지정 // 자세한건 다음 포스트에서 설명@Around가 달린 메서드 doLog는 어드바이스가 된다.  ..

스프링 고급편 - 스프링 AOP 개념

✔️ AOP - 핵심 기능과 부가 기능핵심 기능해당 객체가 제공하는 고유의 기능 (주문 로직 같은 target의 기능)  부가 기능핵심 기능을 보조하기 위해 제공되는 기능 (로그 추적 로직, 트랜잭션)이러한 부가 기능은 단독으로 사용되지 않고, 핵심 기능과 함께 사용  보통 부가 기능은 여러 클래스에 걸쳐서 함께사용된다.  부가기능 적용 문제 그런데 여러 곳에부가 기능을 적용하기에는 각 클래스 마다 동일한 코드를 추가해야하기에 번거롭다. 부가 기능이 구조적으로 단순 호출이 아닌 try-cath-finally 같은 구조가 필요하다면 더욱 복잡해진다.부가 기능 수정이 발생하면 적용한 모든 클래스를 수정해야한다. (끔찍하다..)  정리부가 기능을 적용할 때 아주 많은 반복이 필요부가 기능이 여러 곳에 퍼져서 ..

스프링 고급편 - @Aspect AOP

✔️ @Aspect 프록시스프링은 @Aspect 애노테이션으로 매우 편리하게 포인트 컷과 어드바이스로 구성되어있는 어드바이저 생성 기능 지원  참고@Aspect 는 관점 지향 프로그래밍(AOP)을 가능하게 하는 AspectJ 프로젝트에서 제공하는 애노테이션이다.   @Slf4j@Aspectpublic class LogTraceAspect { private final LogTrace logTrace; public LogTraceAspect(LogTrace logTrace) { this.logTrace = logTrace; } @Around("execution(* hello.proxy.app..*(..))") // 포인트 컷 public Object execute(Pr..

스프링 고급편 - 빈 후처리기

✔️ 빈 후처리기 - BeanPostProcessor스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에조작이 가능하다.한 마디로 빈 생성후무언가 처리하는 용도이다.  이를 사용하면 컴포넌트 스캔 대상들도 프록시로 등록할 수 있게 된다.      BeanPostProcessor 인터페이스 - 스프링 제공public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException Object postProcessAfterInitialization(Object bean, String beanName) throws Bean..

스프링 고급편 - 스프링이 지원하는 프록시 (프록시 팩토리)

✔️ 프록시 팩토리 스프링은 동적 프록시를 통합해서 편리하게 만들어주는 프록시 팩토리(ProxyFactory) 기능을 제공프록시 팩토리 하나로인터페이스의 경우 JDK 동적 프록시를,구체 클래스의경우CGLIB를 적용해준다.  그런데 동적 프록시는 InvocationHandler가 , CGLIB는 MethodInterceptor 로 부가기능을 적용하였는데 프록시팩토리를 사용해도따로 만들어야할까? 스프링은 이 문제를 해결하기 위해 부가기능을 적용할 때 Advice   라는 새로운 개념을 도입했다.프록시 팩토리를 사용하면 Advice를 호출하는 전용 InvocationHandler, MethodInterceptor 를 내부에서 사용한다.   Advice 만들기Advice는 프록시에 적용하는부가 기능 로직이며,I..

스프링 고급편 - 동적 프록시 기술

핵심 내용만 정리하고  자세한 구현 코드는 올리지 않는다. 스프링 부트 3.3.3 버전 기준 ✔️ 리플렉션 이전까지 프록시를 사용해 로그 추적기 부가 기능을 적용했지만 대상 클래스만큼 프록시 클래스를 만들어야 한다는 단점이 있다.따라서 자바의 기본 제공 기술인 JDK 동적 프록시, CGLIB 같은 프록시 생성 오픈소스 기술을 활용하면 프록시 객체를 동적으로 만들어 낼 수 있다. 하지만 JDK 동적 프록시 생성을 이해하려면 리플렉션을 알아야한다. 리플렉션은 한다미로 메타 데이터 이다. void reflection1() throws Exception { //클래스 정보 Class classHello = Class.forName("hello.proxy.jdkdynamic.ReflectionTest$Hell..

백준 2448번 : 별 찍기 - 11 자바

🧫 문제 분석 ✔️ 출처별 찍기 - 11 골드 4 📖 문제    재귀로 풀어야 될거 같은 패턴 모양이다 삼각형을 3개로 나눠서 위쪽, 아래왼쪽, 아래 오른쪽 으로 분할한다. 높이는 N 이고밑변은 N * 2 - 1 이다. n 이 3일 때까지 재귀로 삼각형을 분할하고3이되면 위치에 맞게 별을 넣으면 된다.  아래의 그림을 참조하면 될 것 같다. 이 방식으로 삼각형을 분할한다.   처음 시도때 실수 한 것이 삼각형의 위쪽 별 위치를 재귀로 넘겨서 분할할려 했는데인덱스 벗어나거나 하는 문제가 발생했다.    🔅 문제 풀이import java.io.*;import java.util.*;public class Main { static char[][] arr; public static void mai..

baekjoon 2024.09.13

백준 12891번 : DNA 비밀번호 자바

🧫 문제 분석 ✔️ 출처DNA 비밀번호 실버 2 📖 문제   투포인터 문제로 슬라이딩 윈도우에 대한 지식이 있다면풀이방법이 쉽게 떠오를 것이다.  모르겠다면 네트워크에서 흐름제어로 사용중인 슬라이딩 윈도우 에 대해서 학습해보자.  이 문제는 윈도우 역할을 할 배열을 하나 만들고,읽어들인 비밀번호가 DNA 문자에 맞는지 확인하기 위해 각 문자마다 개수를 저장할 배열을 만든다.  front 포인터와 back 포인터로 이용하되우선 부분 문자열 p 만큼윈도우에 채우고 만들 수 있는 DNA 비밀번호인지확인한다. 확인 후 새로운 문자를 받기위해  front를 뒤로 한 칸 땡겨서 윈도우의 맨 앞쪽을 빼고 윈도우 사이즈를 1 줄인 뒤 back을 늘려서 윈도우 사이즈를 p일때까지 채운다.  p 가4라 했을 때    ..

baekjoon 2024.09.13