컴퓨터 공학 61

👉[Java] JWT 검증방식 Interceptor 구현

기존에 Java/Spring-boot 활용한 백엔드 코드를 정리하던 중 불편한 코드를 발견했다. 지금 돌이켜 보니 문제점이 많아보여, 공부도 할겸 리팩토링을 시도해본 과정이다. Spring 진영의 경우 Request에 대해 검증하는 방식을 크게 Filter와 Interceptor 두가지로 볼 수 있다. 모두 중간에서 값을 하이재킹하여 검증 로직을 구현한다. 아래 그림처럼 말이다. 기존의 코드는 Filter 인터페이스의 구현체가 중간에서 URL 매칭을 통해 검증하는 구조이다. 두 가지 접근 방식에는 각각 장단점이 있다: Interceptor: Spring의 Interceptor는 Controller로 들어오는 요청을 가로채서 처리할 수 있는 기능을 제공. Interceptor는 Spring의 Applica..

컴퓨터 공학 2023.06.01

👉 [Java] JVM 메모리 관리는 어떤 원리로 돌아갈까?

JVM 이 메모리를 관리한다는 것은 알겠는데, 실제로 GC가 어떻게? 동작하는 것인지 궁금해졌다. Garbage ? = 유효하지 않은 메모리 주소를 말한다. Unreachable Object 라고도 부른다. 아래 예시를 보자. //Java String talk = "Hello"; talk += " World"; 좌측 그림처럼 String 객체인 talk는 Heap 내 "Hello" 라는 주소값을 가리키고 있다. 그러나 += 연산을 통해 새로운 객체를 할당하여 "Hello World" 라는 주소값을 가리키도록 변경된다. 해당 부분은 String의 불변성 특성 때문에 차이가 발생한다. 주제에서 살짝 벗어나니 해당 부분은 생략한다. 우측과 같이 talk 가 가리키는 주소값이 변경되었다면, 기존의 0x10 주소..

컴퓨터 공학 2023.05.13

👉 [Python] GIL은 왜 탄생했을까?

GIL(Global Interpreter Lock)은 파이썬 인터프리터가 한 번에 한 스레드만 수행할 수 있도록 제한하는 메커니즘이다. 다시 말하자면, 파이썬은 멀티쓰레딩을 처리해도 병렬적인 동작이 불가능하다는 것이다. 파이썬 진영에서는 왜 이러한 불필요한 리소스낭비를 하면서까지 GIL을 도입했을까? 그 이유를 알아보기로 했다. What Is the Python Global Interpreter Lock (GIL)? 위 글에서는 다음과 같이 표현했다. The problem was that this reference count variable needed protection from race conditions where two threads increase or decrease its value simu..

컴퓨터 공학 2023.05.03

👉 [CS] Python 은 정말로 인터프리터 언어일까?

뜬금 없이 궁금해진 Python 동작 방식에 대해 알아보던 중... "파이썬 컴파일 과정에서, 실제로 기계어로 바로 번역되는 단계는 없다. 대신, 최종적으로 실행되는 것은 바이트코드(bytecode)이며, 이는 미리 컴파일된 파이썬 모듈(.pyc 파일)에 저장된다. 이렇게 저장된 바이트코드는 나중에 같은 모듈이 다시 로드될 때 재사용된다. 따라서, 같은 모듈이 두 번째로 로드될 때는 컴파일 과정을 거치지 않고 바이트코드를 즉시 실행한다." 파이썬은 Byte-code 형태 파일로 컴파일 된다고 이해하였다. 그렇다면 파이썬을 과연 인터프리터 언어라고 봐도 되는건가? Byte-code로 컴파일 되는데? 라는 의문이 생겼다. 기계어로 번역되어야만 컴파일 언어라고 표현하지 않으니 말이다. 분명 대학 새내기 시절을..

컴퓨터 공학 2023.04.13

👉 [DB] B+Tree 인덱스는 왜 LIKE 연산시 Full Scan을 할까?

LIKE 연산은 Indexing 걸린 column 이라도, Full Scan을 한다! 라는 말은 올바른 답일까? 정확하게는 아래와 같은 명제가 참이다. LIKE 연산은 Indexing 걸린 column 이라도, Full Scan 할수도 혹은 Index Scan 할수도 있다. 실제로 아래와 같은 3가지 방식의 코드는 각각 Full-Scan 과 Index Scan의 결과를 초래한다. /* Full Scan */ SELECT * FROM table_name WHERE column_name LIKE '%X%'; SELECT * FROM table_name WHERE column_name LIKE '%X'; /* Index Scan */ SELECT * FROM table_name WHERE column_name..

컴퓨터 공학 2023.04.03

👉 [CS] 아이폰 시리를 chatGPT로 바꿔서 써보기 Feat.노코드

