전체 글 349

람다식이란??

람다식이란?? 메소드를 하나의 식으로 표현한 것. 익명 함수(annonymous function)이라고도 한다. 이를 사용하면 기존의 함수를 간단하고 명확한 식으로 표현할 수 있게 된다. 함수형 언어 JDK1.8부터 함수형 언어의 기능을 java가 지원하기 시작했다. 그래서 java는 oop언어임과 동시에 함수형 언어의 기능을 포함하고 있다. 람다식이란?? 1. 함수(메서드)를 간단한 식으로 표현하는 방법이다. 예를 들어 // 메서드 int max(int a, int b) { return a > b ? a : b; }요런 애를 // 람다식 (a, b) -> a > b ? a : b이런 식으로 간단하게 표현하는 것이다. 2. 람다식은 익명 함수(anonymous function)이다. 위의 예시에서 볼 수..

이론 정리/java 2023.01.07

함수형 인터페이스

함수형 인터페이스 단 하나의 추상 메서드만 선언된 인터페이스 에를 들면 interface MyFunction { public abstract int max(int a, int b); }이런 식으로 하나의 추상 메서드만 선언된 것을 말한다. 참고로 이거에다가 @FunctionalInterface 라는 어노테이션을 붙이면 컴파일러가 이친구가 제대로 작성된 추상 메서드인지 확인해준다. -> 엥간하면 이거 붙이자. 그래서 이 함수형 인터페이스 로직을 구현해 주면 MyFunction f = new MyFunction() { public int max(int a, int b) { return a > b ? a : b; } };이렇게 될 것이다. 이를 활용해서 람다식의 참조변수로 쓸 수 있는데 int value = ..

이론 정리/java 2023.01.07

logging - java에서 System.out.println()을 왜 사용하면 안될까??

logging - java에서 System.out.println()을 왜 사용하면 안될까?? 보통 현업에서 일할때에 절대 System.out.println()을 쓰지 말라는 말을 듣는다. -> 가급적 쓰지말자~ 가 아니라 절대다!! 대신 로깅을 진행할 때에는 주로 얼마전에 문제가 있었던 Log4j를 사용하고는 한다. 왜일까?? Sync문제 발생 한번 System.out.println()의 구현 코드를 살펴보도록 하자. 다양한 내부 코드들이 있는데, 이거는 보면 동작 과정에서 synchronized를 사용해서 동기화를 걸어준다.(writedln도 물론 synchronized가 걸려있는것을 확인 가능하다.) 즉, 해당 코드가 작동할 때에 다른 쓰레드는 작동이 불가능하다는 것이다!! 따라서 이 System.o..

이론 정리/java 2023.01.06

shared lock, exclusive lock

Shared lock과 Exclusive lock에 관하여 해당 lock들은 DB자체에서 걸어주는 lock으로, InnoDB의 Row-level lock이다. 이거랑 이거랑 이거를 읽고오면 좀더 이해가 쉬울 것이다. 간단히 예를 들어 설명하겠다. 예를 들어 DB에 다음과 같은 데이터가 있다고 가정해 보자 그런데 만약 A는 류찬의 외모를 읽음 B는 류찬의 외모를 잘생김에서 멋짐으로 변경 C는 류찬의 외모를 읽음 한다고 생각해보자. A Transaction에서 류찬의 외모를 가져오는 중(잘생김) B Transaction에서 류찬의 외모를 멋짐으로 변경(멋짐으로 변경) C Transaction에서 류찬의 외모를 가져옴 (멋짐) A Transaction에서 류찬의 외모를 가져옴 (잘생김) 이렇게 되는 이유는, ..

java 깊은복사 vs 얕은복사(feat.clone)

