전체 글

1. 이 개념으로 어떻게 최적화를 할 수 있을까?=> 트랜잭션을 적용=> 비즈니스 로직 특성을 고려하여, 발생할 수 있는 이상현상 체크=> 락이나, Lock-Free 등의 정합성을 해결할 수 있는 방법을 고안=> 적용 2. JPA에서의 트랜잭션 격리 수준 적용 과정=> Spring Boot + JPA에서는 커넥션 생성 비용을 줄이기 위해 Connection Pool에 Connection들을 생성해 저장해둠=> @Transactional(isolation = Isolation.{사용할 격리 수준}) 으로 격리 수준 선언=> Connection을 ConnectionPool에서 가져온 후 Connection.setTransactionIsalation() 메서드로 격리 수준 설정=> 비즈니스 로직 수행=> 커밋..
AtomicIntegerint 값을 원자적으로 다룸AtomicLonglong 값을 원자적으로 다룸AtomicBooleanboolean 값을 원자적으로 다룸AtomicReference객체 참조를 CAS로 변경AtomicStampedReference참조 + 버전(stamp) 을 같이 CASAtomicMarkableReference참조 + boolean 마크를 같이 CASAtomicIntegerArrayint[] 배열의 원소를 CAS로 다룸AtomicLongArraylong[] 배열의 원소를 CAS로 다룸AtomicReferenceArrayT[] 배열의 원소를 CAS로 다룸AtomicIntegerFieldUpdater객체 내 int 필드 업데이트용AtomicLongFieldUpdater객체 내 long 필드 ..
우선 순위대로 차례로 정리해본다.각 번호(대 분류)마다, 순서대로 고려. 번호-n(소 분류)마다, 상황에 따라 고려. 1. DB 최적화, 자료구조(운영체제 공부, DB 공부 선행할 것)=> 기본적인 속도를 높여 최적화한다.=> 데이터 구조 자체를 효율적으로 해야 한다.1-1. 인덱싱1-2. 파티셔닝1-3. 정규화 vs 반정규화1-4. 조회/갱신 쿼리 튜닝1-4-1. JOINhttps://icanchangeworld.tistory.com/167 인덱스를 탈 수 있는 쿼리에서는 옵티마이저는 무조건 NLJ 방식을 사용한다.=> NLJ는 Nested Loop Join으로 그냥 루프를 돌려 조인을 수행한다고 보면 된다.1-1. NLJ는 " data-og-host="icanchangeworld.tistory.co..
추상화란?복잡한 자료, 시스템에 대해 핵심적인 기능만 드러내고, 세부적인 사항들은 감추는 것을 말한다. 우리 사회에서는 여러가지로 추상화된 것들을 볼 수 있다.버스를 탈 때, 그저 '카드를 찍음'이라는 행동으로 승차 권한을 얻을 수 있다.사진을 찍을 때, '터치 함'이라는 행동으로 사진을 저장할 수 있다. 우리는 모든 것에 대한 전문가가 아니기 때문에, 추상화된 것들을 보고 사용하며 살아간다.추상화라는 개념은 이처럼 전문가가 아닌 사람에게도, 많은 경험을 선사할 수 있게 한다. 하지만, 추상화를 함으로 많은 오류를 범하게 된다.이러한 것들을 '일반화의 오류'라고 부른다.일반화의 오류란 특정 사례를 근거로 전체를 단정짓거나 일반화를 하는 것을 말한다. 세상의 사건들은 다양하고, 기적적인 요소들의 협력에서 ..
이 글은 Lock-Free 방식 중 하나를 설명한다. 1. CAS 기법이란=> 가정1: CompareAndSwap함수는 원자적으로 실행된다고 가정한다.=> 가정2: ptr은 모든 프로세서가 공유할 수 있는 Volatile 메모리이다. 1. 일단, 공유 메모리에 접근해 ptr의 값을 가져온다.2. (기대하는 값)expected와 비교해 같다면, 값을 new로 갱신(새로운 값)3. 실제 ptr의 값을 반환한다. 이를 while문으로 actual값과 expected값이 같을 때 까지 돌려준다.즉, CompareAndSwap(CAS)와 SPIN(while문)으로 락을 구현할 수 있다. 이게 무슨 소리인가 싶다.그렇다면, 예제를 통해 살펴보자.2. CAS 기법을 이용한 락 방식 예2-1. 상황=> Counter을..
· 알고리즘
https://www.acmicpc.net/problem/17298 이 문제는 아주 쉬운 문제였다.stack의 특성 상아직 처리가 안된 것들을 스택이라는 버퍼에 담고(아직 큰 것들이 안나온것)큰 것이 나오면 처리해준다.스택을 선택해준 이유는처리가 안될 수록 큰 수이기 때문에, 우선순위가 뒤로 밀려야 했다.PQ로 해주었어도 됐겠지만, 시간 복잡도로 인해스택을 써주었다.** System.out.println()을 써주면 시간 초과가 나니, BufferedWriter를 쓰자.** import java.io.*;import java.util.Stack;import java.util.StringTokenizer;public class Main { static int N; static Stack nums..
· 알고리즘
https://www.acmicpc.net/problem/2461 이 문제는 투 포인터보다는 구현 문제같다.이 문제의 킥은 최소와 최대값만 알면 된다는 것이다. 우선, 모든 반을 정렬 시킨다.0에 N개의 포인터를 고정하고, while문을 실행한다.최대와 최소의 합이 최소가 되기 위해서는 최소값을 증가시켜 주어야 한다.때문에, 정렬되어있는 배열에서 최솟값을 한 칸 증가시킨다.이게 다다. 투포인터는 정렬되어있는 어떤 자료들에서Left를 옮기면 커지고Right를 옮기면 작아진다는 개념이다.즉, 최소를 옮기면, (최댓값 - 최솟값에서 최솟값이 증가하니) 값이 작아진다.는 개념을 이용해서 투 포인터라고 문제 유형에 있던것같은데,내가 봤을 때는 그냥 구현같다.import java.io.BufferedReader;i..
· 알고리즘
https://www.acmicpc.net/problem/20366이 문제는 투 포인터 시간 복잡도 계산을 잘 해야하는 문제였다.600개의 눈덩이가 있을때,엘자보다 안나의 눈사람이 무조건 작다고 가정한다.엘자가 만들 수 있는 모든 눈사람의 높이를 구한 후(601 * 300 = 180000)안나의 눈사람을 투 포인터로 만든다.(600)즉, 108000000 으로 1초 조금 넘는 시간복잡도를 갖는다.투 포인터는 최대/최솟값과 같은 조건에 가까운 두 개의 값을 구할 때 사용한다는 것을 배웠다.import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Arrays;import ja..
쥐4
결국 이기는 개발자