We will find a way, we always have.

-interstellar

Computer Science 50

[네트워크] 3xx 리다이렉트 (feat: ERR_TOO_MANY_REDIRECTS)

서론우테코 레벨 2 미션을 하면서 생성 요청이 왔을 때 응답으로 201 Created를 반환하고 Location을 내리라는 요구사항이 있었다.   그래서 코드 구현도 UriComponentsBuilder를 사용해서 URI를 만들고 Location 필드에 넣어주었다.   하지만 이렇게 구현을 해도 Post 요청이 왔을 때, Location으로 리다이렉트 하지 않는다. 왜냐 2xx에선 Location에 값이 있어도 그쪽으로 자동 리다이렉트하지 않는다. 레벨 2 당시에는 놓쳤던 부분이지만 이번 레벨 4 미션을 하면서 왜 201 Created에 Location을 말아 넣는지 알았다. 오다 주웠기 때문이다.    리다이렉션웹 서버는 종종 성공 메시지 대신 리다이렉션 응답을 반환한다. HTTP 헤더에서 Locati..

[알고리즘] 이분 매칭 (bipartite matching)

한동안 알고리즘 공부를 멈췄다가 최근에 다시 흥미가 생겨 발을 들이기 시작했다. 이번에는 또 어떤 씹덕 알고리즘을 배워볼까 하다가 이분 매칭이 맛있어 보였다.    모든 간선 용량이 1이고, 정점을 두 개의 그룹으로 나누었을 때, 존재하는 모든 간선의 양 끝 정점이 서로 다른 그룹에 속하는 형태의 유량 그래프를 이분 그래프(bipartite graph)라고 한다.    이분 그래프에서 한쪽 그룹을 A, 다른 쪽 그룹을 B라고 할 때, 간선의 방향이 모두 A -> B일 때, 최대 유량을 구하는 문제를 이분 매칭(bipartite matching) 문제라고 부른다. 위 그림에서는 생략되었지만 소스에서 A로 가는 간선과 B에서 싱크로 가는 간선이 있다고 생각하면 된다.  이분 그래프에서 매칭은 두 그룹의 정점..

[네트워크] DNS(Domain Name System) 1편

테코톡 준비할 겸, 공부했던 내용을 다시 복습해보자.  DNS 등장배경아파넷(ARPAnet) 시절에는 아파넷의 호스트 주소(숫자 주소)와 호스트 이름 리스트를 SRI NIC(Stanford Research Institution Network Information Center)에서 일괄 관리하였다. TCP/IP 및 DNS가 개발되기 전까지, 전체 호스트 정보(호스트 이름과 숫자주소)를 담고 있는 텍스트 파일을 온라인에 올리면 네트워크 사용자는 FTP로 다운받아 사용하는 방식이었다. 이 텍스트 파일이 hosts.txt이고, 현재도 운영체제 상관없이 어느 pc에서든 이 파일을 검색할 수 있다. window 같은 경우 windows\system32\drivers\etc 에서 찾을 수 있다.    이 hosts ..

[DB] Flyway

Flyway Flyway란 오픈소스 데이터베이스 마이그레이션 툴이다. 다시말해 데이터베이스의 DDL 이력을 쌓아서 관리하는 툴이다. 이를 통해 데이터베이스 형상관리 및 마이그레이션을 할 수 있다. 사용 이유 개발을 진행하다보면 엔티티의 구조가 변경되고 이로 인해 데이터베이스의 스키마도 변경되는 일이 발생한다. 소프트웨어 소스 코드는 Git과 같은 형상관리 툴을 사용하여 버전관리를 진행했다면, 데이터베이스는 그러지 못했다. 일일히 스키마 수정을 위한 DDL을 각 환경별로 모두 실행해주어야 했다. 로컬 개발 환경이나 개발 서버에서는 하이버네이트 설정 중 ddl-auto 에서 create나 create-drop, update 옵션을 사용하여 엔티티 구조를 맞춰 실행이 가능하나, 운영 환경에서는 해당 설정이 불..

[디자인 패턴] 디자인 패턴 (feat: 스프링)

디자인 패턴 Design Pattern 디자인 패턴이란 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 일반적인 해결책이다. 디자인 패턴의 분류 GoF(Gang of Four)의 디자인 패턴은 크게 생성 패턴, 구조 패턴, 행위 패턴으로 분류된다. 생성 패턴 (Creational Pattern) 생성 패턴의 목적 클래스의 캡슐화를 통해 코드의 유연성과 재사용 가능성을 향상시키는 패턴 생성 패턴의 예 추상 팩토리 (Abstract Factory) 빌더 (Builder) 팩토리 메서드 (Factory Method) 프로토타입 (Prototype) 싱글턴 (Singleton) 구조 패턴 (Structural Pattern) 구조 패턴의 목적 클래스와 객체를 조합하여 더 큰 구조를 만드는 패턴 인터페이스..

