본문 바로가기

legacy

(151)
쿠키(Cookie)와 세션(Session) 방식의 개념과 차이점 1. 쿠키(Cookie)와 세션(Session) 개념이 등장한 이유HTTP 프로토콜은 비상태성(stateless)를 가지고 있다. 이게 무슨 말이냐면, 동일한 클라이언트가 서버로 요청을 보냈을 때, 서버는 이전의 요청들을 기억하지 않는다는 것이다. 예를 들면, 메인 페이지와 로그인 페이지가 존재할 때, 로그인을 완료하고 메인 페이지로 이동하였을 때, 서버는 로그인을 했는지 알 수 없다는 것이다.사용자가 로그인을 했는지 여부를 알 수 없으므로 모든 요청마다 로그인을 해야할 것이다. 따라서 사용자의 상태를 유지하기 위해서 쿠키(Cookie)와 세션(Session)이 도입되었다. 2. 쿠키(Cookie)2-1. 쿠키(Cookie)란?쿠키란 클라이언트의 브라우저에 사용자의 상태 정보를 저장하는 데이터 파일이다...
토큰(Token) 방식과 세션(Session) 방식 1. 인증(Authentication)과 인가(Authorization)인증(Authentication)은 사용자가 서비스에 등록되어 있는지 검증하기 위해 사용된다. 예를 들어, 사용자가 입력한 정보가 서비스에 등록되어 있다면 인증된 사용자라고 할 수 있다.인가(Authorization) 는 인증이 완료된 사용자가 서버에서 보호하고 있는 자원에 접근할 수 있는지 권한을 확인하는 과정이다. 먼저 인증이 되어야만, 인가 여부를 확인할 수 있다. 예를 들어, 게시판에 글을 작성하는 것은 로그인 된(인증된) 사용자(USER, ADMIN)라면 누구나 할 수 있지만, 관리자 페이지에 접근하는 것은 관리자 권한(ADMIN)이 있는 사람만 가능할 것이다. 인증(Authentication), 인가(Authorizatio..
[Java] LockSupport와 ReentrantLock 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 null 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 signature 1. 오류 원인Kotlin은 컴파일 시에 자바 바이트코드(.class)로 변환되기 때문에 다른 자바 파일과 호환이 되고 JVM에 의해 실행된다. 오류 메시지를 보면 JVM 시그니처가 충돌했음을 알 수 있다. 아래 코드를 보면 4개의 프로퍼티(email, password, nickName, authorities)가 존재한다. 코틀린 컴파일러는 프로퍼티에 대해서 자동으로 getter와 setter를 생성한다. 따라서 password와 authroties 프로퍼티에 대해서도 자동으로 getter가 생성된다. 여기서 한 가지 문제점이 발생하는데 현재 코드에는 UserDetails을 상속하면서 getPassword(), getAuthorities()를 오버라이딩하고 있다. 코틀린 컴파일러에 의해 자바 바이트 코드..
[Java] 배열(Array), ArrayList, LinkedList 1. 배열(Array)1-1. 배열이란?입력된 데이터가 메모리 공간에 연속적으로 저장되는 자료 구조이다. 메모리에 연속적으로 저장된다는 특징으로 인해 index를 통해 데이터에 접근이 가능하다. 연속적으로 저장하기 위해서는 미리 메모리의 크기를 할당받아야 하므로, 배열을 생성 후 크기를 수정할 수 없다. 1-2. 시간복잡도삽입배열의 끝에 데이터를 삽입하는 경우 : O(1)끝이 아닌 처음이나 중간에 삽입하는 경우 : O(N)전자의 경우 삽입될 메모리의 영역을 알고 있기 때문에 바로 삽입할 수 있다. 후자의 경우 특정 위치에 데이터를 삽입하게 되면 삽입된 지점 이후의 데이터를 뒤로 복사하여 이동시켜야 한다.탐색특정 인덱스(Index) 탐색 : O(1)모든 데이터 탐색 : O(N)배열의 특징으로 연속적으로 메..
[Spring] 다중 인스턴스에서 @Scheduled 문제와 ShedLock 사용하기 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-handshake 1. TCP1-1. TCP란?TCP는 Transmission Control Protocol로써, 신뢰성이 높고 연결 지향 프로토콜이다. ”신뢰성이 높다” 의미는 두 장치 간에 정보를 전달함에 있어 안정적이고 순서대로 에러 없이 데이터를 교환할 수 있음을 의미한다. TCP는 연결 지향 프로토콜이기 때문에 두 장치가 데이터를 교환하기 전에 연결을 맺어야 한다. 여기서 연결을 맺는다는 것은 두 장치간에 세션이 존재하는지 확인한다는 의미이다. 두 장치가 세션을 연결하기 위해서는 3-way-handshake 과정을 거쳐아 한다. 2. 3-way-handshake STEP 1. Client → Server로 SYN 패킷 전송SYN 요청이란 연결을 요청하는 패킷이다. 발신자가 수신자에게 SYN 요청을 보내어 연결을 ..