일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Semaphore
- 헬름
- Microservice
- Kotlin
- cloud native
- cloud native java
- decorator 패턴
- 클라우드 네이티브
- 동기화
- devops
- 머신러닝
- Adapter 패턴
- 자바
- 익명클래스
- Stress test
- 쿠버네티스
- MySQL
- MSA
- 마이크로서비스
- CRD
- kubernetes
- spring microservice
- Spring
- 클라우드 네이티브 자바
- 코틀린
- ansible
- ingress
- nGrinder
- java
- Algorithm
- Today
- Total
목록Java (20)
카샤의 만개시기
낙관적 락 (Optimistic Lock) 트랜잭션 대부분 충돌이 발생하지 않는다고 가정하는 방법으로써 어플리케이션이 제공하는 락 방식입니다. 그러므로 읽는 시점에 Lock을 사용하지 않기 때문에 데이터를 수정하는 시점에 다른 사용자에 의해 데이터가 변경되었는지 변경여부를 확인해야 합니다. 이렇게 낙관적 락은 트랜잭션을 커밋하기 전까지는 트랜잭션의 충돌 여부를 알 수 없습니다. @Version JPA가 제공하는 낙관적 락을 사용하려면 @Version 어노테이션을 사용하여 버전 관리를 추가하면 되며 지원되는 타입은 long, Long, int, Integer, short, Short, TimeStamp 이다. @Version 어노테이션을 붙이면 엔티티가 수정될때 자동으로 버전이 하나씩 증가하며, 수정할때 ..
HttpClient는 HTTP를 사용하여 통신하는 범용 라이브러리이고, RestTemplate은 HttpClient 를 추상화(HttpEntity의 json, xml 등)해서 제공해준다. 따라서 내부 통신(HTTP 커넥션)에 있어서는 Apache HttpComponents 를 사용한다. 작동원리 어플리케이션이 RestTemplate를 생성하고, URI, HTTP메소드 등의 헤더를 담아 요청한다. RestTemplate 는 HttpMessageConverter 를 사용하여 requestEntity 를 요청메세지로 변환한다. RestTemplate 는 ClientHttpRequestFactory 로 부터 ClientHttpRequest 를 가져와서 요청을 보낸다. ClientHttpRequest 는 요청메세..
AOP는 관점지향 프로그래밍(Aspect Oriented Programming)으로써, 공통 기능(로깅, 트랜잭션, 접근 제어 등의 보안) 등에 대한 횡단 영역의 공통된 부분의 중복을 제거하고 모듈화 하는 프로그래밍 방식이다. Aspect 공통으로 적용되는 기능 Advice 언제 Aspect을 로직에 적용할 지를 정의. @Before 메소드 실행 전 기능 수행. @After 메소드 결과와 상관없이 메소드가 완료 된 이후에 기능 수행. @AfterReturning 메소드가 성공적으로 완료 된 이후에 기능 수행. @AfterThrowing 메소드 수행 중 예외 발생 시 이후에 기능 수행. @Around 메소드가 실행되기 전과 후 기능 구행. proceed() 메소드 호출 전, 후를 통해 구분할 수 있다. J..
실제 결과가 필요한 시점보다 훨씬 이전에 시간이 많이 필요한 작업을 미리 해두는 용도로 사용합니다. FutureTask는 시작 전 대기, 시작됨, 종료 3가지 상태로 구분할 수 있고 한번 종료상태가 되면 더 이상 상태가 바뀌지 않습니다. Future.get()메소드는 FutureTask의 작업이 종료되면 그 결과를 즉시 알려줍니다. class MyRunnable implements Runnable { private final long waitTime; public MyRunnable(int timeInMillis) { this.waitTime = timeInMillis; } @Override public void run() { try { Thread.sleep(waitTime); System.out.pr..
두 쓰레드 간에 인스턴스를 교환해주는 역할로 사용합니다. 예제를 통해서 알아보도록 하겠습니다. 메모리를 할당하는 A 쓰레드와 메모리를 해제하는 B 쓰레드가 있다고 할 때 A는 자신의 스택에 계속 데이터를 추가하고 쌓여있는 메모리를 해제하기 위해 A는 B와 스택을 교환하게 되고, 그러면 B는 교환 된 스택을 전부 비웁니다. public final static int MAX_STACK_CNT = 8; private Exchanger exchanger = new Exchanger(); class PushThread implements Runnable { LinkedList stack = new LinkedList(); private Scanner sc = new Scanner(System.in); public..
실행중인 쓰레드 내부 원하는 지점에서 대기를 걸어주고 CyclicBarrier 생성자의 파라미터로 넘겨준 값 만큼 await()을 호출하면 대기하고 있던 쓰레드들의 대기를 풀어주는 동작을 할 수 있습니다. private static final int THREAD_CNT = 5; private CyclicBarrier cyclicBarrier = new CyclicBarrier(THREAD_CNT); public class SleepThread implements Runnable { private int id = 0; private Random random = new Random(System.currentTimeMillis()); public SleepThread(int id) { this.id = id;..
백그라운드로 스레드가 돌아가고 있는 상황에서 해당 스레드가 종료 되기를 기다려야 하는 상황이 있을때 Thread 클래스의 join() 함수를 이용하면 됩니다. 그렇지만 하나가 아닌 여러 스레드들이 종료되기를 기다려야 하는 상황이 발생된다면 CountDownLatch를 고려할 수 있습니다. private static final int THREAD_CNT = 10; private CountDownLatch lacth = new CountDownLatch(THREAD_CNT); public class SleepThread implements Runnable { private int id = 0; private static Random random = new Random(System.currentTimeMill..
리소스에 접근할 수 있는 스레드의 수를 제한할 때 사용합니다. acquire() 메소드를 통하여 접근 권한을 퍼밋(Permit)받고, 남은 퍼밋이 없을 경우 퍼밋이 생기거나 인터럽트가 발생되거나 타임아웃이 걸리지 전까지 대기합니다. release() 메소드는 확보했던 퍼밋을 다시 세마포어에게 돌려주는 메소드입니다. 세마포어에 대해서 자세히 알고 싶다면 다음 글을 참고해주세요 세마포어(Semaphore)와 뮤텍스(Mutex) class ShareResource { private final Semaphore semaphore; private final int MAX_PERMIT_CNT; public ShareResource(int cnt) { this.semaphore = new Semaphore(cnt);..