New
-
[Spring] 커스텀 어노테이션 스캔하기 (Scan Custom Annotation)
커스텀 어노테이션 스캔하기 (Scan Custom Annotation)마커 인터페이스와 비슷한 기능으로 커스텀으로 마커 어노테이션도 만들 수 있다.또는 기능이 담긴 어노테이션을 만들 때, Aspect를 이용해 특정 어노테이션이 붙은 클래스나, 메소드를 weaving 할 수 있게 만들 수 있다.그런데 이 방법은 커스텀 어노테이션이 어느 클래스에 붙어있는지 특정할 수 있어야 하는데, (해당 클래스나 메소드가 호출 될 때 등)특정 할 수 없다면 모든 클래스를 대상으로 특정 어노테이션이 붙어있는지 검사하는 방법밖에 없다.이러한 기능이 필요한 케이스를 예를 들면 다음과 같다.특정 어노테이션이 붙은 클래스들을 알고 있어야 할 때특정 어노테이션이 붙은 클래스가 특정 타입의 인터페이스, (추상)클래스를 상속했는지 검사..
2024.11.25
-
JAVA21 전환기
JAVA21 전환기자바21이 2023년 9월경 출시되었다. 그리고 자바21을 지원하는 Spring Boot 3.2가 2023년 11월쯤 릴리즈 되었고 자바21에 대한 오류보고나 스프링 3.2에 대한 깃허브 이슈들을 찾아본 뒤, 적용하는데에 큰 이슈가 없을 것으로 판단해 2024년 1월경 자바21로 전환하기로 결정했다.회사는 지금 MSA 구조로 자바11을 사용중인데, 적은 리소스로 많은 트래픽을 담당하기 위해 블로킹 IO를 담당하는 MVC 프로젝트와 인터페이스 및 동시성 처리를 위한 webflux 프로젝트로 분리되어 있다.즉 공식적인 Reactive IO 를 지원하지 않는 (redis, mongodb 등 대부분은 요즘 지원하지만..) 오라클(R2DBC는 공식이 아니라 제외했다.) 등을 사용하려면 MVC 프..
2024.06.19
-
[spring] Stream, Future 사용시 주의해야 할 점 (커넥션 풀이 남는 이슈)
Stream, Future 사용시 주의해야 할 점 (커넥션 풀이 남는 이슈) 얼마 전 코드에서 Stream 을 수행하면서 그 안에 DB 를 조회해서 데이터를 가져오는 로직이 있었는데, 트래픽이 많은데도 불구하고, 커넥션을 다 사용하지 못했다. 환경과 증상은 이러했다. 서버는 spring boot의 Hikari Connection Pool 사용함 min, max connection은 동일하게 20개로 설정 하지만 APM으로 확인 시, 실제 사용되는 커넥션은 9개였고, 노는(idle) 커넥션이 11개정도 였다. 트래픽이 몰리는 순간에도 hikaricp_connections_acquire_seconds_sum, hikaricp_connections_pending 수치만 증가할 뿐 idle 커넥션은 일정하게 8..
2024.01.12
-
[Java] MS949(CP949)와 EUC-KR은 다르다
MS949(CP949)와 EUC-KR은 다르다 요새 대부분 UTF-8을 사용해서 MS949, EUC-KR 등을 잘 사용하지 않는다. (ASCII, ISO-8859-1 등) 하지만 레거시에서는 EUC-KR을 사용하는 경우가 꽤 있는데, 이번에 레거시에서 작업하면서 발생한 문제가 있었다. 레거시 DB는 인코딩을 us7ascii 을 사용하고 있었고, 웹은 EUC-KR로 뿌리고 있었고, 그 중간과정을 MS949로 인코딩해서 던져주었다가, EUC-KR로 변경했는데 표시못하는 한글이 발생하기 시작했다. 가만히 있는 MS949를 왜 EUC-KR로 바꾸었냐면.. 둘이 같은 줄 알았다. EUC-KR과 MS949이 같다고 표현하는 예전?블로그들이 꽤 많았고, 구글링 해가며 개발을 하다보니 그런 지식이 자연스럽게 정립되었는..
2023.09.27
-
[Spring] Spring AOP 사용시 주의 점
Spring AOP 사용시 주의 점 Spring AOP는 기존에 JDK Dynamic Proxy 를 사용하다가, Spring boot 2.0, Spring framework 4.3 에 올라와서 기본 프록시 라이브러리로 CGLib을 사용한다. 뭐가 다른거지 JDK Dynamic Proxy 와 CGLib 의 가장 큰 차이는 프록시 대상 객체가 인터페이스를 구현했느냐 여부이다. 신입 시절에 백엔드를 개발하다보면 회사 코드가 Service-ServiceImpl 로 구현되어 있었는데, 이게 Loose Coupling을 해결하기 위한 것인가 보다 했으나, 다형성을 위해 구현되는 경우가 거의 없었다. (interface : class = 1 : N 이 거의 없고 대부분 1 : 1) 아마 JDK Dynamic Prox..
2023.03.31
Best
-
[REDIS] Redis 설치 (for Windows 64bit)
[REDIS] Redis 설치 (for Windows 64bit) Redis (Remote dictionary Server) 란? key-value를 기반으로 하는 Memory DB 비슷한걸로는 Oracle NoSQL DataBase, Memcached 등이 있다. 당연히 memory에 관리하므로 프로세스가 내려간다거나, 컴퓨터가 off 되면 모든 데이터는 날아간다. redis의 또 다른 특징 중 redis는 메모리에 있는 데이터를 디스크에 통째로 찍어내는 SnapShot 기능이 있다. Redis 특징 Key - Value value의 자료형은 String, Set, Hashes, List, Sorted Set 등의 구조를 가질 수 있다. 출처 : Data Structures | Redis Labs Me..
2020.01.13
-
[Spring] 동적으로 Bean 생성 또는 개입하기 (Dynamic Bean Create, BeanPostProcessor)
동적으로 Bean 생성 또는 개입하기 (Dynamic Bean Create, BeanPostProcessor) application yml 에 List 형태로 어떤 프로퍼티를 추가하거나 했을 때 추가적으로 Bean 생성 메소드를 만들지 않아도, 자동으로 만들어 놓게 할 수 있습니다. 스프링에서는 개발자가 직접 지정한 Bean을 만들기 전에, 만들어지는 중에, 만들어진 후에 개입 할 수 있도록 추상체를 제공하고 있습니다. 즉 어떤 시점에 개입해서 추가 로직 처리를 할지 (= 추가적인 bean 을 생성할지) 추상체를 구현하기만 하면 되고, 그걸 ApplicationContext 에 등록하면 ApplicationContext는 알아서 구현체를 찾아 적절한 시점에 후킹해 줍니다. BeanPostProcessor..
2022.06.23
-
[Spring] Spring의 @EventListener
Spring의 @EventListener 쓰는 이유? 의존성이 강한 로직들의 레이어를 분리할 수 있습니다. 예를 들어 A 서비스의 a 비즈니스 로직을 실행 할 때 B 서비스의 b 추가 로직을 같이 실행해야 하는 경우 A 서비스에 B 서비스를 주입시켜 a 로직 안에 b 로직을 녹이는 경우가 많습니다. 이렇게 점점 강해지는 결합을 이벤트 핸들러라는 레이어로 분리한 뒤 다시 핸들링 하는 느슨한 결합 형태로 만들 수 있습니다. A 서비스의 a 로직 실행 -> 이벤트 발행 -> B 서비스의 b 로직 실행 이렇게 되면 A 서비스는 B 서비스의 변경사항과 관련없이 수정이 필요없게 됩니다. Spring 4 버전 이상으로 올라오며 쓰기가 많이 편해졌습니다. 기존의 이벤트 객체는 ApplicationEvent 와, 이벤트..
2021.04.21
-
[MacOS] 터미널 사용시 한글이 물음표로 나오는 경우
터미널 사용시 한글이 물음표로 나오는 경우 로컬 터미널 사용시 한글 부분이 물음표(???)로 나오거나, SSH 사용 시 한글부분이 ???로 나온다면 locale 확인하고 아래 방법으로 해결이 가능했다. 먼저 세션에 locale을 쳐서 언어셋이 ko_KR.UTF-8로 되어있다면 아래 내용과 상관없이 다른문제로 인해 물음표가 생기는 이유다. 아래 내용은 언어셋을 ko_KR.UTF-8로 바꾸는 내용이다. export LC_ALL=ko_KR.UTF-8 위와 같은 명령어는 현재 세션에만 적용되는 것으로 설정된 세션을 끄거나 새로운 세션이 붙으면 똑같이 한글이 물음표로 나온다. bash shell의 profile에 설정을 하게 되면 계속 적용된 세션으로 사용이 가능하다. # bash를 사용하는 경우 vi ~/.ba..
2020.04.18
-
[Spring] Spring Configuration 의 Cannot resolve configuration property 문제
Spring Configuration 의 Cannot resolve configuration property 문제 spring에서 제공하는 configuration 말고도 따로 properties/yml의 configuration을 추가해서 쓸때가 많습니다. Configuration Property 내부의 Nested Property, 즉 중첩된 Property가 있는 경우에는 Spring 에서 그 데이터 타입에 대한 정의를 하라고 하는데요. 아래 사진을 보면 밝게 표시된 property 입니다. 특히 개발 IDE 중 인텔리제이를 쓰시는분들중 저처럼 이게 거슬리는 분들이 많을 것 같습니다. 일단 이걸 재현하기 위해 예제를 보시게 되면 property model 만들기 yml에서 설정이 바인딩 될 모델입니..
2022.04.22