유닛 테스트를 진행할때 사용하는 객체들에 대한 용어를 정리한다. 확실하게 정의가 내려진 용어가 아니므로 사람마다 의견이 다르기에 Martin Fowler의 정의+ @를 통해 정리하고자 한다. Fake Fake 실제로 동작하는 객체이나 테스트를 위한 목적으로 가볍고 단순하게 만들어져 있어 실제로 프로덕션 레벨에서 사용하기 부적합한 객체를 의미한다. (e.g. fake web service, InMemoryTestDatabase etc) Stub, Mock Stub 테스트를 위해 미리 정해진 응답만을 하도록 만들어진 객체. 단순히 테스트를 도와주기 위해 동작하는 객체라고 볼 수 있다. Mock Stub 객체에 assertion이 추가된 객체. Mock은 Stub의 superset으로 볼 수 있다. Dummy..
JPA는 직접 동시성을 해결하기 보다는 DB의 동시성 제어 방법을 활용하는 방향으로 기능을 제공한다. 낙관적 잠금 (비선점 잠금) 트랜잭션 간에 충돌이 발생하지 않을 것이라고 기본적으로 가정하고 트랜잭션을 진행하는 방법을 말한다. @Entity public class Entity { @Id private Long id; @Version //int, Integer, long, Long, short, Short, java.sql.Timestamp 등과 같은 Type 사용 가능 private Integer version; } @Version이 적용된 필드가 존재하면 암시적으로 낙관적 잠금이 적용된다. 만약 Version 정보가 다른 경우 (dirty read가 발생한 경우) OptimisticLockExcep..
싱글턴 패턴 싱글턴 패턴이란 애플리케이션 내에서 하나의 클래스는 하나의 인스턴스만을 가지도록 강제하는 패턴이다. 하나의 클래스에서 하나의 인스턴스만을 가지므로 해당 인스턴스를 전역변수처럼 사용하여 접근하기 용이하고 인스턴스 개수를 조절할 수 있다. 구현 싱글턴 패턴은 생성자의 레벨을 private이나 protected로 두어 숨기고 static 메서드 (e.g. getInstance())를 통해서 인스턴스를 생성하는 식으로 구현될 수 있다. 예시 추상 팩토리, 팩토리 메서드, 빌더, 프로토 타입과 같은 패턴에서 싱글턴 패턴을 사용할 수 있으며 Logging이 가장 대표적인 싱글턴 패턴을 사용하는 예시이다. 싱글턴 패턴은 안티 패턴이다. 싱글턴 패턴을 이용하여 인스턴스를 전역 상태(Global state)..
동시성 문제 동시성 문제란 멀티스레드의 환경에서 하나의 리소스에 여러 스레드가 동시다발적으로 접근하게 되어 같은 리소스에서 값을 가져오더라도 서로 다른 값을 가져오는 등의 문제가 발생하는 경우를 일컫는다. 이러한 동시성 문제가 발생하지 않도록 애플리케이션을 설계하는 것을 Thread Safe라 한다. 자바에서는 이러한 동시성 문제를 해결하기위해 아래과 같은 방법을 이용한다. synchronized, volatile synchronized (Pessimistic Locking, 비관적 잠금) synchronized 키워드를 사용하면 공유 변수에 동시에 접근하는 스레드를 단 하나로 한정지음으로서 다른 모든 스레드들은 공유 변수에 접근할 수 없고 이용 중인 스레드가 릴리즈 할 때까지 대기하게 된다. synch..
더해서 target이 만들어지는 부분배열을 구하고 겹치지 않는 부분배열의 최대 개수를 구하는 문제이다. 해당 문제는 Prefix Sum을 통해 문제를 해결할 수 있다. Prefix Sum prefix sum은 Memoization 기법을 이용한 풀이 방법으로 브루트 포스 풀이시 O(n^2) 이상의 시간 복잡도를 O(n)으로 낮출 수 있다. prefix sum의 과정은 아래와 같은 코드로 나타낼 수 있다. [-1,3,5,1,4,2,-9] //prefix sum -1 = -1 -1 + 3 = 2 ... -1 + 3 + ... + 2 + -9 = 5 [-1,2,7,8,12,14,5] 위와 같은 memoization을 마친 상황에서 target = 6을 찾아야 한다고 가정해보자. 이때 sum - target으로..
class Solution { public int balancedString(String s) { //caching var cache = new int[128]; int n = s.length(), result = n, k = n / 4; for (var ch : s.toCharArray()) { cache[ch]++; } //sliding windows var slow = 0; var fast = 0; while (fast < n) { //fast pointer goes while slow pointer condition does not meet. //decrease cache frequency. cache[s.charAt(fast)]--; fast++; //caused by fast pointer a..
이분 탐색을 진행할 때 while 문을 종료시키는 여러가지 방법 중 아래의 3가지를 언제 어떤 것을 사용해야 할지를 알아본다. 세 조건의 차이점 기본적으로 어떤 조건으로 while 문을 종료시키든 차이가 없다. 하지만 본인이 어떤 식으로 구현하고 싶은지, 어떤 내용을 구현하고 싶은지에 따라 달라지므로 세세한 내용을 알아둘 필요가 있다. mid = (low + high) >>> 1로 가정한다. low < high low는 inclusive, high는 exclusive. low == high가 됐을때 while 문이 종료된다. high를 exclusive하므로 high = mid, low = mid + 1로 업데이트한다. loop가 끝난 low 혹은 high를 가지고 로직을 이어나가고 싶을때 low < h..
비트연산자 자바에서 , >>>는 비트연산자 기호이다. 비트연산자란 char, byte, short, int, long 등과 같은 자료형에서 해당 값을 비트로서 연산하는 기능을 수행한다. 비트연산자의 개념에 대해 다루려는 것이 아니므로 아래의 표만 첨부한다. 비트연산자 , >>>의 활용 1은 low + (high - low) / 2 와 같은 의미를 가진다. 만약 int mid = (low + high) >> 1 라고 사용했다면 (high + low) / 2 와 같은 의미를 가질 것이다. >>>와 >>의 차이를 알아보기 전에 low + (high - low) / 2와 (high + low) / 2의 차이를 먼저 알아야 한다. 한 줄로 요약하자면 (high + low) / 2를 사용하면 overflow가 발생..
class Solution { public int coinChange(int[] coins, int amount) { //dp[amount]가 정답이므로 amount + 1의 크기로 초기화 var dp = new int[amount + 1]; //최소값을 찾는 것이므로 무한대에 해당하는 값을 채우기 //점화식 dp[i - coin] + 1으로 인해 overflow를 해결하기 위해 - 1 Arrays.fill(dp, Integer.MAX_VALUE - 1); //0을 만드는데 필요한 경우의 수를 첫번째 값에 초기화 dp[0] = 0; //dp 배열의 2번째부터 돌면서 for (var i = 1; i < dp.length; i++) { //모든 동전 중에 for (var coin : coins) { //해당..
class Solution { public List findAnagrams(String s, String p) { var list = new ArrayList(); if (s == null || p == null || s.length() == 0 || p.length() == 0) return list; //hashing //'a' is equal to 97 and 'z' is equal to 122. //constraints said that letters are always lower case. var hash = new int[128]; for (char ch : p.toCharArray()) { hash[ch]++; } //two pointers and target length int left =..
- Total
- Today
- Yesterday
- RequestPart
- 도커
- 루나빔
- 아키텍처
- 레디스
- JavaScript
- ModelAttribute
- vim
- 배포
- lunarvim
- IDE
- RequestParam
- RequestBody
- neovim
- Dap
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |