| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- mongodb lookup
- java 1509
- 백준 2252 줄세우기
- java 팩토리얼 개수
- javav 1676
- spring mongoTemplate
- ipfs singletone
- spring mongoTemplate switch
- rabbitmq 싱글톤
- java 파티
- 자바 1676
- kotiln functional interface
- 백준 특정한 최단 경로
- 익명 객체 @transactional
- 안정해시
- nodejs rabbitmq
- 백준 연결요소 자바
- java 백준 1509
- 백준 1504 java
- Claude Intelij 연결
- kotiln const val
- kotiln const
- Java Call By Refernce
- spring mongodb switch
- java 1238
- Spring ipfs
- go
- spring mongodb
- ipfs bean
- 자바 백준 팩토리얼 개수
- Today
- Total
목록2023/12 (8)
공부 흔적남기기
BeanPostProcessor란? 한국어로 그대로 번역하면 빈 후 처리기로 스프링 빈이 생성되기 전후(초기화 전후)에 IOC 컨테이너에 빈으로 등록되기전에 빈을 intercept해서 특정로직을 처리가능하게 해주는 스프링이 지원하는 객체이다. 주로 AOP를 사용하기위해 Proxy 객체를 생성해 IOC 컨테이너에 실제 빈 대신에 프록시를 넣을 떄 사용한다. 이 뿐만 아니라 다양하게 특정 빈이 초기화 되었을 때 어떤 로직을 실행한다던지 등 여러가지로 구현가능하다. BeanPostProcessor는 다른 빈 등록보다 선행된다. 예시 BeanPostProcess를 상속받아 구현 가능하다. class LogBeanPostProcessor( private val packageName : String, private..
$facet과 $limit $skip $project를 통해 쉽게 페이지 네이션을 구현하자. 이 코드를 통해 한방에 페이지네이션을 할 수 있다. 틀은 다음과 같다 { total: Long, $지정할데이터이름 : List } fun Aggregation.pagination(pageable: Pageable, listName: String) { val skipSize = (pageable.pageSize * pageable.pageNumber).toLong() val limitSize = pageable.pageSize.toLong() val pageFacetOperation = Aggregation.facet( SkipOperation(skipSize), LimitOperation(limitSize), )..
프록시 팩토리란 Spring에서 지원하는 프록시 생성해주는 클래스로 프록시를 사용할 구현체(타겟)과 Advice, PointCut을 지정해서 프록시를 생성할 수 있다. 만약 타겟이 interface라면 jdk dynamic proxy를 생성하고 타겟이 구현체라면 cglib를 생성한다. 둘중에 하나만 사용하도록 설정도 가능하다. 최근 spring은 cglib를 기본값으로 사용하고 있다. Advice란 Advice란 프록시 로직을 의미한다 (로그, 캐싱, 권한 확인) Pointcut이란 Advice를 지정할 패키지,클래스,메소드 범위이다. 즉 Advice(로직) PointCut(범위)를 생성하고 ProxyFactory에 넘겨주면 알맞게 proxy를 생성해준다. 참고로 Advice와 PointCut을 합쳐 만..
jdk dynamic proxy와 cglib 둘은 어디에 쓰이는 걸까? 이름에서 볼 수 있다시피 proxy를 동적으로 만들어주는 라이브러리다. jdk dynamic proxy는 java의 reflection을 이용해서 프록시를 만들고 cglib는 바이트코드 수준에서 코드를 조작하여 프록시를 생성한다. jdk dynamic proxy는 어떻게 사용할까 jdk dynamic proxy는 java의 invocationHandler interface를 구현해서 사용한다. proxy의 target은 interface만 들어갈 수 있다. 예시 class LogInvocationHandler( private val target : Any, private val logService: LogServiceDirtyCode..
프록시란 특정 구현을 실행하기 전에 구현체 앞에서 대신 호출되어 실행되는 대리 응답체이다. 프록시는 여러가지 경우에 사용되는데 예를 들어 특정 로직을 실행시키기 전에 권한을 확인한다던지 모든 로직에 로그를 단다던지 캐싱을 한다던지 등등 여러가지 쓰임새로 사용된다. 프록시 패턴과 데코레이터 패턴 둘다 프록시를 사용한다. 둘을 구분하는 구분점은 패턴의 의도이다. 접근제어를 의도(권한/ 캐싱)로 작성한다면 프록시 패턴 부가 기능을 추가하는 의도(로그, 꾸미기)로 작성한다면 데코레이터 패턴이다. 자바 및 코틀린에서는 프록시를 사용하기위해 실제 클래스를 상속해서 구현하거나 인터페이스를 사용한다. 프록시를 사용하기전에 클라이언트가 특정 로직을 호출하면 실제 클래스에서 메소드를 가져와 사용하지만 프록시를 사용하게되면..
템플릿 메소드 패턴, 전략패턴, 템플릿 콜백 패턴 위 3가지의 디자인 패턴은 어떤 공통점을 가지고 있을까? 위 디자인 패턴들은 같은 목적을 가진 패턴들이다. 복잡한 코드속에서 반복되는 부분을 외부로 템플릿화(공통화?) 시켜 결합성을 낮추고 (단일 책임 원칙) 변하는 부분(알고리즘 군)을 구현해 템플릿을 통해 실행시키는 방식이다. 예를 들어 코드의 모든 곳에 다음과 같이 로그를 남기는 코드가 있다고 가정해보자 @Service class ItemServiceDirtyCode( private val itemRepository: ItemRepositoryDirtyCode, private val logService: LogServiceDirtyCode ) { fun getItems(): List { var tra..
Kotlin fun interface와 interface 차이 먼저 fun interfcace를 사용하게된 계기... interface LogCallStrategy { fun call() : T } 다음과 같은 인터페이스가 있고 class LogHelperStrategy( private val logService: LogServiceDirtyCode, private val logCallStrategy: LogCallStrategy, ) { fun execute(message: String): T { var trace: Trace? = null return runCatching { trace = logService.begin(message) logCallStrategy.call() }.onSuccess {..
문제 발생 프로젝트에서 12시마다 특정 주기를 가진 아이템을 새로 생성해주는 스케쥴러가 있다. 서버를 k8s에 pod가 4개인 replica로 배포했는데 12시마다 4개의 아이템이 중복 생성되는 것을 확인. 해결 방법 구색 Shced Lock을 통해 하나의 작업에 대해 여러 스케줄러가 동시에 접근하지 못하도록 Lock을 걸 수 있음 SchedLock이란 스프링 스케줄러가 태스크를 시작하기전에 (아마 AOP 를 통해서겠지) DB에 요청을 보내 Lock이 걸렸는지 확인한다. Lock이 걸렸다면 태스크를 Wait(기다리기)하지 않고 Drop(아에 실행 시키지 않음)한다. Lock이 걸리지 않았다면 task를 수행한다. SchedLock은 DB table 을 필요해 하는데 다음과 같다. @Document(Sch..