Introduction 나는 2021년 12월 무렵부터 TIL(Today I Learned) 이라는 Github Repository를 관리하고 있다. 기술 블로그를 따로 운영함에도, 학습 내용을 TIL에 정리하게 된 이유는 다음과 같다. 블로그에는 잘 정리된 포스팅 형태로 글을 게시하고 싶었기 때문에, 정말 날 것 그대로의 학습 내용을 저장할 장소가 필요했다. 마크다운 문서를 예쁘게 보여줬으면 좋겠으므로, 먼저 Notion을 이용해 학습 정리를 하게 되었다. 그러나 Notion은 학습 내용을 여러 사람에게 공유하기 어려워(단순히 문서를 Public으로 설정하는 것은 접근성이 떨어질 것 같아) Github Public Repository를 별도로 운영하게 되었다. Problem 그러나 개인적으로 생각하는 ..
필요한 HTTP Header 브라우저 캐싱을 도입하기 위해서는 아래의 헤더들이 설정되어야 한다. Cache-Control 브라우저의 캐싱 방법을 정하기 위해 서버/클라이언트가 사용하는 HTTP Header 캐시의 저장 여부, 유효 시간 등을 지정할 수 있음 자주 사용하는 디렉티브(directive) 목록 public/private: public은 이 리소스를 받는 모든 주체가 캐싱을 하도록 하고, private는 오직 end-user(마지막 수신자)만이 캐싱을 하도록 함 must-revalidate: 반드시 재검증을 거쳐 캐시된 리소스를 사용하도록 함 max-age=: 캐시가 유효하다고(최신 상태라고) 판단할 최대 시간 E-Tag 리소스를 식별하는 식별자 역할을 하는 HTTP Header response..
서버가 클라이언트를 식별하는 방법 HTTP는 기본적으로 stateless다. HTTP 요청에 포함되는 정보들은 현재 요청을 처리하기 위한 정보들만을 제공할 뿐, 그 이전 또는 이후의 요청에 대한 정보는 제공하지 않는다. 그러나 이러한 정보만으로는 적절한 응답을 내려주기 어려운 요청들이 있다. 대표적인 예시로 사용자의 인증(로그인된 사용자인가?) 여부에 따라 허용을 달리하는 API로의 요청이 있다. 이러한 API를 호출하기 위해, 통상적으로 두 가지 방법이 사용된다. 하나는 서버가 부가적인 정보를 소유하는 세션 방법이고, 다른 하나는 클라이언트가 부가적인 정보를 소유하는 토큰 방법이다. 두 가지 모두 활발하게 사용되고 있고, 나름의 장단점을 가진다. 본 글에서는 두 가지의 특징을 분석하고 어떤 상황에서 어..
Introduction 최근에 Python으로 알고리즘 문제 풀이를 하다가, Java로 코딩 테스트를 준비할 일이 있었다. 준비를 위해 Java에서 주로 사용되는 알고리즘 문제 풀이 문법을 정리하다가 의문점이 생겼다. 왜 자바는 정렬을 array.sort()가 아닌 Array.sort(array)로 지원하는 걸까? 내장 함수 vs 스태틱 함수 보통 Python 등의 언어에서는 정렬 등의 동작이 객체 내부 함수를 통해 이루어진다. list = [3, 1, 4, 5, 2] list.sort() print(list) # [1, 2, 3, 4, 5] 그러나 Java에서는 배열/리스트를 다루는 클래스에서 static 함수로 정렬 기능을 제공한다. import java.util.Arrays; public class..
2302. 극장 좌석 백준 2302번 문제인 극장 좌석을 풀기 위해, 처음에는 백트래킹 알고리즘을 이용했다. 오름차순으로 한 명씩 자리에 앉히고 다음 사람을 앉히기 위해 왼쪽, 자기자리, 오른쪽을 탐색을 반복하여 마지막 사람까지 자리에 앉으면 이것을 하나의 case로 보고 정답 값에 1을 더해주는 재귀 함수를 짜면 된다고 생각했기 때문이다. 그러나 시간 초과가 발생했다. 좌석의 수 N이 최대 40인데, 각 자리에는 왼쪽 사람, 자리 주인, 오른쪽 사람 총 세 명이 앉을 수 있으므로 시간 복잡도가 O(3^N)이다. 3^40은 조가 넘어가는 어마어마한 값이므로 당연히 안 된다. 결론적으로 이 문제는 Sub-Problem이 숨어 있는 DP 문제였다. VIP석이 Sub-Problem을 쪼개는 기준이었다. 이번 ..
Introduction 추상클래스와 인터페이스는 추후에 완성할 무언가를 미리 정의한다는 공통점을 가진다. 이 때문에 두 가지의 차이가 정확히 무엇인지, 두 가지를 어떨 때 사용해야 하는지 항상 확실하지 않았기 때문에 시간을 내서 정리해보았다. 추상클래스와 인터페이스의 차이 인터페이스는 여러 개를 구현할 수 있지만 클래스는 하나만 상속할 수 있다. (단일 상속, 다중 구현) 인터페이스는 인스턴스의 자료형으로 지정할 수 있으나 추상클래스는 그럴 수 없다. 추상클래스는 추상이 아닌(구현부를 포함한) 메소드를 가질 수 있다. 추상클래스는 인스턴스 변수를 선언할 수 있으나, 인터페이스는 static field만 소유할 수 있다. 추상클래스는 constructor를 가질 수 있으나(자식 클래스에서 사용하기 위함),..