분류 전체보기
-
[Java] 람다식 표현 (Lambda Expression)언어/Java 2021. 4. 4. 00:04
자바 8에서 도입된 개념으로 함수를 변수처럼 사용하는 사용하는 개념입니다. 함수를 변수처럼 사용하므로 파라미터로 다른 메소드에 전달할 수도 있고 반환값으로 함수를 받을 수 있습니다. 자바에서 람다식은 다른 스크립트 언어처럼 완전한 함수형 프로그래밍 방식은 아닙니다. 인터페이스 형식을 빌려서 람다식을 표현하기 때문에 함수형 프로그래밍의 장점을 완벽하게 가지지 못합니다. 장단점은 아래에서 설명합니다. 사용법 (매개변수1, 매개변수2, ...) -> {실행문...}매개변수의 이름은 자유롭게 정할 수 있고 타입을 명시하지 않아도 됩니다. -> 는 실행문에서 좌변에 설정한 값들을 보내 사용한다 라고 이해하면 쉽습니다. 예시 예시를 하기 위해 사전에 아래와 같은 코드가 작성되어 있다고 가정합니다. @Function..
-
[Postgresql] 데이터 해시화, 암호화, 복호화DB/PostgreSQL 2021. 4. 3. 22:41
해시화 MD5 md5 는 해시화로 한번 변형을 하면 복원을 할 수 없습니다. 예전에는 비밀번호와 같은 값을 많이 변환했지만 보안적인 측면에서 이미 취약하다고 하기 때문에 탈취가 되어도 크게 중요하지 않은 데이터에서만 사용하기를 권장합니다. 형식 md5(문자열) return hex예시 SELECT md5('abcd'); -- e2fc714c4727ee9395f324cd2e7f331fdigest digest를 사용하면 md5 뿐만 아니라 sha1, sha256, sha512와 같이 평문을 해시화 할 수 있습니다. 반환 타입은 bytea 이므로 encode()함수를 사용해 16진수로 변환하여 사용하면 됩니다. 형식 해시 타입 md5, sha1, sha224, sha256, sha384, sha5..
-
[Java] Optional언어/Java 2021. 3. 14. 22:52
Optional 클래스는 객체를 포장해주는 래퍼 클래스로 모든 타입의 참조 변수를 담을 수 있습니다. Optional 객체를 사용하면 복잡한 조건문 없이 NullPointerException (;NPE) 예외 처리를 할 수 있습니다. 생성 Optional 객체 생성은 .empty(), .of(), .ofNullable() 이 있습니다. .of() 메소드를 사용해서 객체를 생성할 때, 인자값으로 null이 전달된다면 NPE가 발생하므로 null이 입력될 수도 있다면 안전하게 ofNullable() 메소드를 호출하는 것이 좋습니다. Optional op1 = Optional.empty(); // Optional.empty - null을 담고 있는 빈 객체 Optional op2 = Optional.ofNul..
-
[PostgreSQL] DB LockDB 2021. 3. 13. 23:21
명시적 lock (Explicit Lock) PostgreSQL은 여러 lock 모드들을 사용하여 테이블의 데이터를 동시 접근을 제어합니다. 이와 같은 lock 모드는 다중 버전 동시성 제어(MVCC)를 제공하지 않는 상황에서 어플리케이션을 제어하는 lock을 쓸 수 있고 대부분의 PostgreSQL 명령들은 해당 명령이 실행되는 동안 명령 실행의 대상이 되는 테이블이 삭제되거나 수정되지 않도록 적절한 모드의 lock을 자동으로 얻습니다. 예를 들어, 특정 테이블에서 truncate가 실행되는 동안 다른 작업이 실행되지 않도록 해당 테이블에 배타적 lock(exclusive lock)을 얻습니다. 동시성 제어 (Concurrency Control) 동시성 제어란 DBMS가 다수의 사용자 사이에서 동시에 ..
-
[DB] 데이터베이스 정규화 (Database Normalization) - 1NF, 2NF, 3NF, BCNFDB 2021. 3. 6. 21:06
이상현상의 종류와 함수적 종속성이 무엇인지 알고 있어야 이해가 쉽기 때문에 이 개념들을 먼저 설명을 먼저 한 다음, 데이터베이스 정규화를 설명합니다. 이상 현상 (Anomaly) 데이터베이스 설계를 잘못했을 때, 불필요하게 데이터가 중복으로 저장될 수 있습니다. 이럴 경우, 리소스가 낭비되고 운영 상 의도치 않은 부작용이 발생할 수도 있습니다. 부작용으로는 삽입 이상(Insertion Anomaly), 갱신 이상(Update Anomaly), 삭제 이상(Deletion Anomaly)이 있습니다. 아래는 학사 시스템 예제로 1명의 학생은 1개의 학과에 속할 수 있으며 학번과 과목명의 조합으로 기본키를 가지는 테이블 입니다. 삽입 이상 (Insertion Anomaly) 수강을 1개도 하지 않는 편입생을 ..
-
[Python] divmod를 사용해 몫과 나머지 구하기언어/파이썬 & 장고 2021. 3. 1. 20:45
divmod 모듈을 모른다면 몫과 나머지를 구하는 로직은 아래와 같습니다. # 몫 s = a // b # 나머지 r = a % b위와 같이 구하는 것도 좋지만 divmod를 사용하여 계산할 수도 있습니다. s, r = divmod(a, b) s, r = divmod(11, 3) # 3, 2divmod가 편해보여서 평상시에 사용해도 크게 상관은 없지만 처리 속도가 아주 중요한 프로그램에서는 사용에 지양해야 합니다. 계산하고자 하는 숫자가 작을 경우, divmod 보다 직접 연산자를 사용해서 계산하는 방식이 더 빠릅니다. 반대로 숫자가 크다면 divmod를 사용하는 것이 더 빠르게 처리됩니다. import timeit timeit.timeit('divmod(n, d)', 'n, d = ..
-
[Python] asyncio 파헤치기언어/파이썬 & 장고 2021. 3. 1. 20:12
asyncio는 파이썬 버전 별로 사용하는 형태가 조금씩 다릅니다. 아래 설명에서는 파이썬 3.8 기준으로 작성했습니다. asyncio란? 파이썬 3.5부터 지원하는 asyncio는 비동기 프로그래밍을 위한 모듈입니다. 동기란 빨래를 시작하고 종료가 되면 설거지를 시작하고 완료가 되면 TV를 보는 것처럼 한 번에 하나의 작업을 하는 것이고, 비동기는 빨래를 시작시키고 설거지를 하면서 TV를 보는 것과 같이 여러 작업을 동시에 하는 것과 같은 행동을 하는 것입니다. 하지만 파이썬에서는 GIL때문에 비동기 프로그래밍이 동기 프로그래밍보다 느릴 수도 있습니다. asyncio는 이벤트 루프와 코루틴을 기반으로 동작하며 데이터를 요청하고 응답을 기다리는 I/O bound한 작업에서 효율적입니다. 코루틴 기반이므로..
-
[PostgreSQL] COALESCE, NULLIF, SIGN, IS DISTINCT FROMDB/PostgreSQL 2021. 2. 28. 19:41
COALESCE와 NULLIF 두 함수는 유사한 동작을 하는 것 같지만 실제로는 다른 결과를 유발합니다. COALESCE COALESCE(X, Y)는 첫 파라미터인 X가 NULL이라면 Y를 반환하고 그렇지 않으면 X를 반환합니다. select coalesce(null, '123'); -- '123' select coalesce('1', '123'); -- '1' NULLIF NULLIF(X, Y)는 X와 Y가 같다면 NULL을 반환하고 그렇지 않으면 X를 반환합니다. select nullif('1', '1'); -- null select nullif('1', '2'); -- 1 select nullif(null, null); -- null SIGN 입력된 값이 양수면 1, 0이면 0, 음수면 -1을 반환..
-
[PostgreSQL] CUBE문을 사용해 사용자 액션 집계하기DB/PostgreSQL 2021. 2. 28. 18:51
먼저 사용자들의 액션 플래그를 집계하는 쿼리를 다음과 같다고 가정합니다. WITH action_flag AS ( SELECT user_id, SIGN(SUM(CASE WHEN action = 'purchase' THEN 1 ELSE 0 END)) AS has_purchase, SIGN(SUM(CASE WHEN action = 'review' THEN 1 ELSE 0 END)) AS has_review, SIGN(SUM(CASE WHEN action = 'favorite' THEN 1 ELSE 0 END)) AS has_favorite FROM action_log GROUP BY user_id ) SELECT * from action_flag 이러한 결과는 다음과 같습니다. user_id has_purch..
-
[PostgreSQL] ROLLUP을 사용해 소계 구하기DB/PostgreSQL 2021. 2. 28. 17:15
먼저 아래와 같은 데이터가 있다고 가정합니다. dt order_id user_id item_id price category sub_category 2017-01-01 1 1 1 10000 men jacket 2017-01-01 1 1 2 5000 food fish 2017-01-01 1 1 3 2500 book business 2017-01-01 2 2 1 10000 men jacket 2017-01-01 2 2 5 50000 women bag 2017-01-01 3 2 2 5000 food fish 2017-01-01 4 3 1 10000 men jacket 2017-01-01 5 4 4 40000 cd classic 이러한 데이터에서 카테고리별 총 매출과 소계를 계산하고자 합니다. 소계란 전체가 아닌..