목록전체 글 (302)
elevne's Study Note

자바에서는 JDK 에서 제공하는 다이나믹 프록시 외에도 편리하게 프록시를 만들 수 있는 다양한 기술이 존재한다. 그 중 하나는 ProxyFactoryBean 이다. 이는 프록시를 생성해서 빈 오브젝트로 등록하게 해준다. 기존에 작성했던 TxProxyFactoryBean 과 달리 ProxyFactoryBean 은 순수하게 프록시를 생성하는 작업만을 담당하고 프록시를 통해 제공해줄 부가기능은 별도의 빈에 둘 수 있다. ProxyFactoryBean 이 생성하는 프록시에서 사용할 부가기능은 MethodInterceptor 인터페이스를 구현해서 만든다. 이전에 사용한 InvocationHandler 은 타깃에 대한 정보를 알아야했지만, MethodInterceptor 은 ProxyFactoryBean 으로부터 ..

이전까지 작업한 TransactionHandler, 다이나믹 프록시를 스프링의 DI 를 통해 사용할 수 있어야 할 것이다. 하지만 DI 의 대상이 되는 다이나믹 프록시 오브젝트는 일반적인 스프링의 빈으로는 등록할 방법이 없다. 스프링은 내부적으로 리플렉션 API 를 사용하여 빈 정의에 나오는 클래스 이름을 가지고 오브젝트를 생성한다. 하지만 다이나믹 프록시 오브젝트는 이런 식으로 프록시 오브젝트가 생성되지 않는다. (어떤 클래스를 구체적으로 사용하는지도 알 수 없다) 다이나믹 프록시를 사용하게 되면 프록시 오브젝트 클래스 정보를 미리 알아내서 스프링 빈에 정의할 방법이 없다는 뜻이다. 다이나믹 프록시는 Proxy 클래스의 newProxyInstance() 메소드를 통해서만 생성할 수 있다. 이 때, Fa..

이전 시간에는 트랜잭션 기능, 즉 비즈니스 로직과 직접적으로 연관이 없는 코드를 서비스 밖으로 빼주는 작업을 진행해주려 하였다. 부가기능 전부를 UserServiceTx 라는, UserService 인터페이스를 구현한 클래스로 옮겨두고 UserServiceImpl 에서는 트랜잭션과 관련된 기능을 전부 제거해줄 수 있었다. 이 때, 부가기능은 마친 해당 클래스가 핵심 기능을 가진 클래스인 것처럼 꾸며서, 클라이언트가 해당 클래스를 거쳐 핵심 기능을 사용하도록 만들어져야 한다. (이를 위해 UserServiceTx 또한 UserService 인터페이스를 구현하도록 만든 것) 이와 같이 자신이 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장하여 클라이언트의 요청을 받아주는 것을 프록시 (Proxy) 라고..

간단한 게시판 서버를 Spring Boot 를 통해 천천히 구현해보고자 하였다. 우선 아래와 같은 dependency 들만 추가해주었다. dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-mail' implementation 'org.springframework.boot:spring-boot-starter-security' implementation '..

링크: https://www.acmicpc.net/problem/1676 1676번: 팩토리얼 0의 개수 N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오. www.acmicpc.net N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오. import sys def solution(): n = int(sys.stdin.readline()) fac = 1 for i in range(1, n+1): fac *= i x = 0 for num in list(reversed(list(str(fac)))): if num == "0": x += 1 else: return x if __name__ == "__main__": pr..

링크: https://www.acmicpc.net/problem/2805 2805번: 나무 자르기 첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보 www.acmicpc.net 상근이는 나무 M미터가 필요하다. 근처에 나무를 구입할 곳이 모두 망해버렸기 때문에, 정부에 벌목 허가를 요청했다. 정부는 상근이네 집 근처의 나무 한 줄에 대한 벌목 허가를 내주었고, 상근이는 새로 구입한 목재절단기를 이용해서 나무를 구할것이다. 목재절단기는 다음과 같이 동작한다. 먼저, 상근이는 절단기에 높이 H를 지정해야 한다. 높이를 지정하면 ..

링크: https://www.acmicpc.net/problem/11651 11651번: 좌표 정렬하기 2 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다. www.acmicpc.net 2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오. 정렬 기준이 2 개가 있는 문제였다. 파이썬에서는 sort 함수의 key 파라미터를 사용하여 정렬 기준을 직접 정해줄 수 있다. 이 때, 여러 개의 정렬 기준을 잡아줄 수도 있..

오늘은 스택 수열 문제를 풀어보았다. 링크: https://www.acmicpc.net/problem/1874 1874번: 스택 수열 1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다. www.acmicpc.net 스택 (stack)은 기본적인 자료구조 중 하나로, 컴퓨터 프로그램을 작성할 때 자주 이용되는 개념이다. 스택은 자료를 넣는 (push) 입구와 자료를 뽑는 (pop) 입구가 같아 제일 나중에 들어간 자료가 제일 먼저 나오는 (LIFO, Last in First out) ..