애플 제품은 다 써도, Siri 잘 안쓰는 편이다. 발화에 대한 인식률이 낮기 때문이다. 내 발음이 제대로 안되나... 영어는 잘 된다고 하는데 흠.. 스픽(Speak) 이라는 영어 회화 앱을 쓰는데 이건 한국식 영어 발음도 참 잘되는걸 보면 내가 보기엔 그냥 애플에서 한국인 발음 데이터를 제대로 관리 안하는 것 같다. (소수 민족의 슬픔) 아무튼 근데 chatGPT를 Siri에게 쓸 수 없을까? 라는 호기심이 생겼다. 바로 실행했다. 아이폰에 기본 탑재된 단축어 앱을 이용하면 되는데, 이게 스크래치 같은 노코드 툴이다. 로직만 잘 짜면 된다. 오 짜봐야지! 하다가 문득 혹시 깃허브에 누군가 만든게 있지 않을까... 궁금해졌다. 찾아보니 있었다. ChatGPT-siri 바로 써보기로 했따. 프로그래밍 제..

컴퓨터 공학 2023.04.02

👉 [Python] 같지만 다른 배열 초기화 방법

x = [[0] * n ] * n 종종 이런식으로 이차원 배열을 선언하는데 알 수 없는 오류가 발생했다. arr2 = [[0] * n ] * n arr2[0][0] = 1 print(arr2) # 출력: [[1, 0, 0], [1, 0, 0], [1, 0, 0]] 분명 첫 원소 (0,0)만 바꿨는데 (X,0) 애들이 전부 바뀌어 버린다... 😭 다른 방식과 비교해보았다. n = 3 # 리스트 내포로 2차원 리스트 초기화 arr1 = [[0] * n for _ in range(n)] arr1[0][0] = 1 print(arr1) # 출력: [[1, 0, 0], [0, 0, 0], [0, 0, 0]] # 반복문으로 2차원 리스트 초기화 arr2 = [[0] * n ] * n arr2[0][0] = 1 pr..

컴퓨터 공학 2022.12.22

👉 [알고리즘] 투포인터 알고리즘

투 포인터(Two Pointers) 알고리즘은 주로 배열이나 리스트와 같은 순차적인 자료구조에서 특정 범위를 탐색하거나 부분합, 부분 문자열 등을 찾을 때 유용한 알고리즘이다. 투 포인터 알고리즘은 이름 그대로, 두 개의 포인터를 이용하여 문제를 해결한다. 이 알고리즘은 보통 정렬된 배열에서 찾는 문제에서 유용하게 사용한다. 1. 배열이나 리스트에서 각각 왼쪽 포인터(left)와 오른쪽 포인터(right)를 정한다. 2. right를 체크 대상 추가를 위해 +1 씩한다. 3. left를 체크 대상 해제를 위해 +1 씩한다. 4. 반복해서 두 포인터의 위치를 조정하며 문제를 해결한다. 보통 이 알고리즘은 두 포인터의 위치를 이동시키는 규칙을 설정하여 사용한다. 예를 들어, 부분합을 구하는 문제에서는 왼쪽 ..

👉 [DB] Migration

마이그레이션(migration)은 일반적으로 데이터베이스에서 스키마를 변경하거나 업데이트할 때 사용하는 작업이다. 이 과정에서 데이터 무결성을 보장하기 위해 여러 가지 방법을 사용할 수 있다. 기존에 마이그레이션 툴을 이용하지 않고, 수작업으로 계속해서 버전을 관리한 경험이 있는데 덕분에 오류를 만나게 되었다. 무엇이든지 자동화하는 것은 큰 메리트가 있는 것 같다. 데이터베이스 마이그레이션은 (1)데이터의 무결성을 보장하고, (2)데이터 유실을 방지하며, (3)데이터베이스 구조를 유지 보수하는 데에 매우 중요하다. Python에서는 Flask-Migrate, Alembic 등의 마이그레이션 도구가 있고, Java 에서는 Flyway 가 있다! 데이터베이스 스키마를 변경하는 경우, 스키마 변경에 따른 데이..

컴퓨터 공학 2022.11.12

👉 [CS] 우선순위 큐

우선순위 큐 우선순위 큐(Priority Queue)는 데이터를 저장하고, 꺼내올 때 우선순위에 따라 처리하는 자료구조이다. 일반적으로는 힙(Heap)이라는 자료구조를 이용하여 구현된다. (우선순위 큐 != 힙) 우선순위 큐는 일반 큐와 달리, 데이터가 들어올 때마다 우선순위를 비교하여 적절한 위치에 삽입하거나, 이미 삽입된 데이터 중 가장 우선순위가 높은 데이터를 먼저 꺼내오는 동작을 수행한다. 우선순위 큐는 다양한 분야에서 사용됩니다. 예를 들어, 다익스트라 알고리즘과 같은 최단 경로 알고리즘에서는 우선순위 큐를 이용하여 다음으로 방문할 노드를 선택한다. 또한, 운영 체제에서는 프로세스 스케줄링을 위해 우선순위 큐를 사용한다. 우선순위 큐는 일반적으로 삽입과 삭제 연산의 시간복잡도가 O(log n)입..