깊은복사 vs 얕은복사(feat.clone) 간단하게 말하면 얕은복사 객체의 주소값을 복사함 깊은복사 객체의 실제 값을 복사함 이거임. 솔직히 뭐 딱히 쓸말이 없긴하다... 그래도 좀 상세히 알아보아요 얕은복사 먼저 얕은복사이다. @Getter @Setter @AllArgsConstructor public class Person { private String name; private int iq; }이런 식으로 Person이라는 객체를 선언해 줄 것이다. 그리고 @Test public void 복사() { Person person = new Person("류찬", 200); Person ryoochan = person; ryoochan.setIq(300); System.out.println("본래의 Ob..

이론 정리/java 2023.01.02

문제 풀이에서 1000000007, 1000000009으로 나누는 이유가 뭐지? (feat.모듈로 연산)

문제 풀이에서 1000000007, 1000000009으로 나누는 이유가 뭐지? (feat.모듈로 연산) 가끔 알고리즘 풀다보면 뭐 숫자를 몇으로 나눈 나머지를 써라~~ 이런 것들이 보인다. 아니 이거 왜씀? 하기도 하고, 결과에 나누라해서 진짜 결과에다가 나누면 제대로 안나온다... 이거 뭘까?? Integer, Long int형식은 32비트로 표현되고 표현할 수 있는 범위는 -2147483648 ~ 2147483647 이다. long형식은 64비트로 표현되고 표현할 수 있는 범위는 -9.22337204e18 ~ 9.22337204e18이다. 이게 가끔 문제에서 계산하다보면 저 이상의 숫자가 나오면 overflow가 나와버리는 것이다. 연산자 분배법칙 모듈러 연산은 주로 암호 알고리즘에서 사용된다. 일..

이론 정리 2023.01.01

ThreadLocal - 쓰레드로컬 이란?

ThreadLocal - 쓰레드로컬 이란? Comment 이름 그대로… 쓰레드 단위 로컬 변수 할당임ㅇㅇ 사실 이 Thread local에 대해서는 잘 몰랐는데, 놀랍게도 java1.2버전부터 제공되고있던 유서깊은 클래스였다고 한다. 그게 뭔데 일단 보통 java에서는 멀티 쓰레드를 이용해 한번에 작업을 처리해서 성능상의 이점을 얻을 수 있다. 근데 이 멀티 쓰레드 간에 리소스를 어떻게 공유해야 할지, 그리고 그 리소스의 동시성 문제를 어떻게 해결할 수 있을지 고민해야 한다. 그 방안 중 하나가 바로 Thread local이다. 그거 어떻게 하는건데. 일단 ThreadLocal의 내부는 Map구조를 갖고 있는데, key - thread정보, value - 변수 요렇게 저장한다. 그래서 각각의 쓰레드는 자..

이론 정리/java 2022.12.28

Heap and Stack

Heap and Stack 둘다 메모리를 저장하는 곳이다. 운영 체제에서는 프로그램의 실행을 위해 메모리 공간을 4부분으로 제공하는데 코드영역 실행할 프로그램 코드 데이터영역 전역변수, 정적 변수 프로그램 시작시 할당, 프로그램 종료시 소멸 Heap영역 사용자의 동적할당 전역 변수 런타임에 크기 결정 Stack영역 메모리의 정적 할당 지역 변수, 매개 변수, 함수 LIFO관리 컴파일타임에 크기 결정 요건데, 사실상 코드영역이랑 데이터영역은 그냥 있는 애들이고, heap이랑 stack에 대해 한번 자세히 알아보자! Stack Stack은 정적으로 메모리가 할당된다. 그리고 지역변수와 매개변수, 그리고 함수여서 함수가 호출되면 쭈루룩 할당되고, 호출이 완료되면 소멸된다. Stack은 이름 그대로(java에서..

이론 정리 2022.12.27

spring boot에서 redis를 사용한 동시성 이슈 처리

Redis를 활용해서 동시성 이슈를 방지하는 두 가지 방법이 있다. Lettuce setnx 명령어를 활용하여 분산락 구현 set if not exist의 줄입말이다. key와 value를 set할 때 기존의 값이 없을 때에만 set하기 spin lock 방식 락을 사용하는 쓰레드가 이걸 사용할 수 있는지 매번 시도하는 방식 retry 로직을 개발자가 직접 구현해야 한다. Redisson pub-sub 기반으로 Lock 구현 제공 앞선 쓰레드가 자신이 끝나면 다음 쓰레드에 접근하라고 할려줌 Lettuce 요런 식으로 lock을 사용하고 setnx를 써서 하면 이전에 만들어둔게 없음 1 -> 만들어짐 이전에 만들어둔게 있음 0 -> 안됨 이전에 있던걸 지우고 다시하면 잘 되는것도 확인 가능 구현이 간단하다..

낙관적/비관적 lock, named lock

pessimistic Lock 실제로 데이터에 Lock을 걸어서 정합성을 맞추는 방법 이걸 걸면 다른 트랜잭션에서는 lock이 해제되기 전에 데이터를 가져갈 수 없다. 데드락이 걸릴 수 있어 주의 필요 Optimistic Lock 실제로 lock을 이용하지 않고 버전을 이용해서 정합성을 맞추는 버전 먼저 데이터를 읽은 후에 update를 수행할 때 내가 읽은 버전이 맞는지 확인하여 업데이트한다. 내가 읽은 버전에서 수정사항이 생기는 경우 application에서 다시 읽은 후에 작업 수행 필요 Named Lock 이름을 가진 metadata locking이다. 이름을 가진 lock을 획득한 후 해제할때까지 다른 세션은 이 lock을 획득할 수 없다. transaction이 종료될 때 자동으로 lock이 ..