서버가 클라이언트를 식별하는 방법 HTTP는 기본적으로 stateless다. HTTP 요청에 포함되는 정보들은 현재 요청을 처리하기 위한 정보들만을 제공할 뿐, 그 이전 또는 이후의 요청에 대한 정보는 제공하지 않는다. 그러나 이러한 정보만으로는 적절한 응답을 내려주기 어려운 요청들이 있다. 대표적인 예시로 사용자의 인증(로그인된 사용자인가?) 여부에 따라 허용을 달리하는 API로의 요청이 있다. 이러한 API를 호출하기 위해, 통상적으로 두 가지 방법이 사용된다. 하나는 서버가 부가적인 정보를 소유하는 세션 방법이고, 다른 하나는 클라이언트가 부가적인 정보를 소유하는 토큰 방법이다. 두 가지 모두 활발하게 사용되고 있고, 나름의 장단점을 가진다. 본 글에서는 두 가지의 특징을 분석하고 어떤 상황에서 어..
이 글은 최범균 님의 유튜브 “프로그래밍 초식 : DB 트랜잭션 조금 이해하기 02 격리”를 시청하고 작성되었습니다. 같은 데이터에 동시 접근? 동시성은 초심자가 놓치기 쉬운 문제를 발생시킴 ex) 당직 담당자를 최소 1명은 유지해야 한다. 2명의 담당자 A, B가 존재한다. A가 담당자 수를 SELECT ⇒ 결과: 2 B가 담당자 수를 SELECT ⇒ 결과: 2 A는 자신이 빠져도 최소 1명을 만족하므로 자신을 당직에서 제거하도록 UPDATE B가 자신이 빠져도 최소 1명을 만족하므로 자신을 당직에서 제거하도록 UPDATE 결과적으로 남은 당직자는 0명. 최소 1명을 유지해야 한다는 비즈니스 로직 위반 왜? A와 B가 동시에 같은 데이터(당직자 수)에 접근했기 때문 따라서 트랜잭션을 격리하여 이러한 동..
트랜잭션 (Transaction) 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위 트랜잭션이 필요한 이유 SELECT → UPDATE → INSERT 순으로 동작하는 비즈니스 로직이 있다고 가정하자. 만약 UPDATE를 성공적으로 수행한 후 INSERT를 수행하는 과정에서 오류가 발생해 성공적으로 INSERT가 수행되지 않았다면, 이는 로직을 작성한 개발자가 의도한대로 처리된 것이 아니라고 봐야 한다. 따라서 개발자는 어떻게든 수행된 UPDATE를 되돌려야 하고, 이는 복잡한 추가 작업을 요구한다. 트랜잭션을 도입하면 INSERT까지 모든 쿼리가 정상적으로 수행된 경우에만 변경 사항을 반영하고(Commit), 중간에 예외 등에 의해 일부 쿼리가 정상적으로 수행되지 못한 경우에는 수행된 쿼리의 ..
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을 쪼개는 기준이었다. 이번 ..
클라이언트에서도 데이터베이스에서 길이 제한 오류가 나지 않도록 문자열 길이에 제한을 둘 필요가 있다. 보통 한글과 같은 문자는 1 Byte가 아닌 2 또는 3 Bytes로 이루어진다. (주로 사용하는 UTF-8은 한글을 3 Bytes로 표현한다.) 따라서, VARCHAR가 Byte를 기준으로 한다면 VARCHAR의 길이 제한은 어떤 것을 입력하는지, 어떤 인코딩 방식을 사용하는지에 따라 달라질 것이다. 이를 모르고 사용하면 추후에 이슈가 생길 수도 있고, 데이터베이스 마이그레이션 시 문제가 발생할 여지도 있을 것 같아 주로 사용하는 DBMS 종류별로 정리해보았다. ✔ VARCHAR의 기준 - MySQL 버전 4.1 이전까지는 Bytes를 사용했다가 4.1부터는 Character를 사용한다고 한다. 즉, ..
IP 주소는 A부터 E까지 총 5개의 클래스로 구성된다. 다섯 가지 클래스는 다음과 같이 구성된다. 위 그림을 통해 알 수 있는 한 가지 사실은 IP를 나타내기 위해 사용되는 비트의 수가 다르다는 것이다. IP를 나타내기 위한 비트를 제외한 비트는 모두 호스트를 할당하는 비트로 사용된다. 즉, 클래스별로 할당 가능한 호스트의 수가 다르며, A클래스가 가장 많고 C 클래스로 갈수록 줄어든다. 일반적으로 클래스 A는 대규모 네트워크에, 클래스 B는 중간 규모의 네트워크에, 클래스 C는 소규모 네트워크에 사용된다. D와 E는 멀티캐스트, 연구 등에 사용되기 위한 클래스이지만 잘 사용되지 않는다고 한다. 또한, IP는 사설 IP와 공인 IP로 나뉜다. 사설 IP는 특정 네트워크 내에서 사용하는 상대적인 주소라면..
Introduction 추상클래스와 인터페이스는 추후에 완성할 무언가를 미리 정의한다는 공통점을 가진다. 이 때문에 두 가지의 차이가 정확히 무엇인지, 두 가지를 어떨 때 사용해야 하는지 항상 확실하지 않았기 때문에 시간을 내서 정리해보았다. 추상클래스와 인터페이스의 차이 인터페이스는 여러 개를 구현할 수 있지만 클래스는 하나만 상속할 수 있다. (단일 상속, 다중 구현) 인터페이스는 인스턴스의 자료형으로 지정할 수 있으나 추상클래스는 그럴 수 없다. 추상클래스는 추상이 아닌(구현부를 포함한) 메소드를 가질 수 있다. 추상클래스는 인스턴스 변수를 선언할 수 있으나, 인터페이스는 static field만 소유할 수 있다. 추상클래스는 constructor를 가질 수 있으나(자식 클래스에서 사용하기 위함),..