[DB] SQL Injection

SQL Injection SQL 인젝션은 악의적인 사용자가 보안상의 취약점을 이용하여, 조작된 쿼리문을 DB에 그대로 전달하여 비정상적 명령을 실행시키는 공격 기법이다. 공격 목적 정보 유출 저장된 데이터 유출 및 조작 원격 코드 실행 일부 데이터베이스의 경우 확장 프로시저를 이용하여 원격으로 시스템 명령의 실행 가능 시스템 명령의 실행은 원격 자원 접근 및 데이터 유출, 삭제 가능 인증 우회 공격의 대표적인 경우는 로그인 폼에서 발생 이때 상위 권한을 가진 사용자의 권한으로 인증 절차를 우회하여 로그인 발생 조건 사용자 입력값의 신뢰성 부족 사용자로부터 입력 받은 값(폼 데이터, URL 파라미터)을 적절히 검증 또는 이스케이프하지 않은 경우 발생 동적 SQL 쿼리 생성 동적으로 SQL 쿼리를 생성하고 ..

[DB] 스키마 (Schema)

스키마 (Schema) 스키마는 데이터베이스의 구조와 제약 조건에 관하여 전반적인 명세를 기술한 메타데이터의 집합이다. 데이터 개체(Entity), 속성(Attribute), 관계(Relationship) 뿐만 아니라 데이터들의 제약 조건까지 포함되어 있다. 속성의 데이터 타입을 나타내지는 않는다. 스키마는 시간에 따라 불변인 특징을 가지고 있다. 스키마의 3계층 스키마는 사용자의 관점에 따라 3계층으로 나뉜다. 외부 스키마 (View Schema) 사용자 관점에서의 논리적인 구조이다. 사용자와 데이터베이스 간의 상호 작용을 정의할 수 있는 뷰 레벨이다. 전체 데이터베이스의 한 논리적인 부분으로 볼 수 있으므로 서브스키마라고도 불린다. 때문에 하나 이상의 외부 스키마가 존재할 수 있으며 하나의 외부 스키..

[알고리즘] KMP 알고리즘

문자열 $N$ 와 $H$가 주어졌을 때 $N$에 $H$ 있는지 찾는 문자열 검색 알고리즘에 대해 알아보자. 나이브하게 접근해보면 $N$의 첫문자부터 마지막문자까지 $H$와 하나하나 비교해가면서 일치하는지 판별할 수 있고 해당 솔루션의 시간복잡도는 $O(|N|*|H|)$ 이다. 문자열의 길이가 짧다면 해당 접근방법도 구현도 쉽고 나쁘지만은 않다. 하지만 문자열의 길이가 커진다면 제한시간내에 동작하지 못하게 된다. $N[k...i-1]$과 $H[...i-1]$ 까지는 문자열이 일치하였지만 $H[i]$ 문자에서 일치하지 않는경우 다시 $N[k+1]$ 부터 비교하는 것이 아니라 이미 $H[...i-1]$까지 어떤 문자가 있는지 알고 있으니 보지 않아도 $H[k+1]$이 $H[0]$과 같은지 다른지는 알 수 있지..

[DB] 트랜잭션

트랜잭션 이해 트랜잭션 - 개념 이해 트랜잭션은 데이터베이스의 작업 단위이다. ACID 트랜잭션이 안전하게 수행된다는 것을 보장하기 위해서는 ACID가 만족해야 한다. Atomicity(원자성): 설정된 트랜잭션 범위 안의 내용들이 마치 하나의 작업처럼 모두 성공하거나 모두 실패해야 한다. Consistency(일관성): 모든 트랜잭션은 일관성 있는 DB 상태를 유지해야 한다. 트랜잭션은 DB에서 정한 무결성 제약 조건을 항상 만족해야 한다. Isolation(독립성): 여러 트랜잭션이 있을 때, 각각의 트랜잭션은 다른 트랜잭션의 연산에 끼어들지 못하고 독립적이다. Durability(영구성): 트랜잭션이 성공했다면 그 결과가 항상 기록되어야 한다. 문제가 발생하여도 DB 로그 등을 사용해서 성공한 트랜..