일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- kotiln const
- kotiln functional interface
- 백준 1504 java
- Java Call By Refernce
- 익명 객체 @transactional
- go
- nodejs rabbitmq
- 안정해시
- rabbitmq 싱글톤
- 자바 백준 팩토리얼 개수
- kotiln const val
- 자바 1676
- ipfs singletone
- javav 1676
- 백준 특정한 최단 경로
- java 1238
- spring mongoTemplate switch
- java 1509
- Spring ipfs
- 전략 패턴이란
- 백준 2252 줄세우기
- java 팩토리얼 개수
- 백준 연결요소 자바
- java 백준 1509
- ipfs bean
- spring mongodb switch
- spring mongodb
- java 파티
- mongodb lookup
- spring mongoTemplate
- Today
- Total
목록web study (49)
공부 흔적남기기
일반적으로 우리가 만드는 시스템은 아마도 RDB만 써도 충분히 잘 동작할 것이다.하지만 특정 시점에는 RDB에서 더 나은 성능을 가진 DB(NOSQL)로 넘어갈 필요가 있다. 구조적 현상으로는1. 테이블이 점점 비정규화가 되어가고 Column수가 늘어나며 Table과 관련도가 떨어진 Column이 점점 추가될떄.2. 하나의 Column에 JSON, yml, xml 등 구조화된 데이터를 점점 넣기 시작할떄3. 데이터를 가져오기 위해 많은 조인을 해야하며 재귀적 커리가 늘어날때4. 스키마의 변경이 잦을 때 성능적 현상으로는1. 쓰기 용량이 벅찰 때2. 데이터 셋이 너무 커서 하나의 DB에 저장하지 못할 떄3. 배치 작업이나 분석 쿼리가 트랜잭션의 작업에 부하를 줄때 Non-Relational Datbase..
Kafka에 Topic이름을 상수화해서 사용하고 싶어서 다음과 같이사용했다.companion object{ val ECOMMERCE_ORDER_QTY_TOPIC = "ecommerce.order-topic"} @KafkaListener(topics = [KafkaConsumerConfig.ECOMMERCE_ORDER_QTY_TOPIC]) 다음과 같이 사용했을 떄 Only 'const val' can be used in constant expressions Error가 떨어졌고 companion object{ const val ECOMMERCE_ORDER_QTY_TOPIC = "ecommerce.catalog-topic"}다음과 같이 수정 한 후 잘 동작되었다. 이전에는 그냥 val을 쓰면 상수..
요구사항 www.example.com 도메인이 존재하고 / 일경우 기본으로 /var/html/www/manage로 포워딩을 하고/student 일 경우 /var/html/www/student 로 포워딩 해주고/book 일 경우 /var/html/www/book 으로 포워딩 해줘야 한다.server { server_name www.example.com; listen 80; root /var/www/html/manage location / { } location /student { root /var/www/html; } location /book { root /var/www/html; } lo..
분명히 같은 키를 사용하고 똑같은 알고리즘을 통해서 암호화 복호화를 하는데 에러가 나서 삽질을 했다.. JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted. 수정전 코드 토큰 발급 val token = Jwts.builder() .subject(user.userId) .expiration(Date(System.currentTimeMillis() + jwtProperties.expire)) .signWith(key, Jwts.SIG.HS256) ..
다음과 같이 구성되어있다고 가정하자익명객체를 만들고 익명객체의 함수에는 @Transactional이 붙어있으며 해당 함수는 Transcation이 필요한 함수를 호출한다.@FunctionalInterfaceinterface TempHandleInterface { fun handle(something: String): String} import jakarta.annotation.PostConstructimport org.springframework.stereotype.Serviceimport org.springframework.transaction.annotation.Transactionalimport java.util.UUID@Serviceclass TempClass( private val t..
문제인식 Book { @Id val id : String val title: String val author: User } User { id: String name: String } 대충 다음과 같은 구조에서 mongodb에서 Aggregation한뒤 Book class로 Mapping해서 data를 가져오면 전부 잘 가져와지는데 id 만 null로 나온다. 참고로 spring data mongo는 기본적으로 id property strategy를 _id로 지정한다. 웃긴게 mongoTemplate할때는 id를 넣어도 잘되는데 @Query로 query는 무조건 _id를 넣어줘야한다 id 관련해서 버그가 참 많은 것 같다. 해결 방법 1 User의 id 에 @Field("id") 를 명시하기 해결 방법 2..
BeanPostProcessor란? 한국어로 그대로 번역하면 빈 후 처리기로 스프링 빈이 생성되기 전후(초기화 전후)에 IOC 컨테이너에 빈으로 등록되기전에 빈을 intercept해서 특정로직을 처리가능하게 해주는 스프링이 지원하는 객체이다. 주로 AOP를 사용하기위해 Proxy 객체를 생성해 IOC 컨테이너에 실제 빈 대신에 프록시를 넣을 떄 사용한다. 이 뿐만 아니라 다양하게 특정 빈이 초기화 되었을 때 어떤 로직을 실행한다던지 등 여러가지로 구현가능하다. BeanPostProcessor는 다른 빈 등록보다 선행된다. 예시 BeanPostProcess를 상속받아 구현 가능하다. class LogBeanPostProcessor( private val packageName : String, private..
프록시 팩토리란 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..
프록시란 특정 구현을 실행하기 전에 구현체 앞에서 대신 호출되어 실행되는 대리 응답체이다. 프록시는 여러가지 경우에 사용되는데 예를 들어 특정 로직을 실행시키기 전에 권한을 확인한다던지 모든 로직에 로그를 단다던지 캐싱을 한다던지 등등 여러가지 쓰임새로 사용된다. 프록시 패턴과 데코레이터 패턴 둘다 프록시를 사용한다. 둘을 구분하는 구분점은 패턴의 의도이다. 접근제어를 의도(권한/ 캐싱)로 작성한다면 프록시 패턴 부가 기능을 추가하는 의도(로그, 꾸미기)로 작성한다면 데코레이터 패턴이다. 자바 및 코틀린에서는 프록시를 사용하기위해 실제 클래스를 상속해서 구현하거나 인터페이스를 사용한다. 프록시를 사용하기전에 클라이언트가 특정 로직을 호출하면 실제 클래스에서 메소드를 가져와 사용하지만 프록시를 사용하게되면..