개발/java
-
DB 인터페이스 분리개발/java 2024. 10. 28. 17:41
RDB , SNOWFLAKE , Athena 등 DB를 다양하게 사용하는 경우가 있을 수가 있다. 예를 들어 큰 DB를 읽어 오는데 부담 될때 특정 조건에 따라 RDB -> SnowFlake나 S3로 적재된 Athena를 콜 하는 방식말이다 이 경우 Mybatis를 사용하는 개발자들은 각각의 DB 정보를 이용해 Config를 등록하며 이를 mybatis sqlSessionFactory에 연결한 후 이를 특정 어노테이션을 붙이면 해당 method를 mapper.xml에 있는 method를 연결하도록 구현을 할 것 이다 예를 들어 @Athena , @Snow 라는 애노테이션을 인터페이스에 연결만 한다면 Mybatis로 연동하는 방식이다 예를 들면 @Configuration@RequiredArgsConst..
-
jpa 흉내내기개발/java 2024. 10. 23. 11:36
1탄 https://ehhooni.tistory.com/32 mybatis로 jpa 흉내내기mybatis의 경우 jdbc를 통해 코드와 db를 혼합하여 작성하는 방식에서 둘을 분리하게 구현함으로써 유지 보수 및 개발을 함에 있어 간편하고 쉽게 만들었다 그 이후 JPA가 도입됨에 따라 DB table에ehhooni.tistory.com 1탄 select 버젼에 이어 insert도 가능합니다. mybatis는 insert의 경우 new SQL().INSERT_INFO를 이용하여 동적으로 생성이 가능하다 NEW SQL().INSERT_INFO(테이블명).INTO_COLUMNS(컬럼명들..).INTO_VALUES(컬럼값들 ..) 앞서 예시에서 나온 클래스인 OrderInfo를 토대로 한번 작성을 해보자 cl..
-
enum 활용기개발/java 2024. 9. 11. 09:58
enum을 통해 단순 코드를 비교할뿐만 아니라 특정 코드에 따라 bean을 가져와 method를 동작할 수 있다 예를 들어 고객이 주문을 힐때 특정 조건에 따라 가격을 할인 받는 정책을 정하거나 그 이후 api에 동일한 데이터를 전송하는 경우와 같은 작업을 할때이다 이때 주목할점이 유사한 데이터라는 점이고 이를 특정 조건에 따라 데이터의 일부만 변경하고 그걸통해 특정 기능을 수행하거나 특정 api , 특정 mq , kafka에 전송을 하면 된다는 점이다이때 enum을 이용하면 if else와 같은 형태로 혹시 method 형태로가 아닌 특정 클래스 형태로 파일들을 관리 할 수 있다 코드는 아래와 같은 형태가 될 것이다할인과 관련된 부분을 interface를 통해 동일 메소드를 받게 하고 bean n..
-
CompletableFuture개발/java 2024. 9. 5. 14:19
multi Thread를 통한 성능 개선 단일 Thread를 통해 작업을 수행하게 되면 많은 서비스를 수행하는 로직에서는 동작이 다소 지연 되는 경우가 있다.이 경우 Thread를 추가하여 작업을 main Thread가 아닌 다른 Thread에 작업을 배정함으로써 속도를 향상 시킬 수 있다 그 중 CompletableFuture를 통해 성능을 개선한 사례를 소개하려 한다 CompletableFuture의 경우 ForkJoin을 통해 스레드 풀을 할당받으며 반환 값이 있는 supplayAsync method와 반환 값이 없는 runAsync를 통해 다중 스레드로 작업을 할 당 할 수 있다 또한 아래와 같이 ThreadPoolTaskExecutor를 직접 생성하여 작업별 할당 스레드를 직접 선언하는 것..
-
java stream Util 만들기개발/java 2024. 9. 4. 10:14
java에서 제공하는 stream을 이용하여 코드를 단축할 수 있다 아래와 같이 Map을 통해 그룹핑을 하는 과정이다 Map> collect = orderInfoList.stream() .collect(Collectors.groupingBy(t -> t.getTrNo()+"-"+ t.getLrtrNo()));Map collect1 = orderInfoList.stream() .collect(Collectors.toMap(t -> t.getTrNo() + "-" + t.getLrtrNo(), Function.identity(), (t1, t2) -> t1)); 우선 그룹핑을 하기 위한 조건을 보면 변수 사이를 "-"를 묶어서 키로 만드는 과정을 볼 수 있다 이를 코드화하면 아래와 ..
-
mybatis로 jpa 흉내내기개발/java 2024. 9. 3. 13:18
mybatis의 경우 jdbc를 통해 코드와 db를 혼합하여 작성하는 방식에서 둘을 분리하게 구현함으로써 유지 보수 및 개발을 함에 있어 간편하고 쉽게 만들었다 그 이후 JPA가 도입됨에 따라 DB table에 따라 구현하는 방식이 서비스를 구현하는 것이 아닌 실 서비스를 세분화하여 ORM에 좀 더 다가갈 수 있게 되었다 그러나 특정 이유로 JPA를 사용하지 못하는 경우 mybatis에서 제공하는 new SQL() 과 ProviderMethodResolver를 통해서 별도 쿼리 작성 없이 동적으로 만들 수 있는 방법이 있다. import org.apache.ibatis.builder.annotation.ProviderMethodResolver;//mybatis 인터페이스 ProviderMethodRe..
-
싱글턴 문제점과 해결책개발/java 2024. 9. 2. 11:55
자바의 경우 싱글턴 패턴으로 이루어져 있다 예를 들어 동일 서비스를 10번 호출을 하게 되면 10번을 새로운 서비스로 인지해서 비효율적이니 1번의 호출만 새로운 서비스로 인식하고 나머지 9번을 1번을 호출된 서비스를 받아 처리하는 구조이다. 이 경우 상태를 체크하는 부분에서 문제가 발생할 수 있다. 예를 들어 멀티스레드로 구성된 경우 주문을 접수를 하는 고객이 여러번 주문생성이 가능한 구조라면 여러가지 상태 체크를 무시하는 경우가 발생할 수 있다. 이를 방지하는 경우는 여러가지가 있으나 그중 DB를 통해 resource lock을 걸어 제어하는 방법이 있다. 방식 1. 서비스 시작 시 특정 키를 통해 db를 insert 한다 2.서비스 수행 도중 해당 키를 통해 유입된 경우 유입을 대기 한다 3.서비..
-
api retry하기개발/java 2024. 8. 28. 13:06
msa 구조 내에서는 api 통신이 빈번하게 발생한다. 그중 gateway 관련된 오류의 경우 일시적인 경우가 많기에 재시도를 하면 해소 되는 경우가 많다 그러므로 해당 api의 응답코드(httpStatusCode)가 502 ,504인 경우 재호출을 하여 오류 빈도를 줄일 수 있다. 재시도의 경우 아래와 같이 HttpClient 내부에서 제공하는 HttpRequestRetryHandler를 이용하는 방법이 대표적이다. HttpRequestRetryHandler retryHandler = (exception, executionCount, context) -> { if (executionCount > 3) { // retry의 maxCount를 설정하여 false를 return 하면 재시도가 중단된..