전체 글 278

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

✔️ 프록시 팩토리 스프링은 동적 프록시를 통합해서 편리하게 만들어주는 프록시 팩토리(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

백준 1094번 : 막대기 자바

🧫 문제 분석 ✔️ 출처막대기 실버 5 📖 문제  비트 마스킹 문제인데 바른 방식으로 풀었다. 시간차는 비트마스킹이랑 4ms 차이정도 났다. 비트마스킹 제대로 공부해야겠다.  🔅 문제 풀이import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); ..

baekjoon 2024.09.07

백준 1030번 : 프렉탈 평면 자바

🧫 문제 분석 ✔️ 출처프렉탈 평면 골드 3 📖 문제  분할 정복 문제증말 어려웠던 문제였다. 필자는 먼저 s초가 흐른 뒤의 크기부터 n으로 나눠가며 분할했다.n^s → n ^s / n → n ^s - 1 / n ...핵심black 체크 (어떻게 계속해서 분할되는 정사각형에서 black인지 아닌지 확인할 것인가)주어진 범위를 벗어나면 탐색 범위 제외 black 체크black 체크의 경우 문제에서 나와있듯이 (N - K) % 2 = 0이다.즉 , 분할한 각 구역의 시작 위치에서 대각선으로 (N - K) / 2 만큼 떨어져있다는 의미이기도 하다.이를 블랙 포인트라 하자.문제는 시간이 지날수록 n*n 씩 나눠지고, 사각형은 k*k 크기로 만들어진다.  앞서 말했듯이 n^s 부터 시작한다. 여기서 구한 블랙..

baekjoon 2024.09.05

스프링 고급편 - 프록시 패턴과 데코레이터 패턴

✔️ 프록시 패턴  프록시는 대체자 이다.프록시의 주요 기능접근 제어권한에 따른 접근 차단캐싱지연 로딩부가 기능 추가원래 서버가 제공하는 기능에 더해서 부가 기능을 수행예) 요청 값이나, 응답 값을 중간에 변형예) 실행 시간을 측정해서 추가 로그를 남김프록시는 체인 작용이 가능하다.     GOF 디자인 패턴둘다 프록시를 사용하지만 의도에 따라서 프록시 패턴과 데코레이터 패턴으로 구분프록시 패턴 : 접근 제어가 목적데코레이터 패턴 : 새로운 기능 추가가 목적위 그림을 보면클라이언트가 subject에 접근하지만 subject의 구현체인 proxy가 캐시 처리를 하고없다면 target으로 realSubject를 이용해서 처리package hello.proxy.pureproxy.proxy.code;import..

백준 2447번 : 별 찍기 - 10 자바

🧫 문제 분석 ✔️ 출처별 찍기 골드 5 📖 문제 분할정복 문제로N이 3의 거듭 제곱으로 주어지고 3의 거듭 제곱을 3으로 나눌때 중앙이 공백이 되어야한다. 재귀로 주어진 N / 3 을 하여 3등분을 하고 (이에 따라 N/3 개의 위치가 생김)각 위치에 따라 재귀로 호출한 후재귀가 끝나면 각 구역의 가운데 부분을 for문을 돌면서 빈칸을 채운다.  예를 들어 27이면y : 0, 9, 18 x : 0 , 9, 18  이런 식으로 3등분 했을 때 구역의 첫 위치를 재귀로 넘긴다.   나는 먼저 배열을 *로 가득 채운 상태에서 공백을 넣는 방법을 사용하였다.  🔅 문제 풀이import java.io.*;import java.util.*;public class Main { static char[][]..

baekjoon 2024.09.04

백준 11057번 : 오르막 수 자바

🧫 문제 분석 ✔️ 출처오르막 수 실버 1 📖 문제 깊이 별로 나누되 0~10까지 에 대해서 동적프로그래밍을 한다. 중요한 점수는 0으로 시작할 수 있다는 것이다.  현재 깊이의 각 수는 이전 깊이의 현재 수부터 9까지의 개수 합을 더하면 된다.   수 \ 깊이12301깊이 1의 0~9까지 : 10깊이 2의 0~9 까지 : 5511깊이 1의 1~9까지 : 9깊이 2의 1~9까지 : 4521깊이 1의 2~9까지 : 8깊이 2의 2~9까지 : 36 잘 모르겠다면 노드로 직접 그려보면 바로 알기 쉽다.  🔅 문제 풀이import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws I..

baekjoon/DP 2024.09.03

배열의 복사 : clone() 메서드 자바

✔️ 1차원 배열 깊은 복사얕은 복사는 그냥 대입하면 되므로 깊은 복사를 중점으로 정리 1차원 배열 깊은 복사는 배열의 메서드인 clone() 을 사용하면 된다.  int[] arr = {1,2};int[] arr2 = arr.clone();   Testpublic class Main { public static void main(String[] args) throws IOException { int[] arr = {1, 2}; int[] arr2 = arr.clone(); arr[0] = 55555; for (int i : arr) { System.out.print(i + " "); } System.ou..

JAVA 2024.09.03