legacy
-
[Java] LockSupport와 ReentrantLocklegacy/Java 2024. 8. 5. 02:16
1. LockSupport1-1. LockSupport란?synchronized의 경우 임계 영역에 접근하지 못하고 대기 중인 스레드는 BLOCKED 상태가 된다. BLOCKED 상태는 다른 스레드에 의해 interrupt 될 수 없기 때문에 lock을 얻지 못하면 영원히 대기 상태로 유지한다.LockSupport는 무한 대기를 해결하기 위해서 대기 중인 스레드의 상태를 BLOCKED가 아닌 WAITING 이 되게 한다. WAITING 상태는 다른 스레드가 interrupt를 통해 깨우거나, 스스로가 시간을 정하여 깨어날 수 있다.1-2. LockSupport의 대표적인 기능park() : 현재 스레드를 WAITING 상태로 바꾼다.parkNanos(nanos) : 나노초 동안 현재 스레드를 TIMED_..
-
[Spring] java.lang.NullPointerException: save(...) must not be nulllegacy/Spring 2024. 7. 17. 23:05
1. Mock 테스트를 위한 라이브러리 추가Mock 테스트를 위하여 gralde에 아래를 추가하였다.// MockitotestImplementation("org.mockito.kotlin:mockito-kotlin:4.0.0")testImplementation("org.mockito:mockito-core:4.0.0")testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") 2. 서비스 레이어 작성게시물을 작성하는 코드를 작성한다.@Service@RequiredArgsConstructorclass DiaryService( private val diaryRepository: DiaryRepository) { @Transactional fun..
-
[Kotlin] The following declarations have the same JVM signaturelegacy/Kotlin 2024. 7. 16. 16:21
1. 오류 원인Kotlin은 컴파일 시에 자바 바이트코드(.class)로 변환되기 때문에 다른 자바 파일과 호환이 되고 JVM에 의해 실행된다. 오류 메시지를 보면 JVM 시그니처가 충돌했음을 알 수 있다. 아래 코드를 보면 4개의 프로퍼티(email, password, nickName, authorities)가 존재한다. 코틀린 컴파일러는 프로퍼티에 대해서 자동으로 getter와 setter를 생성한다. 따라서 password와 authroties 프로퍼티에 대해서도 자동으로 getter가 생성된다. 여기서 한 가지 문제점이 발생하는데 현재 코드에는 UserDetails을 상속하면서 getPassword(), getAuthorities()를 오버라이딩하고 있다. 코틀린 컴파일러에 의해 자바 바이트 코드..
-
[Java] 배열(Array), ArrayList, LinkedListlegacy/Java 2024. 7. 12. 19:46
1. 배열(Array)1-1. 배열이란?입력된 데이터가 메모리 공간에 연속적으로 저장되는 자료 구조이다. 메모리에 연속적으로 저장된다는 특징으로 인해 index를 통해 데이터에 접근이 가능하다. 연속적으로 저장하기 위해서는 미리 메모리의 크기를 할당받아야 하므로, 배열을 생성 후 크기를 수정할 수 없다. 1-2. 시간복잡도삽입배열의 끝에 데이터를 삽입하는 경우 : O(1)끝이 아닌 처음이나 중간에 삽입하는 경우 : O(N)전자의 경우 삽입될 메모리의 영역을 알고 있기 때문에 바로 삽입할 수 있다. 후자의 경우 특정 위치에 데이터를 삽입하게 되면 삽입된 지점 이후의 데이터를 뒤로 복사하여 이동시켜야 한다.탐색특정 인덱스(Index) 탐색 : O(1)모든 데이터 탐색 : O(N)배열의 특징으로 연속적으로 메..
-
[Spring] 다중 인스턴스에서 @Scheduled 문제와 ShedLock 사용하기legacy/Spring 2024. 7. 11. 13:43
1. 실행 환경Java 17Gradle 8.5SpringBoot 3.2.3 2. 기존 코드우리 프로젝트의 경우 게시물(Section)에 좋아요 기능과 관련한 API를 Redis를 사용하여 처리하고 있다. Redis에서 (key: SectionId, value:listof(userId))로 관리하고 있다.30초 간격으로 스케줄링을 통해 Redis에 좋아요 정보를 DB의 Likes 테이블로 옮긴다.// 30초마다 Redis 좋아요 기록을 DB의 Likes 테이블에 저장한다.@Scheduled(fixedDelay = 1000L * 30)@Transactionalpublic void saveLikes() { log.info("스케줄링 호츌"); // 정규식에 해당하는 모든 key를 조회한다. S..
-
[네트워크] TCP 3-way-handshake, 4-way-handshakelegacy/Network 2024. 7. 10. 17:06
1. TCP1-1. TCP란?TCP는 Transmission Control Protocol로써, 신뢰성이 높고 연결 지향 프로토콜이다. ”신뢰성이 높다” 의미는 두 장치 간에 정보를 전달함에 있어 안정적이고 순서대로 에러 없이 데이터를 교환할 수 있음을 의미한다. TCP는 연결 지향 프로토콜이기 때문에 두 장치가 데이터를 교환하기 전에 연결을 맺어야 한다. 여기서 연결을 맺는다는 것은 두 장치간에 세션이 존재하는지 확인한다는 의미이다. 두 장치가 세션을 연결하기 위해서는 3-way-handshake 과정을 거쳐아 한다. 2. 3-way-handshake STEP 1. Client → Server로 SYN 패킷 전송SYN 요청이란 연결을 요청하는 패킷이다. 발신자가 수신자에게 SYN 요청을 보내어 연결을 ..