fbfbf1의 등록된 링크

 fbfbf1로 등록된 네이버 블로그 포스트 수는 1350건입니다.

[Kotlin] 기본 문법 정리 [내부링크]

statement와 expression expression는 값을 만들어 내고 다른 식의 하위 요소로 계산에 참여 가능 statement는 자신을 둘러싸고 있는 가장 안쪽 블록의 최상위 요소로 존재하고 아무런 값을 만들어내지 않음 kotlin은 주로 expression으로 이루어져있고 java는 statement fun max(a: Int, b: Int): Int = if(a > b) a else b; fun max(a: Int, b: Int) = if(a > b) a else b; 둘 다 가능 아래는 타입 추론 기능 변수 코틀린에서는 타입 지정을 생략하는 경우가 많음 val a: Int = 123 val b = 123 둘 다 가능 val a: Int a = 42 초기화 식을 사용하지 않고 변수 선언하려면 변수 타입 반드시 명시 val, var val = value 변경 불가능한 참조를 저장하는 변수, final 변수임 var = variable 변경 가능한 참조 일반 변수임 기본적

[Kotlin] 함수 정의와 호출 [내부링크]

이름 붙인 인자 fun main(args: Array<String>) { isNumber(num = 123) } fun isNumber(num: Int) { } 함수를 호출할 때 인자를 명시해서 사용 가능 인자가 여러 개일 때 한 개라도 이름을 명시하고 나면 다른 모든 인자도 이름을 명시해야 함 Default 파라미터 fun isNumber(num: Int = 834) { } 함수의 디폴트 파라미터 값을 세팅할 수 있다. 오버로드를 피할 수 있는 장점이 있음 일반 호출 문법을 사용하려면 함수를 선언할 때와 같은 순서로 인자 지정 이름 붙인 인자를 사용하는 경우에는 인자 목록의 중간에 있는 인자를 생략하고, 지정하고 싶은 인자를 이름을 붙여서 순서와 관계없이 지정 가능 최상위 함수 코틀린에서는 함수를 소스 파일의 최상위 수준, 즉 모든 다른 클래스의 밖에 위치시킬 수 있음 이를 통해서 정적 함수 사용 가능 최상위 프로퍼티 프로퍼티도 최상위 수준에 놓을 수 있음 별로 흔한 경우는 아님

[LeetCode] Increasing Triplet Subsequence, Can Place Flowers, Move Zeros [내부링크]

Increasing Triplet Subsequence - Medium https://leetcode.com/problems/increasing-triplet-subsequence/description/?envType=study-plan-v2&envId=leetcode-75 Increasing Triplet Subsequence - LeetCode Can you solve this real interview question? Increasing Triplet Subsequence - Given an integer array nums, return true if there exists a triple of indices (i, j, k) such that i < j < k and nums[i] < nums[j] < nums[k]. If no such indices exists, return false. Example 1: Input: nums = [1,2,3,4,5] Out... le

[Kotlin] 클래스, 객체, 인터페이스, 접근제어자, 내부 클래스, 중첩 클래스 [내부링크]

인터페이스 interface Clickable { fun click() } 추상 메서드와 구현이 있는 메서드 정의 가능(java의 default 메서드) 단 인터페이스에는 아무런 상태도 들어갈 수 없음 class Button: Clickable { override fun click() = println("button click") } 코틀린에서는 클래스 이름 뒤에 콜론을 붙여서 상속받는다. 인터페이스뿐만 아니라 클래스 상속도 콜론을 붙임 인터페이스는 여러 개 상속 가능하지만 클래스는 한 개만 상속받음 자바의 @Override 애노테이션과 똑같은 게 override 변경자임 override 변경자는 반드시 사용해야 함 interface Clickable { fun click() fun showOff() = println("clickable") } 디폴트 메서드는 자바처럼 default를 붙일 필요 없이 함수 정의하듯이 정의하면 된다. interface Focusable { fun sh

[Kotlin] Sealed Class [내부링크]

봉인된 클래스: 클래스 계층 정의 시 계층 확장 제한 상위 클래스에 sealed 변경자를 붙이면 그 상위 클래스를 상속한 하위 클래스 정의를 제한 가능 sealed 클래스의 하위 클래스를 정의할 때는 반드시 상위 클래스 안에 중첩시켜야 함 sealed class Expr { class Num(val value: Int): Expr() class Sum(val left: Expr, val right: Expr): Expr() } sealed를 사용해서 기반 클래스를 sealed로 봉인함 기반 클래스인 Expr의 모든 하위 클래스 Num, Sum을 중첩 클래스로 나열함 fun eval(e: Expr): Int = when(e) { is Expr.Num -> e.value is Expr.Sum -> eval(e.right) + eval(e.left) } 그러면 when 식에서의 경우 모든 하위 클래스를 검사하기에 별도의 else 분기가 없어도 됨 sealed로 표시된 클래스는 자동으로 o

[3년 전 오늘] [일상] 2학기 종강 [내부링크]

2020.12.23. 3년 전 오늘 [일상] 2학기 종강 12월 17일 2학기 종강 나도 드디어 3학년이다.! 시험기간에 많이 나왔던 테스트 나는 거베라다.! 심지어 티없이 맑은 A++ 흑우이다. 내가 흑우라고 생각한 적은 없는데 역시 테스트는 테스트일 뿐..! 요것은 국제학생회 들어가서 처음으로 한 활동 처음에 중국집 가서 먹고 9시까지 밖에 못 놀고 갈 수 있는 곳은 술집밖에... 류리상자 블로그의 순기능이네 잊고 있던거 기억들이 글과 사진을 보니 다 생각난다 ㅋㅎ 2학년이 끝난 나 귀엽네~~~~ 이때 샀던 초록색 알고리즘 책은 생각보다 코드가 별로 없어서 안 읽었고 종만북에서는 KMP 알고리즘이랑 유니온 파인드 알고리즘만 열심히 정리하고 그 뒤로 넘 어려워서 안 읽었다. KMP랑 유니온 파인드는 그때 잘 정리해서 아직도 잘 보는 중

복제 (1) 동기/비동기식 복제, 노드 중단, 복제 지연 문제, 쓰기 일관성 [내부링크]

복제란 네트워크로 연결된 여러 장비에 동일한 데이터의 복사본을 유지하는 것 리더와 팔로워 데이터베이스의 복사본을 저장하는 각 노드를 replica(복제 서버)라고 함 마스터와 슬레이브가 있을 때 모든 복제 서버에 데이터가 있다는 사실을 어떻게 보장할 수 있을까? 가 의문이다. 이를 위해서는 데이터베이스의 모든 쓰기는 리더와 모든 복제 서버에서 처리해야 된다. 이걸 리더 기반 복제(leader-based replicaion)이라고 한다. 복제 서버 중 하나를 리더로 지정한다. 클라이언트가 쓰기 요청을 할 때는 리더로 요청을 보내야 한다. 그럼 리더는 먼저 로컬 저장소에 쓰기 요청을 기록한다. 그 후에 리더가 로컬 저장소에 새로운 데이터를 기록하면 변경분을 복제 로그나 변경 스트림의 일부로 팔로워에게 전송한다. 변경분을 받은 팔로워는 리더가 처리한 것과 동일한 순서로 모든 쓰기를 적용해서 모든 데이터가 있을 수 있게 한다. 여기서 쓰기는 리더에게만 허용이 되고 읽기는 리더와 복제본 모두

[Kotlin] 클래스 선언, data class, companion object, 익명 클래스 [내부링크]

클래스 초기화 : 주 생성자와 초기화 블록 class User(val nickname: String) 클래스 이름 뒤에 오는 괄호로 둘러싸인 코드를 주생성자라고 함 주 생성자는 생성자 파라미터를 지정하고 그 생성자 파라미터에 의해 초기화되는 프로퍼티를 정의 위에 코드를 풀어서 쓰면 위와 같다. constructor 키워드는 주 생성자나 부 생성자 정의를 시작할 때 사용함 init 키워드는 초기화 블록을 시작함 초기화 블록에는 클래스의 객체가 만들어질 때 실행될 초기화 코드가 들어감 초기화 블록은 주 생성자와 함께 사용됨 여러 초기화 블록 선언 가능 this 사용해서 위와 같이 사용 가능 바로 초기화 가능하면 init 블록 쓸 필요 없고 주 생성자 앞에 별다른 애너테이션이나 가시성 변경자가 없으면 constructor를 생략 가능 프로퍼티를 초기화하는 식이나 초기화 블록 안에서만 주 생성자의 파라미터를 참조할 수 있음 주 생성자의 파라미터로 프로퍼티를 초기화한다면 주 생성자 파라미터

[Docker] 이미지와 컨테이너 [내부링크]

도커 이미지 이미지는 컨테이너를 생성할 때 필요한 요소 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용됨 저장소 이름/이미지 이름:태그 ex) ubuntu:lastest , alicek106/ubuntu:14.04 저장소 이름 이미지가 저장된 장소, 생략 가능 이미지 이름 해당 이미지가 어떤 역할을 하는지 나타냄 이름은 생략 불가능 태그 이미지의 버전 관리, 리비전 관리에 사용됨 도커 컨테이너 도커 이미지로 컨테이너를 생성하면 해당 이미지 목적에 맞는 파일이 들어 있는 파일 시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간 생성되는 데 이걸 도커 컨테이너 컨테이너에서 수정한 이미지는 원본 이미지에 영향을 주지 않고 각각의 컨테이너도 서로에게 영향을 주지 않는다. 도커 컨테이너 생성 docker run -i -t ubuntu:14.04 docker run을 사용하면 컨테이너를 생성하고 실행한다. 즉 컨테이너 내부로 들어간다. 이미지가 없으면 도커 허브에서 이미지

데이터 모델과 질의 언어 [내부링크]

문서 데이터 모델 선호 이유 스키마 유연성, 지역성에 기인한 더 나은 성능 일부 애플리케이션의 경우 애플리케이션에서 사용하는 데이터 구조와 더 가까움 NoSQL 임 관계형 모델 선호 이유 조인, 다대일, 다대다 관계를 더 잘 지원해서 문서 데이터 모델에 대항함 RDB임 어떤 데이터 모델이 애플리케이션 코드를 더 간단하게 할까 애플리케이션에서 데이터가 문서와 비슷한 구조면 문서 모델을 사용하는 게 좋다. 단 문서 모델은 문서 내 중첩 항목을 바로 참조할 수는 없다. 문서 데이터베이스의 미흡한 조인 지원은 문제가 될 수도 있고 아닐 수도 있음 애플리케이션이 다대다 관계를 사용하면 문서 모델은 별로 좋지 않음 애플리케이션에서 비정규화된 데이터의 일관성 유지를 위해 추가 작업이 필요하고 조인을 애플리케이션으로 옮기면 코드도 복잡해지고 더 느려짐 상호 연결이 많은 데이터의 경우 문서 모델은 곤란하지만 관계형 모델은 무난하고 그래프 모델은 매우 자연스럽다. 문서 모델에서의 스키마 유연성 대부분

[Docker] 도커 볼륨 [내부링크]

도커 볼륨 도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 되고 컨테이너의 변경 사항만 별도로 저장해서 각 컨테이너의 정보를 보존함 이미 생성된 이미지는 변경되지 않고 컨테이너 계층에 원래 이미지에서 변경된 파일시스템 등을 저장함 이런 이유로 컨테이너 자체를 삭제하면 컨테이너 계층에 저장되어 있던 모든 정보가 삭제가 된다. 이런 데이터가 날아가는 상황을 방지하기 위해서 사용하는 게 도커 볼륨이다. 호스트 볼륨 공유 docker run -d \ --name wordpressdb_hostvolume \ -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_DATABASE=wordpress \ -v /Desktop/docker-volume:/var/lib/mysql \ mysql:latest -v /Desktop/docker-volume:/var/lib/mysql -v 옵션을 통해서 내 로컬의 Desktop의 docker-volume 폴더와 도커 컨테이너의

[Dokcer] 도커 네트워크 [내부링크]

도커 네트워크 도커 컨테이너의 네트워크 인터페이스에는 etho0과 lo 네트워크 존재 etho0의 Inet 주소는 순차적으로 할당되고 컨테이너를 재시작할 때마다 변경됨 내부망에서만 사용할 수 있는 IP이기에 외부와 연결해야 됨 이 과정은 virtual eth인 veth 네트워크 인터페이스를 도커 엔진이 자동으로 생성해서 이뤄짐 컨테이너의 eth0 인터페이스는 호스트의 veth 인터페이스와 연결되어 있고 veth 인터페이스는 docker() 브리지와 바인딩 되어 외부와 통신 가능 도커 네트워크 기능 도커 컨테이너를 생성하면 기본적으로 docker0 브리지를 통해 외부와 통신할 수 있는 환경 생성 사용자의 선택에 따라 원하는 네트워크 드라이브 사용 가능 bridge, host, none, container, overlay가 있음 도커의 네트워크를 다루는 명령은 docker network로 시작함 ls로 네트워크 목록 확인 가능하며 이미 bridge, host, none이 있는 걸 볼 수

[Dokcer] 컨테이너 로깅 [내부링크]

json-file 로그 사용 도커는 컨테이너의 표준 출력 (StdOut)과 에러(StdErr) 로그를 별도의 메타데이터 파일로 저장해 이를 확인하는 명령어 제공 docker run -d --name mysql \ -e MYSQL_ROOT_PASSWORD=1234 \ mysql:latest 먼저 Mysql 컨테이너 백그라운드 모드로 생성함 백그라운드 모드이기에 애플리케이션이 잘 구동되는지 여부는 알 수 없지만 docker logs 명령어를 사용해서 표준 출력을 확인해서 애플리케이션 상태를 알 수 있음 docker logs [컨테이너이름] 위 명령어를 사용하면 컨테이너의 로그를 볼 수 있다. 간단하고 빠르게 에러 확인 가능 docker run -d --name no_password_mysql \ > mysql:latest Mysql을 패스워드 없이 컨테이너 생성해 본다. docker ps, ps - a를 확인해 보면 no_password_mysql 컨테이너는 생성된 상태로 뜨지 않는다.

[Docker] 컨테이너 자원 할당 제한 [내부링크]

컨테이너 할당 제한 docker run, create 명령어 사용 시 컨테이너의 자원 할당량에 대한 설정을 할 수 있음 설정을 하지 않게 되면 호스트의 자원을 제한 없이 쓸 수 있기에 호스트에 문제가 발생할 수 있음 docker inspect 컨테이너이름 위 명령어를 사용하면 컨테이너에 설정된 자원 제한을 확인할 수 있음 도커 컨테이너 메모리 제한 --memory 명령어를 사용하면 컨테이너 메모리 제한 가능 단위는 m(megabyte), g(gigabyte)이고 제한할 수 있는 최소 메모리는 6MB docker run -d --memory="1g" \ --name memory_1g \ nginx:latest 위와 같이 설정하면 메모리 사용량을 1GB로 제한한다. docker inspect memory_1g | grep \"Memory\" Inspect를 위와 같이 사용해서 Memory를 확인하면 1G로 설정된 걸 볼 수 있다. 컨테이너 메모리 부족 도커 컨테이너에서 동작하는 프로세스

[Docker] 도커 컴포즈 [내부링크]

도커 컴포즈 도커 컴포즈를 활용해서 컨테이너를 이용한 서비스 개발과 CI를 위해 여러 개의 컨테이너를 하나의 프로젝트로서 다룰 수 있다. 컴포즈는 여러 개의 컨테이너의 옵션과 환경을 정의한 파일을 읽어 컨테이너를 순차적으로 생성하는 방식으로 동작함 각 컨테이너별로 의존성, 네트워크, 볼륨 함께 정의 가능 Mac 기준으로는 Docker Desktop을 다운로드하면 docker-compose도 같이 설치된다. 도커 컴포즈 기본 사용법 도커 컴포즈는 컨테이너의 설정이 정의된 YAML 파일을 읽어 도커 엔진을 통해 컨테이너 생성함 그렇기에 먼저 YAML 파일을 작성해야 함 위와 같은 구조이다. docker run -d --name mysql \ alicek106/composetest:mysql \ mysqld docker run -d -p 80:80 \ --link mysql:db --name web \ alicek106/composetest:web \ apachectl -DFOREGROU

[2년 전 오늘] 오 이걸 [내부링크]

2021.12.1. 2년 전 오늘 오 이걸 이걸 합격하네 조금 풀다 나왔는데 예상치 못했지만 어쨌든 합격하니까 기분 좋다~ 오랜만에 보는 합격이구만 2차는 kotlin이라서 할 수가 없네 나는 아직 Java로 밖에 안드로이드를 못 하니ㅠ 근데 어차피 4일에 딥러닝 특강이랑 겹쳐서 못 하긴 하는데 아 왜 우리 학교는 Java로 안드로이드를 가르쳐줄까 kotlin으로만 ... 류리상자 과거의 나 멋있었군

[Oracle] 인덱스 활용한 소트 연산, 그룹핑 연산 [내부링크]

소트 수행 과정 Sort는 기본적으로 PGA에 할당한 Sort Area에서 이뤄짐 Sort Area가 다 차면 디스크 Temp 테이블스페이스를 활용함 메모리 소트(Internal Sort) 전체 데이터 정렬 작업을 메모리 내에서 완료 디스크 소트(External Sort) 할당받은 Sort Area 내에서 정렬을 완료하지 못했을 때 디스크 공간까지 사용하는 경우 디스크 소트 수행 과정 Sort할 대상 집합을 SGA 버퍼캐시에서 읽고 일차적으로 PGA의 Sort Area에서 정렬 시도 Sort할 양이 많을 경우 정렬된 중간 집합을 Temp 테이블스페이스에 임시 세그먼트를 만들어 저장함 Temp 영역에 저장해 둔 중간 단계의 집합을 Sort Run 정렬된 최종 결과 집합을 얻기 위해 다시 Merge 해야 함 각 Sort Run 내에서는 이미 정렬된 상태여서 Merge 과정이 어렵지 않음 디스크 소트가 발생하면 SQL 수행 성능 나빠짐 또한 부분 범위 처리를 불가능하게 해서 OLTP 환경

[Oracle] DML 성능에 영향을 미치는 요소 [내부링크]

DML 성능에 영향을 미치는 요소 인덱스 무결성 제약 조건절 서브쿼리 Redo 로깅 Undo 로깅 Lock 커밋 인덱스와 DML 성능 테이블에 레코드를 입력하면 인덱스에도 입력해야 함 테이블은 Freelist(테이블마다 데이터 입력이 가능한 블록 목록)를 통해 입력할 블록을 할당받는다. 인덱스는 정렬된 자료구조이기에 수직적 탐색을 통해 입력할 블록을 찾아야 함 DELETE 할 때는 테이블에서 레코드 하나를 삭제하면 레코드를 보고 있던 인덱스 레코드를 모두 찾아서 삭제해 줘야 함 UPDATE 할 때는 변경된 컬럼을 참조하는 인덱스만 찾아서 변경해 주면 됨 대신 테이블에서 한 건 변경할 때마다 인덱스에는 두 개의 작업이 발생함 인덱스가 정렬된 자료구조이기에 컬럼 값을 변경하면 인덱스에서의 저장 위치도 달라지기에 삭제 후 삽입하는 방식으로 처리 create table MEMBER ( name varchar2(20), age NUMBER ); commit; DECLARE v_name VAR

[Oracle] Direct Path I/O [내부링크]

대용량 데이터를 처리할 때 버퍼캐시를 경유하는 I/O 메커니즘이 성능에 악영향을 끼칠 수 있음 오라클은 버퍼캐시를 경유하지 않고 곧바로 데이터 블록을 읽고 쓸 수 있는 Direct Path I/O 기능을 제공 Direct Path I/O 대량 데이터를 읽고 쓸 때는 버퍼캐시에서 블록을 찾을 가능성이 거의 없기에 프로그램 성능에 안 좋다. 또한 대량 블록을 건건이 디스크로부터 버퍼캐시에 적재하고서 읽어야 하는 부담도 큼 Full Scan 위주로 가끔 수행되는 대용량 프로그램은 버퍼캐시에 적재한 블록을 재사용할 가능성이 낮음 이런 데이터 블록들이 버퍼캐시를 점유하면 다른 프로그램에도 영향을 끼침 Direct Path I/O 작동하는 경우 병렬 쿼리로 FULL SCAN 수행할 때 병렬 DML을 수행할 때 Direct Path Insert를 수행할 때 Temp 세그먼트 블록들을 읽고 쓸 때 direct 옵션을 지정하고 export를 수행할 때 nocache 옵션을 지정한 LOB 컬럼을 읽을

[Oracle] 파티션 [내부링크]

테이블 파티션 파티셔닝은 테이블 또는 인덱스 데이터를 특정 컬럼(파티션 키) 값에 따라 별도 세그먼트로 나눠서 저장하는 것 일반적으로 시계열에 따라 Range 방식으로 분할하지만 다른 기준으로도 분할 가능 관리적 측면 파티션 단위 백업, 추가, 삭제, 변경으로 인한 가용성 향상 성능적 측면 파티션 단위 조회 및 DML, 경합 또는 부하 분산 Range 파티션 날짜 컬럼 기준으로 파티션 하는 방법이다. 주문 테이블을 만들 때 PARTITION BY RANGE(파티션 키)를 사용하면 파티션을 만들 수 있다. 데이터를 4개를 넣은 다음에 파티션을 확인하면 데이터가 들어가 있는 걸 확인할 수 있다. 각 파티션에 맞게 데이터가 들어가 있다. 파티션 조건 없이 조회하면 모든 파티션에 있는 데이터를 출력한다. ALL_PART_KEY_COLUMNS에서는 파티션 키값 확인 가능 ALL_TAB_PARTITION에서는 테이블의 파티션 명 확인 가능하다 Range 파티션 장점 조회시 검색 조건을 만족하는

[2023 마이 블로그 리포트] 데이터로 알아보는 블로그 속 숨은 직업 찾기! [내부링크]

이거 언제하나 했는데 역시 내 블로그 잘 되네 3년 연속 가장 많은 공감을 보내주신 류리님께 감사의 말씀 드립니다. 2023 마이 블로그 리포트 올해 블로거들의 직업을 공개합니다! 내 직업 확인하고, 2024년 행운도 뽑아보세요! https://mkt.naver.com/p1/2023myblogreport

신뢰할 수 있고 확장 가능하며 유지 보수하기 쉬운 애플리케이션 [내부링크]

신뢰성 하드웨어나 소프트웨어 결함, 인적 오류와 같은 역경에 직면해도 시스템은 올바르게 동작하는 것 무언가 잘못되더라도 지속적으로 올바르게 동작함 확장성 시스템의 데이터양, 트래픽 양, 복잡도가 증가하면서 이를 처리할 수 있는 적절한 방법이 있어야 함 시스템이 특정 방식으로 커지면 이에 대처하기 위한 선택은 무엇인가? 처리량 초당 처리할 수 있는 레코드 수나 일정 크기의 데이터 집합으로 작업을 수행할 때 걸리는 전체 시간 응답 시간 클라이언트가 요청을 보내고 응답을 받는 사이의 시간 클라이언트 관점에서 본 시간으로, 요청을 처리하는 실제 시간 외에도 네트워크 지연과 큐 지연도 포함 지연 시간 요청이 처리되길 기다리는 시간으로 서비스를 기다리면서 휴지 상태인 시간 응답 시간에서는 평균보다는 백분위를 사용하는 편이 좋다. 중앙값도 좋은 지표이다. 꼬리 지연 시간인 상위 백분위 응답 시간은 서비스의 사용자 경험에 직접 영향을 주기에 중요함 응답 시간이 100밀리초 증가하면 판매량이 1%

[논현] 한우 전문점 육덕등심 갔다 옴 [내부링크]

육덕등심 본점 서울특별시 강남구 학동로4길 49 이 블로그의 체크인 이 장소의 다른 글 회사 회식으로 육덕등심 갔다 왔다. 한우 오마카세 집이다. 외부가 이렇게 생겨서 안을 볼 수가 없다. 처음에 여기가 입구인 건가 싶었다. 여기가 입구 맞다. 굉장히 프라이빗하다. 내부도 깔끔하게 잘 되어있다. 프라이빗 룸으로 들어가니 위와 같이 세팅이 되어 있었다. 인당 18만 원짜리 프리미엄 코스 먹었다. 코스 요리는 위 사진과 같다. 먼저 웰컴 드링크로 솔의 눈 맛 나는 음료 준다. 참고로 위의 사진에서 보듯이 3가지 밑반찬을 주는데 다 맛있고 고기랑 잘 어울린다. 2번째로 한우사골계란찜 나왔다. 계란찜도 부드러웠고 위에 있는 소고기도 맛있었다. 왼쪽부터 한우 육회 타르타르, 한우 카르파치오, 한우 고기말이이다. 한우 육회 타르타트가 제일 맛있었고, 카르파치오는 처음 먹어보는 음식이었는데 맛있게 먹었다. 메인 메뉴를 제외하고 가장 맛있었던 메뉴를 꼽으라 하면 한우 육전이다. 지금까지 살면서 먹

[DB] View [내부링크]

View(뷰) 가상 테이블로 부르는 VIEW는 테이블을 조회하는 SELECT문의 결과를 저장한 객체를 의미한다. VIEW는 SELECT 쿼리를 저장하기에 데이터를 저장하는 것은 아니다. VIEW를 FROM절에 사용하면 테이블을 조회하는 효과를 얻을 수 있음 VIEW의 사용성 편리성 복잡한 여러 개의 쿼리를 VIEW로 만들어서 사용하면 코드의 복잡성을 줄일 수 있음 보안성 VIEW를 이용해서 테이블의 특정 컬럼만 보이게 할 수 있음 VIEW 생성과 사용 다음과 같이 NAME과 AGE column을 가지는 Member table이 있다. CREATE VIEW VW_MEMBER AS (쿼리) 명령어를 통해서 VIEW를 만들 수 있다. SELECT 쿼리로 VIEW를 조회하면 결과가 나오는 걸 볼 수 있다. SELECT * FROM ( SELECT NAME, AGE FROM MEMBER WHERE NAME = '1' ); FROM절에 VIEW를 쓰는 건 Subquery를 쓰는 거랑 같다. 즉

[Oracle] 인덱스 스캔 효율화, 액세스 조건 필터 조건, BETWEEN과 IN-LIST [내부링크]

인덱스 스캔 효율화 인덱스의 선행 컬럼이 조건절에 없으면 비효율이 발생할 수 있다. (A, B, C) 인덱스가 있을 때 선두 칼럼은 A, C의 선행컬럼은 B이다. 조건에 따라서 똑같은 데이터 개수를 가져오지만 스캔하는 인덱스 레코드 개수에서 큰 차이가 발생할 수 있음 ROWS Row Source Operation 10 TABLE ACCESS BY INDEX ROW ID BIG_TABLE (cr=7471 pr=1466 pw=0 ..) 10 INDEX RANGE SCAN BIG_TABLE_IDX (cr=7463 ...) 트레이스를 보게 되면 인덱스를 스캔해서 얻은 ROW는 10개인데 CR = 7463 부분에서 7463개의 블록을 읽었다는 걸 알 수 있다. 한 블록당 500개의 레코드를 담는다고 했을 때 10개를 얻기 위해서 약 370만 개의 레코드를 읽은 것이다. 액세스 조건과 필터 조건 인덱스를 스캔하는 단계에 처리하는 조건절은 액세스 조건과 필터 조건으로 나뉨 인덱스 액세스 조건은

[Oracle] 인덱스 설계 [내부링크]

가장 중요한 두 가지 선택 기준 인덱스 선두 컬럼을 조건절에 반드시 사용해야함 결합 인덱스를 구성할 때 첫 번째 기준은 조건절에 항상 사용하거나 자주 사용하는 컬럼을 선정 그렇게 선정한 컬럼 중 '=' 조건으로 자주 조회하는 컬럼을 앞쪽에 두어야 한다. 스캔 효율성 이외의 판단 기준 수행 빈도 업무상 중요도 클러스터링 팩터 데이터량 DML 부하 (기존 인덱스 개수, 초당 DML 발생량, 자주 갱신하는 컬럼 포함 여부 등) 저장 공간 인덱스 관리 비용 하나 뽑자면 수행빈도가 가장 중요하다. NL 조인할 때 어느 쪽에서 자주 액세스 되는지도 중요한 판단 기준임 데이터량도 인덱스 설계할 때 중요함 데이터가 적으면 굳이 인덱스 필요 없음 Full Scan으로도 충분히 빠르다. 소트 연산을 생략하기 위한 컬럼 추가 인덱스는 항상 정렬 상태를 유지하기에 ORDER BY, GROUP BY를 위한 소트 연산을 생략할 수 있게 해줌 조건절에 사용하지 않는 컬럼이더라도 소트 연산을 생략할 목적으로 인

[Oracle] NL 조인 [내부링크]

Nested Loop 조인 프로그래밍으로 따지면 이중 중첩 루프문을 사용하는 방식이다. NL 조인은 Outer(Driving)와 Inner 양쪽 테이블 모두 인덱스를 사용한다. Outer 테이블의 사이즈가 크지 않으면 인덱스를 사용하지 않을 수도 있음 Table Full Scan을 해도 한 번에 하기 때문에 Inner 쪽 테이블은 인덱스를 사용해야 한다. 인덱스를 사용하지 않으면 Outer Loop에서 읽은 건수 만큼 Table Full Scan을 반복하기 때문에 인덱스를 이용한 조인 방식이다. SELECT /* ordered use_nl(B) */ * FROM 사원 A, 고객 B USE_NL을 사용하면 NL 조인 사용 가능하다. ordered 힌트는 FROM 절에 기술한 순서대로 조인하라는 의미이다. 위 쿼리는 사원 테이블 (Driving) 기준으로 고객 테이블 (inner)과 NL 방식으로 조인하라는 의미 SELECT /*+ orderd use_nl(B) use_nl(C) use

[Oracle] Sort merge 조인 [내부링크]

Sort Merge 조인 조인하려는 컬럼에 인덱스가 없거나 대량 데이터 조인이어서 인덱스가 효과적이지 않을 때 NL 조인 대신 소트 머지 조인이나 해시 조인을 사용한다. 다만 해시 조인 등장 이후 소트 머지 조인은 예전만 못하다, 그래도 해시 조인 사용할 수 없을 때 유용하다. SGA와 PGA 공유 메모리 영역인 SGA에 캐시 된 데이터는 여러 프로세스가 공유할 수 있지만 동시에 액세스할 수 없음 동시에 액세스하려는 프로세스 간 액세스를 직렬화하기 위한 Lock 메커니즘인 Latch 존재 프로세스에 종속적인 고유 데이터를 저장하면서 자신만의 고유 메모리 영역인 PGA가 있다. PGA는 독립적인 메모리 공간이기에 래치 메커니즘이 불필요하다. 그렇기에 같은 양의 데이터를 읽어도 SGA 버퍼캐시에서 읽는 것보다 훨씬 빠름 소트 머지 조인 기본 메커니즘 소트 단계 : 양쪽 집합을 조인 컬럼 기준으로 정렬 머지 단계 : 정렬한 양쪽 집합을 서로 머지함 /*+ USE_MERGE() */ 위 힌

[Oracle] 해시 조인 [내부링크]

해시 조인 해시 조인은 조인 과정에서 인덱스를 사용하지 않음 두 단계로 진행된다 Build 단계 : 작은 쪽 테이블(Build Input)을 읽어 해시 테이블(해시 맵)을 생성함 Probe 단계 : 큰 쪽 테이블(Build Input)을 읽어 해시 테이블을 탐색하면서 조인 /*+ use_hash( ) */ 위 힌트를 사용하면 해시 조인 사용 가능하다. SELECT /*+ ordered use_hash(c) */ e.사원번호, e.사원명, e.입사일자, c.고객번호, c.고객명, c.전화번호, c.최종주문금액 FROM 사원 e, 고객 c WHERE c.관리사원번호 = e.사원번호 AND e.입사일자 >= '20231010' AND e.부서코드 = 'Z123' AND c.최종주문금액 >= 20000 SELECT 사원번호, 사원명, 입사일자 FROM 사원 WHERE 입사일자 >= '20231010' AND 부서코드 = 'Z123' Build 단계 : 위 조건에 해당하는 사원 데이터를 읽어

[Oracle] 조인 메서드 선택 기준 [내부링크]

조인 메서드 선택 기준 소량 데이터 조인할 때 : NL 조인 대량 데이터 조인할 때 : 해시 조인 대량 데이터 조인이지만 해시 조인으로 처리할 수 없을 때, 조인 조건식이 등치 조건이 아닐 때 : 소트 머지 조인 소량과 대량의 기준 단순히 데이터량의 많고 적음이 아님 NL 조인 기준으로 최적화를 했는데도 랜덤 액세스가 많아 만족할 만한 성능을 낼 수 없는 경우도 대량 데이터 조인이다. 수행 빈도가 매우 높은 쿼리에 대한 기준 최적화된 NL 조인과 해시 조인 성능이 같으면 NL 조인 해시 조인이 약간 더 빨라도 NL 조인 NL 조인보다 해시 조인이 매우 빠른 경우 해시 조인 즉 대량 데이터 조인이면 해시 조인 수행 빈도가 높은 소량 데이터 조인은 해시 조인이 약간 더 빠르더라도 NL 조인 그럼 왜 NL 조인을 가장 먼저 고려해야 함? NL 조인에 사용하는 인덱스는 일부러 지우지 않는 이상 영구적으로 유지하면서 다양한 쿼리를 위해 공유 및 재사용하는 자료 구조 반면에 해시 테이블은 단

[Oracle] 서브쿼리 조인, 인라인 뷰, 중첩된 서브쿼리, 스칼라 서브쿼리 [내부링크]

서브쿼리 정의 및 종류 서브쿼리는 하나의 SQL문 안에 괄호로 묶은 별도의 쿼리 블록을 말한다. 종류 설명 인라인 뷰 FROM 절에 사용한 서브쿼리 중첩된 서브쿼리 결과 집합을 한정하기 위해 WHERE 절에 사용한 서브쿼리 서브쿼리가 메인쿼리 컬럼을 참조하는 형태를 상관관계있는 서브쿼리라고 부름 스칼라 서브쿼리 한 레코드당 정확히 하나의 값을 반환하는 서브쿼리 주로 SELECT-LIST에서 사용하지만 몇 가지 예외사항을 제외하면 컬럼이 올 수 있는 대부분 위치에서 사용 가능 서브쿼리를 참조하는 메인 쿼리도 하나의 쿼리 블록이고, 옵티마이저는 쿼리 블록 단위로 최적화 수행함 SELECT c.고객번호, c.고객명 FROM 고객 c WHERE c.가입일시 >= trunc(add_months(sysdate, -1), 'mm') AND EXISTS ( SELECT 'X' FROM 거래 WHERE 거래번호 = c.고객번호 AND 거래일시 >= trunc(sysdate, 'mm') ) 위와 같이

[Elasticsearch] 서킷 브레이커 [내부링크]

서킷 브레이커 문제를 발생시킬 만한 무거운 작업의 수행을 사전 차단한다. 엘라스틱서치는 과도한 요청이 들어왔을 때 이를 최대한 처리하다 죽도록 하는 정책이 아니라 처음부터 과도한 요청은 거부하는 정책을 채택 서킷 브레이커로 요청이 거부되는 상황에 대한 처리 책임은 클라이언트에게 기본적으로 있음 종류 설명 필드 데이터 서킷 브레이커 fielddata가 메모리에 올라갈 때 얼마만큼의 메모리를 사용할지를 예상함, 기본값은 heap의 40%. indices.breaker.fielddata.limit으로 설정함 이 경곗값을 넘는 요청은 거부함 요청 서킷 브레이커 요청 하나의 데이터 구조가 메모리를 과다하게 사용하는지 계산함 기본 값은 heap의 60%다. indices.breaker.request.limit으로 설정함 실행 중 요청 서킷 브레이커 노드에 transport나 HTTP를 통해 들어오는 모든 요청의 길이를 기반으로 메모리 사용량을 계산함. 메모리 사용량 산정에 요청의 텍스트 원본

[Elasticsearch] 슬로우 로그 설정 [내부링크]

슬로우 로그 검색이나 색인 작업 시 너무 오랜 시간이 소요되면 별도로 로그를 남기도록 설정할 수 있음 장애 원인 추적하는데 큰 도움이 됨 기본적으로 어떤 설정도 되어있지 않기에 직접 설정해야 함 동적으로 변경할 수 있음 _settings api를 이용해서 설정할 수 있다. 위 API는 느린 검색 로그이다. 로그는 샤드 레벨에서 측정이 된다. 검색 요청 전체에 소요된 시간을 측정해 로깅하는 것이 아니다. 느린 검색 로그를 남기도록 설정하면 로그 디렉터리에 별도로 [클러스터 이름]_index_search_slowlog.log 파일이 생긴다. 느린 색인 로그 PUT _settings { "index.indexing.slowlog" : { "source" : "1000", "threshold" : { "index.warn" : "10s", "index.info" : "5s", "index.debug" : "2s", "index.trace" : "500ms" } } } _setting의 in

[Elasticsearch] 장애 발생 시 대응, 자주 발생하는 장애 유형 [내부링크]

빠른 기본 상황 파악 먼저 cerebro, kibana 모니터링 도구에서 지표 확인 모든 노드가 클러스터에 붙어 있는지, 미할당 샤드가 생겼는지 확인하는 게 중요함 GET _cat/health를 통해 red, yellow 상태 돌입 여부, 미할당 샤드 수, 클러스터에 있는 노드 수 확인 GET _cat/nodes를 통해 마스터 노드 확인, 평균 부하, 힙 사용량, 메모리 사용량, CPU 사용량 확인 GET _nodes/stats의 fs 항목에서 디스크 사용량 확인 샤드 할당 비활성화 _cat/health나 _cat/nodes의 수행 결과, 클러스터에 있어야 할 노드 수보다 적게 노드가 있으면 바로 샤드 할당이 끄는 것이 중요함 Node 하나가 Cluster에서 빠지면 그 노드가 들고 있던 샤드의 수만큼 replica 샤드의 수도 줄어든다. 그러면 elasticsearch는 number_of_replicas를 맞추기 위해 새 복제본을 할당하고 복사하는 작업 수행 장애 상황인데 이 작업

[Elasticsearch] 댕글링 인덱스 [내부링크]

댕글링 인덱스 dangling -> 매달려있는 노드가 클러스터에 합류할 때 노드의 로컬 데이터 디렉터리에는 샤드 데이터가 있는데 클러스터의 메타데이터에는 해당 인덱스와 샤드가 없는 경우를 댕글링 인덱스라고 한다. 보통 특정 노드가 클러스터에서 제외된 후 클러스터에서 인덱스를 삭제하고 다시 합류되는 경우에 발생 이런 경우 더 이상 필요 없는 데이터가 확인이 되면 로컬 데이터 디렉터리의 댕글링 인덱스를 삭제하면 된다. 심각한 경우는 마스터 노드에 문제가 발생해서 메타데이터가 깨지고 각 노드의 로컬 데이터와 메타데이터가 맞지 않을 때 댕글링 인덱스가 생기는 경우이다. index tombstones 노드 한 대가 롤링 스타트 하는 동안 인덱스가 삭제되었을 경우 댕글링 인덱스가 발생할 수 있다. 이런 경우 매 롤링 스타트마다 댕글링 인덱스를 확인하고 삭제하는 번거로운 작업을 해야 됨 엘라스틱 서치에서는 이런 상황 방지를 위해서 인덱스를 삭제할 때마다 인덱스 묘비를 세운다. 인덱스 묘비는 특정

[Elasticsearch] 샤드 복구 [내부링크]

샤드 복구 기본 샤드의 크기와 개수는 샤드 복구 속도에 큰 영향을 미치기에 너무 큰 샤드를 만들지 않도록 주의해서 미리 조정해야 함 샤드 복구 진행 상황 확인 인덱스 복구 API를 호출해서 샤드 복구의 진행 상황을 확인할 수 있다. GET 인덱스이름/_recovery?human GET _recovery?human stage 필드를 보면 샤드 복구가 어떤 단계까지 왔는지 알 수 있음 단계 설명 INIT 복구 작업이 아직 시작되지 않음 INDEX 루씬 파일 복구하는 단계 VERIFY_INDEX 색인을 검증하는 단계 TRANSLOG translog 작업 재처리하는 단계 FINALIZE translog 작업이 끝난 이후 최종 작업을 수행하는 단계 DONE 복구가 완료된 단계 index의 밑의 size, files, translog, recovered를 보면 복구가 얼마나 진행됐는지 알 수 있음 샤드 복구 속도 조정 위 설정으로 노드 하나가 네트워크를 통해 동시에 수행하는 샤드 복구 작업의

2023년 SK TECH SUMMIT 후기 [내부링크]

2023년 11월 16일 ~ 17일 SK TECH SUMMIT이 열려서 16일에 참가하러 갔다. 작년에는 그랜드 워커힐에서 열렸는데 이번에는 코엑스에서 열렸다. 글쓰기 전에 참고할만 내용들을 먼저 적는다. 첫째 날 기준이니 둘째 날은 또 다를 수 있다. 코엑스 규모에 비해 사람들이 훨씬 많아서 인기 많은 세션은 줄 서서 들어가야 된다. 그렇기에 좀만 늦게 가면 듣고 싶은 세션 못 듣는다. 애초에 공간이 작아서 어느 정도 사람이 들어가면 스태프분들이 인원 조정을 해서 못 들어간다. 사람이 많아서 그런지 데이터가 초반에 잘 안 터졌다. 나는 SKT 요금제에 갤럭시 S23 plus였는데 잘 안 터졌다. 코엑스 와이파이도 잘 안됐다. 나는 봉은사역에서 내려서 7번 출구로 나갔다. 코엑스 쪽으로 쭉 들어가서 컨벤션 센터 로비 1층으로 올라가면 된다. 참고로 혹시 KOSIGN 2023이 본다면 잘못 간 것이다. 이쪽이 아니다. 에스컬레이터를 타고 올라왔을 때 No Brand 버거쪽으로 가야 된

[Elasticsearch] 색인 과정에서의 낙관적 동시성 제어 [내부링크]

낙관적 동시성 제어 인덱스에 색인 과정 시 프라이머리 샤드 변경 내용은 레플리카 샤드로 복제가 된다. 이때 분산 클러스터 특성상 여러 요청이 들어오게 되면 어떤 요청이 먼저 복제본 샤드로 들어갈지는 보장할 수 없다. 엘라스틱 서치에서는 이러한 상황에서 값이 역전되는 상황을 막기 위해서 _seq_no을 사용한다. _seq_no _seq_no은 각 프라이머리 샤드마다 들고 있는 시퀀스 숫자 값이고 매 작업마다 1씩 증가한다. _seq_no 값을 이용해서 역전되는 상황을 막는다. 시간 작업 _seq_no 오후 11시 40분 인덱스에 "name" : "ryool" 색인 0 오후 11시 43분 12초 인덱스에 "name" : "ryool1"으로 색인 1 오후 11시 43분 13초 인덱스에 "name" : "ryool2"으로 색인 2 위와 같은 상황에서 최종 결과는 name : ryool2가 되어야 된다. 만약 동시성 제어를 하지 않는다면 13초 작업이 먼저 들어오고 12초 작업이 나중에 들어

[DB] 데이터베이스 모델링과 설계 [내부링크]

데이터베이스 설계 과정 3가지 주요 단계 요구사항 분석 어느 데이터를 저장할지, 각 아이템이 어떻게 관계되는지 데이터베이스에 필요한 사항 결정 및 기록 개념적 설계 데이터베이스 요구사항을 파악한 후에는 데이터베이스 설계에 대한 공식 설명으로 다듬는다. 논리적 설계 데이터베이스 설계를 기존의 데이터베이스 관리 시스템에 맞춘다. 관계형 엔티티 모델 데이터베이스는 객체인 엔티티와 엔티티 간의 연결 정보인 관계를 저장함 대학교 데이터베이스에는 학생, 수업, 등록자 수에 대한 정보를 저장하는데 여기서 학생, 수업이 엔티티 재고와 판매 데이터베이스에는 제품, 고객, 매출 정보를 저장하는데 제품과 고객이 엔티티이고 제품과 고객의 관계가 판매이다. 엔티티 표현 방법 판매 데이터베이스 예시 Entity RelationShip (ER) 모델을 사용해서 엔티티를 표현한다. 엔티티 집합은 엔티티 이름이 담긴 직사각형으로 표현된다. 속성 일반적으로 엔티티의 특징이나 속성을 저장하기 위해 데이터베이스를 사용

[Spring] Springboot DispatcherServlet 동작 과정 [내부링크]

디스패처 서블릿 Http 프로토콜로 들어오는 모든 요청을 가장 먼저 받아서 적합한 컨트롤러에게 위임해 주는 Front Controller Front Controller는 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리하는 Controller 디스패처 서블릿을 통해 요청을 처리할 컨트롤러를 찾아서 위임하고, 그 결과를 받아온다. 디스패처 서블릿 동작 과정 DispatcherServlet의 계층 구조는 다음과 같다. HttpServlet은 HttpServlet을 구현하기 위한 추상 클래스 특정 Http 메서드를 지원하기 위해서는 do로 시작하는 메서드를 오버라이딩 해야 함 doPatch는 지원하지 않는다. HttpServlet을 Spring이 구현한 추상 클래스 스프링이 모든 유형의 서블릿 구현을 위해 정의한 공통 클래스 FramworkServlet은 스프링 웹 프레임워크의 기반이 되는 서블릿 do로 시작하는 메서드 오버라이딩하고 있고, do로 시작하

[Redis] Redis 운영과 관리, RDB, AOF, 장애상황 [내부링크]

Redis와 Memcached Memcached는 캐시 솔루션이고 Memcached에 저장소의 개념이 추가된 것이 Redis 기능 Redis Memcached 속도 초당 100000QPS 이상 초당 100,000 QPS 이상 자료구조 key-value List Hash Set Sorted Set 등 지원 Key-value만 지원 안정성 특성 잘못 이해할 경우 프로세스 장애 발생 장애 거의 없음 응답 속도의 균일성 Memcached에 비해서 균일성이 떨어질 수 있음 전체적으로 균일함 응답속도의 균일성을 보면 대규모 트래픽으로 많은 데이터가 업데이트되면 Redis는 Memcached에 비해 속도가 균일하지 않다. 이것은 메모리 할당 구조의 차이 때문에 발생한다. Redis는 jemalloc을 사용해서 매번 malloc과 free를 통해서 메모리 할당이 이루어진다. 반면 Memcached는 slab 할당자를 이용해서 내부적으로 메모리 할당을 다시 하지 않고 관리한다. 이런 차이로 인해서

[Redis] 복제 [내부링크]

Redis의 주요 특징 중 하나가 DBMS에서 제공하는 것과 유사한 복제 기능이 있음 복제 기능은 장애 발생 시 빠른 서버 교체나 장비 교체 등에 사용 가능 Redis 복제 모델 Redis는 마스터/슬레이브 형태의 복제 모델 제공함 이를 통해서 마스터의 변경 사항이 슬레이브로 전파됨 한 대의 슬레이브는 오직 하나의 마스터만 가진다. 위 그림처럼 슬레이브에서 마스터로 접속함 이 점을 이용해서 슬레이브가 다른 마스터로도 동작할 수 있음 Mac 기준 Redis Port 여러 개로 띄우기 기존 Redis.conf를 복사한 redis2.conf를 만들어줌 맥북 기준 /opt/homebrew/etc에 기존 redis.conf 파일 위치 이걸 redis2.conf로 복사 vi redis2.conf 해서 Port 6380으로 해줌 2. redis-server 명령어 사용 그다음 redis-server /opt/homebrew/etc/redis2.conf 명령어 실행 정상 실행되면 위와 같이 뜸 3

[Redis] HA와 Sentinel [내부링크]

High Availability Redis는 HA를 위해서 기본적으로 master/slave 형태로 서비스한다. 이 경우 마스터 장애 발생 시 slave가 마스터 대신 서비스하도록 변경해 주는 기능이 필요함 http://redisgate.kr/redis/introduction/redis_release7.php 참고로 현재는 redis 7.x까지 나옴 너무 먼 과거 버전인 Redis 2.6 버전부터는 slave-read-only가 yes로 설정되어 있어서 쓰기 요청은 실패하기에 slave 전환 기능은 필요함 장애 발생 후 작업 마스터의 장애를 정확히 판별함 슬레이브를 마스터로 승격 해당 작업 내용을 클라이언트에게 통지 Redis는 Sentinel 데몬을 이용해서 1, 2, 3 작업을 처리한다. 다만 3번에 대해서는 sentinel에서는 이미 장애가 발생한 master에 접속된 client를 알 수 없기에 해당 알림을 원하는 client는 pub/sub으로 sentinel에 등록해야 함

[Elasticsearch] 인덱스 생명 주기 관리(Index Lifecycle Management) [내부링크]

ILM 인덱스를 hot-warm-cold-frozen-delete 페이즈로 구분해서 지정한 기간이 지나면 인덱스를 다음 페이즈로 전환시키고 지정한 작업을 수행하도록 하는 기능 인덱스와 데이터 스트림을 매우 편하게 관리할 수 있게 해준다. ILM을 통해서 hot 페이즈에서는 매일 자동으로 roll-over 수행하고 거기에 더해 샤드 사이즈가 8GB 크기가 넘어가면 날짜가 넘어가지 않아도 롤오버를 수행하도록 한다. 노드 phase 컨셉 컨셉 설명 HOT 현재 업데이트가 수행되고 있고 읽기 작업도 가장 많은 상태 WARM 인덱스에 더 이상 업데이트가 수행되지는 않지만 읽기 작업은 들어오는 상태 COLD 인덱스에 더 이상 업데이트가 수행되지 않고 읽기 작업도 가끔씩만 들어오는 상태, 검색은 되어야 하나 속도가 느려도 괜찮은 상황 FROZEN 인덱스에 더 이상 업데이트 안 되고 읽기 작업도 거의 없는 상태 검색은 되어야 하지만 속도가 상당히 느려도 괜찮은 상황 DELETE 인덱스가 더 이상

[Spring] SpringBootApplication run 메서드 실행 과정 1 ~ 10단계 [내부링크]

SpringBootApplication run SpringBootApplication Class의 run 메서드는 위와 같이 구성이 되어 있고 크게 13단계를 가지고 있다. 1단계 StopWatch로 실행 시간 측정 시작 System.nanoTime()을 통해서 시간 측정을 시작한다. timeTakenToStartUp에 전체 실행 시간을 저장하고 이걸 newStarupInfoLogger에 저장한다. 위에서. logStarted 메서드를 따라가보면 메시지를 찍는 부분을 볼 수 있다. StarupInfoLogger에서 start 메시지를 만든다. 해당 부분에 debug을 찍고 메시지를 확인해 보면 만들어지는 걸 볼 수 있고 실제 로그랑 똑같이 찍히는 것도 볼 수 있다. 2단계 BootStrapContext 생성 BootStrapContext를 생성하는 createBootStrapContext 단계이다. BootStrapContext는 애플리케이션 컨텍스트가 준비될 때까지 환경 변수들을

[Spring] SpringBootApplication 실행과정 11 ~ 13단계 [내부링크]

11단계 Context Refresh 후처리 단계 애플리케이션 컨텍스트의 refresh 단계가 마무리되고 후처리를 하는 단계 현재는 메서드가 비어있는 상태이다. 12단계 실행 시간 출력 및 리스너 started 처리 StartUpInfoLogger를 통해서 걸린 시간을 로그로 남기고 listeners.started로 리스너들을 started 처리한다. 13단계 Runners 실행 마지막으로 Runner를 호출하는 단계이다. 애플리케이션이 실행된 이후에 초기화하는 작업이 필요할 때 사용할 수 있는 방법이 Runner를 등록하는 방법이다. Runner에는 2가지가 존재한다. String을 파라미터로 넘기는 경우에는 CommandLineRunner 다른 타입을 파라미터로 넘기는 경우에는 ApplicationRunner를 사용할 수 있다. 스프링 부트 기본 상태에서 실행을 하게 되면 구현한 Runner가 없기 때문에 Runner를 실행하지는 않는다. CommandLineRunner나 App

[서평] 러닝 MySQL (MySQL 운영 종합 가이드, 데이터베이스 설계부터 비용 최적화까지) [내부링크]

안녕하세요 이번에 한빛미디어에서 MySQL에 대해서 배울 수 있는 새로운 책이 나와서 서평을 작성해 봅니다. 표지는 역시 한빛미디어 특유의 하얀색 배경에 생물이 그려져 있네요 뒷면에는 책의 내용이 요약되어 있고 서평이 작성이 되어있습니다. 책을 보기 전에 추천사를 한 번씩 보는 편입니다. 추천사를 읽으면 대략적으로 책의 내용을 알 수 있어서 봅니다. 추천사의 내용이 굉장히 좋네요 이 책의 대상 독자는 MySQL을 처음 사용하는 사람과 데이터베이스로 MySQL을 시작하려는 사람입니다. 책의 두께만 보고 처음 DB에 대해서 공부하려는 사람에게 적합할까 싶었는데 책의 내용을 보니 처음 공부를 해도 적합하다고 생각이 들었습니다. 책의 목차를 보시면 아시겠지만 정말 처음부터 다 알려줍니다. 설치부터 해서 쿼리, 데이터베이스 설계, 고급 쿼리 트랜잭션 및 잠금 그리고 운영환경에서 알면 좋은 것들도 다 알려줍니다. 책에서 MySQL 설치 방법을 하나하나 다 알려줍니다. 각 운영체제별로 어떻게 설

화담숲 [내부링크]

4시간 정도 걸려서 예약을 한 화담숲 모노레일은 예약하지 못해서 그냥 걷는(?) 코스로 갔다. 모노레일 타고 정상으로 가서 내려오는 게 안 힘들고 좋다. 물론 중간중간에 모노레일 예매할 수 있다. 10월 28일 토요일에 베스트 드라이버인 오기사님과 함께 화담숲 갔다. 곤지암 리조트 안에 화닾숨이 위치해 있어서 곤지암 리조트로 가야 된다. 주차 구역은 잘 되어있다. 주차 공간은 크고 주차하기 힘들면 어쩌나 했는데 황제주차 했다~ 리프트 타고도 갈 수 있는데 줄이 엄청 길어서 걸어서 입구까지 갔다 한 5분 걸으면 된다. 화담숲 가는 길도 잘 되어있다. 화담숲 입구 쪽 토요일에 갔는데 사람들 꽤 있었다. 입구 앞에 편의점도 있어서 간단한 게 뭐 사 먹고 들어갔다. 참고로 음식물 반입 금지이나.. 들어가 보면 사람들 죄다 먹고 있다 ㅋㅎ 들어가면 바로 포토존 있다. 여기서 사람들 많이 찍는다. LG에서 만들었다고 한다. 좀 들어가면 바로 민물고기생태관 있는데 본격적으로 구경하기 전에 보기

[Spring] SpringApplication의 refreshContext [내부링크]

refreshContext springboot의 run 메서드에서 동작하는 기능 중 하나인 refreshContext이다. 동작 과정 먼저 shutdownhook을 등록을 해준다 shutdownhook은 프로그램의 종료를 감지해 프로그램 종료 시에 후처리 작업을 진행하는 기술 프로세스가 갑자기 죽어버리면 연결 종료, 자원 반납 등의 처리를 못 하는데 shutdownhook을 사용해서 프로그램이 종료되어도 별도의 쓰레드가 올바른 프로그램 종료를 위한 작업 처리할 수 있게 한다. 스프링은 DisposableBean 인터페이스나 @PreDestroy 또는 @Bean에 소멸자 메서드를 지정해서 소멸자를 구현할 수 있는데 SpringApplication이 여기에 shutdownHook을 추가해서 소멸자 메서드를 처리할 수 있게 한다. 그리고 applicationContext를 refresh 해준다. refresh는 각 applicationContext에 맞게 구현이 되어 있다. 기본으로 하게

[Oracle] 비관적, 낙관적 동시성 제어 [내부링크]

비관적 동시성 제어 (Pessimistic Concurrency Control) 사용자들이 같은 데이터를 동시에 수정할 것이라고 가정함 따라서 한 사용자가 데이터를 읽는 시점에 Lock을 걸고 조회 또는 갱신 처리가 완료될 때까지 Lock을 유지 Locking은 첫 번째 사용자가 트랜잭션을 완료하기 전까지 다른 사용자들이 그 데이터를 수정할 수 없게 만들기에 비관적 동시성 제어를 잘못 사용하면 동시성을 저해 받게 됨 잘 사용하면 약이 됨 비관적 동시성 제어 구현 SELECT 포인트, 방문횟수, 방문일시, 구매실적 FROM 고객 WHRER 고객번호 = :cust_num FOR UPDATE; -- 여기서 무언가 발생하면 문제 발생 UPDATE 고객 SET 적립포인트 = :적립포인트 WHERE 고객번호 = :cust_num SELECT 문 이후와 UPDATE 문 이전에 다른 트랜잭션이 같은 고객 레코들을 변경하면 문제가 발생할 수 있다. 이를 위해서 FOR UPDATE를 사용해서 해당 고

[BOJ] 11724번 연결 요소의 개수 구하기 Java [내부링크]

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class Main { static ArrayList<Integer>[] edges; static boolean[] visited; public static void main(String[] args) throws IOException { final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer stringTokenizer = new StringTokenizer(bf.readLine()); int N = Integer.valueOf(stringTokenizer.nextToken());

[백준] 2023번 신기한 소수 구하기 Java [내부링크]

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static int N; public static void main(String[] args) throws IOException { final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); final StringTokenizer st = new StringTokenizer(bf.readLine()); N = Integer.valueOf(st.nextToken()); dfs(2, 1); dfs(3, 1); dfs(5, 1); dfs(7, 1); } static void dfs(int startNumber, int numberLength) {

[Spring] ApplicationContext [내부링크]

ApplicationContext ApplicationContext는 빈들의 생성과 의존성 주입 등의 역할을 하는 DI(Dependeny Injection Context) 의존성 관계는 다음과 같다. 최상위인 BeanFactory는 1개의 bean을 찾기 위한 메서드들을 가지고 있음 여러 개의 Bean 중에서 하나를 찾을 수 있는 이유 BeanFactory는 1개의 bean을 찾는 메서드들을 가지고 있지만 AppilcationContext가 상속받는 ListableBeanFactory와 HierarchicalBeanFactory를 통해서 동일한 타입의 빈이 여러 개 존재할 때 List에서 Bean을 찾아서 주입해 준다. HierarchicalBeanFactory는 여러 BeanFactory들 간의 계층 관계를 설정하기 위한 퍼블릭 인터페이스를 가진다. @Autowired ApplicationContext는 AutowireCapableBeanFactory를 합성 관계로 가지고 있기에

[Spring] @SpringBootApplication [내부링크]

@SpringBootApplication Springboot 프로젝트를 생성하면 @SpringBootApplication이 붙은 클래스가 자동 생성됨 @SpringBootApplication 애노테이션을 보면 위와 같다. 메서드 설명 exclude 특정 클래스를 자동 설정에서 제외한다. excludeName 특정 클래스의 이름으로 자동 설정에서 제외함 scanBasePackages 컴포넌트 스캔을 진행할 베이스 패키지 설정함 scanBasePackagesClaases 컴포넌트 스캔을 진행할 베이스 클래스 설정함 nameGenerator 빈 이름 생성을 담당할 클래스를 설정함 proxyBeanMethods @Bean 메서드로 프록시 방식으로 처리하도록 함 proxyBeanMethods @Bean으로 빈을 등록하는 메서드에 프록시 패턴을 적용할 것인지를 결정한다. 기본 값은 true로 @Bean 메서드에 프록시가 기본적으로 적용된다. @Bean 메서드에 프록시가 필요한 이유는 해당 메서

[Spring] SpringBootApplication 생성과 초기화 [내부링크]

SpringBootApplication SpringApplication Class의 run 메서드는 ConfigurableApplicationContext를 반환하고 있음 SpringApplication Class가 어떠한 부모 클래스나 인터페이스를 가지고 있지 않기에 run 메서드 내부에서 ApplicationContext를 만들어서 실행하고 반환하는 걸 알 수 있음 SpringBootApplication 초기화 및 실행 과정 SpringApplication의 생성자는 위와 같다. primarySources는 메인 클래스이고 Assert.notNull을 통해서 null이면 에러 반환하게 되어있다. 메인 클래스가 null인지 검사한 후에는 5가지 단계를 거친다. 1단계 클래스 패스로부터 애플리케이션 타입을 추론 WebApplicationType.deduceFromClassPath()로 애플리케이션 타입을 추론한다. SpringBoot는 애플리케이션 실행 초기에 현재 애플리케이션 타입

[Spring] @Aspect AOP [내부링크]

@Aspect 스프링이 제공하는 @Aspect로 포인트컷과 어드바이스로 구성된 어드바이저 생성 기능 지원 @Aspect 애노테이션 기반 프록시를 적용할 때 필요함 @Compont @Aspect가 있어도 스프링 빈으로 등록해줘야 함 @Around 포인트컷 표현식을 적음 @Around의 메서드가 어드바이스(Advice)가 됨 ProceedingJoinPoint joinpoint Advice의 MethodInvocation과 유사함 내부에 실제 호출 대상, 전달 인자, 어떤 객체와 어떤 메서드가 호출되었는지 정보 포함 proceed 실제 호출 대상인 target을 호출한다. 테스트에 사용할 Hello 클래스를 만들고 테스트를 실행해 보면 정상적으로 어드바이스가 적용된 걸 볼 수 있다. @Aspect 설명 스프링이 제공하는 자동 프록시 생성기인 AnnotationAwareAspectJAutoProxyCreator이다. 자동 프록시 생성기가 @Aspect가 붙은 Class를 찾아서 Advis

[Spring] AOP, Pointcut, @Around [내부링크]

AOP 적용 방식 컴파일 시점 클래스 로딩 시점 런타임 시점 (프록시) 컴파일 시점 (Weaving) .java 소스 코드를 컴파일러를 사용해서. class를 만드는 시점에 부가 기능 로직 추가 가능 AspectJ 컴파일러는 Aspect를 확인해서 해당 클래스가 적용 대상인지 먼저 확인하고, 적용 대상인 경우에 부가 기능 로직을 적용함 원본 로직에 부가 기능 로직이 추가되는 것을 Weaving이라고 함 단점 특별한 컴파일러도 필요하고 복잡함 클래스 로딩 시점 자바를 실행하면 자바 언어는 .class 파일을 JVM 내부의 클래스 로더에 보관함 이때 주간에서 .class 파일을 조작해서 JVM에 올릴 수 임ㅅ음 런타임 시점 런타임 시점은 컴파일 타임 끝나고, 클래스 로더에 클래스도 다 올라간 상태에서 자바가 실행이 된 다음 상태를 의미 main 메서드가 실행된 다음 자바 언어가 제공하는 범위에서 부가 기능 적용해야 함 런타임 시점에서는 실제 대상 코드는 그대로 유지되고, 대신에 프록시를

[Spring] Pointcut execution [내부링크]

예제 코드 먼저 메서드용 / 클래스용 애노테이션을 만들어준다. 테스트에서 사용할 클래스도 생성 테스트 코드를 만들어서 AopServiceImpl 메서드의 정보를 출력해 보면 위와 같이 나온다. execution은 위 메서드 정보를 매칭해서 포인트컷 대상을 찾아낸다. execution execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?) execution(접근제어자? 반환타입 선언타입?메서드이름(파라미터) 예외?) execution을 통해서 메서드 실행 조인포인트를 매칭함 ?로 표시되어 있는 건 생략 가능하다. 패턴을 지정할 때 *와 같은 패턴 사용 가능 setExpression에 위에서 얻은 메서드 정보를 적어주고 테스트 코드를 돌려보면 정상 작동한다. 흠 근데 왜 matches에 MemberService.class를 넣으면 통과하는

[Spring] 로그 출력 AOP, 재시도 AOP [내부링크]

애노테이션 활용 로그 출력 AOP @LogTrace 애노테이션이 붙은 곳에 AOP를 적용하기 위해서 애노테이션 생성 @Before를 사용하고 @annotation이 붙은 곳에 적용할 수 있게 포인트 컷 적용 테스트 사용할 class를 생성하고 메서드에 @LogTrace 애노테이션을 붙여준다. 테스트 코드를 돌려보면 ProducerService와 ProductRepository에 AOP가 적용이 된 걸 볼 수 있다. Retry AOP 적용 Retry에서 사용할 애노테이션을 만든다. default를 5로 해서 기본으로 5번의 리트라이를 하게 만든다. proceed()를 사용해야 되기에 @Around를 사용해 주고 pointCut 부분에 annotation을 달아준다. 이때 원래는 패키지명부터 다 작성해도 되지만 annotation 이름만 Pointcut 부분에 쓰고 메서드에서 Retry를 파라미터로 받으면 된다. 위 코드에서는 예외 / 정상인 상황에 대해서 일단 다 적용이 되는 코드다.

[Spring] AOP 주의 사항 내부 호출 [내부링크]

프록시 내부 호출 문제 Spring은 프록시 방식의 AOP 사용 AOP를 적용하려면 항상 프록시를 통해서 대상 객체를 호출해야 함 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, Advice도 호출되지 않음 프록시 객체 주입 AOP를 적용하면 스프링은 대상 객체 대신 Proxy를 스프링 빈으로 등록함 그렇기에 의존관계 (DI) 주입 시에 항상 프록시 객체를 주입함 하지만 대상 객체 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제 발생함 예제 코드 AOP를 적용할 LogAspect를 만들어준다. AOP를 적용할 Class를 만들어주고 메서드를 2개 만들어준다. 이때 external에서 internal를 호출하게 만들어준다. 테스트 코드를 만들고 각각 external, internal을 호출해 본다. 먼저 외부 메서드만 호출해서 로그를 보면 external에만 AOP가 적용된 걸 볼 수 있다. 위의 사항을 그림으로 나타

[Oracle] 테이블 랜덤 액세스 [내부링크]

SQL 튜닝에서는 랜덤 I/O가 중요하다. 질문 파티션 Pruning은 조건절에 해당하는 파티션만 읽는 기능이라고 알고 있다. 인덱스를 이용해도 조건절에 해당하는 데이터만 골라서 읽는데, 파티션 Prunning이 왜 필요한지 궁금하다. 관리적 측면을 제외하고 성능적 측면에서 굳이 파티션이 필요할까? 인덱스로 검색해도 빠른데 왜 굳이 파티셔닝을 할까? 인덱스로 검색하는 데 왜 느릴까? 인덱스 ROWID는 물리적 주소? 논리적 주소? SQL이 참조하는 컬럼을 인덱스가 모두 포함하는 경우가 아니면, 인덱스를 스캔 한 후에 반드시 테이블을 액세스한다. TABLE ACCESS BY INDEX ROWID라고 표시된 부분 인덱스를 스캔하는 이유는 검색 조건을 만족하는 소량의 데이터를 인덱스에서 빨리 찾고 거기서 테이블 레코드를 찾아가기 위한 주소값인 ROW를 얻음 ROWID는 논리적 주소다. 디스크 상에서 테이블 레코드를 찾아가기 위한 위치 정보를 담는다. 메인 메모리 DB와 비교 메인 메모리

[Oracle] 트랜잭션, 트랜잭션 Isolation Level [내부링크]

동시성 제어 오라클에서 동시성 제어란 동시에 실행되는 트랜잭션 수를 최대화하면서도 입력, 수정, 삭제, 검색 시 데이터의 무결성이 유지될 수 있도록 노력하는 것이다. 여러 개의 트랜잭션이 동시에 수행될 때, DB 애플리케이션은 이들 트랜잭션이 서로 간섭을 일으키는 현상을 최소화하고 데이터의 일관성과 무결성이 보장되도록 개발되어야 한다. 트랜잭션 (All or Nothing) 트랜잭션이란 여러 개의 수정 작업이 하나의 작업처럼 전부 처리되거나 아예 전부 처리가 안 되도록 하는 것의 최소 단위이다. 트랜잭션 특징 ACID라고 부른다. Atomicity, Consistency, Isolation, Durability 4단어의 앞 글자를 따서 만든 단어이다 먼저 원자성은 더 이상 분해가 불가능한 업무의 최소단위를 의미한다. 일관성은 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환한다. 즉 트랜잭션 실행의 결과로 데이터베이스 상태가 모순되지 않는다. 격리

JDK 동적 프록시 [내부링크]

JDK 동적 프록시 동적 프록시 기술을 사용하면 직접 프록시 클래스를 생성하지 않아도 된다. 동적 프록시가 객체를 동적으로 런타임에 대신 만들어준다. 또한 동적 프록시에 원하는 실행 로직을 지정할 수 있다. JDK 동적 프록시는 인터페이스를 기반으로 프록시를 동적으로 만들어준다. 인터페이스가 필수 JDK 동적 프록시 예제 JDK 동적 프록시를 위해서 Interface를 만들어준다. Interface를 구현한 2개의 클래스를 생성함 JDK 동적 프록시를 사용하기 위해서는 java.lan.reflect에 있는 InvocationHandler를 구현하면 된다. InvocationHandler의 invoke 메서드는 3개의 파라미터를 제공한다. Object proxy는 프록시 자신 Method method는 호출한 메서드 Object[] args는 메서드를 호출할 때 전달한 인수 실제 사용은 위와 같이 한다. 빨간색 네모 동적 프록시에 적용할 핸들러 로직 Interface로 선언을 하고 i

CGLIB [내부링크]

CGLIB (Code Generator Library) 바이트 코드를 조작해서 동적으로 클래스를 생성하는 라이브러리 인터페이스가 없어도 구체 클래스만 가지고 동적 프록시를 만들어낼 수 있음 스프링을 사용하면 외부 라이브러리 추가 없이 사용 가능 CGLIB 적용을 위해서 인터페이스와 인터페이스를 구현한 서비스 클래스를 만든다. 인터페이스 없이 구체 클래스만 있는 서비스 클래스도 만든다. CGLIB를 사용하기 위해서는 MethodInterceptor를 구현해서 사용하면 된다. 패키지 위치가 중요하다. Object var1 CGLIB가 적용된 객체 Method var2 호출된 메서드 Object[] var3 메서드를 호출하면서 전달된 인수 MethodProxy var4 메서드 호출에 사용 TimeMethodInterceptor는 위와 같이 구현한다. 먼저 메서드를 실행할 target를 생성자로 받을 수 있게 만든다. 프록시가 호출할 실제 대상 그다음 methodProxy의 invoke를

[Spring] ProxyFactory [내부링크]

ProxyFactory 스프링은 동적 프록시를 통합해서 편리하게 만들어주는 ProxyFactory를 제공 ProxyFactory를 통해서 인터페이스가 있으면 JDK 동적 프록시 사용, 인터페이스 없고 구체 클래스만 있다면 CGLIB 사용할 수 있게 할 수 있다. 의존 관계 JDK 동적 프록시와 CGLIB를 함께 사용하려면 InvocationHandler와 MethodInterceptor를 각각 만들 필요 없고 Advice를 만들면 된다. InvocationHandler와 MethodInterceptor는 Advice를 호출하게 됨 ProxyFactory를 사용하면 Advice를 호출하는 전용 InvocationHandler, MethodInterceptor를 내부에서 사용 TimeAdvice 구현 MethodInvocation 내부에는 다음 메서드를 호출하는 방법 현재 프록시 객체 인스턴스 arguments 메서드 정보 포함 Advice를 사용할 때는 org.aopalliance.i

[Spring] 포인트컷, 어드바이스, 어드바이저 [내부링크]

포인트 컷 (Pointcut) 어디에 부가 기능을 적용할지/말지를 판단하는 필터링 로직 주로 클래스와 메서드 이름으로 필터링 어드바이스 (Advice) 프록시가 호출하는 부가 기능 프록시 로직임 어드바이저 (Advisor) 하나의 포인트컷과 하나의 어드바이스를 가지고 있는 것 부가 기능 로직을 적용할 때 포인트컷으로 어디에 적용할지 선택 어드바이스로 어떤 로직을 적용할지 선택 어디에 / 어떤 로직을 모두 알고 있는 것이 어드바이저 Advisor 코드 interface가 있기에 JDK 동적 프록시가 적용된 걸 볼 수 있다. new DefaultPointCutAdvisor 하나의 포인트컷과 하나의 어드바이스를 넣어주면 된다. Pointcut.True 항상 True를 반환하는 포인트컷 new TimeAdvice() 구현한 Advice를 넘겨줌 proxyFactory.addAdvisor 프록시 팩토리에 적용할 어드바이저를 지정함 어드바이저는 내부에 포인트컷과 어드바이스를 모두 가지고 있음

[Spring] Bean 후처리기 [내부링크]

일반적인 스프링 Bean 등록 @Bean이나 ComponentScan으로 스프링 빈을 등록하면 스프링은 대상 객체를 생성하고 스프링 컨테이너 내부의 Bean 저장소에 등록함 이후 스프링 컨테이너를 통해 등록한 스프링 Bean을 조회해서 사용 Bean 후처리기 스프링이 Bean 저장소에 등록할 목적으로 생성할 객체를 Bean 저장소에 등록하기 직전에 조작하려면 Bean 후처리기를 사용하면 된다. Bean을 생성한 후에 처리하는 용도로 사용 바꿔치기 가능 Bean 후처리기에서 스프링 Bean 객체를 조작하거나 다른 객체로 바꿔치기 가능 스프링 빈 등록 코드 예제 @Configuration과 @Bean을 통해서 first만 Bean에 등록한다. AnnotationConfigApplicationContext를 통해서 BasicConfig.class 설정 파일을 스프링 Bean으로 등록한다. getBean으로 beanFirst는 찾을 수 있고 beanSecond는 찾을 수 없다. Bean 후

[Mybatis] ResultMap을 쓰지 않아도 자바 객체와 매핑 되는 경우 [내부링크]

사용할 자바 객체 사용할 쿼리 사용할 DB 테이블 DB 테이블 이름은 Member 사용할 코드 케이스 1 : @ToString만 있는 경우 사이즈는 2개가 나오나 null 값으로만 나온다. 케이스 2 : @NoArgsConstructor 추가 및 쿼리에 alias 추가 사실 기본생성자는 자동으로 만들어지긴 한다. alias를 추가하면 정상 작동한다. 케이스 3 : @AllArgsConstructor 추가 및 alias 없는 경우 정상적으로 데이터가 나온다. 이 케이스 때문에 좀 헷갈렸다. 분명 자바 객체와 DB 테이블 컬럼의 이름이 다른데 왜 정상결과가 나오나 했는데 전체 생성자가 있으면 생성자 순서대로 값을 할당해준다. 그렇기에 순서가 바뀌면 값이 제대로 나오지 않는다. 순서를 바뀌면 위와 같이 나온다. 케이스 4 : @NoArgsConstructor와 ResultMap 사용, alias는 없음 ResultMap을 사용해도 정상작동한다. 쿼리 순서가 바뀌어도 잘 작동한다. 케이스

[KAFKA] Java에서 Kafka로 Date 타입의 데이터를 직렬화해서 넣을 때 형식이 변경되는 문제점 [내부링크]

상황 DB에는 2023-08-22 15:00:17로 저장이 되어 있는 Date 데이터가 Kafka에 넣으면 다른 형식으로 변경이 되어서 넣어짐 DB 데이터 MySQL 기준 create_dt에 2023-08-19 14:00:37로 되어있음 DB에서 데이터를 가져오고 Kafka에 넣을 자바 객체 Spring boot에서 데이터 확인 및 KafkaProducer 코드 먼저 위 코드를 돌려서 print 문을 확인해보면 DB에서 가져올 때는 정상적으로 가져온다. 다만 이걸 Kafka에서 확인을 해보면 createDt가 밀리세컨트 형식으로 바뀌어진다. Jackson 라이브러리를 활용한 해결법 https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind JsonFormat를 사용하면 문제를 해결할 수 있다. 위와 같이 설정 후에 다시 Produce 해보면 원하는 형식으로 들어간다. 밀리세컨트 형식으로 들어간 이유 J

[ElasticStack] routing [내부링크]

라우팅 엘라스틱서치가 인덱스를 구성하는 샤드 중 몇 번 샤드를 대상으로 작업을 수행할지 지정하기 위해 사용한 값 라우팅 값은 문서를 색인할 때 문서마다 하나씩 지정할 수 있다. 작업 대상 샤드 번호는 지정된 라우팅 값을 해시한 후 주 샤드의 개수로 나머지 연산을 수행한 값 라우팅 값을 지정하지 않으면 _id 값의 해시값을 기반으로 샤드가 배정됨 routing_factor = num_routing_shards / num_primary_shards shard_num = (hash(_routing) % num_routing_shards) / routing_factor 색인 시 라우팅 값을 지정했으면 조회, 업데이트, 삭제, 검색 등의 작업에서도 똑같이 라우팅 지정해야 됨 검색할 때 라우팅 값을 명시하면 단일 샤드를 대상으로 검색함 인덱스 내에서의 _id 고유성 보장 라우팅 값을 명시하지 않으면 전체 샤드를 대상으로 검색을 요청함 성능도 떨어지고 검색 결과도 달라질 수 있음 단건 조회 AP

[ElasticStack] Update By Query, Delete By Query [내부링크]

Update By Query, Delete By Query 검색 쿼리를 통해서 주어진 조건을 만족하는 문서를 찾은 뒤 문서를 대상으로 업데이트나 삭제 작업을 실행 query_test index에 age를 10으로 색인한다. 버전 충돌, 재시도 횟수 등도 확인 가능 POST query_test/_update_by_query { "script" : { "source": "ctx._source.age += params.plus", "lang": "painless", "params": { "plus" : 1 } }, "query" : { "exists": { "field": "age" } } } age라는 field가 있으면 1을 더하는 script이다. 결과를 확인하면 11인 걸 볼 수 있다. 알아야 할 점 Update By Query는 _doc을 이용한 업데이트를 지원하지 않음 script를 통한 업데이트만을 지원함 문맥 정보 중에서 ctx._now를 사용할 수는 없다. Conflict

[ElasticStack] tasks API [내부링크]

Tasks API update by query 요청 시에는 wait_for_completion 매개변수를 false로 지정하면 비동기로 처리 가능 비동기 요청을 받으면 엘라스틱서치는 작업을 task로 등록한 뒤 즉시 task의 id가 포함된 응답을 반환 노드의 id와 해당 노드 내 task의 id를 :로 연결한 형태 client는 이 값을 가지고 tasks api를 호출해서 작업을 확인하거나 취소 가능 GET _tasks/tH2u83L4QWCR9jn2vqzphA:36455 GET API를 사용하면 task의 상태를 확인할 수 있다. _tasks는 tasks 관리 API 중 조회 API를 호출하는 것 작업이 진행 중이면 completed가 false로 나오고 response 필드가 존재하지 않는다. task 취소 POST _tasks/tH2u83L4QWCR9jn2vqzphA:47715/_cancel 작업도 취소할 수 있다. 위의 경우는 취소에 실패한 경우 응답에 node_failure

[ElasticSearch] Cluster 구축 - elasticsearch.yml 수정 [내부링크]

구성 환경 elasticsearch : 7.17.x 별 이유는 없음 깔아보니 7.17이어서 엘라스틱서치는 homebrew로 설치 안 했음 mac m1 node 3대로 클러스터를 구성함 local에서 구성함 node1, node2, node3 폴더를 만들고 각각 엘라스틱서치를 설치함 설정값 참고 https://blog.naver.com/fbfbf1/223135286925 node1 elasticsearch.yml elasticsearch-cluster는 임의로 만든 파일임 node1에 관한 elasticsearch.yml path.data에 data 파일은 임의로 만들었다. bin 폴더에서 실행해 보자 localhost:9200로 들어가면 확인할 수 있다. node1을 먼저 실행시키면 cluster_uuid가 "_na_"로 된다. 다른 노드까지 실행하고 다시 보면 cluster_uuid가 추가된다. node2 elasticsearch.yml node2에 관한 elasticsearch.

[ElasticSearch] mac cerebro 설치 (JDK 16 이상인 경우 에러 발생) [내부링크]

깃허브에서 다운 https://github.com/lmenezes/cerebro/releases Releases · lmenezes/cerebro Contribute to lmenezes/cerebro development by creating an account on GitHub. github.com 원하는 폴더에 압축해제 ./cerebro 명령어 실행 에러 발생 java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed m

[ElasticStack] 힙 크기, 스와핑, bootstrap.memory_lock, max_map_count [내부링크]

LINUX 기준 힙 크기 7.11 버전 이상 사용 시 config/jvm.options 파일을 직접 수정하는 것보다는 config/jvm.options.d 디렉터리 밑에 별도 파일을 새로 생성해서 힙 크기를 지정하는 것이 관리가 편함 vim config/jvm.options.d/heap-size.options -Xms원하는값 -Xmx원하는값 최솟값과 최댓값을 똑같이 맞춰줘야 GG가 안 일어남 java -Xmx1m -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOop UseCompressedOops 값이 true가 되는 경곗값으로 힙 크기를 정해야 한다. java -XX:+UnlockDianosticVMOptions -Xlog:gc+heap+coops=debug -Xmx30720m -version Compressed OOPs mode가 Zero base로 적용되는 경곗값을 적용해야 한다. LINUX 기준 스와핑 엘라스틱서치에서는 스와핑

[ElasticSearch] 마스터 노드를 여러 개 해야 되는 이유 [내부링크]

노드 종류 마스터 노드, 데이터 노드, 인제스트 노드, 코디네이팅 노드가 있는데 elastisearch.yml에서 설정 가능하다. 보통 Cluster를 운영할 때는 마스터 노드와 데이터 노드를 분리한다. 마스터 노드 1대 노드 3대를 사용하는데 노드 1은 마스터 노드이면서 데이터노드 노드 2, 노드 3은 데이터 노드이다. 마스터 노드가 1대만 실행이 되어도 엘라스틱 서치 클러스터가 실행이 될 수 있게 각 노드의 elasticsearch.yml에서 cluster.initial_master_nodes, discovery.seed_hosts에 node1만 적어준다. 노드 1, 노드 2, 노드 3번 다 똑같이 적어야 한다. 먼저 노드 1을 실행해서 보면 클러스터가 정상적으로 구성이 된다. 이후에 노드 2, 노드 3을 실행하자 클러스터에 정상적으로 추가가 된다. 데이터 노드인 2번만 꺼본다. 데이터 노드인 2번에 문제가 생겨서 노드가 다운됐다고 해보자. node 2번이 클러스터에서 나가면 g

[서평] 육각형 개발자 시니어 개발자로 성장하기 위한 10가지 핵심 역량 최범균 지음 한빛미디어 [내부링크]

개발자 사이에서 유명하신 최범균님이 주니어 개발자들을 위한 책을 하나 출간하셨습니다. 출간하기 전부터 여러 사이트에서 좋은 리뷰들이 많이 보여서 꼭 리뷰를 해보고 싶었는데 운 좋게 당첨이 되었네요 이 책 주니어한테 정말 좋습니다. 더 나은 개발자로 성장하기 위해서 필요한 엑기스들을 모아놓은 책이라고 생각합니다. 특히 개발과 관련된 내용도 좋은데 '일'과 관련된 부분에서도 많이 배울 수 있었습니다. 일단 책 자체도 작고 양도 많지 않아서 읽으려면 금방 읽을 수 있습니다. 책의 가독성도 좋고요 코드가 필요한 부분은 코드까지 같이 보여주기에 내용이 잘 파악이 됩니다. 1장 들어가며 간단하게 개발자가 해야 되는 일이 무엇이고 새로운 기술을 써야만 개발 능력이 향상된다고 여기지 말자라고 알려줍니다. 또한 많은 개발자들이 개발만 하면 일을 잘하는 걸로 알고 있는데 개발자는 개발뿐만 아니라 구현 기술, 설계 역량, 업무 관리와 요구 분석/공유, 리드&팔로우 등등 여러 가지도 같이 중요하다고 알려

예외 [내부링크]

예외 예외가 발생했을 때 프로그래밍 회복되도록 강제할 것인지를 생각해 봐야 한다. 일시적으로 발생하는 오류라면 동작을 다시 시도하거나 화면에 메시지를 출력해 응용프로그램의 반응성을 유지할 수 있다. 비즈니스 로직 검증 (잘못된 형식이나 연산) 시 발생한 문제는 불필요한 try / catch 구문을 줄일 수 있게 미확인 예외로 결정 예외가 발생했을 때 응용프로그램을 어떻게 회복시킬 것인지 애매한 상황 API 사용자에게 오류를 복구하라고 강제할 필요가 없다. 시스템 오류 (저장 공간이 꽉 참)가 발생했을 때 사용자가 할 수 있는 일이 없기에 시스템 오류도 미확인 예외로 지정 대다수의 예외 미확인 예외로 지정하고 꼭 필요한 상황에서만 확인된 예외로 지정해 불필요한 코드를 줄임 검증 코드 Vaildator 클래스를 만드는 것을 권장 다만 과하게 만들면 너무 많은 설정 작업이 필요하고, 여러 예외를 선언해야 하고, 사용자가 모든 예외를 처리해야 하기에 생산성이 떨어진다. 과하게 담당하면 구체

[JAVA] 제네릭 [내부링크]

제네릭 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구체적인 타입으로 대체시키는 기능 T가 타입 파라미터, 타입이 필요한 자리에 T를 사용할 수 있음을 알려주는 역할 Box Class는 T가 무엇인지 모르지만 Box 객체가 생성될 시점에 다른 타입으로 대체된다. 사용을 할 때는 위와 같이 필요한 타입을 넣어서 사용하면 된다. String 타입을 선언했기에 Long Type으로 변수를 할당해 주면 오류가 난다. 타입 파라미터를 여러 개 사용할 수도 있다. getter와 setter를 사용할 때도 타입 파라미터를 명시해 줘야 한다. 제네릭 타입 클래스 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스를 의미한다. 제네릭 타입은 선언부에 <> 부호가 붙고 그 사이에 파라미터들이 위치 제네릭 타입은 컴파일 시 컴파일러에 의해 제거됨 자바 코드에서 선언되고 사용된 제네릭 타입은 컴파일 시 컴파일러에 의해 자동으로 검사되어 타입으로 변환 코드 내의 모든 제네릭

[JAVA] 제네릭 공변 [내부링크]

Cage<Animal>이 Cage<Cat>의 상위 타입이 아니다. 만약 Cage<Animal>이 Cage<Cat>이 상위 타입이라고 한다면 첫 번째 빨간색 네모친 할당 부분이 가능하다. 그럼 두 번째 빨간색 네모친 부분에서 Dog은 Animal의 하위 클래스이기에 Push가 가능하다. 다만 세 번째에서 getAll을 하게 되면 List<Cat>이 리턴 값이나 두 번째에서 dog을 넣었기에 dog 리스트를 리턴한다. 이런 경우에 의해서 Cage<Animal>은 Cage<Cat>의 상위 타입이 아니다. 무변성 A가 B의 상위 타입일 때 GenericType<A>가 GenericType<B>의 상위 타입이 아니면 변성이 없다. 무변성 animal은 Cat의 상위 타입이지만 Cage<Animal>은 Cage<Cat>의 상위 타입이 아니다. 무변성일 때 문제 위와 같이 Dog을 상속받는 Small, CuteDog 구현 그리고 Dog cage에 사랑을 주는 Human class도 구현 그리고

[Effective Java] 로 타입은 사용하지 말라 [내부링크]

제네릭 클래스, 제네릭 인터페이스 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면 제네릭 클래스, 인터페이스라고 부름 제네릭 클래스와 인터페이스를 통틀어 제네릭 타입이라고 함 각각의 제네릭 타입은 매개변수화 타입(Parameterized Type)을 정의 List<String>과 같이 정의 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입 로 타입 제네릭 타입을 하나 정의하면 Raw Type도 함께 정의된다. Raw Type은 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 의미 List<E>의 Raw Type은 List이다. Raw Type은 타입 선언에서 제네릭 타입 정보가 전부 지워진 것처럼 동작함 Raw 타입을 사용하면 Cat을 넣어야 되는 곳에 Dog을 넣어도 컴파일 에러가 발생하지 않는다. 런타임 에러 시점에서 실수했다는 걸 발견할 수 있다. 제네릭을 사용하면 타입 선언 자체에 Cat만 넣어야 된다는 걸 알 수 있다. Dog을 넣는 코드를 작성하면 컴

[Effective Java] 비검사 경고를 제거하라 [내부링크]

비검사 경고를 제거하라 -Xlint:uncheck 옵션을 사용하면 무엇이 잘못된 지 알 수 있다. 할 수 있는 한 모든 비검사 경고를 제거하자! 모두 제거하면 타입 안정성이 확실히 보장된다. @SuppressWarnings("unchecked") 경고를 제거할 수는 없지만 타입이 안전하다고 확신할 수 있으면 @SuppressWarnings("uncheck") 애너테이션을 사용해서 경고를 숨기자 다만 타입 안전이 검증되지 않은 채로 애너테이션을 사용하면 안 된다. 위 애너테이션은 개별 지역변수 ~ 클래스 전체까지 달 수 있다. 하지만 항상 가능한 한 좁은 범위에 적용하자! 변수 선언, 아주 짧은 메서드, 생성자 절대로 클래스 전체에 적용해서는 안 된다. return 문에는 사용할 수 없다. 주석 @SuppressWarnings("uncheck")를 사용할 꺼면 경고를 무시해도 안전한 이유를 항상 주석으로 남기자 다른 사람이 코드를 이해하는 데 도움이 되고 다른 사람이 코드를 잘못 수정

[Effective Java] 배열보다는 리스트를 사용하라 [내부링크]

배열과 제네릭 타입의 차이 1 배열은 공변이다. 공변은 함께 변한다는 뜻 Sub가 Super의 하위 타입이면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다. 제네릭은 불공변이다. 서로 다른 타입 Type1, Type2가 있을 때 List<Type1>은 List<Type2>의 하위/상위 타입이 아니다 제네릭이 문제 있어 보이지만 문제가 있는 건 배열 쪽이다. 위 코드는 컴파일 단계에서는 문제가 없지만 런타임 단계에서 문제가 발생한다. List를 사용하면 처음부터 호환이 되지 않는다. 컴파일 단계에서 문제를 알 수 있게 된다. 배열과 제네릭의 차이 2 배열은 실체화(reify) 된다. 배열은 런타임에도 담기로 한 원소의 타입을 인지하고 확인 그래서 Long 배열에 String을 넣으려 하면 ArrayStoreException이 발생 제네릭은 타입 정보가 런타임에는 소거된다. 원소 타입을 컴파일 타임에만 검사하고 런타임에는 알 수 없다. 소거는 제네릭이 없는 레거시 코드와 제네

[Effective Java] 이왕이면 제네릭 타입으로 만들라 [내부링크]

Object를 사용한 Stack public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } final Object result = elements[--size]; elements[size] = null; return result; } public boolean isEmpty() { return size == 0; } private void ens

[Effective Java] 이왕이면 제네릭 메서드로 만들라 [내부링크]

이왕이면 제네릭 메서드로 만들라 클래스와 마찬가지로, 메서드도 제네릭으로 만들 수 있다. 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭이다. 로타입을 사용해서 제네릭 메서드를 만들 수 있지만 경고가 발생한다. 원소 타입을 타입 매개변수로 명시하고 메서드 안에서도 타입 매개변수만 사용하게 수정하면 경고를 없앨 수 있다. 문제 없이 사용 가능하다. 불변 객체를 여러 타입으로 활용 제네릭은 런타임에 타입 정보가 소거되기에 하나의 객체를 어떤 타입으로든 매개변수화할 수 있다. 하지만 이렇게 하려면 요청한 타입 매개변수에 맞게 매번 그 객체의 타입을 바꿔주는 정적 팩터리를 만들어야 한다. 이 패턴을 싱글턴 팩터리라고 한다. 항등함수를 담은 클래스 항등함수 객체는 상태가 없으니 요청할 때마다 새로 생성하는 것은 낭비 자바의 제네릭이 실체화된다면 항등함수를 하나씩 만들어야 했겠지만 소거 방식을 사용하면 제네릭 싱글턴 하나로 충분하다. 위와 같이 제네릭을 사용해서 만들 수 있다. ID

[Effective Java] 한정적 와일드카드를 사용해 API 유연성을 높이라 [내부링크]

불공변 서로 다른 타입 Type1과 Type2가 있을 때 List<Type1>은 List<Type2>의 하위 타입도 상위 타입도 아니다. 예를 들면 List<String>은 List<Object>의 하위 타입이 아니다는 뜻 List<Object>에는 어떤 객체든 넣을 수 있지만 List<String>에는 문자열만 넣을 수 있다. 즉, List<String>은 List<Object>가 하는 일을 제대로 수행하지 못하니 하위 타입이 될 수 없다. 불공변 방식보다 유연한 무언가 와일드카드 타입을 사용하지 않는 pushAll 메서드에는 결함이 있다. src의 원소 타입과 스택의 원소 타입이 일치하면 잘 동작한다. 하지만 Stack<Number>로 선언하고 Iterable<Integer>를 넣으면 Integer가 Number의 하위 타입이니 잘 동작할 것 같지만 실제로는 매개변수화 타입이 불공변이기에 오류 메시지가 뜬다. 해결법 한정적 와일드카드 타입이라는 특별한 매개변수화 타입 지원함 pu

가을 소풍 [내부링크]

티켓 받기 쉽지 않았어 회사에서 가을 소풍 보내줬다(?) 역시 복지는 좋다. 서울대공원, 서울랜드, 코끼리 열차 탑승권, 인당 만원 식사 쿠폰 줬다. 입장 티켓들이 기한이 좀 있어서 뭐 갈까 하다가 일단 서울랜드 한 번도 안 가봐서 서울랜드 가봤다. 비가 많이 오면 어쩌나 싶었는데 별로 안 와서 다행이었다. 여기는 서울랜드 후문! 뭔가 처음 봤을 때 서울 느낌 났다. 들어가면 보이는 분수 사진을 보면 알겠지만 정말 사람이 없었다. 아마 비가 와서 사람들이 별로 안 온 것 같다. 사람 없어서 오히려 좋았다. 감사합니당 후문에서 주차를 하고 정문에서 가을 소풍 선물(?)을 받았다. 에코백이랑 간식 받았다. 그리고 폴라로이드 사진도 찍어줘서 사진도 이쁘게 찍었다. 여기가 서울랜드 정문이다. 놀이공원들 정문은 다 비슷한 느낌이다. 뭔가 날씨가 안 좋아서 아포칼립스 느낌도 나네 간식은 뭐가 있나 봤는데 포켓몬 빵 3개에 간식거리 있었다. 포켓몬 빵 존맛탱 들어가자마자 슬러시 하나 사서 먹었다

[Effective Java] 제네릭과 가변인수를 함께 쓸 때는 신중하라. [내부링크]

가변인수 가변인수는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해줌 하지만 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어짐 내부로 감춰야 할 배열을 클라이언트에 노출하는 문제가 생김 그 결과 가변인수 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고 발생 실체화 불가 타입은 런타임에는 컴파일 타임보다 타입 관련 정보를 적게 담고 있음 메서드를 선언할 때 실체화 불가 타입으로 가변인수 매개변수를 선언하면 컴파일러가 경고 발생 위 코드에서는 형변환하는 곳이 보이지 않는데도 인수를 건네서 호출하면 예외를 던진다. 마지막 줄에 형변환이 숨어 있기 때문이다. 위와 같은 사례로 타입 안전성이 깨지니 제네릭 가변인수 배열 매개변수에 값을 저장하는 건 안전하지 않음 @SafeVarargs @SafeVarargs 애네티이션으로 제네릭 가변인수 메서드 작성 시에 클라이언트 측에서 발생하는 경고를 숨길 수 있게 되었음 이 애너테이션은

[Effective Java] 타입 안전 이종 컨테이너를 고려하라 [내부링크]

단일원소 컨테이너 제네릭은 Set<E>, Map<K, V> 등의 컬렉션과 ThreadLocal<T>, AtomicReference<T> 등의 단일원소 컨테이너에도 흔히 사용됨 이런 모든 쓰임에서 매개변수화되는 대상은 원소가 아닌 컨테이너 자신 따라서 하나의 컨테이너에서 매개변수화할 수 있는 타입의 수가 제한됨 Set<E>은 E 한 개, Map<K, V>는 K, V 2개가 필요한 식 더 유연한 수단 타입 안전 이종 컨테이너 패턴 컨테이너 대신 키를 매개변수화한 다음, 컨테이너에 값을 넣거나 뺄 때 매개변수화한 키를 함께 제공 이러면 제네릭 타입 시스템이 값의 타입이 키와 같음을 보장해 줌 타입 안전 이종 컨테이너 패턴 예시 타입별로 즐겨 찾는 인스턴스를 저장하고 검색할 수 있는 Favorites 클래스 각 타입의 Class 객체를 매개변수화한 Map의 Key 역할 사용 class의 클래스가 제네릭이기 때문이다. class 리터럴 타입은 Class가 아닌 Class<T>다. 컴파일타임

[Java] ThreadLocal [내부링크]

동시성 문제 여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제를 동시성 문제 다음과 같이 TestService와 test 메서드를 작성한다. sleep(1000)을 통해서 1초의 지연을 만들자. 그렇기에 1초 이후에 호출하면 순서대로 실행을 할 수 있다. 다음과 같이 2개의 쓰레드를 만들고 2초 간격으로 실행할 수 있게 만든다 그럼 결과가 정상적으로 나온다. first는 nameStore에 할당된 값이 없기에 null이 나오는 게 맞고 second는 First가 끝나고 난 뒤에 실행이 됐기에 처음 nameStore는 first가 맞다. 이번에는 sleep을 0.1초 둔다 이렇게 되면 test 메서드에서는 1초의 지연이 있는 데 이 지연이 끝나기 전에 다른 쓰레드가 접근이 가능하다. sleep이 2초일 때와 달리 First의 NameStore가 동시성 문제로 인해서 second로 나오게 된다 여기서 문제는 조회하는 부분에서 발생함 first와 second는 각각

리플렉션 [내부링크]

리플렉션 자바에서 제공하는 기술로 리플렉션을 사용하면 클래스나 메서드의 메타정보를 동적으로 획득하고, 코드도 동적으로 호출할 수 있다. 컴파일 시점이 아닌 런타임 시점에 정보를 획득할 수 있다. 위의 코드를 보면 호출하는 메서드만 다르고 전체 코드의 흐름은 같다. 호출하는 메서드만 동적으로 처리하면 공통화를 할 수 있다. 이때 사용하는 게 리플렉션이다. java.lang에 있는 Class를 통해서 리플렉션을 적용하려는 클래스의 메타정보를 획득한다. 내부 클래스는 $를 통해서 구분한다. getMethod를 통해서 해당 클래스의 callA / callB 메서드 메타 정보 획득 invoke를 통해서 getMethod를 통해서 획득한 메서드 메타정보로 실제 인스턴스의 메서드를 호출함 Invoke를 호출할 때 target 인스턴스를 넘겨주면 해당 인스턴스의 callA 메서드를 찾아서 실행함 dynamicCall를 통해서 공통 처리 로직을 만들 수 있다. Method는 java.reflect에

비 오는 날 캐리비안베이 나들이 [내부링크]

2023년 7월 15일에 여자친구랑 캐리비안베이 갔다. 비가 많이 오면 어쩌나 싶었는데 비는 별로 안 왔다. 그래서 그런지 사람도 꽤 많았다. 놀이 기구는 인기 많은 건 대기시간이 2시간이라고 써져있었다. 놀이 기구는 안 타고 계속 유스풀이랑 파도풀만 즐겼다. 티켓은 네이버에 샀고 방수팩은 다이소에서 사갔다. 모자는 파도풀이나 유스풀 들어갈 때 무조건 써야되는 줄 알았는데 아니였다. 안 쓰고 들어가도 별 문제 없다. 오랜만에 보는 캐리비안 베이 정문 처음에 베이코인 안 하고 옷 갈아입고 베이코인으로 바꿨다. 참고로.. 내 기억에는 옛날에는 구명조끼 보증금만 받았는데 요즘에는 보증금 안 받고 대여금으로 8000원 받는다 너무 비싸 그래서 그런지 길거리에 버려진 구명조끼들이 많이 보였다. 옷 갈아입고 바로 파도풀로 달려갔다. 참고로 워터슈즈 있으면 가지고 가자.. 오랜만에 파도풀 가니 재밌었다. 물도 미지근해서 별로 안 추웠다. 저기 보이는 노란색 선 앞뒤에 있는 게 제일 재밌긴 하다.

[서평] 마이크로서비스 아키텍처 구축 샘 뉴먼 지음, 정성권 옭김, 한빛미디어 [내부링크]

이번에 서평 할 책은 마이크로 서비스 아키텍처 구축입니다. 책 앞표지에는 벌집이 그려져 있네요 마이크로서비스를 의미하는 것 같네요 뒷면에는 무려 마틴 파울러의 서평까지 있습니다. 마틴 파울러가 서평 남긴 책이라서 신뢰가 많이 가는 책이네요. 책 뒷면의 이정인님이 남기신 서평이 딱 알맞은 것 같습니다. 주니어 개발자에게는 이 책을 통해서 마이크로서비스 아키텍처에 대한 이해를 높일 수 있다고 생각하네요 다만 책이 난이도가 있기 때문에 어느 정도 MSA를 다뤄본 주니어부터 읽어보는 게 좋다고 생각이 드네요 책은 1장부터 16장까지 구성이 되어있습니다. 총 3부로 기초, 구현, 사람으로 나눠져있습니다. 책은 읽기 편하게 되어 있습니다. 적재적소에 그림도 잘 배치되어 있고 소제목도 잘 나눠놓아서 읽기 편하네요. 초반에는 모놀리스 서비스에 대해서 설명을 하고 뒤에서 MSA에 대해서 설명을 합니다. MSA에 대해서 얘기할 때 빠지지 않는 게 DDD인데 여기서도 DDD를 어느 정도 설명하고 넘어갑

[KAFKA] 브로커 설정 [내부링크]

/kafka/config에서 server.properties에서 설정 broker id 카프카 브로커 정숫값 식별자 클러스터 내에서 전부 달라야함 zookeeper.connect 브로커의 메타데이터의 저장되는 주키퍼 위치 Log.dirs 모든 메시지를 Log Segment 단위로 묶어서 Log.dir 설정에 지정된 디스크 디렉토리에 저장 다수의 디렉토리를 지정할꺼면 Log.dirs를 사용 num.recovery.threads.per.data.dir 설정 가능한 스레드 풀을 사용해서 로그 세그먼트를 관리함 하나의 로그 디렉토리에 대해 하나의 스레드만이 사용됨 auto.create.topics.enable 토픽 자동 생성 막음 auto.leader.rebalance.enable 가능한 한 리더 역할이 균등하게 분산되도록 해서 카프카 클러스터 균형이 깨지는 걸 막아줌 Delete.topic.enable true로 설정하면 클러스터의 토픽을 임의로 삭제하기 못하게 막는다. num.parti

[4년 전 오늘] 2019.07.29 동탄 쿠팡 알바 허브B팀 후기 [내부링크]

2019.7.29. 4년 전 오늘 2019.07.29 동탄 쿠팡 알바 허브B팀 후기 +추가 2019.12.28 많은 분들이 제 글을 읽어주시는데 일단 매우 감사합니다. 한 가지 알아두셔야 될게 이 글은 7월에 쓴 거라 지금이랑 좀 다릅니다! 그걸 꼭 확인해 주세요 저 할 때는 9시부터였는데 아마 지금은 8시부터 일 겁니다! 그리고 제가 답변드릴 수 있는 게 있고 답변드릴 수 없는 게 있습니다. 저도 알바 몇 번... 류리상자 나 블로그 시작하고 얼마 안돼서 올린 글인데 이게 대박나서 하루에 500명 넘게 왔었다 ㅋㅋㅋ 요즘은 거의 조회수가 0이네 ㅠ

[KAKFA] Producer 설정 [내부링크]

ProducerRecord 카프카에 메시지를 쓰는 작업은 ProducerRecord 객체를 생성해서 사용한다. Record가 저장될 토픽과 밸류 지정은 필수, 키와 파티션 지정은 선택사항 ProducerRecord를 전송하는 API를 호출했을 때 Producer가 가장 먼저 하는 일은 Key와 Value를 네트워크에 전송될 수 있도록 직렬화해서 byte 배열로 변환하는 과정 파티션을 지정하지 않았으면 해당 데이터를 파티셔너로 보냄 파티셔너가 파티션을 결정하는 역할을 함 보통 ProducerRecord 객체의 Key 값 사용해서 결정 프로듀서는 레코드를 같은 토픽 파티션으로 전송될 레코들을 모은 Record Batch에 추가함 별도의 스레드가 Record Batch를 적절한 카프카 브로커에게 전송함 Producer 응답 값 메시지가 성공적으로 저장되면 브로커는 토픽, 파티션, 해당 파티션의 레코드의 오프셋을 담은 RecordMetaData 객체를 리턴한다. 에러가 발생하면 에러 리턴됨

[KAFKA] 파티션, 헤더, 인터셉터 [내부링크]

파티션 ProducerRecord는 토픽, 키, 밸류의 값을 포함한다. 대부분 키값이 지정된 레코드를 쓴다. 키의 역할은 두 가지 메시지에 함께 저장되는 추가적인 정보이기도 하지만 토픽에 속한 여러 개의 파티션 중 해당 메시지가 저장될 파티션을 결정짓는 기준점 같은 키값을 가진 모든 메시지는 같은 파티션에 저장된다. 키값이 null 기본 파티셔너 사용할 때 키값이 Null인 레코드가 주어지면 토픽의 파티션 중 하나에 랜덤으로 저장 카프카 2.4 프로듀서부터는 접착성 처리를 위해 기본 파티셔너에서 Round Robin 알고리즘 사용 접착성 처리 접착성 처리가 있은 경우 key 값이 null인 메시지들은 일단 key 값이 있는 메시지 뒤에 따라붙은 다음에 라운드 로빈 방식으로 배치됨 key 값있는 메시지 뒤에 따라붙기에 접착성 처리 헤더 레코드에는 헤더를 포함할 수 있다. 헤더는 카프카 레코드의 key/value 값을 건드리지 않고 추가 메타데이터를 심을 때 사용함 메시지의 전달 내역을

[KAFKA] Consumer 설정 [내부링크]

fetch.min.bytes 컨슈머가 브로커로부터 레코드를 얻어올 때 받는 데이터의 최소량을 지정 기본값은 1바이트 브로커가 컨슈머로부터 레코드 요청을 받았는데 새로 보낼 레코드의 양이 fetch.min.bytes보다 작을 경우, 브로커는 충분한 메시지를 보낼 수 있을 때까지 기다린 뒤 컨슈머에게 레코드를 보내준다. fetch.max.wait.ms 카프카가 컨슈머에게 응답하기 전에 데이터가 모일 때까지 얼마나 오래 기다릴 것인지를 결정한다. 기본값은 500 밀리초 카프카는 토픽에 컨슈머에게 리턴할 데이터가 부족할 경우 최소량 조건을 맞추기 위해 500밀리까지 기다리게 된다. fetch.max.wait.ms를 100밀리초, fetch.min.bytes를 1MB로 잡을 경우 카프카는 컨슈머로부터 읽기 요청을 받았을 때 리턴할 데이터가 1MB 이상 모이거나 100밀리초가 지나거나 두 조건 중 하나가 만족되는 대로 리턴하게 됨 fetch.max.bytes 컨슈머가 브로커를 폴링 할 때 카프

[KAKFA] 오프셋, 커밋, 리밸런스 리스너 [내부링크]

오프셋 커밋 컨슈머는 카프카의 특수 토픽인 __consumer_offsets 토픽에 각 파티션 별로 커밋 된 오프셋을 업데이트하도록 메시지를 보내서 커밋을 함 리밸런싱 발생 시 문제 사항 파티션에 커밋 된 오프셋이 클라이언트가 처리한 마지막 메시지의 오프셋보다 작을 경우 마지막으로 처리된 오프셋과 커밋 된 오프셋 사이의 메시지들이 두 번 처리됨 커밋 된 메시지가 클라이언트가 실제로 처리한 마지막 메시지의 오프셋보다 클 경우 마지막으로 처리된 오프셋과 커밋 된 오프셋 사이의 모든 메시지들은 컨슈머 그룹에서 누락됨 비동기적 커밋 브로커가 커밋에 응답할 때까지 기다리는 대신 요청만 보내고 처리를 계속함 문제점 commitSync는 성공하거나 재시도가 불가능한 실패가 발생할 때까지 재시도 하지만 commistAsync는 재시도 하지 않는다. CommistAsync가 서버로부터 응답을 받은 시점에 이미 다른 커밋 시도가 성공했을 수 있기에 오프셋 2000을 커밋 하는 요청을 보낸 후 브로커가

넷플릭스 고스트워 [내부링크]

https://www.netflix.com/title/80098200 고스트 워 | 넷플릭스 공식 사이트 보이지 않는 적의 출현으로 인해 유럽의 거리는 초토화가 된다. 이 위기를 해결하기 위해 나선 엘리트 특수 작전 부대와 미지의 적과의 사투가 시작된다. 전율을 부르는 SF 스릴러. www.netflix.com 나름 내용이 신선하고 재밌음 처음 보는 주제에 대한 영화임 2016년에 나온 영화인데 별로 안 알려져서 아쉽네 이런 영화가 많이 알려져야 되는데

넷플릭스 프로젝트 파워 [내부링크]

https://www.netflix.com/title/80204465 프로젝트 파워 | 넷플릭스 공식 사이트 소령이라 불리는 남자, 10대 소녀, 경찰. 이들이 뉴올리언스에서 얽힌다. 5분간 초능력을 발휘할 수 있는 약. 도시 전체를 혼돈에 빠트린 파워의 출처를 뒤쫓으면서. www.netflix.com 애매함 더 재밌게 만들 수 있었을 것 같은데 아쉽네

넷플릭스 익스트랙션 1, 2 [내부링크]

https://www.netflix.com/title/80230399 익스트랙션 | 넷플릭스 공식 사이트 어떤 일에도 쉽게 동요하지 않는 냉철한 청부업자. 그가 살아남기 위해 자신을 끊임없이 성찰한다. 마약왕의 납치된 아들을 구하러 간 방글라데시에서 그 모든 것이 시작됐다. www.netflix.com https://www.netflix.com/title/81098494 익스트랙션 2 | 넷플릭스 공식 사이트 고도로 숙련된 전직 특수 요원 타일러 레이크. 죽음의 문턱에서 가까스로 살아 돌아온 그가 또다시 위험천만한 작전에 뛰어든다. 임무는 하나. 무자비한 갱스터의 가족을 감옥에서 탈출시켜라. www.netflix.com 전형적인 특수 요원 이야기이긴한데 액션 재밌음

[KAKFA] 한 개의 Consumer에서 여러 개의 Topic Subscribe [내부링크]

상황 한 개의 Consumer에서 2개의 Topic을 구독해야되는 상황 주키퍼 실행 카프카 브로커 실행 토픽 생성 Producer Producer를 통해서 두 개의 토픽에 각각 5000개씩 데이터를 넣음 데이터가 생성이 되는 걸 볼 수 있다. Consumer subscribe를 통해서 두 개의 토픽 이름을 적음 결과 내가 예상했던 건 동시에 두 개의 토픽에서 데이터를 읽어올꺼라고 생각해서 로그가 뒤죽박죽 나올 줄 알았다. 결과를 보니 토픽 하나부터 쭉 읽고 그 다음 토픽 쭉 읽는다. 심지어 번갈아가면서 읽지도 않는다.

[Oracle] SGA, Table Full Scan, Index Range Scan [내부링크]

SGA System Global Area에는 DB Buffer Cache와 Library Cache 존재 라이브러리 캐시 SQL, 실행계획, DB 저장형 함수/프로시저 등을 캐싱 하는 코드 캐시 DB 버퍼 캐시 데이터 캐시 디스크에서 읽은 데이터 블록을 캐싱 해둬서 같은 블록에 대한 반복적인 I/O Call을 줄임 Table Full Scan 테이블에 속한 블록 전체를 읽어서 사용자가 원하는 데이터를 찾는 방식 Table Full Sacn을 수정하는 건 SQL 성능 향상에 큰 도움이 되지 않음 오히려 인덱스가 SQL 성능을 떨어뜨리는 경우가 더 많다. 한 번에 많은 데이터를 처리하는 집계용 SQL, 배치 프로그램은 상당수 Table Full Scan으로 유동하면 성능이 빨라진다. 조인을 포함한 SQL 이면, 조인 메서드로 해시 조인을 선택하면 된다. Index Range Scan 인덱스에서 일정량을 스캔하면서 얻은 ROWID로 테이블 레코드를 찾아가는 방식 ROWID는 테이블 레코드

[Oracle] 인덱스 수직적 탐색, 수평적 탐색 [내부링크]

인덱스 튜닝 두 가지 핵심요소 인덱스는 큰 테이블에서 소량 데이터를 검색할 때 사용한다. 첫 번째 인덱스 스캔 과정에서 발생하는 비효율 줄이기 인덱스 스캔 효율화 튜닝 두 번째 테이블 액세스 횟수 줄이기 인덱스 스캔 후 테이블 레코드를 액세스할 때 랜덤 I/O 방식을 사용하기에 랜덤 액세스 최소화 튜닝 더 중요한 걸 하나 고르면 랜덤 액세스 최소화 튜닝이 더 중요하다. 성능에 미치는 영향이 더 크다. SQL 튜닝은 랜덤 I/O 와의 전쟁!!! SQL 튜닝은 랜덤 I/O 와의 전쟁!!! DB 성능이 느린 이유는 디스크 I/O 때문이다. 인덱스 구조 대용량 테이블에서 필요한 데이터만 빠르게 효율적으로 액세스 하기 위해 사용하는 오브젝트 인덱스를 이용하면 범위 스캔이 가능하다. 범위 스캔이 가능한 이유는 인덱스가 정렬되어 있기 때문이다. 일반적으로 B+ Tree 인덱스 사용함 루트와 브랜치 블록에는 키 값을 갖지 않는 특별한 레코드가 존재 가장 왼쪽 첫 번째 레코드 LMC = LeftMo

[Oracle] 인덱스 기본 사용법, Range Scan, 인덱스 사용조건 [내부링크]

인덱스 기본 사용법 인덱스를 Range Scan 하는 게 기본 사용법이다. 인덱스 컬럼(선두 컬럼)을 가공하지 않아야 인덱스를 정상적으로 사용할 수 있다. 인덱스 정상적 사용은 리프 블록에서 스캔 시작점을 찾아 거기서부터 스캔하다가 중간에 멈추는 것을 의미 리프 블록 일부만 스캔하는 index Range Scan을 의미 인덱스 컬럼을 가공하면 스캔 시작점을 찾을 수 없고 멈출 수도 없어 리프 블록 전체를 스캔 Index Full Scan 방식으로 작동한다. 인덱스 Range Scan 할 수 없는 이유 인덱스 컬럼을 가공하면 인덱스를 정상적으로 사용할 수 없다. 인덱스 스캔 시작점을 찾을 수 없기 때문이다. Index Range Scan은 인덱스에서 일정 범위를 스캔한다는 뜻 그렇기에 시작지점과 끝지점이 있어야한다. LIKE를 대한%으로 사용하면 특정 구간에 모여있기에 Range Scan이 가능하지만 %대한%을 포함하는 값은 전체 구간에 걸쳐 흩어져 있어서 Range Scan 불가능

[Oracle] 인덱스를 활용한 SORT 연산 생략, ORDER BY 절 컬럼 가공 [내부링크]

인덱스를 이용한 SORT 연산 생략 인덱스를 Range Scan 할 수 있는 이유는 데이터가 정렬되어 있기 때문 찾고자 하는 데이터가 정렬된 상태로 서로 모여있기에 전체가 아닌 일정 부분만 읽다가 멈출 수 있다. 테이블과 달리 인덱스는 정렬되어 있다. 인덱스를 사용하는 이유 인덱스가 정렬되어 있기에 Range Scan이 가능하고 소트 연산 생략 효과도 부수적으로 얻게 됨 장비번호 + 변경일자 + 변경순번 순으로 PK를 구성한다고 하면 PK 인덱스에서 장비번호, 변경일자가 같은 레코드는 변경순번 순으로 정렬된다. SELECT * FROM 상태변경이력 WHERE 장비번호 = 'C' AND 변경일자 = '20230711'; 장비번호와 변경일자를 모두 '=' 조건으로 검색할 때 PK 인덱스를 사용하면 결과 집합은 변경순번 순으로 출력된다. 옵티마이저는 위와 같은 속성을 활용해서 ORDER BY가 있어도 정렬 연산을 따로 수행하지 않는다. PK 인덱스를 스캔하면서 출력한 결과 집합은 어차피

[Oracle] SELECT-LIST에서 컬럼 가공 [내부링크]

SELECT-LIST에서 컬럼 가공 장비번호 + 변경일자 + 변경순번 위와 같이 인덱스를 구성하면 변경순번 최솟값을 구할 때도 옵티마이저는 정렬 연산을 수행하지 않는다. SELECT WIN(변경순번) FROM 상태변경이력 WHERE 장비번호 = 'C' AND 변경일자 = '20230712' 수직적 탐색을 통해 조건을 만족하는 가장 왼쪽 지점으로 내려가서 첫 번째 읽는 레코드가 바로 최솟값이기에 SELECT NVL(MAX(TO_NUMBER(변경순번)), 0) FROM 상태변경이력 WHERE 장비번호 = 'C' AND 변경일자 = '20230712' 하지만 위와 같이 변경순번을 숫자 값으로 바꾸게 되면 정렬 연산을 생략할 수 없다. SELECT NVL(TO_NUMBER(MAX(변경순번)), 0) FROM 상태변경이력 WHERE 장비번호 = 'C' AND 변경일자 = '20230712' 위와 같이 TO_NUMBER을 바깥으로 쓰게 되면 정렬 연산을 생략할 수 있다. 자동 형변환 고객 테이

[Oracle] Index Range Scan, Index Full Scan [내부링크]

Index Range Scan B+ Tree 인덱스의 가장 일반적이고 정상적인 형태의 액세스 방식 인덱스 루트에서 리프 블록까지 수직적으로 탐색한 후에 필요한 범위만을 스캔한다. 0 SELECT STATEMENT Optimizer=ALL_ROWS 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (TABLE) 2 1 INDEX (RANGE SCAN) OF 'EMP_DEPTNO_IDX' (INDEX) Index Range Scan을 사용하려면 인덱스 선두 컬럼을 가공하지 않은 상태로 조건절에서 사용해야 함 반대로 선두 컬럼을 가공하지 않으면 index Range Scan 무조건 가능하다. Index Full Scan 수직적 탐색 없이 인덱스 리프 블록을 처음부터 끝까지 수평적으로 탐색하는 방식 Index on emp(enam, sal) select * from emp where sal > 2000 order by enam; 0 SELECT STATEMENT

[ElasticStack] 노드 재시작 [내부링크]

장애 상황이 아닌 상황에서 노드 재시작할 때 사용하는 방식 클러스터 내 샤드 할당 기능 비활성화 PUT /_cluster/settings { "persistent": { "cluster.routing.allocation.enable": "none" } } 클러스터 내에 샤드 할당 기능 비활성화 none으로 설정하면 샤드 재분배를 하지 않는다. 위 기능을 none으로 하면 한 노드의 프로세스를 중지해서 클러스터에 제외되더라도 해당 노드에 포함된 샤드를 다른 노드로 재분배하지 않는다. 프라이머리 샤드와 레플리카 샤드 데이터 동기화 프라이머리 샤드와 레플리카 샤드 간의 데이터를 똑같은 형태로 맞춘다. 두 샤드가 가지고 있는 문서가 일치해야 클러스터에서 노드가 갑작스럽게 제외되더라도 데이터의 정합성을 보장할 수 있기에 POST /_flush/synced 이 과정 이후에 노드를 재실행하면 된다. 이탈한 노드 클러스터에 합류했는지 확인 작업이 필요한 노드를 다시 재실행하고 클러스터에 합류했는지

[ElasticStack] 디스크 사용량 임계치 설정 [내부링크]

옵션 설명 기본값 cluster.routing.allocation.disk.watermark.low 특정 노드에서 임계치가 넘어가면 샤드를 더 이상 할당하지 않음 85% cluster.routing.allocation.disk.watermark.high 임계치가 넘어선 노드를 대상으로 즉시 샤드 재할당 진행, 새롭게 생성된 인덱스에 대해서도 적용됨 90% cluster.routing.allocation.disk.watermark.flood_stage 전체 노드가 임계치를 넘어서면 인덱스를 read only 모드로 변경 95% cluster.info.update.interval 임계시 설정을 체크할 주기 30s cluster.routing.allocation.disk.watermark.low 설정한 값보다 높아지면 해당 노드에는 현재 생성되어 있는 인덱스에 새로운 샤드들을 더 이상 배치하지 않는다. 새롭게 생성되는 인덱스의 샤드들은 배치함 cluster.routing.allocatio

[ElasticStack] elasticsearch 설정 우선순위 [내부링크]

transient가 1순위다. 다만 클러스터와 관련된 항목 외에 노드별로 설정할 수 있는 항목들은 elasticsearch.yml 파일에서만 설정할 수 있다. elasticsearch.yml 우선순위에 따라 노드 별로 설정해야 하는 항목과 변경되지 않고 클러스터에 공통으로 필요한 설정은 elasticsearch.yml 파일에 설정 persistent 자주 변경되지는 않지만 간헐적으로 변경이 필요한 설정은 cluster api를 통해 persistent에 디스크 사용량 임계치 설정 transient 자주 변경되는 설정은 cluster api를 통해서 transient에 설정하는 것이 좋다. 샤드 할당 활성/비활성화 설정

[ElasticStack] 인덱스 복구 시 사용 가능한 최대 네트워크 트래픽 설정 변경 [내부링크]

PUT /_cluster/settings { "persistent" : { "indices.recovery.max_bytes_per_sec" : "100mb" } } 노드 장애 발생 후 복구 시 각 노드에서 샤드의 재배치 등 데이터를 주고받게 됨 위의 설정을 통해서 네트워크 트래픽 최댓값을 설정할 수 있음 최대 초당 100MB씩 데이터를 주고받을 수 있다는 의미 기본 값은 40MB 다만 이 값이 너무 크면 다른 서비스에 영향을 줄 수 있기에 주의 필요 기본 값 40MB는 작은 편이기에 시스템 환경 고려해서 늘리는 것이 좋다.

[ElasticStack] explain, retry_failed [내부링크]

explain GET /_cluster/allcation/explain unassigned 샤드가 발생했을 때 unassigned 샤드가 발생한 원인을 확인할 수 있는 기능 제공 retry_failed 샤드 배치 실패의 원인을 제거한 후 배치해야 할 unassigned 샤드의 개수가 너무 많으면 retry_failed를 이용해서 한 번에 여러 개의 unassigned 샤드를 배치할 수 있다. 샤드 배치가 모두 자동으로 이루어지기에 특정 노드에 배치해야할 필요가 있으면 allocate_replica를 사용하는 게 좋다. POST /_cluster/reroute?retry_failed explain와 retry_failed 먼저 explain 메서드를 통해서 unassigned 샤드 발생 원인을 빠르게 파악함 원인 제거 후 retry_failed를 이용해서 unassigned 샤드를 복구 시키는 형태로 사용 가능함 출처 : 기초부터 다지는 엘라스틱 서치

[ElasticStack] 클러스터와 노드 구성 [내부링크]

클러스터와 노드 클러스터는 여러 대의 컴퓨터를 병렬로 연결해 하나의 시스템을 구성하는 것을 의미 엘라스틱서치에서 클러스터를 구성하는 요소를 Node(노드) 클러스터는 여러 노드의 집합 노드는 엘라스틱서치가 설치되는 물리적 혹은 논리적 단위 보통 하나의 컴퓨터(혹은 서버)에 하나의 노드를 구성 물리 서버뿐만 아니라 논리 혹은 가상 서버로도 노드를 구분 HTTP 계층과 전송 계층 전송 모듈 클러스터 내부에서 사용한다. 내부에서 노드와 노드 간의 통신에서 사용 노드 간 데이터를 분산 처리하는 구조에 적합한 방식 기본 포트 9300 ~ 9399 HTTP 모듈 REST API를 통해서 노드와 외부 클라이언트 통신을 위해 사용 엘라스틱 API에서 제공하는 형태로 외부 클라이언트 앱과 통신 시 사용함 기본 포트 9200 ~ 9299 노드 엘라스틱 서치 클러스터를 구성하는 하나의 인스턴스 보통 하나의 논리적 서버로 구성되어 데이터를 저장하고 클러스터의 인덱싱과 검색 기능에 참여 단일 서버에 복수

[ElasticStack] Cluster BackUp, repository, snapshot [내부링크]

클러스터 백업 엘라스틱서치는 데이터 백업을 위해 스냅샷을 지원함 스냅샷을 위한 저장소는 repository라고 한다. 스냅샷을 찍기 전에 먼저 repository부터 지정해야 한다. 스냅샷은 클러스터 전체를 찍거나 특정 인덱스만 찍을 수 있다. repository 등록 PUT _snapshot/fsrepo { "type" : "fs", "settings" : { "location" : "C:\\elasticsearch-7.10.1" } } 레포지토리 등록은 type에 따라 사용법이 달라진다. 파일시스템(fs), 빅데이터 파일시스템 HDFS(hdfs), 리모트 리포지토리인 아마존 (s3)와 마이크로소프트 애저(azure)와 구글 클라우드 스토리지 (gcs) 지원 fs 타입의 경우 location이라는 파라미터를 이용해 레포지토리로 사용할 노드 내부의 특정 폴더를 지정 레포지토리는 클러스터를 구성하는 마스터 노드와 데이터 노드가 동일한 위치를 공유해야 하기에 노드 설정 파일에서 레포지토

[ElasticStack] 샤드, 프라이머리 샤드, 레플리카 샤드 [내부링크]

샤드 분산 처리 시스템인 엘라스틱 서치는 여러 대의 노드를 효율적으로 활용하기 위해 데이터를 샤드라는 단위로 나눠서 분산 저장함 데이터를 분산 저장하면 클러스터의 수평적인 확장이 가능하고 작업을 분산 처리해 성능과 처리량을 높일 수 있다. 인덱스는 가상의 논리적 단위 document 인덱싱과 검색은 샤드에서 일어난다. 인덱싱을 할 때 코디네이터 노드, 최초 요청을 수신한 노드는 문서에 별도의 ID가 주어지지 않는다면 랜덤 ID 생성 _routing 파라미터가 명시되지 않았다면 ID를 이용해 document가 인덱싱될 샤드를 결정한다. shard = hash(_routing) % 프라이머리 샤드 개수 샤드 선택 공식 document가 어떤 샤드에 저장되는 지 결정하는 것을 라우팅 프라이머리 샤드와 레플리카 샤드 데이터 원본을 프라이머리 샤드에 저장하고 유실 방지하고 가용성 확보하기 위한 데이터 복제본, 레플리카 샤드를 만들어서 사용함 인덱스 설정에서 프라이머리 샤드 개수와 레플리카 샤

[ElasticStack] 샤드 개수와 크기 구성 가이드, rollover, shrink API [내부링크]

샤드 개수 가이드 샤드가 늘어나면 더 많은 스레드를 활용해 인덱스를 병렬 검색할 수 있고 샤드가 적으면 요청을 분배하고 취합하기 오버 샤딩 6.x 까지는 프라이머리 샤드 5, 레플리카 샤드 1 7.x 버전부터 프라이머리 샤드 1, 레플리카 사드 1 기본 값 변경 많은 수의 프라이머리 샤드는 인덱스를 너무 작게 나누어서 오버샤딩 문제 발생할 가능성이 있다. 오버 샤딩은 샤드를 잘게 나누어 필요 이상의 많은 리소스를 사용하게 하는 문제 오버 샤딩 문제 각 샤드는 개별적으로 리소스를 소비한다. CPU, 메모리, 루씬 인스턴스 리소스도 필요 즉 샤드가 많을수록 시스템 성능에는 좋지 않다. 인덱스를 검색하기 위해서는 인덱스에 저장된 모든 샤드에 접근해야 함 많은 리소스가 필요하고 낭비됨 샤드 크기 가이드 검색이 많은 시스템인지 저장이 중요한 시스템인지에 따라 샤드 크기는 변경된다. 노드의 리소스 상태도 영향을 미침 엘라스틱에서는 통계적으로 샤드 하나의 크기가 10GB ~ 40GB 정도로 관리

[ElasticStack] Setting [내부링크]

Setting 운영이나 개발 과정에서 발생하는 시스템의 설정값들을 변수화해서 상황에 맞게 사용 가능 설정은 크게 클러스터, 노드, 인덱스 3가지 레벨로 나눌 수 있다. 클러스터 > 노드 > 인덱스 레벨로 시스템 영향도가 높다. 설정 설명 클러스터 로그 레벨이나 클러스터 전반에 관한 설정 REST API를 이용해 동적으로 설정값 변경 가능 노드 네트워크 인터페이스, 보안 설정 등 같은 노드 구성에 관한 설정을 한다. elasticsearch.yml 파일에서 정적으로 수정한다. 인덱스 인덱스와 관련된 설정 프라이머 샤드, 레플리카 샤드 개수 설정 하며 정적/동적으로 설정 가능 REST API를 이용해서 동적으로 인덱스별로 설정값 변경 가능 클러스터 설정 클러스터는 하나 혹은 여러 개의 노드들의 집합 GET _cluster/settings?include_defaults=true include_defaults를 true로 지정하면 API를 이용해 직접 설정하지 않았거나 elasticsear

[ElasticStack] 운영 환경 설정 [내부링크]

노드 elasticsearch 설정 config 폴더에 elasticsearch.yml 파일이 있다. # ======================== Elasticsearch Configuration ========================= # # NOTE: Elasticsearch comes with reasonable defaults for most settings. # Before you set out to tweak and tune the configuration, make sure you # understand what are you trying to accomplish and the consequences. # # The primary way of configuring a node is via this file. This template lists # the most important settings you may want to configure for a produ

[ElasticStack] logstash [내부링크]

logstash 플러그인 기반의 오픈 소스 데이터 처리 파이프라인 도구 로그스태시를 통해서 데이터를 가공/변환해서 엘라스틱 서치에 저장 특징 플러그인 기반 모든 형태 데이터 처리 JSON, XML event data RDBMS 데이터를 마이그레이션 elasticsearch document 리인덱싱 성능 자체 내장되어 있는 메모리와 파일 기반의 큐를 사용하기에 처리 속도와 안정성이 높다. 인덱싱할 document의 수와 용량을 종합적으로 고려해 벌크 인덱싱을 수행하고 파이프라인 배치 크기 조정을 통해 병목현상을 방지하고 성능 최적화 안정성 재시도 로직이나 오류가 발생한 document를 따로 보관하는 dead-letter-queue 내장하고 있음 파이프라인 데이터를 입력받아 실시간으로 변경하고 이를 다른 시스템에 전달하는 역할을 하는 로그스태시의 핵심 기능 입력, 필터, 출력 세 가지 구성요소로 이뤄짐 입력과 출력은 필수 필터는 옵션 { "@version" => "1", "host"

[ElasticStack] Node Query Cache, Shard Request Cache, Field data cache [내부링크]

Cache ES는 동일한 요청에 대해 더 빠른 응답을 주기 위해 해당 쿼리의 결과를 메모리에 저장해서 캐싱 해서 사용 캐시 영역 설명 Node Query Cache 쿼리에 의해 각 노드에 캐싱 되는 영역 Shard Request Cache 쿼리에 의해 각 샤드에 캐싱 되는 영역 Field data cache 쿼리에 의해 필드를 대상으로 각 노드에 캐싱 하는 영역 Node Query Cache 검색 엔진에서 활용하기 적합한 캐시 영역 Filter Context에 의해 검색된 문서의 결과가 캐싱 되는 영역 filter Context로 구성된 쿼리로 검색하면 내부적으로 각 문서에 0과 1로 설정할 수 있는 bitset 설정 filter Context로 호출한 적이 있는 문서는 bitset을 1로 설정해서 사용자가 호출한 적이 있다는 것을 Document에 표시 bitset이 1인 문서들 중에 자주 호출되었다고 판단한 문서들을 노드의 메모리에 캐싱 다만 세그먼트 하나에 저장된 문서의 수가

[Oracle] 옵티마이저, 실행계획, Cost, Hint [내부링크]

SQL 최적화 옵티마이저가 SQL 최적화를 맡음 옵티마이저는 미리 수집한 시스템 및 오브젝트 통계정보를 바탕으로 다양한 실행 경로를 생성해서 비교한 후 가장 효율적인 하나를 선택함 DB 성능을 결정하는 가장 핵심적인 엔진 SQL 옵티마이저 사용자가 원하는 작업을 가장 효율적으로 수행할 수 있는 최적의 데이터 액세스 경로를 선택해 주는 DBMS 핵심 엔진 최적화 단계 사용자로부터 전달받은 쿼리를 수행하는 데 후보군이 될만한 실행계획들을 찾음 데이터 딕셔너리에 미리 수집해 둔 오브젝트 통계 및 시스템 통계정보를 이용해 각 실행계획의 예상 비용 산정 최저 비용인 실행계획 선택 실행계획 SQL 옵티마이저가 생성한 처리 절차를 사용자가 확인할 수 있게 트리 구조로 표현한 것 Cost 쿼리를 수행하는 동안 발생할 것으로 예상되는 I/O 횟수 또는 예상 소요시간을 표현한 값 중요한 게 예상치다. 실행 경로를 선택하기 위해 옵티마이저가 여러 통계정보를 활용해서 계산해 낸 값 실측치가 아니기에 실제

[ElasticStack] 매핑, text, keyword, 인덱스 템플릿, 다이내믹 템플릿 [내부링크]

매핑 JSON 형태의 데이터를 루씬이 이해할 수 있도록 바꿔주는 작업 자동으로 하게 되면 다이내믹 매핑, 사용자가 직접 설정하면 명시적 매핑 다이내믹 매핑 ES의 모든 인덱스는 매핑 정보를 갖고 있지만 인덱스 생성 시 매핑 정의를 강제하지 않는다. 원본 소스 데이터 타입 다이내믹 매핑으로 변환된 데이터 타입 null 필드를 추가하지 않음 boolean boolean float float integer long object object string string 데이터 형태에 따라 date, text/keyword 필드 다만 다이내믹 매핑을 사용하게 되면 불필요한 매핑이 될 수 있다. 명시적 매핑 인덱스 매핑을 직접 정의하는 것 PUT index3 { "mappings": { "properties": { "age" : {"type": "short"}, "name" : {"type": "text"}, "gender" : {"type" : "keyword"} } } } mapping과 pr

[ElasticStack] 분석기, 캐릭터 필터, 토크나이저, 토큰 필터, 커스텀 분석기 [내부링크]

분석기 엘라스틱서치는 전문 검색을 지원하기 위해 역인덱싱 기술을 사용한다. 전문 검색은 장문의 문자열에서 부분 검색을 수행하는 것 역인덱싱은 장문의 문자열을 분석해서 작은 단위로 쪼개어 인덱싱하는 기술 역인덱싱을 이용해서 전문 검색에서 좋은 결과를 얻기 위해서는 문자열을 나누는 기준이 중요 ES에서는 캐릭터 필터, 토크나이저, 토큰 필터로 구성되어 있는 분석기 모듈을 가지고 있다. 분석기에는 반드시 하나의 토크나이저 포함 캐릭터 필터와 토큰 필터는 옵션이고 여러 개를 함께 사용해도 된다. 토큰과 용어 분석기는 필터를 통해 원문에서 불필요한 문자들을 제거한다. 이 과정까지는 문자열 자체가 분리되지 않는다. 토크나이저를 이용해서 필터링 된 문자열을 자르게 되는데 잘린 단위를 토큰 분석기에서는 하나의 토크나이저를 가진다. 토큰들이 복수의 토큰 필터를 거치며 정제되는데, 정제 후 최종으로 역인덱스에 저장되는 상태의 토큰들을 용어 토큰은 분석기 내부에서 일시적으로 존재하는 상태 인덱싱되어 있

[ElasticStack] 쿼리 컨텍스트, 필터 컨텍스트 [내부링크]

쿼리 컨텍스트, 필터 컨텍스트 쿼리 컨텍스트는 질의에 대한 유사도를 계산해 이를 기준으로 더 정확한 결과를 먼저 보여준다. 필터 컨텍스트는 유사도를 계산하지 않고 일치 여부에 따른 결과만을 반환 도큐먼트에 '피자'가 포함되어 있는지를 찾을 때는 쿼리 컨텍스트 사용 연관성을 계산해서 최대한 비슷한 도큐먼트들을 찾아준다. 연관성에 따른 스코어 결과를 제공 도큐먼트 제목이 '피자'인 문서를 찾기 위해서는 필터 컨텍스트 사용 예/아니오만 확인 -> 결과로 제공 스코어를 제공하지 않기에 스코어 계산 과정을 생략할 수 있어서 전체적인 쿼리 속도를 올릴 수 있다. 스코어 계산을 하지 않으면 결과에 대한 업데이트를 매번 수행할 필요가 없기에 캐시 사용 가능 엘라스틱 서치는 기본적으로 힙 메모리의 10% 캐시 사용 캐시를 이용한 빠른 검색을 사용하려면 필터 컨텍스트를 사용 쿼리 컨텍스트 사용 GET kibana_sample_data_ecommerce/_search { "query": { "match

[ElasticStack] 유사도 스코어 BM25, TF IDF, score [내부링크]

유사도 스코어 쿼리 컨텍스트는 엘라스틱에서 지원하는 다양한 스코어 알고리즘 사용 가능 기본적으로는 BM25 알고리즘 이용해서 유사도 스코어 계산 유사도 스코어는 질의문과 Documen의 유사도를 표현하는 값 스코어가 높을수록 찾고자 하는 document의 가깝다는 사실을 의미 explain 옵션을 사용하면 스코어가 어떤 식으로 계산되는지를 알 수 있다. 쿼리 내부적인 최적화 방법과 어떤 경로를 통해 검색되었으며 어떤 기준으로 스코어가 계산되는지 score 계산식은 description 항목에 제공 스코어 알고리즘 BM25 쿼리 컨텍스트로 요청한 응답 값을 보면 hits된 Document는 _score 값을 가지고 있다. score는 document와 query 간의 연관성 수치로 값이 클수록 연관성이 높다 BM25 알고리즘은 검색, 추천에서 많이 사용되는 알고리즘 TF-IDF 개념에 문서 길이를 고려한 알고리즘 검색어가 문서에서 얼마나 자주 나타나는지, 검색어가 문서 내에서 중요한

[ElasticStack] 리프 쿼리, full text query, term level query [내부링크]

리프 쿼리와 복합 쿼리 리프(leaf) 쿼리는 특정 필드에서 용어를 찾는 쿼리 match, term, range 쿼리 등이 있다. 복합(compound) 쿼리는 쿼리를 조합해서 사용되는 쿼리 bool 쿼리 전문 쿼리(full text)와 용어 수준(term level) 쿼리 전문 쿼리 전문 검색을 하기 위해 사용되고 전문 검색을 할 필드는 인덱스 매핑 시 text 타입으로 매핑 용어 수준 쿼리 정확히 일치하는 용어를 찾기 위해 사용 인덱스 매핑 시 필드를 keyword 타입으로 매핑 전문 쿼리 전문 쿼리에서는 match 쿼리를 사용한다. match 쿼리를 사용하게 되면 검색어인 hello world도 [hello, world]로 토큰으로 분리가 된다. 그럼 이 분리된 토큰들로 score를 계산하고 검색한다. 전문 쿼리는 text가 많은 필드에서 특정 용어를 검색할 때 사용함 구글, 네이버 검색 방식 용어 수준 쿼리 키워드 타입을 검색한다고 하자. 키워드 타입은 인덱싱 과정에서 분석기

[ElasticStack] bool 쿼리, must, must_not, should, filter [내부링크]

논리 쿼리 논리 쿼리 복합 쿼리 (Commpound Query)로 전문 검색 쿼리, 용어 쿼리를 조합할 수 있다. 논리 쿼리를 조합할 수 있도록 4개의 타입 지원 타입 설명 must 쿼리를 실행하여 참인 document를 찾는다. 복수의 쿼리를 실행하면 AND 연산을 한다. must_not 쿼리를 실행하여 거짓인 document 찾는다. 다른 타입과 같이 사용할 경우 document 제외 should 단독으로 사용 시 쿼리를 실행하여 참인 document를 찾는다. 복수의 쿼리를 실행하면 OR 연산 실행 다른 타입과 같이 사용할 경우 score에만 활용 filter 쿼리를 실행해서 '예/아니요' 형식의 필터 컨텍스트를 수행 must 타입 bool 쿼리 밑에 must 쿼리를 사용한다. customer_first_name에 'mary'가 들어간 document를 검색한다. match는 전문 검색을 위한 쿼리이다. must 타입에 복수 개의 쿼리를 실행하면 AND 효과를 얻는다. 위 쿼리

[ElasticStack] 집계, metric 집계, bucket 집계, 파이프라인, 부모 집계, 형제 집계 [내부링크]

agg 집계 쿼리는 aggs 파라미터를 이용하면 쿼리 결과에 대한 집계를 생성할 수 있다. my_agg는 사용자가 지정하는 집계 이름이다. agg_type은 집계 타입을 의미한다. metric 집계와 bucket 집계 두 가지 타입의 집계가 있다. metric 집계는 통계나 계산에서 사용되고 bucket 집계는 document를 그룹핑하는데 사용된다. metric 집계 메트릭 집계는 필드의 최소/최대/합계/평균/중간값 같은 통계 결과를 보여줌 필드 타입에 따라서 사용 가능한 집계 타입에 제한이 있다. text 타입 필드는 sum / avg 같은 수치 연산은 계산할 수 없다. avg, min, max, sum, percentils, stats, cardinality, geo-centroid 제공함 stats는 필드의 min, max, sum, avg, count(document 개수)를 한 번에 볼 수 있다. cardinality 필드의 유니크한 값 개수 평균/중간값 평균값을 구할 수

[Spring Batch] Rest API 이용 Job 실행 [내부링크]

REST 방식으로 잡 실행하기 REST API 방식으로 배치 잡을 실행할 수 있긴 하나 즉시 실행할 수 있지는 않다. JobLauncher를 이용하면 REST API 방식으로 실행 가능하다. 스프링 배치는 SimpleJobLauncher 제공 잡의 실행이 기존 잡 인스턴스의 일부인지 새로운 잡의 일부인지를 판별해서 알맞게 동작 SimpleJobLauncher는 전달받은 JobParameters 조작을 지원하지 않는다. 따라서 잡에 JobParametersIncrementer를 사용해야 한다면, 해당 파라미터가 SimpleJobLauncher로 전달되기 전에 적용해야 함 JobLauncher가 사용하는 TaskExecutor를 구성해서 동기, 비동기 실행 방식을 선택할 수 있다. 기본적으로는 TaskExecutor를 사용해 Job을 동기식으로 실행 호출자와 동일한 스레드에서 잡이 수행 기존 스레드가 아닌 다른 스레드에서 잡을 실행하려면 REST 호출로 잡을 시작한 후 잡의 완료를 기다

[Spring Batch] job 재시작 제어 [내부링크]

잡 재시작 방지 JobBuilder의 preventRestart()를 호출해서 잡을 다시 시작할 수 없게 만들 수 있다. preventRestart() 메서드를 호출하면 잡이 실패하거나 어떤 이유로 중지돼도 다시 실행할 수 없다. 재시작 횟수 제한 재시작 횟수 제한은 job 대신 Step 수준에서 제공함 startLimit이 2로 구성되어 있기에 이 Job은 2번까지만 실행 가능 첫 실행은 한 번의 시도이기에 이후에 한 번의 시도만 더 허용한다. allowStartIfComplete allowStartIfComplete true로 설정하면 STEP이 COMPLETE로 종료되어도 재실행 할 수 있다. 동일한 파라미터로 잡을 한 번만 실행시킬 수 있지만 스텝에는 이 규칙이 반드시 적용되지 않는다. 완료된 스텝을 두 번 이상 실행 가능 단 Job의 ExitStatus가 COMPLETE라면 모든 Step에 allowStartIfComplete(true)를 적용해 구성해도 이와 관계없이 Jo

[Spring Batch] ItemReader Jdbc cursor, paging [내부링크]

ItemReader 인터페이스 ItemReader<T> 인터페이스는 Step 입력을 제공할 때 사용하는 read 단일 메서드 정의 org.springframework.batch.item 사용하자. Spring Batch가 read 메서드를 호출하면, 해당 메서드는 Step 내에서 처리할 Item 한 개를 반환 Step에서 Item 개수를 세어서 Chunk 내의 데이터가 몇 개나 처리되었는지 관리 데이터베이스 Reader 데이터베이스는 내장된 트랜잭션 기능 제공 JDBC, Hibernate, JPA 등을 통해서 DB에서 데이터를 읽어올 수 있다. JDBC 대용량 데이터를 한 번에 메모리에 적재하는 건 좋지 않다. JdbcTemplate를 사용하면 전체 ResultSet에서 한 row 씩 순서대로 가져오면서, 모든 row를 필요한 도메인 객체로 변환해서 메모리에 적재하기에 좋지 않다. Spring Batch에서는 한 번에 처리할 만큼의 레코드만 로딩하는 Cursor와 Paging을 제공

[Spring Batch] ItemReader 에러 처리 [내부링크]

Skip Spring batch에서는 특정 예외가 발생했을 때 레코드를 건너뛰는 skip 기능 제공함 두 가지를 고려 어떤 조건에서 레코드를 건너뛸 것인가 얼마나 많은 레코드를 건너뛰게 할 것인가. 어떤 예외를 무시할 것인가 faultTolerant는 fault를 허용한다는 의미이다. 레코드를 건너뛰려면 스프링 배치가 어떤 예외를 건너뛰게 할지, 몇 번까지 예외를 허용할지를 설정 위 예에서는 RuntimeException을 13회까지 건너뛰게 설정함 즉 무시하고 넘어간다는 의미 itemReader에서 한 건씩 읽다가 예외가 발생하면 해당 item을 skip 하고 다음 item itemProcessor에서는 예외가 발생하면 해당 chunk의 첫 단계로 돌아가서 ItemReader로부터 다시 데이터를 받는다. noSkip을 사용하면 건너뛰지 말아야 할 대상을 지정할 수 있다. writer에서 RuntimeException을 일으켜본다. 14번째 하고 끝나버린다. 근데 위에 보면 이미 처

[Spring Batch] Multi Thread Step [내부링크]

다중 스레드 스텝 스텝은 기본적으로 단일 스레드로 처리 다중 스레드 스텝은 잡의 실행을 병렬화하는 가장 쉬운 방법 TaskExecutor 다중 스레드 스텝 개념을 적용하면 배치 Job이 TaskExecutor 추상화를 사용해서 각 청크가 자체 스레드에서 실행되게 할 수 있다. 다중 스레드 스텝을 사용하면 Job 내의 모든 Step은 각 청크를 독립적으로 처리하면서 하나의 스레드 풀 내에서 처리되게 구성 가능 청크가 처리될 때 스프링 배치는 해당 청크에서 어떤 일이 수행됐는 지 추척 스레드 중 하나에서 오류가 발생하면, 잡 처리는 일반적인 스프링 배치 기능에 따라 롤백되거나 종료 step에서 TaskExecutor 구현체를 정의하고 참조해서 사용하면 된다. 다중 스레드 기능 사용 가능 이 잡을 실행하면 스프링은 Step내에서 실행되는 각 청크용으로 새 스레드를 생성해 각 청크를 병렬로 실행 다중 쓰레드 설정을 하고 Thread 이름 로그를 추가하면 Thread 이름이 여러 개가 오고

[Spring Batch] 병렬 스텝 [내부링크]

병렬 스텝 스텝을 병렬로 실행한다. 위의 그림에서 Job은 일단 단일 Step으로 실행 병렬로 두 개의 flow 처리 위쪽은 Step 2를 실행하고 완료되면 Step 3 실행 아래쪽은 Step 4실행 flow 1, 2가 모두 완료되면 Step 5 실행 병렬 Step 구성 Spring의 TaskExecutor를 사용한다. 각 플로우가 자체 스레드에서 실행되기에 여러 Flow를 병렬로 실행 가능 FlowBuilder FlowBuilder의 split를 메서드를 사용해서 병렬로 실행 split 메서드는 TaskExecutor를 argument로 받아서 SplitBuilder를 반환한다. SplitBuilder를 사용하면 원하는 만큼 많은 flow 객체 추가 가능 각 flow는 TaskExecutor의 규약에 따라서 자체 스레드에서 실행 이런 실행 메커니즘은 각 스텝이나 Step의 flow를 병렬로 실행하는 기능 제공 springframework의 flow 사용 split 유의 사항 spl

[Spring Batch] AsyncItemProcessor, AsyncItemWriter [내부링크]

ItemProcssor에서 스텝의 전체 실행 속도를 느리게 만드는 경우가 있다면 새 스레드에서 스텝의 ItemProcssor 부분만 실행하게 만들 수 있다. AsyncItemProcessor ItemProcessor 구현체를 래핑하는 데코레이터 어떤 item이 데코레이터에 전달될 때 위임자의 호출은 새 스레드에서 실행 그런 다음에 itemProcessor의 실행 결과로써 반환된 Future가 AsyncItemWriter로 전달 AsyncItemWriter ItemWriter의 데코레이터 AsyncItemWriter는 Future를 처리해 그 결과를 위임 ItemWriter에 전달한다 AsyncItemProcessor와 AsyncItemWriter는 반드시 함께 사용해야한다. 그렇지 않으면 Future를 사용자가 직접 처리해 결과를 얻어야한다. build.gradle implementation 'org.springframework.batch:spring-batch-integration

[Spring Batch] 배치 처리 테스트 [내부링크]

@SpringBatchTest 자동으로 ApplicationContext에 테스트에 필요한 여러 유틸 Bean을 등록해 주는 어노테이션 JobLauncherTestUtils launchJob(), launchStep()과 같은 스프링 배치 테스트에 필요한 유틸성 메서드 지원 JobRepositoryTestUtils JobRepository를 사용해서 JobExecution을 생성 및 삭제 기능 메서드 지원 StepScopeTestExecutionListener @StepScope 컨텍스트를 생성해 주며 해당 컨텍스트를 통해 JobParameter 등을 단위 테스트에서 DI 받을 수 있음 JobScopeTestExecutionListener @JobScope 컨텍스를 생성해 주고 해당 컨텍스를 통해서 JobParameter 등을 단위 테스트에서 DI 받을 수 있다. JobLauncherTestUtils @SpringBatchTest 어노테이션을 통해서 주입받는 Util Class 실행

[ElasticStack] 엘라스틱서치 index, document, bulk [내부링크]

엘라스틱 서치의 모든 기능은 REST API 형태 인덱스 document를 저장하는 논리적 구분자 document는 실제 데이터를 저장하는 단위 RDBMS의 테이블과 유사한 개념 동일한 인덱스에 있는 document는 동일한 스키마(매핑)을 갖는다. 모든 document는 반드시 하나의 인덱스에 포함 document document는 엘라스틱서치에서 데이터가 저장되는 기본 단위로 JSON 형태 하나의 document는 여러 필드와 값을 갖는다. 스키마에 따른 그룹핑 일반적으로 스키마(매핑)에 따라 인덱스를 구분함 관리 목적의 그룹핑 기본적으로 인덱스는 용량이나 숫자 제한 없이 무한대의 도큐먼트를 포함 가능 이론적으로 하나의 인덱스에 수억 개의 document 저장 가능 하지만 인덱스가 커지면 검색 시 많은 document를 참조해야 하기에 성능이 나빠짐 운용할 때 인덱스 용량 제한을 둠 특정 도큐먼트 개수에 도달하거나 특정 용량을 넘어서면 인덱스 분리 날짜/시간 단위로 분리 인덱스

[Spring Batch] Step Flow [내부링크]

조건 로직 Spring batch의 Step은 잡내에서 StepBuilder의 Next 메서드를 이용해서 지정한 순서대로 실행됨 전이를 사용하면 다른 순서로 실행할 수 있다. 위 예제 코드는 firstStep의 실행 결과가 정상이면 successStep 실행 firstStep이 ExitStatus로 FAILED를 반환하면 failureStep을 실행 job의 On 메서드는 Step의 ExitStatus를 평가해서 어떤 일을 수행할지를 결정할 수 있다. BatchStatus, ExitStatus BatchStatus는 job이나 step의 현재 상태를 식별하는 JobExecution 또는 StepExecution의 애트리뷰트 ExitStatus는 job이나 step 종료 시 스프링 배치로 반환되는 값 스프링 배치는 어떤 스텝을 수행할지 결정할 때 이 값을 확인 문자열이기에 와일드카드 사용할 수 있다. ExitStatus를 확인해서 다음에 어떤 스텝을 진행할지 결정할 수 있지만 충분하지

[Spring Batch] JobRepository와 메타데이터 [내부링크]

JobRepository JobRepository 인터페이스, JobRepository 인터페이스를 구현해 데이터를 저장하는 데 사용되는 데이터 저장소의 의미를 가진다. 스프링 배치는 잡내에서 사용할 수 있는 두 가지 데이터 저장소를 제공한다. 하나는 인 메모리 저장소 하나는 관계형 데이터베이스 관계형 데이터베이스 크게 6개의 테이블이 존재한다. BATCH_JOB_INSTANCE 스키마의 시작점 잡의 논리적 실행을 나타냄 필드 설명 JOB_INSTANCE _ID 테이블의 기본 키 VERSION 낙관적인 락에 사용되는 레코드 버전 JOB_NAME 실행된 잡 이름 JOB_KEY 잡 이름과 잡 파라미터의 해시 값으로 JobInstance를 고유하게 식별하는 데 사용 BATCH_JOB_EXECUTION 필드 설명 JOB_EXECUTION_ID 테이블의 기본 키 VERSION 낙관적인 락에 사용되는 레코드 버전 JOB_INSTANCE_ID BATCH_JON_INSTANCE 외래 키 CREAT

[Spring Batch] StepListener [내부링크]

스텝 리스너 스텝 리스너는 이벤트 시작 및 종료를 처리하고 잡 전체가 아닌 개별 스텝에서 이뤄짐 afterStep의 반환 값은 ExitStatus이다. Listener가 Step이 반환한 ExitStatus를 Job에 전달하기 전에 수정할 수 있다. 위 기능은 Listener가 Job 처리의 성공 여부를 판별하는 데 사용할 수 있다. StepExecutionListener와 ChunkListener 인터페이스를 사용한다. 각각 스텝과 청크의 시작과 끝에서 특정 로직을 처리할 수 있게 해줌 StepListener는 모든 스텝 리스너가 상속하는 마커 인터페이스이다. listener에 추가를 해주면 사용할 수 있다.

[Spring Batch] tasklet Step, chunk Step [내부링크]

STEP 알아보기 스텝은 잡의 구성 요소를 담당 스텝은 독립적이고 순차적으로 배치 처리를 수행함 트랜잭션은 스텝 내에서 이루어짐 독립되도록 의도적으로 설계 배치 처리는 2가지도 나뉨 Tasklet 처리 Tasklet.execute 메서드가 RepeatStaus.FINISHED를 반환할 때까지 트랜잭션 범위 내에서 반복적으로 실행되는 코드 블록을 만들 수 있음 chunk 기반 최소한 2 ~ 3개의 컴포넌트로 구성 각 청크는 자체 트랜잭션으로 실행됨 마지막으로 성공한 트랜잭션 이후부터 다시 시작할 수 있다. Tasklet Step 만드는 방법에는 2가지가 있다. 사용자가 작성한 코드를 Tasklet step처럼 실행되도록 하는 것 MethodInvokingTaskletAdapter를 사용해서 정의 가능 이 구현체를 사용하면 기존에 존재하던 다른 클래스 내의 메서드를 잡내의 tasklet처럼 실행할 수 있다. Tasklet 인터페이스 구현 execute 메서드를 구현하며 처리 완료 이후에

[Spring Batch] 배치 기본, Job, Step [내부링크]

JobRepository 다양한 배치 수행과 관련된 수치 데이터(시작 시간, 종료 시간, 상태, 읽기/쓰기 횟수) 관리 잡의 상태 관리 일반적으로 관계형 데이터베이스 사용 스프링 배치 내의 대부분의 주요 컴포넌트가 공유한다. 각 스텝이 실행되면 현재 상태로 갱신됨 실행된 스텝 현재 상태 읽은 아이템 및 처리된 아이템 수 등이 다 저장됨 jobLauncher 잡을 실행함 execute 메서드 호출 잡의 재실행 가능 여부 검증. 잡의 실행 방법(현재 스레드에서 수행할지 스레드 풀을 통해 실행할지) 파라미터 유효성 검증 스프링 부트가 즉시 잡 시작하는 기능 제공함 일반적으로 직접 다룰 필요는 없다. JobInstance, JobExecution JobInstance 잡의 이름, 잡의 논리적 실행을 위해 제공되는 고유한 식별 파라미터 모음으로써 유일하게 존재 잡이 다른 파라미터로 실행될 때마다 새로운 JobInstance가 생성된다. 실패한 이후 재실행하면 새로운 게 생성되지 않음 JobE

[Spring Batch] job parameter 유효성 검증 [내부링크]

잡 파라미터 유효성 검증 인터페이스를 구현하고 해당 구현체를 Job 내에서 구성하면 된다. DefaultJobParametersValidator 다만 DefaultJobParametersValidator를 기본적으로 제공함 requiresKey는 필수적인 파라미터 optionalKeys는 옵션이다. name과 age 이 외에 다른 파라미터 변수가 전달되면 유효성 검증에 실패한다. money를 추가하면 실패함 옵션 키가 구성되어있지 않고 필수 키만 구성되어 있다면 필수 키를 전달하기만 하면 어떤 키의 조합을 전달해도 유효성 검증 통과함. optional을 없애면 성공함 DefaultJobParametersValidator는 파라미터 존재 여부를 제외한 다른 유효성 검증을 수행하지 않는다. 더 강력한 게 필요하면 JobParameterValidator를 용도에 맞게 구현해야됨 다만 JobBuilder 의 메서드는 하나의 JobParameterValidator 인스턴스만 지정하게 되어 있

[Spring Batch] RunIdIncrementer [내부링크]

RunIdIncrementer JobParametersIncrementer는 잡에서 사용할 파라미터를 고유하게 생성할 수 있도록 스프링 배치가 제공하는 인터페이스 기본적으로 run.id long 타입 파라미터의 값을 증가시킨다. validator의 옵셔널 키에 run.id를 추가해 주고 new RunIdIncrementer()를 사용해야 됨 JobParametesBuilder의 addDate 코드이다. Spring Batch에서 제공 커스텀 한 방식의 위와 같이 사용하면 된다. validator의 옵셔널키에 CurrentDate를 추가해 줘야 한다. 또한 Job에서도 custom 한 Class를 넣어줘야 한다. 실행을 하게 되면 currentDate가 바뀌는 걸 볼 수 있다.

[Spring Batch] JobListener [내부링크]

잡 리스너 모든 잡은 생명주기를 갖는다. 스프링 배치는 생명주기의 여러 시점에 로직을 추가할 수 있는 기능 제공 잡과 관련이 있는 건 JobExecutionListener를 사용 JobExecutionListener beforeJob, afterJob 두 개의 콜백메서드 제공함 알림 초기화 : 잡 실행 전에 준비할 게 있다면 beforeJob 메서드에 해당 로직 추가 정리 : 잡 실행 이후에 정리 작업 수행할 때 사용 인터페이스를 상속받아서 beforeJob, afterJob 메서드에 구현을 하면 된다. afterJob 메서드는 잡의 완료 상태에 관계없이 호출이 된다. 그러므로 잡의 종료 상태에 따라 어떤 일을 수행할지 결정할 수 있다. Job에 리스너를 추가하면 된다. 실행하면 위와 같이 나오게 된다. afterJob에서 배치 종료 상태에 따라 로직을 작성할 수 있다. 인위적으로 에러를 발생시키면 if 문에 걸리게 된다. 또한 afterJob 잡의 완료 상태에 관계없이 호출이 되기

[KAFKA] Consumer Offset Commit Strategies [내부링크]

enable.auto.commit True 오토 커밋을 true로 하게 되면 배치가 동시에 처리된다. 컨슈머 API를 사용할 때 오프셋이 정기적으로 커밋 된다. At Least Once가 특정 상황에서 기본적으로 활성화된다. poll 함수가 코드에 호출될 때 항상 커밋 된다. 그러면 auto.commit.interval.ms의 간격마다 오프셋을 비동기적으로 커밋 한다. 이때 poll을 호출하기 전에 모든 메시지를 처리해야 된다. 처리하지 못하게 되면 메시지가 손실이 된다. 커밋 한 오프셋부터 데이터를 읽기에 그전 오프셋에서 문제가 발생한 데이터는 읽지 못함 이를 위해서 enable.auto.commit을 비활성화한 다음에 어디까지 처리되었는지에 따라 commitSync or commitAsync를 호출해야 된다. https://www.conduktor.io/kafka/delivery-semantics-for-kafka-consumers/ 위와 같이 Poll을 한 뒤 시간이 지나면 비

[KAFKA] Consumer Offset Reset Behavior [내부링크]

컨슈머 오프셋 재설정 동작 애플리케이션에 버그가 있으면 컨슈머가 중단될 수 있다. 기본적으로 kafka에는 7일의 데이터 리텐션(보유)이 있다. 즉 컨슈머가 7일 넘게 중단이 되면 읽으려 하는 오프셋이 무효화된다. 이럴 때 알아야 하는 게 컨슈머 오프셋 재설정 동작 latest 컨슈머가 로그 끝에서 읽도록 한다. auto.offset.reset=latest earliest 컨슈머가 로그 시작 부분에서 읽도록 한다. --from -beginning auto.offset.reset=earliest none 오프셋을 찾지 못했을 때 예외가 발생한다. auto.offset.reset=none 처리를 다시 시작하기 전에 데이터를 복구할 방법을 찾고 싶을 때 사용한다. offset.retention.minutes kafka 2.0 이전 버전에서는 하루 동안 새로운 데이터를 읽지 못 하면 오프셋 손실 kafka 2.0 보다 높은 버전에서는 컨슈머가 7일 동안 데이터를 읽지 못 하면 오프셋 손실

[서평] 직장인을 위한 챗GPT 이안 클레이턴 지음, 김상유 옮김 [내부링크]

이번에 한빛 미디어에서 받은 책은 직장인을 위한 챗 GPT입니다. Chat GPT가 나온 이후로 챗 GPT에게 "어떻게 질문을 하냐" 가 정말 중요하게 변한 것 같습니다. 이 책은 책 GPT를 어떻게 잘 활용하는 지를 알려주고 있습니다. 책의 앞부분과 뒷부분은 위와 같습니다. 깔끔한 초록색으로 나와져있었네요 챗 GPT 색깔이 초록색이라서 그런가봅니다. 책의 저자가 설명하는 책에 대한 설명입니다. 간단하게 요약하면 책 GPT 사용 방법입니다. 목차는 다음과 같습니다. 먼저 프롬프트가 무엇인지 설명합니다. 그리고 이제 산업별부터 시작해서 여러 분야에 대해서 챗 GPT를 어떻게 사용해야되는지 알려줍니다. 뒷부분에는 자기 계발과 관련된 프롬프트도 나와있습니다. 책의 6장에의 산업분야입니다. 프롬프트를 어떻게 활용하는 지 알려주고 어떤 산업 분야에서 활용할 수 있는 지 알려줍니다. 제 직업이 IT쪽이라서 IT쪽으로 가져와봤습니다. IT 분야엣서 활용할 만한 문제들을 알려줍니다. 또한 챗 GP

Spring boot jdbc sql log 설정 추가 [내부링크]

build.gradle // https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1 implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16' log4jdbc 추가 application.yml url과 driver-class-name에 추가 log4jdbc.log4j2.properties 파일 추가 resource 폴더에 파일 추가 log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator log4jdbc.dump.sql.maxlinelength=0 해당 내용 추가 logback.xml 추가 resources에 logback.xml 추가 <configuration> <appender name="STDOUT" class="ch.qos.logback

[Spring Batch] ExecutionContext [내부링크]

ExecutionContext 배치 처리는 특성상 상태를 가지고 있다. JobExecution은 상태를 저장하는 여러 곳 중 하나 잡이나 스텝이 진행될 떄 변경 잡 상태는 ExecutionContext에 저장된다. ExecutionContext는 배치 잡의 세션 키 - 값 쌍으로 보관 잡을 다루는 과정에서 여러 개의 ExecutionContext가 존재할 수 있다. 모든 것이 JobRepository에 저장됨 Job 범위 - 각 Job의 JobExecution에 저장되며 동일한 Job 내에서만 Step 간 데이터 공유가 가능 Step 범위 - 각 Step의 StepExecution에 저장되며 Step 사이에서는 데이터 공유 불가능 ExecutionContext 조작 JobExecution 또는 StepExecution 일부분 사용하려면 JobExecution 또는 StepExecution에서 가져와야 한다. 스텝 -> job으로 넘어가는 일이 필요하다. BATCH_JOB_EXEUCT

[KAFKA] Consumer Group, Partition Rebalance, Static Group MemberShip [내부링크]

Partition Rebalance Consumer가 그룹에 합류하거나 나갈 때마다 파티션이 이동하게 된다. 이때 파티션이 컨슈머 사이에서 이동하는 상황을 리밸런싱이라고 한다. 리밸런싱은 컨슈머가 그룹을 나가거나 합류할 때마다 발생한다. 적극적 리밸런싱 파티션 3개가 있고 컨슈머 그룹에 컨슈머가 2개 있는 상황 이때 컨슈머가 기존 그룹에 합류하게 된다. 적극적 리밸런싱은 컨슈머가 그룹에 합류하게 되면 모든 컨슈머의 읽기 작업을 중단한다. 읽기 작업을 중단하고 파티션 멤버십을 포기한다. 즉 읽기를 진행하는 컨슈머도 없고 파티션도 없다는 의미이다. 모든 컨슈머가 다시 그룹에 합류해서 새로운 파티션을 무작위로 할당받는다. 전체 컨슈머 그룹이 처리를 멈추는 데 이걸 Stop the World 이벤트라고 한다. Stop the world로 인해서 컨슈머가 원래 있던 파티션으로 되돌아간다는 보장이 없다. 하나의 컨슈머에게 전과 같은 파티션을 할당해 주고 싶은데 해줄 수가 없고 일부 컨슈머가 같

[KAFKA] Auto Offset Commit Behavior [내부링크]

Auto Offset Commit Behavior 자바 Consumer API에서는 Polling을 정규적으로 수행할 때마다 오프셋도 정규적으로 커밋 된다. 언제 Offset Commit 컨슈머에서 poll을 호출할 때마다 auto.commit.interval.ms 설정 시간이 경과된다. enable.auto.commit을 참으로 하면 설정 시간이 지나면 커밋 한다. 카프카 컨슈머를 자바에서 실행해 보면 interval는 기본으로 5000ms, enable auto commit은 true로 되어있는 걸 볼 수 있다. properties로 설정할꺼면 위와 같이 설정하면 된다. 위 코드에서 5초마다 Poll을 수행한다는 의미이다. 5초가 지난 다음에 다시 Poll을 호출하면 비동기적으로 오프셋을 커밋 한다는 의미다. 기록을 받아서 pll을 다시 호출하기 전에 오프셋 처리를 하기에 최소한 한 번으로 설정이 되어있다.

[KAFKA] Producer Acknowledgement [내부링크]

ACK ack을 통해서 Producer는 브로커에 데이터를 전송할 때 데이터 쓰기 작업이 완료됐다는 응답을 받을 수 있다. ack은 0, 1, all(-1)이 있다. ACK 0 프로듀서가 확인 응답을 기다리지 않겠다는 의미. 데이터 손실 가능성이 있다. 프로듀서는 메시지가 전송된 순간 메시지 쓰기에 성공했다고 간주함 브로커가 수신하기까지 기다리지 않는다. 리더에게 데이터 전송 후 리더가 쓰기 작업을 하던 중에 브로커가 오프라인 상태가 되거나 예외가 발생해도 Producer 쪽에서는 문제가 발생한 걸 알 수가 없고 데이터는 손실된다. 메시지를 유실해도 괜찮을 때 사용 가능함 또한 설정값 중 처리량이 가장 많다. 오버헤드가 최소화된다. ACK 1 프로듀서는 리더 브로커에 확인 응답을 받을 때 쓰기가 성공했다고 간주함. 카프카 1.0 ~ 2.8까지 기본 값 프로듀서가 리더에 데이터를 보내면 리더가 쓰기 작업을 한 뒤 요청이 성공적이라고 응답한다. 하지만 리더가 요청을 받긴 하지만 데이터가

[KAFKA] 멱등 프로듀서(Idempotent Producer) [내부링크]

상황 프로듀서가 아파치 카프카에 데이터를 전송할 때 네트워크 오류로 인해서 중복된 메시지가 전송될 수 있다. 정상 요청 카프카에 데이터를 생성하면 카프카가 로그에 데이터 커밋 그 후 프로듀서에게 수신 확인 전달 중복 요청 카프카에 데이터를 생성하면 카프카가 로그에 데이터 커밋 수신 확인 반환할 때 ACK을 프로듀서에게 전달하지 못한다. ACK을 받지 못한 프로듀서는 재시도를 하게 된다. 똑같은 메시지를 보내면 카프카는 새로운 요청으로 여겨서 로그에 중복 커밋 그 후 ACK을 보내게 된다. 프로듀서 입장에서는 두 개의 요청 중 하나만 성공했고 카프카가 수신 확인을 반환했지만 카프카는 실제로 메시지 두 개를 커밋 한 것이다. 멱등 프로듀서 위와 같은 문제를 해결하기 위해서 멱등 프로듀서를 사용한다. 네트워크 오류에도 중복을 허용하지 않는다. https://www.conduktor.io/kafka/idempotent-kafka-producer/ 중복 요청인 경우 카프카 쪽에서 중복 생성인

[KAFKA] Message Compression, Linger.ms, batch.size [내부링크]

메시지 압축 프로듀서가 카프카에 데이터를 전송할 때 텍스트로 된 데이터 전송 Ex : Json 형식 압축을 하게 되면 메시지의 크기가 줄어들어서 카프카로의 전송 속도가 빨라지고 디스크 내 저장 공간을 적게 차지한다. 압축은 다양한 곳에서 할 수 있다. 프로듀서 압축, 브로커에서도 압축할 수 있다. 압축 과정에서 반복되는 값을 한 번에 압축하기에 메시지 배치의 크기가 클수록 압축률이 올라가서 효율 증가 압축 종류로는 none, gzip, lz4, snappy, zstd가 있다. 압축을 활성화하면 메시지 배치가 압축된 메시지의 배치로 압축된다. 크기가 줄어들기에 전송 속도 증가 요청 크기가 1/4 정도로 줄일 수 있기에 디스크 효율 증가 지연 시간이 줄어들고 처리량이 늘어나게 된다. 압축 단점 요즘은 거의 무의미 Producer가 CPU 사이클을 사용해서 계산과 압축을 수행 Consumer도 CPU 사이클을 사용해서 메시지 배치의 압축을 해제하고 읽어야 함 snappy와 lz4를 먼저

[KAFKA] Default Partitioner, Sticky Partitioner [내부링크]

key Hashing 프로듀서에서 카프카로 메시지를 보낼 때 키가 null이 아니면 레코드는 파티셔너 로직을 거쳐서 어떤 파티션에 할당될지 결정된다. 이를 key Hashing이라고 한다. Default Partitioner 기본 파티셔너에서는 murmur2 알고리즘을 사용해서 키를 해싱 한다. 위 식을 통해서 동일한 키는 동일한 파티션에 할당이 된 게 만든다. 하지만 식의 오른쪽에 파티션의 개수가 있기에 기존 토픽에 파티션을 추가하면 식의 결괏값이 달라짐 따라서 동일한 키가 동일한 파티션에 할당된다는 보장이 없게 된다. 이럴 경우 파티션을 추가하는 대신 새로운 토픽을 만드는 것이 좋다 라운드 로빈 파티셔너 카프카 2.3까지는 기본이 Round Robin 방식이다. https://www.conduktor.io/kafka/producer-default-partitioner-and-sticky-partitioner/ 프로듀서가 6개의 메시지를 전송하고 파티션이 5개 있는 토픽 라운드 로

[KAFKA] Delivery Sementics [내부링크]

At Most Once At Most Once 최대한 한 번인 경우이다. 이는 메시지 배치를 받자마자 오프셋이 커밋 되는 경우이다. https://www.conduktor.io/kafka/delivery-semantics-for-kafka-consumers/ 이 방법은 컨슈머에서 문제가 발생하면 다시 읽지 않기 때문에 메시지가 손실된다. 중요한 게 컨슈머 그룹의 컨슈머가 배치 읽고 바로 오프셋을 커밋 한다. 그 후에 데이터 처리를 시작한다. 위의 그림에서 일단 5번째까지 배치에 있는 데이터를 읽고 그다음에 처리 시작 이때 3번째까지 데이터를 처리하다가 4번째부터 문제가 생기게 되면 컨슈머는 다시 읽기를 시작한다. 다시 읽기 시작하면 마지막으로 커밋 된 부분부터 읽는다. 그렇기에 4번째와 5번째는 읽지 못하기에 데이터가 유실된다. 각 메시지를 최대한 한 번 보거나 처리하기 때문에 At Most Once이다. At Least Once 최소한 한 번 본다는 At Least Once 보통

[KAFKA] Topic CLI [내부링크]

주키퍼 실행 zookeeper-server-start.sh 위 명령어를 사용하면 properties가 있어야 한다고 나온다. 이건 kafka/bin/config 폴더에 있다. zookeeper-server-start.sh /Users/a1101902/Desktop/kafka_2.13-3.4.0/config/zookeeper.properties kafka-server-start.sh /Users/a1101902/Desktop/kafka_2.13-3.4.0/config/server.properties 왼쪽 주키퍼 오른쪽 카프카 둘 중 하나가 정지되면 카프카가 멈춘다. 항상 주키퍼와 카프카를 실행시켜 놓고 있어야한다. 카프카 토픽 생성 카프카 토픽 생성 kafka-topics.sh --bootstrap-server localhost:9092 --topic first_topic --create 9092포트로 이름이 first_topic인 토픽을 생성한다. 카프카 파티션 설정 kafka-to

[KAFKA] Producer CLI [내부링크]

토픽에 데이터 생성 일단 토픽이 있어야 된다. kafka-topics.sh --bootstrap-server localhost:9092 --topic first_topic --create --partitions 1 그 후에 Producer CLI로 데이터 생성 kafka-console-producer.sh --bootstrap-server localhost:9092 --topic first_topic 위 명령어를 입력하면 메시지를 생성할 수 있다. 그만 만들고 싶으면 CTLG + C 누르면 된다. kafka-console-producer.sh --bootstrap-server localhost:9092 --topic first_topic --producer-property acks=all acks=all을 사용하면 모든 토픽이 데이터를 다 확인하게 만든다. 데이터 유실 방지 존재하지 않는 토픽에 데이터 생성 타임아웃이나 오류 발생 존재하지 않는 no_topic에 메시지를 입력하면 에

[KAFKA] Consumer CLI [내부링크]

토픽 생성 kafka-topics.sh --bootstrap-server localhost:9092 --topic second_topic --create --partitions 3 Consumer CLI kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic second_topic 위 명령어로 생성된 second_topic을 Consume 하기 시작한다. 위가 Consumer 아래가 Producer이다. kafka-console-producer.sh --bootstrap-server localhost:9092 --producer-property partitioner.class=org.apache.kafka.clients.producer.RoundRobinPartitioner --topic second_topic 라운드 로빈 방식을 적용한 코드이다. 이 방식을 적용하지 않으면 계속 동일한 파티션에 데이터가 쌓이게 된다.

[KAFKA] Consumer Group CLI [내부링크]

토픽 생성 kafka-topics.sh --bootstrap-server localhost:9092 --topic third_topic --create --partitions 3 3개의 파티션을 가지는 토픽 생성 Consumer kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic third_topic --group my-first-application Consumer를 실행하고 Consumer에 대해서 그룹 ID를 지정한다. my-first-application Producer kafka-console-producer.sh --bootstrap-server localhost:9092 --producer-property partitioner.class=org.apache.kafka.clients.producer.RoundRobinPartitioner --topic third_topic 또 다른 Consumer 위에서

[KAFKA] JAVA 연동 및 CallBack, Partitioner [내부링크]

코드 public class ProducerDemo { private static final Logger log = LoggerFactory.getLogger(ProducerDemo.class.getSimpleName()); public static void main(String[] args) { log.info("hello world"); // 프로듀서 설정 Properties properties = new Properties(); properties.setProperty("bootstrap.severs", "127.0.0.1:9092"); //브로커와 연결 properties.setProperty("key.serializer", StringSerializer.class.getName()); //직렬화 properties.setProperty("value.serializer", StringSerializer.class.getName()); // 프로듀서 생성 final KafkaP

[KAFKA] Producer Key [내부링크]

Producer Key 메시지를 보낼 때 Key를 설정하면 동일한 키는 항상 동일한 파티션으로 들어가게 된다. ProducerRecord class에 인자로 key를 넣어줄 수 있다. 위와 같이 코드를 작성한다. 로그를 보게 되면 같은 아이디를 가지는 메시지는 같은 파티션으로 들어가는 걸 확인할 수 있다. 또한 비동기식으로 데이터를 보내는 것도 확인이 가능하다. 아이디가 순서대로 되어있지 않다.

[KAFKA] Consumer Java API, Shutdown [내부링크]

코드 public class ConsumerDemo { private static final Logger log = LoggerFactory.getLogger(ConsumerDemo.class.getSimpleName()); public static void main(String[] args) { log.info("kafka Consumer"); String groupId = "java-app"; String topic = "demo_topic"; // 프로듀서 설정 Properties properties = new Properties(); properties.setProperty("bootstrap.servers", "127.0.0.1:9092"); //브로커와 연결 properties.setProperty("key.deserializer", StringDeserializer.class.getName()); //직렬화 properties.setProperty("value.deser

[KAFKA] Consumer Groups [내부링크]

demo_topic-1 파티션을 할당받음 Consumer 를 실행하면 partition 1로만 데이터를 받는다. demo_topic-2 파티션을 할당받음 Consumer 를 실행시키면 파티션 2를 할당받은 건 파티션 2로만 읽는 걸 확인할 수 있다. 기존에 있던 Consumer 한 개를 종료하면 다른 Consumer가 파티션을 할당받게 된다. 기존에 한 개 더 켜놓고 있었음

[JAVA] 컬렉션 팩토리 List, Set, Map [내부링크]

컬렉션 팩토리 기존에 리스트 생성 방법 리스트를 만들 때 위의 두 가지 방법을 이용해서 만들 수 있다. 다만 두 번째 방법은 고정 크기의 리스트를 만들었기에 요소 갱신은 가능하지만 새 요소를 추가하거나 요소를 삭제할 수는 없다. UnSupportedOperationException이 발생한다. 집합으로 바꾸면 오류가 발생하지 않는다. 하지만 불필요한 객체를 할당하기도 하고 List를 원하는 데 Set이 반환 결과다. 리스트 팩토리 자바 9에서부터는 List.of를 사용해서 리스트를 만들 수 있다. 하지만 add를 하게 되면 오류가 발생한다. List.of 또한 변경할 수 없는 리스트로 만들어진다. set 메서드를 사용해도 예외가 발생한다. Arrays.asList는 발생하지 않는다. List 인터페이스를 보면 of의 여러 개의 오버로드 버전이 있다. 다중 요소를 받을 수 있도록 API를 구현하지 않는 이유는 다음과 같다. 내부적으로 가변 인수 매개변수를 사용하면 추가 배열을 할당해서

[JAVA] 자바 8 이후의 Map [내부링크]

맵 처리 자바 8에서는 Map 인터페이스 디폴트 메서드 추가 forEach 메서드 기존 방법으로는 위와 같이 구현을 해야 된다. default 메서드를 사용할 수 있다. 위와 같이 사용 가능하다. 정렬 Entry.comparingByValue Entry.comparingByKey 위의 두 메서드를 사용해서 각각 value와 key를 이용해서 정렬할 수 있다. forEachOrdered는 순서를 보장한다. getOrDefault Map에서 찾으려는 키가 없으면 기존에는 NPE가 발생한다. 이를 위해서 기본값을 반환하는 방식으로 이 문제를 해결할 수 있다. 위 삼항 연산자를 보면 key 값이 null이 아니거나 key를 포함하면 get(key) 값을 리턴하고 둘 다 false 이면 defaultValue를 리턴한다. 첫 번째 인수로는 키를, 두 번째 인수로 기본값을 받으며 맵에 키가 존재하지 않으면 두 번째 인수로 받은 기본값을 반환한다. 계산 패턴 맵에 키가 존재하는지에 따라 어떤 동

[JAVA] Optional [내부링크]

Optional java.util.Optional<T> 자바 8에서부터 사용 가능 선택형 값을 캡슐화하는 클래스 값이 있으면 Optional 클래스는 값을 감싼다. 값이 없으면 Optional.empty 메서드로 Optional을 반환 null 참조와 Optional.empty()는 다르다. Optional의 역할은 더 이해하기 쉬운 API를 설계하도록 돕는 것이다. 메서드의 시그니처만 보고도 선택형 값인지를 구별할 수 있다. Optional이 등장해서 언랩해서 값이 없을 수 있는 상황에 적절하게 대응하도록 강제하는 효과가 있다. Optional.empty()를 이용하면 빈 Optional 객체를 얻을 수 있다. Optional.of로 null이 아닌 값을 포함하는 Optional을 만들 수 있다. 위와 같이 null을 넣게 되면 에러가 발생한다. of 정적 팩토리 메서드에 Objects.requireNonNull을 사용하고 있다. Optional.ofNullable로 null 값을

[KAFKA] Topic, Producer, Consumer [내부링크]

토픽 토픽 : 카프카 클러스터에 있는 특정 스트림 데이터에 대한 검증이 없기에 여러 종류의 데이터를 저장할 수 있음 이름을 이용해서 토픽 구별 토픽 안에 있는 메시지 순서를 데이터 스트림이라고 부름 토픽을 통해 데이터 스트림을 만든다. 카프카 토픽에 데이터를 추가하기 위해서 producer 사용 데이터를 읽기 위해서 Consumer 사용 카프카에 쿼리를 할 수는 없다. 파티션 토픽은 여러 개의 파티션으로 분할된다. 각각의 파티션에 있는 메시지들은 순서대로 저장됨 오프셋이라는 증가하는 아이디를 가짐 카프카는 불변성임 데이터를 추가하고 난 뒤에 데이터를 삭제하거나 변경할 수 없음 파티션에 계속 기록 트럭이 20초마다 카프카에 위치를 전송함 (Producer) 대시보드나 알림 서비스에서 Consume 해서 사용함 중요 카프카에 있는 데이터는 불변성 카프카의 데이터는 시간이 지나면 사라짐 기본 7일 오프셋은 특정 파티션에만 의미가 있다. 오프셋 재사용은 안됨 오프셋의 순서는 한 파티션에서만

[KAFKA] Consumer Groups, Offset, Brokers, Discovery, replica, Zookeeper [내부링크]

Consumer Groups 한 토픽이 여러 개의 파티션으로 나눠져 있다. 동일한 응용프로그램의 일부이므로 동일한 "논리적 작업"을 수행하는 컨슈머는 Kafka 컨슈머 그룹으로 그룹화할 수 있습니다. 각각의 컨슈머들이 다른 파티션을 읽기에 컨슈머 그룹이 카프카 토픽 전체를 읽게 된다. 브로커 하나에만(어떤 브로커든) 연결하고, 읽어 오고 싶은 토픽 이름만 제공하면 됩니다. 카프카가 호출을 적당한 브로커와 파티션으로 라우팅해 줍니다! 파티션보다 컨슈머가 많을 때 파티션보다 컨슈머가 많을 때는 읽을 파티션이 없는 컨슈머는 비활성화된다. 정상이다. 하나의 토픽에 여러 개의 컨슈머 그룹 하나의 토픽에 여러 개의 컨슈머 그룹이 있는 건 괜찮다. 각각의 그룹에서 모든 토픽을 다 읽는다. 그룹 3 같은 경우는 한 개의 컨슈머가 세 개의 파티션에서 데이터를 읽는다. Consumer Offset Consumer Offset을 사용해서 카프카에서 데이터를 어디까지 읽었는지 파악할 수 있다. 즉 카프카

[1년 전 오늘] [1년 전 오늘] [1년 전 오늘] 1년 후 [내부링크]

2022.4.3. 1년 전 오늘 [1년 전 오늘] [1년 전 오늘] 1년 후 1년 전 오늘의 1년 전 오늘 20년에는 21년에는 코로나가 잠잠해질 줄 알았는데 아니었다 ㅋ 21년에는 그래도 22년에는 코로나가 끝나있을 줄 알았는데 ㅋㅋㅋㅋ 말도 안 되는 상상이었다~ 2년 동안 코로나가 줄기는 커녕 계속 늘었다~~ 23년에는 끝나있겠지? ㅎ 음 후회 없도록 살려고 여전히 노력했으나 인간이 후회 없이 ... 류리상자 무려 1년 전 오늘의 1년 전 오늘의 1년 전 오늘.. 코로나는 거의 끝난 것 같고.. 저 글 쓰고 2개월 뒤에 취업했다. 아주 잘 살고 있다 ㅎ

[Effective Java] 예외는 진짜 예외 상황에만 사용하라. [내부링크]

예외는 진짜 예외 상황에만 사용하라. try { int i = 0; while(true) range[i++].climb()' catch(ArrayIndexOutOfBoundsException e) {} 위 코드는 직관적이지 않다. 무한 루프를 돌다가 배열 끝에 도달하면 ArrayIndexOutOfBoundsException을 발생시킨다. for(Mountain m : range) { m.climb(); } 위와 같이 작성하면 개발자가 이해하기 더 쉬워진다. try ~ catch를 이용해서 예외를 잡을 필요도 없어지고 배열의 끝에 도달했을 때 예외를 발생시켜서 종료할 필요도 없어진다. 또한 위 코드가 성능도 더 좋다. JVM은 배열에 접근할 때마다 경계를 넘지 않는지 검사하는데 일반적인 반복문도 배열 경계에 도달하면 종료한다. try ~ catch를 명시하면 검사를 하는 일이 중복되므로 하나를 생략한 것이다. 위 try ~ catch 문의 문제점은 몇 가지가 있다. 코드를 try ~

테스트 코드 [내부링크]

TDD 테스트 코드 작성 순서 쉬운 것부터 예외 상황부터 중복 제거 일반적인 프로덕션 코드에서는 중복을 제거하는 것이 좋지만 테스트 코드에서는 스스로 무엇을 테스트하는 지 명확하게 설명할 수 있어야 하기에 중복 제거를 고민해야봐야된다. 파라미터 파라미터 개수는 적을수록 코드 가독성과 유지보수에 유리하기에 메서드의 파라미터 개수가 세 개 이상이면 객체로 바꿔 한 개로 줄이는 것을 고려해야한다. 테스트 목록 정리 TDD를 시작할 때 테스트할 목록을 미리 정리하면 좋다. 테스트 목록을 정리하고 어떤 테스트가 구현이 쉬울지 정하자. 다만 처음부터 모든 사례를 목록에 추가하지말자. 시작이 안 될 때는 단언부터 고민 검증하는 코드부터 작성하기 시작하면 테스트 코드를 짤 때 도움이 된다.

EhCache [내부링크]

EhCache 단순 성능 자체는 Caffeine Cache가 가장 빠르나 분산 환경에서 사용할 수 없기에 EhCache 도입 EhCache는 분산환경에서 사용할 수 있음 Redis로도 Cache를 사용할 수 있지만 READ만 하기에 Redis는 오버스펙이라고 판단 또한 Network를 한 번 더 타야된다는 단점이 있음 @Cacheable(value = "getMembersCache", key = "{#memberNo, #pageNo, #limit}") public MemberDto getMembers(Long memberNo, long pageNo, long limit) { // ... } Value에는 cache 이름을 Key에는 cache에서 사용할 key를 입력 public class MemberDto implements Serializable { private MemberInfo memberInfo; } 응답값에는 Seriablizable 구현해줘야됨 MemberInfo cl

동작 파라미터화 코드 전달하기 [내부링크]

Predicate Member에서 사용할 Predicate를 만든다. 나이에 따라서 구별하기 위해 AgePredicate를 만들고 test 메서드를 구현한다. 성별에 따라서 구별하기 위해서 GenderPredicate를 만들고 test 메서드를 구현한다. 사용할 때는 위와 같이 하면 된다. filterMembers를 만들고 인자로 MemberPredicate interface를 받는다. 사용할 때는 구현체를 넘겨준다. 결과는 다음과 같다. 익명 클래스 익명 클래스를 사용할 수 있다. MemberPredicate interface를 파라미터로 넘겨주고 직접 구현하면 된다. 하지만 코드가 지저분해진다. 람다 람다를 사용하면 더 간결하게 줄일 수 있다. Generic 제너릭을 사용하면 더 일반화 시켜서 사용할 수 있다. 또한 오직 하나의 추상 메서드만 지정하기에 함수형 인터페이스다. 메서드를 인수로 전달 가능 결과도 똑같이 나온다. 정리 동작 파라미터화에서는 메서드 내부적으로 다양한 동작

[JAVA] Stream 슬라이싱 takeWhile, dropWhile [내부링크]

정렬이 된 데이터에서 사용할 수 있는 Stream 슬라이싱 takeWhile 다음과 같이 나이로 정렬된 데이터가 있을 때 나이가 14살 이하인 멤버가 뽑는 코드는 위와 같이 filter를 이용해서 작성할 수 있다. 데이터가 정렬이 되어있다는 걸 이용해서 14살보다 큰 멤버가 나왔을 때 반복 작업을 중단할 수 있다. 이를 위해서 takeWhile를 이용할 수 있다 지금은 데이터 수가 적으니 성능 차이가 없겠지만 데이터가 많다면 성능 차이가 나게 된다. filter를 사용한 코드를 하나씩 찍어보면 아래와 같다. 일단 모든 데이터를 다 보게 된다. 나이가 16살인 것까지 다 본다. takeWhile로 바꾼 코드다. 나이가 15살인 것까지만 본다. dropWhile dropwhile을 사용하면 15살 이상인 멤버가 가져올 수 있다. 결과를 보면 15살부터 getAge() <= 14가 false가 나오기에 여기서부터 작업을 중단하고 남은 모든 요소를 반환한다.

Collector [내부링크]

스트림값에서 최댓값과 최솟값 검색 Collectors.maxBy Collectors.minBy 위 두 개의 메서드를 사용해서 최댓값과 최솟값 계산할 수 있다. 스트림의 요소를 비교하는 데 사용할 Comparator를 인수로 받는다. 합계 Collectors.summingInt라는 특별한 요약 팩토리 메서드 제공 summingInt는 객체를 int로 매핑하는 함수를 인수로 받는다. summingInt의 인수로 전달된 함수는 객체를 int로 매핑할 컬렉터를 반환한다. summingInt가 collect 메서드로 전달되면 요약 작업을 수행 요약 summarizing~ 사용 문자열 연결 Joining을 사용할 수 있다 내부적으로 StringBuilder를 사용해서 문자열을 하나로 만든다. 범용 리듀싱 요약 연산 위에서 본 모든 컬렉터는 reducing 팩토리 메서드로 정의 가능 Collectors.reducing으로 구현 가능 그룹화 groupingBy를 통해서 그룹화 가능 여러 조건으로

[JAVA] 병렬 스트림 [내부링크]

병렬 스트림 1 ~ n 까지 모든 숫자를 반환하는 메서드 n이 커지면 병렬로 연산처리하는 게 좋다. 어떤 것부터 코드를 수정해야될까 결과 변수는 어떻게 동기화? 몇 개의 스레드를 생성 숫자는 어떻게 생성할까? 생성된 숫자는 누가 더 할까 병렬 스트림을 사용하면 위 고민없이 문제 쉽게 해결 가능 위 코드를 Stream으로 바꾸면 위와 같다. 이걸 병렬스트림으로 바꾸려면 parallel()을 사용하면 된다. 순차 스트림과 다른 부분은 스트림이 여러 청크로 분할된다는 것이다. 리듀싱 연산을 여러 청크에 병렬로 수행할 수 있다. 마지막으로 리듀싱 연산으로 생성된 부분 결과를 다시 리듀싱 연산으로 합쳐서 전체 스트림의 리듀싱 결과를 도출한다. 순차 스트림에 parallel()을 사용하면 parallel이 true로 설정된다. 병렬 스트림을 순차 스트림으로 바꾸면 parallel이 false로 된다. stream.parallel() .filter() .sequential() .map() .pa

스프링 트랜잭션 REQUIRES_NEW [내부링크]

트랜잭션 복구 Service A에서 RepositoryB와 Repository C를 호출한다고 가정해 보자. Repository B는 정상 작동했지만 Repository C는 예외가 발생한 상황이다. 우리가 원하는 건 Repository C에서 예외가 발생해도 Repository B를 호출하는 로직은 정상 작동하는 것이다. 간단하게 생각하면 Repository C에서 발생하는 예외를 Service A에서 try ~ catch로 잡아서 처리해 주면 될 것 같다. 하지만 이 방법은 실패를 하게 된다. 실패 이유 Repository C에서 예외가 발생하면 신규 트랜잭션이 아니기에 롤백은 하지 않지만 트랜잭션 동기화 매니저에 롤백을 한다고 표시하기 때문이다. 그렇기에 Service A에서 try ~ catch로 예외를 잡는다고 해도 Repository C에서 이미 롤백을 한다고 표시되었기 때문에 롤백을 하게 된다. 롤백을 하기에 전체 물리 트랜잭션 자체가 롤백이 된다. 해결 방법 위의 문제

프로토 타입 패턴 [내부링크]

프로토 타입 패턴 기존 인스턴스를 복제해서 새로운 인스턴스를 만드는 방법 기존 객체를 복사해서 새롭게 만든 후 일부분만 변경해서 사용할 때 사용한다. DB Connection, Network는 한 번 생성할 때 많은 리소스가 사용이 된다. 그렇기에 매번 필요할 때마다 새롭게 생성하는 게 아니라 기존에 있는 걸 복사해서 필요한 부분만 변경해서 사용한다. 코드 public class Member { private String name; private int age; private String hotelName; public Member(final String name, final int age, final String hotelName) { this.name = name; this.age = age; this.hotelName = hotelName; } public String getName() { return name; } public void setName(final String n

퍼사드 패턴 [내부링크]

퍼사드 패턴 복잡한 서브시스템 의존성을 최소화할 때 사용하는 방법이다. 내가 생각하기에 클라이언트 코드에 호출하는 코드의 의존성을 줄이는 방법이라고 생각한다. 이를 위해서 각각의 역할에 맞는 클래스를 생성하고 이러한 클래스들을 호출하는 인터페이스나 서비스를 만드는 것이라고 생각한다. public class Client { public static void main(String[] args) { String to = "[email protected]"; String from = "[email protected]"; String host = "127.0.0.1"; Properties properties = System.getProperties(); properties.setProperty("mail.smtp.host", host); Session session = Session.getDefaultInstance(properties); try { MimeMessage message = new

[JAVA] 어노테이션 [내부링크]

어노테이션 자바 코드에서 @으로 작성되는 것을 Annotation이라 한다. 클래스 또는 인터페이스를 컴파일하거나 실행할 때 어떻게 처리해야 할 것인지를 알려주는 설정 정보 정의 인텔리제이에서 Annotation 타입으로 만들 수 있다. 다음과 같이 만들어지고 사용할 때는 @TestAnnotation으로 사용하면 된다. 속성 어노테이션도 속성을 가질 수 있다. 속성은 타입과 이름으로 구성되고 이름 뒤에 괄호를 붙인다. 속성의 기본 값은 default 키워드로 지정할 수 있다. 위와 같이 작성하면 TestAnnotation은 firstValue, secondValue 속성을 가지게 된다. secondValue는 기본 값으로 value를 가지게 된다. secondValue는 default 값이 있기에 작성하지 않아도 된다. 적용 대상 어노테이션을 사용할 때는 어떤 대상에 설정 정보를 적용할 것인지를 명시해야 된다. 자바에서는 ElementType 열거 상수로 정의되어 있다. Elemen

어댑터 패턴 [내부링크]

어댑터 패턴 클래스의 인터페이스를 클라이언트가 원하는 다른 인터페이스로 변환할 때 사용하는 패턴 호환성이 전혀 없는 인터페이스를 사용하는 클래스들이 호환되게끔 만들어준다. 클라이언트가 사용하는 인터페이스를 따르지 않는 기존 코드를 재사용할 수 있게 해준다. 구성요소 Target : 클라이언트가 사용하길 원하는 인터페이스 Adaptee : 클라이언트가 갖고 있는 인터페이스 (어댑터에서 사용하고자 하는 인터페이스) Adapter : Target 인터페이스를 구현하는 클래스로, Adaptee의 함수 사용 Client : Target 인터페이스를 사용하는 주체 예시 애플 회사의 CType 케이블이 있다고 하자. AppleCable interface를 상속받아서 AppleCTypeCable을 만들어서 사용하고 있다. 이때 삼성 케이블도 같이 사용하고 싶은데 애플 케이블의 코드를 변경하지 않고 활용해서 사용하고 싶다. 즉 애플과 삼성의 인터페이스를 함께 동작하게 만들고 싶다. 삼성 케이블 인터

브릿지 패턴 [내부링크]

브릿지 패턴 객체의 확장성을 향상하기 위한 패턴으로 객체의 동작을 처리하는 구현부와 확장을 위한 추상부를 분리해서 사용한다. 기능을 처리하는 클래스와 구현을 담당하는 추상 클래스로 구별해서 사용한다. Abstraction 기능 계층의 최상위 클래스 구현 부분에 해당하는 클래스를 인스턴스로 가지고 구현부 메서드를 호출 RefinedAbstraction 기능 계층에서 새로운 부분을 확장한 클래스 Implementor abstraction의 기능을 구현하기 위해서 사용하는 인터페이스 ConcreteImplement 실제 기능 구현 코드 abstraction에 해당하는 Shape이다. 여기서는 Color interface를 호출해서 구현부 메서드에 사용한다. Circle은 RefinedAbstraction이다. Color는 Implementator interface에 해당한다. Shape에서의 색칠하기 기능을 위해서 사용하는 인터페이스 Green과 Red는 ConcreteImplement

전세 알아봐야될 것 [내부링크]

최근에 전세를 알아보고 있는데 알아보기 귀찮아서 대충 알아보다가 피눈물 흘릴 뻔 했다. 요즘 깡통전세, 전세사기 전세 관련 말이 너무 많아서!!! 이제부터 제대로 알아봐야지!!! 계약 전 계약시 알아봐야 할 것 https://justdim.tistory.com/974 전세, 월세 계약시 주의사항 부동산을 알기 쉽게 설명해 드리는 '써니퍼니'입니다. 우리나라는 높은 집값때문에 아직 집을 가지고 있지 못한 사람들이 주변에 많이 있습니다. 혹은 집을 가지고 있지만 사정상 전세나 월세로 거주하고 있는 사람들도 있습니다. 신문이나 인터넷을 보면 임대차계약을 잘못해서 보증금을 돌려받지 못하는 경우들이 종종 보이곤 하는데 이번시간에는 전월세 계약시 주의할점에 대하여 알아보겠습니다. 조금만 조심하면 안전하게 집을 구할수 있는데 귀찮아 하거나 시간이 없다는 핑계로 대충 집을 선택해서 손해를 보는 경우가 많습니다. 천천히 읽어보시면 앞으로 ... justdim.tistory.com https://tw

커넥션 풀, 데이터 소스 [내부링크]

데이터베이스 커넥션 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다. DB 드라이버는 DB와 TCP / IP 커넥션을 연결한다. 3 - way - handshake 같은 TCP / IP 연결을 위한 네트워크 동작 발생 DB 드라이버는 TCP / IP 커넥션이 연결되면 데이터베이스 접속에 필요한 ID, PASSWORD와 같은 정보를 DB에 전달한다. DB는 전달받은 ID, PASSWORD를 통해서 내부 인증을 완료하고 DB 내부에 DB Session을 생성한다. DB는 커넥션 생성이 완료되었다는 응답을 보낸다. DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다. 이 과정은 복잡하고 시간도 많이 들고 TCP/IP 커넥션을 새로 생성하기 위한 리소스를 매번 사용해야 한다. 이를 위해서 커넥션을 미리 생성해두고 필요할 때마다 사용하는 커넥션 풀을 이용한다. 커넥션 풀 초기화 커넥션을 관리하는 공간이다. 커넥션 풀 초기화 과정이다. 애플리케이션을 시작하는 시점에 커넥션

트랜잭션, 락 [내부링크]

트랜잭션 데이터베이스에서 하나의 거래를 안전하게 처리하도록 보장해 주는 것 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야 할 일련의 연산들을 의미한다. 커밋, 롤백 데이터베이스에서 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을 커밋 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것을 롤백 ACID 트랜잭션은 ACID를 보장해야 한다. Atomicity(원자성) 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 실패해야 한다. Consistency (일관성) 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. Isolation (격리성) 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리한다. 동시에 같은 데이터를 수정하지 못하도록 해야 한다. 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준을 선택할 수 있다. 격리 수준 트랜잭션은 원자성, 일관성, 지속성을 보장한다. 격리성을

체크 예외, 언체크 예외 [내부링크]

자바 예외 계층 Object : 모든 객체의 최상위 부모는 Object 예외도 객체이다. Throwable : 최상위 예외 Error 애플리케이션에서 복구 불가능한 시스템 예외 개발자는 이 예외를 잡을 수 없다. 언체크 예외이다. Throwable로 예외를 잡게 되면 하위 클래스들도 다 잡을 수 있기에 Error 예외도 잡을 수 있어서 Throwable로 잡으면 안 된다. Exception 체크 예외 애플리케이션 로직에서 사용할 수 있는 실질적인 최상위 예외 RuntimeException을 제외하고 컴파일러가 체크하는 예외이다. 즉 체크 예외를 사용하면 throws 또는 try ~ catch를 반드시 사용해야 한다. RuntimeException 컴파일러가 체크하지 않는 예외이다. RuntimeException과 그 자식들은 모두 언체크 예외이다. 언체크 예외는 예외를 사용할 때 throws 또는 try ~ catch를 반드시 사용할 필요가 없다. 사용하고 싶으면 사용해도 된다. 예

1월 첫째 주 [내부링크]

점점 글쓰기가 귀찮아지네 자취방 알아보러 갔던 이수역..? 난생 처음 가보는데 엄청 좋다. 깜짝 놀랐다. 이수역에서 먹은 KFC.. 핸드폰 하다가 발견한 공감되는 짤.. 코로나로 몇 년이 순식간에 사라진 느낌이다. 이것도.. 아마 사당역 집 보다가.. 집 다 보고 먹은 돈가스 집 구하기 너무 어렵다!! 회사 베이글은 언제 먹어도 맛있어! 난생 처음 수염 왁싱을 해봤다. 나름 길러서 갔다고 생각했는데 이것도 짧다고 하신다. 나는 어느 정도 아플 줄은 알았는데 와 진짜 아팠다. 왁싱 중에서 턱이랑 인중이 제일 아프다고 한다. 브라질리언 왁싱보다 아프다고.. 아픈 만큼 효과는 확실하다. 지금 한 지 2주 되는 것 같은데 수염이 거의 안 자란다. ㅎㅎ 눈썹 왁싱도 저번에 했었다. 눈썹은 그래도 주기적으로 눈썹 칼 이용해서 밀어줬는데.. 왁싱 한 번 해보니.. 앞으로 왁싱만 해야겠다. 회사 출근해서 사수분이랑 간 수제버거 집 완전 맛있다. 여기는 저기 콜라 뒤에 있는 감자칩이 무료로 준다.

1월 둘째 주 [내부링크]

회사 복지 포인트가 아주 든든하게 들어와서.. 바로 스위치를 샀다~~~ 너무 좋아~~ 오랜만에 먹은 피자스쿨.. 옛날에 피자스쿨은 서민음식이었는데 이제 포테이토피자에 치즈크러스트 추가하면 14900원 나온다.. 엄청 비싸졌다! 둘째 주에는 내 생일이었다. ㅎ 꽃도 선물 받고! 가방도 선물 받았다! ㅎㅎ.. 가방 너무 이쁘고 마음에 든다!! 완전 감사합니다!!!! 카톡으로도 선물 많이 받았다. 축하해 주고 선물 준 모든 분들 감사합니다~ ㅎㅎ.. 생일이라고 위대하신 여자친구께서 오마카세를 데려가 주셨다. 진짜 엄청 맛있다. 음식 가짓수도 많이 있고, 너무 만족스럽다!!! 정말 알차게 나온다.. 버터 전복.. 맛있다.. 회도 많이 나오고 초밥도 많이 나온다. 크.. 이거 다시 먹고 싶네.. 마지막 후식까지 달달하게 나온다!!!!!! ㅎㅎ 생일선물 들고 한 컷! 회사 출근해서 새로 생긴 베트남 음식점 갔다. 이것도 시키고.. 갈비를 품은.. 쌀국수를 시켰다!! 맛있다! ㅎㅎ 생일 다음 날

MSA 정리 [내부링크]

Service Discovery 서비스 클라이언트가 서비스를 호출할 때 서비스의 위치 (즉 IP 주소와 포트)를 알아낼 수 있는 기능이 필요한데, 이것을 바로 서비스 디스커버리 (Service discovery)라고 한다. 즉 유레카 서버에 서버들의 주소를 저장해놓는다. 그러면 유레카 서버에 요청이 들어오면 유레카 서버가 라운드 로빈 방식으로 자체적으로 로드밸런싱을 진행해서 서버에 요청들을 할당해 준다. 유레카 서버는 전화번호부와 같다. 만일 유레카 서버를 쓰지 않으면 호출할 서버의 IP 주소들을 다 알고 있어야 된다. 유레카 서버에 IP 주소 대신에 서버의 이름으로 등록했기에 서버의 이름만 알고 있으면 된다. 사용 @EunableEurekaServer 유레카 서버가 되는 곳에서는 위 어노테이션 사용 @EnableDiscoverClient 유레카 서버에 등록이 되는 서버들은 위 어노테이션 사용 eureka: client: register-with-eureka : false or tr

1장 객체 설계 [내부링크]

객체 설계 public class Theater { private TicketSeller ticketSeller; public Theater(final TicketSeller ticketSeller) { this.ticketSeller = ticketSeller; } public void enter(Audience audience) { if (audience.getBag().hasInvitation()) { final Ticket ticket = ticketSeller.getTicketOffice().getTicket(); audience.getBag().setTicket(ticket); } else { final Ticket ticket = ticketSeller.getTicketOffice().getTicket(); audience.getBag().minusAmount(ticket.getFee()); ticketSeller.getTicketOffice().plusAmount(ti

전셋집 알아보는 법 (부동산 가기 전까지) [내부링크]

부동산 가기 전에 해야 될 것들을 정리해 보자 매물 알아보기 https://new.land.naver.com/complexes?ms=37.4786337,126.9689174,16&a=APT:OPST&e=RETAIL&g=15000 네이버 부동산 네이버 부동산 new.land.naver.com 기본적으로 나는 네이버 부동산을 이용한다. 여기서 자기가 가고 싶은 곳을 필터링하자. 나는 아파트, 오피스텔 상단에서 필터링 가능하다. 자기가 가고 싶은 곳으로 설정하고, 전세 / 월세, 전세 보증금 가격 설정하면 된다. 그럼 위와 같이 뜨게 된다. 주거용 인지 알아보기 요즘같이 전세 사기가 많은 시기에 전세 보증 보험이 되는지 알아봐야 된다. 첫 번째로 볼 것이 주거용인지 확인하는 것이다. 마음에 드는 매물을 클릭하면 오른쪽에 용도가 뜨게 되는데 주거용인지 확인한다. 여기서 중요한 게 용도는 주거용인데 전입신고가 불가능한 곳이 있다. 전입신고가 불가능한 곳은 가지말자 주거용 + 전입신고 불가능

2장 객체지향 프로그래밍 [내부링크]

객체지향 프로그래밍 객체지향 패러다임으로의 전환은 클래스가 아닌 객체에 초점을 맞출 때에만 얻을 수 있다. 어떤 클래스가 필요한지를 고민하기 전에 어떤 객체들이 필요한지를 고민하자. 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 일원으로 보자. 객체들의 모양과 윤곽이 잡히면 공통된 특성과 상태를 가진 객체들을 타입으로 분류하고 이 타입을 기반으로 클래스를 구현하자. 도메인 어떤 문제를 해결하기 위해 사용자가 프로그램을 사용하는 분야를 도메인이라고 한다. 클래스 구현 클래스는 내부와 외부로 구분되고 클래스 설계의 핵심은 어떤 부분을 외부에 공개하고 어떤 부분을 감출지를 결정하는 것이다. 내부와 외부를 구분하면 경계의 명확성이 객체의 자율성을 보장하기 때문이다. 자율적인 객체 객체가 상태와 행동을 함께 가지는 복합적인 존재 객체가 스스로 판단하고 행동하는 자율적인 존재 package com.example.oop.movie2; import java.math.BigD

3장 역할, 책임, 협력 [내부링크]

역할, 책임, 협력 객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것 설계의 핵심은 협력을 구성하기 위해 적절한 객체를 찾고 적절한 책임을 할당하는 과정에서 드러난다. 역할, 책임, 협력이 제자리를 찾지 못한 상태면 응집도 높은 클래스와 중복 없는 상속 계층을 구현한다고 하더라도 문제가 발생할 수 있다. 객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용을 협력이라고 한다. 객체가 협력에 참여하기 위해 수행하는 로직을 책임 객체들이 협력 안에서 수행하는 책임들이 모여 객체가 수행하는 역할을 구성 협력 객체지향 시스템은 자율적인 객체들의 공동체 객체 사이의 협력은 하나의 객체가 다른 객체에게 메시지를 전송할 때 시작된다. 객체는 다른 객체의 상세한 내부 구현에 직접 접근할 수 없기에 오직 메시지 전송을 통해서만 자신의 요청을 전달할 수 있다. 메시지를 수신한 객체는 메서드를 실행해 요청에 응답한다. 상태는 객체가 행동하는 데 필요한 정보에 의해 결정되고 행동은 협력

4장 설계 품질과 트레이드오프 [내부링크]

객체지향 설계 핵심 객체지향 설계에 대한 두 가지 관점 객체지향 설계의 핵심이 책임 책임을 할당하는 작업이 응집도와 결합도 같은 설계품질과 깊이 연관되어 있다. 결합도와 응집도 합리적인 수준으로 유지하기 위해서는 객체의 행동에 초점을 맞추자. 책임은 객체의 상태에서 행동으로, 객체와 객체 사이의 상호작용으로 설계 중심을 이동시키고, 결합도가 낮고 응집도가 높으며 구현을 효과적으로 캡슐화하는 객체들을 창조할 수 있는 기반을 제공한다. 즉 설계를 할 때는 책임 중심으로 설계를 하자! 데이터 중심으로 설계를 하면 안 된다. 데이터 중심 시스템 객체지향 설계에서는 두 가지 방법을 이용해 시스템을 객체로 분할할 수 있다. 첫 번째는 상태를 분할의 중심축으로 삼는 것 객체는 자신이 포함하고 있는 데이터를 조작하는 데 필요한 오퍼레이션을 정의 객체의 상태에 초점을 맞춘다. 두 번째는 책임을 분할의 중심축으로 삼는 것 객체는 다른 객체가 요청할 수 있는 오퍼레이션을 위해 필요한 상태를 보관 객체의

5장 책임 할당하기 [내부링크]

책임 주도 설계 데이터보다 행동을 먼저 결정하라 협력이라는 문맥 안에서 책임을 결정하라. 두 원칙의 핵심은 설계를 진행하는 동안 데이터가 아니라 객체의 책임과 협력에 초점을 맞추는 것 데이터보다 행동을 먼저 결정하라. 객체에게 중요한 것은 데이터가 아니라 외부에 제공하는 행동 데이터는 객체가 책임을 수행하는 데 필요한 재료를 제공할 뿐 책임 중심 설계에세는 이 객체가 수행해야 하는 책임은 무엇인가? 책임을 수행하는 데 필요한 데이터는 무엇인가? 객체의 책임을 먼저 결정한 후에 객체의 상태를 결정한다. 협력이라는 문맥 안에서 책임을 결정하라. 객체에게 어떤 책임을 할당할지는 협력에서 찾을 수 있다. 책임은 객체의 입장이 아니라 객체가 참여하는 협력에 적합해야 한다. 협력을 시작하는 주체는 메시지 전송자이기에 협력에 적합한 책임은 메시지 수신자가 아니라 메시지 전송자에게 적합한 책임을 의미한다. 즉, 메시지를 전송하는 클라이언트의 의도에 적합한 책임을 할당해야 한다는 것 메시지를 결정한

6장 메시지와 인터페이스 [내부링크]

메시지와 인터페이스 객체지향의 흔한 실수 중 하나는 클래스에 집중하는 것 객체지향에서는 클래스가 아닌 객체에 집중해야 된다! 객체가 수행하는 책임에 초점을 맞춰야 한다 협력과 메시지 협력은 객체가 다른 객체에게 무언가를 요청할 때 시작함 메시지는 객체 사이의 협력을 가능하게 하는 매개체 협력의 관점에서 객체는 두 가지 종류의 메시지 집합으로 구성 객체가 수신하는 메시지 집합 외부의 객체에게 전송하는 메시지의 집합 함께 고려해야 한다. 메시지와 메시지 전송 메시지 객체들이 협력하기 위해 사용할 수 있는 유일한 의사소통 수단 한 객체가 다른 객체에게 도움을 요청하는 건 메시지 전송 또는 메시지 패싱 전송하는 객체를 메시지 전송자, 수신하는 객체를 메시지 수신자 메시지는 오퍼레이션명과 인자로 구성되고 메시지 전송은 메시지 수신자를 추가한 것 메시지와 메서드 메서드 메시지를 수신했을 때 실제로 실행되는 함수 또는 프로시저 메시지와 메서드의 구분은 메시지 전송자와 수신자가 느슨하게 결합될 수

7장 객체 분해 [내부링크]

프로시저 추상화 기능 분해 시스템을 분리하기 위한 기준으로 기능을 사용 기능 분해의 관점에서 추상화의 단위는 프로시저 시스템은 프로시저 단위로 분해 전통적인 기능 분해 방법은 하향식 접근법을 따른다. 시스템을 구성하는 가장 최상위 기능을 정의하고 최상위 기능을 좀 더 작은 단계의 하위 기능으로 분해해 나가는 방법을 의미 직원의 급여를 계산 사용자로부터 소득세율을 입력받는다. "세율을 입력하세요: "라는 문장을 화면에 출력한다. 키보드를 통해 세율을 입력받는다. 직원의 급여를 계산한다. 전역 변수에 저장된 직원의 기본급 정보를 얻는다. 급여를 계산한다. 양식에 맞게 결과를 출력한다. "이름: {직원명}, 급여: {계산된 금액}" 형식에 따라 출력 문자열을 생성한다. 기능 분해는 위와 같이 한다. 각 정제 단계는 이전 문장의 추상화 수준을 감소시켜야 한다. 기능을 중심으로 필요한 데이터를 결정한다. 하향식 기능 분해 방식의 문제점 하향식 기능 분해는 시스템을 최상위의 가장 추상적인 메인

8장 의존성 관리하기 [내부링크]

의존성 관리하기 객체지향 설계의 핵심은 협력을 위해 필요한 의존성은 유지하면서 변경을 방해하는 의존성은 제거 의존성 이해하기 어떤 객체가 협력하기 위해 다른 객체를 필요로 할 때 두 객체 사이에 의존성이 존재하게 된다. 의존성은 항상 단방향 실행 시점 : 의존하는 객체가 정상적으로 동작하기 위해서는 실행 시에 의존 대상 객체가 반드시 존재해야 한다. 구현 시점 : 의존 대상 객체가 변경될 경우 의존하는 객체도 함께 변경된다. 의존성은 변경에 의한 영향의 전파 가능성을 암시한다. 의존성 전이 의존성은 전이될 수 있다. A가 B에 의존하고 B가 C에 의존할 경우 A가 C에 의존하게 되는 것 의존성 전이는 캡슐화가 효과적으로 되어있다면 되지 않는다. 직접 의존성 한 요소가 다른 요소에 직접 의존하는 경우 코드에 명시적으로 들어남 간접 의존성 직접적인 관계는 존재하지 않지만 의존성 전이에 의해 영향이 전파되는 걸 의미 코드에 명시적으로 드러나지 않는다. 런타임 의존성과 컴파일 타임 의존성

9장 유연한 설계 [내부링크]

개방 폐쇄 원칙 소프트웨어 개체는 확장에 대해 열려 있어야 하고 수정에 대해서는 닫혀 있어야 한다. 확장에 대해 열려 있다 : 애플리케이션의 요구사항이 변경될 때 이 변경에 맞게 새로운 동작을 추가해서 애플리케이션의 기능을 확장할 수 있다. 수정에 닫혀 있다 : 기존 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있다. 컴파일 타임 의존성을 고정시키고 런타임 의존성을 변경하라 개방 폐쇄 원칙은 런타임 의존성과 컴파일 타임 의존성과 관련 있다. 개방 -폐쇄 원칙의 핵심은 추상화에 의존하는 것! 추상화를 거치면 문맥이 바뀌더라도 변하지 않는 부분만 남게 되고 문맥에 따라 변하는 부분은 생략됨 개방 폐쇄 원칙에서 폐쇄를 가능하게 하는 것은 의존성의 방향이다. 모든 요소가 추상화에 의존해야 된다. 생성 사용 분리 결합도가 높아질수록 개방 폐쇄 원칙을 따르는 구조를 설계하기가 어려워진다. 생성자 내에서 인터페이스를 상속받는 구체적인 클래스 생성하는 경우 동일한 클래스 안에서

10장 상속과 코드 재사용 [내부링크]

상속과 코드 재사용 객체지향에서 클래스를 재사용하는 방법은 새로운 클래스를 추가하는 것 상속과 합성이 있다. 상속은 클래스 안에 정의된 인스턴스 변수와 메서드를 자동으로 새로운 클래스에 추가하는 기법 상속과 중복 코드 중복 코드는 변경을 방해한다. 중복 여부를 판단하는 기준은 변경이다. 요구사항이 변경됐을 때 두 코드를 함께 수정해야 한다면 이 코드는 중복이다. Dont' Repeat Yourself (DRY 원칙) -> 동일한 지식을 중복하지 마라. 중복과 변경 중복 코드는 새로운 중복 코드를 부른다. 민첩하게 변경하기 위해서는 중복 코드를 추가하는 대신 제거해야 한다. 상속을 이용해서 중복 코드 제거하기 이미 존재하는 클래스와 유사한 클래스가 필요하면 코드를 복사하지 말고 상속을 이용해 코드를 재사용하자. 다만 상속을 염두에 두고 설계되지 않은 클래스를 상속을 이용해 재사용하는 것은 쉽지 않다. 상속을 이용해 코드를 재사용하기 위해서는 부모 클래스의 개발자가 세웠던 가정이나 추론

11장 합성과 유연한 설계 [내부링크]

합성 합성은 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해서 객체의 코드를 재사용 합성 관계는 has-a 합성은 구현에 의존하지 않는다. 합성은 내부에 포함되는 객체의 구현이 아닌 퍼블릭 인터페이스에 의존 상속 관계는 클래스 사이의 정적인 관계, 합성은 동적인 관계 코드 작성 시점에 결정한 상속 관계는 변경이 불가능하지만 합성 관계는 실행 시점에 동적으로 변경할 수 있다. 코드 재사용을 위해서는 객체 합성이 클래스 상속보다 더 좋다. 불필요한 인터페이스 상속 문제 해결 public class Stack<E> { private Vector<E> elements = new Vector<>(); public E push(E item) { elements.addElement(item); return item; } public E pop() { if(elements.isEmpty()) { throw new EmptyStackException(); } return elements.rem

블로그 닉네임 [내부링크]

From, 블로그씨 2023년에도 블로그 열심히 운영하고 계시나요? 내 블로그 닉네임 뜻에 대해 이야기해주세요~ 상자에 뭔가를 담아서 저장하는 것처럼 나도 내 블로그에 많은 걸 담아보자라는 의미로 류리상자로 지었다. 참고로 가수 유리상자한테 영감 얻었다. 닉값 제대로 하고 있다 ㅎ

12장 다형성 [내부링크]

상속을 코드 재사용을 위해서 사용하지 말자. 상속은 런타임 때 적합한 메서드를 동적으로 탐색해서 찾기 위한 일종의 탐색 경로를 클래스 계층의 형태로 구현하기 위한 방법 다형성을 위한 서브타입 계층 구축 다형성 하나의 추상 인터페이스에 대해 코드를 작성하고 이 추상 인터페이스에 대해 서로 다른 구현을 연결할 수 있는 능력 여러 타입을 대상으로 동작할 수 있는 코드 다형성은 아래와 같이 구분된다. 유니버설 매개변수 포함 임시 오버로딩 강제 강제 다형성 언어가 지원하는 자동적인 타입 변환이나 사용자가 직접 구현한 타입 변환을 이용해 동일한 연산자를 다양한 타입에 사용할 수 있는 방식 ex) "+" 이항 연산자 매개변수 제네릭 프로그래밍과 관련이 있다. 인스턴스 변수나 매개변수 타입을 임의의 타입으로 선언한 후 사용하는 시점에 구체적인 타입으로 지정하는 방식 포함 메시지가 동일하더라도 수신한 객체의 타입에 따라 실제로 수행되는 행동이 달라지는 능력 서브타입 다형성 객체지향에서의 일반적인 다

13장 서브클래싱과 서브타이핑 [내부링크]

상속 상속의 용도는 타입 계층을 구현하는 것 동일한 메시지에 대해 서로 다르게 행동할 수 있는 다형적인 객체를 구현하기 위해서는 객체의 행동을 기반으로 타입 계층을 구성해야 한다. 타입 사이의 관계를 고려하지 않은 채 단순히 코드를 재사용하기 위해 상속을 사용해서는 안 된다. 타입 개념 관점의 타입 우리가 인식하는 객체들에 적용하는 개념이나 아이디어를 가리켜서 타입이라고 한다. 어떤 대상이 타입으로 분류될 때 그 대상을 타입의 인스턴스 타입의 인스턴스를 객체 공통의 특징을 공유하는 대상들의 분류 프로그래밍 언어 관점의 타입 타입은 연속적인 비트에 의미와 제약을 부여하기 위해 사용 두 가지 목적을 위해 사용 1. 타입에 수행될 수 있는 유효한 오퍼레이션의 집합을 정의 2. 타입에 수행되는 오퍼레이션에 대해 미리 약속된 문맥을 제공 동일한 오퍼레이션을 적용할 수 있는 인스턴스들의 집합 객체지향 패러다임 관점의 타입 객체의 타입이란 객체가 수신할 수 있는 메시지의 종류를 정의하는 것 메시

1월 끝 [내부링크]

후. .점점 일상 쓰기가 귀찮아진다!! 그래도 1월 마지막이니 쓴다. 회사 점심을 먹은 도쿄스테이크.. 채끝살 정식 내 최애~~~~ 너무 맛있어~~ 퇴근하고 운동하고 지하에 있는 식당에서 먹은 제육볶음.. So so.. 요즘 딸기 많이 먹는다! 맛있어! 포켓몬도 진작에 엔딩 봤다.. 재밌어.. 문제는 엔딩 보고 나니 귀찮아서 잘 안 하는 중 ㅠ 드디어 나도 아바타 봤다! 롯데시네마 슈퍼플렉스에서 봤다 ㅎ 사진도 하나 찍어주고! 당연히 팝콘도 사고! 와우! 슈퍼플렉스 처음이었는데 엄청 커서 놀랐다. 영화관 엄청 크다. 3D로 봤는데 처음에 안경 불편했는데 어느 순간 안경 쓴 지도 모르면서 봤다. 3시간 엄청 길겠구나고 생각했는데 금방 지나가버렸다. 화장실 한 번도 안 갔다 ㅎ 영화 보고 배고파서 잠실역 맥도날드!! 금요일 출근해서 혼밥으로 먹은 연어 덮밥!! 이날이 설날 연휴 금요일 + 해피프라이데이여서 회사에 진짜 사람이 없었다. 원래 회사 카페에 사람 엄청 많은데 진짜 한 명도 없

2월 계획 [내부링크]

오브젝트 책 마무리 및 복습 15장 + 부록 A, B, C 있는데 현재 14장 보는 중 부록까지 다 보고 복습하기 김영한 DB 2 강의 보고 정리하기 대규모 시스템 설계 기초 책 3분의 2 이상 보기 Oracle 책 다 보기 위 4가지 하고 여기에 더 할 수 있으면 자바 책 다시 보기 욕심부리지 말자!

14장 일관성 있는 협력 [내부링크]

가능하면 유사한 기능을 구현하기 위해 유사한 협력 패턴을 사용하자. 기본 정책 확장 유사한 기능을 서로 다른 방식으로 구현해서는 안 된다! 설계에 일관성 부여하기 일관성 있는 설계를 만들기 위해서 다양한 설계 경험을 익히자. 디자인 패턴을 학습하자. 변하는 개념을 변하지 않는 개념으로부터 분리하자! 변하는 개념을 캡슐화하자! 클래스를 분리하기 위한 조건 가장 중요한 기준은 변경의 이유와 주기다.! 클래스는 명확히 단 하나의 이유에 의해서만 변경돼야 하고 클래스 안의 모든 코드는 함께 변경돼야 한다.! 단일 책임 원칙을 따르자 캡슐화 다시 살펴보기 데이터 은닉 오직 외부에 공개된 메서드를 통해서만 객체의 내부에 접근할 수 있게 제한함으로써 객체 내부의 상태 구현을 숨기는 기법 모든 인스턴스 변수 private으로 선언하고 해당 클래스의 메서드만이 인스턴스 변수에 접근할 수 있어야 한다. 캡슐화는 데이터 은닉 이상 캡슐화는 변하는 어떤 것이든 감추는 것 대표적인 예는 객체의 퍼블릭 인터

15장 디자인 패턴과 프레임워크 [내부링크]

디자인 패턴과 프레임워크 디자인패턴 소프트웨어 설계에서 반복적으로 발생하는 문제에 대해 반복적으로 적용할 수 있는 해결 방법 목적은 설계 재사용 특정한 변경을 일관성 있게 다룰 수 있는 협력 템플릿 제공 협력을 일관성 있게 만들기 위해 재사용할 수 있는 설계의 묶음 프레임워크 설계와 코드를 함께 재사용하기 위한 것 특정한 변경을 일관성 있게 다룰 수 있는 확장 가능한 코드 템플릿 제공 일관성 있는 협력을 제공하는 확장 가능한 코드 소프트웨어 패턴 패턴이란? 패턴은 반복적으로 발생하는 문제와 해법의 쌍으로 정의 패턴을 사용함으로써 이미 알려진 문제와 이에 대한 해법을 문서로 정리할 수 있고, 이 지식을 다른 사람과 의사소통할 수 있다. 패턴은 추상적인 원칙과 실제 코드 작성 사이의 간극을 메워주며 실질적인 코드 작성을 돕는다. 패턴 분류 아키텍처 패턴 소프트웨어의 전체적인 구조를 결정 분석 패턴 도메인 내의 개념적인 문제를 해결 디자인 패턴 특정한 설계 문제를 해결하는 것을 목적으로

나는 리뷰어다 2023 [내부링크]

한빛 미디어 나는 리뷰어다 2023에 선정됐다. 2022년에도 했었는데 2023년도... 잘 해보겠습니다!! 좋은 책 많이 걸리길~ 와 이번엔 귀신 같이 다 내가 필요한 것들만 있었다. nginx도 필요하고 MSA도 필요하고 코틀린도 필요하고!!!!!!!! 야호!!!!

[JAVA] Thread, Runnable [내부링크]

자바의 멀티 스레드 기반의 프로그래밍을 위해 사용하는 Thread, Runnable Thread Thread 생성을 위해 Java에서 미리 구현해둔 클래스 sleep 현재 스레드 멈추는 기능 자원을 놓아주지 않고, 제어권을 넘겨주기에 데드락 발생 가능 interupt 다른 스레드를 깨워서 interruptedException 발생시킴 Interupt가 발생한 스레드는 예외를 catch 해서 작업할 수 있다. join 다른 스레드의 작업이 끝날 때까지 기다림 스레드의 순서를 제어할 때 사용 자바에서는 기본적으로 메인 스레드 1개에 의해서 프로그램이 실행된다. Main Thread도 만들어지고 ExThread에서 새로운 스레드가 생성이 된다. start() 메서드를 사용하게 되면 run 메서드가 실행된다. 중요한 게 run 메서드 직접 실행이 아니라 start 실행이다. 별도의 스레드에서 ExThread의 메서드를 실행하고 싶은 것인데 run을 직접 호출하면 메인 스레드에서 객체의 메서

[JAVA] Callable, Future, Executor [내부링크]

Callable 기존의 Runnable 인터페이스는 결괏값을 반환할 수가 없다. run의 반환형이 void이다. Runnable의 발전된 형태로 제네릭을 사용해서 결과를 받을 수 있는 Callable이 만들어짐 제네릭 V가 응답 값이다. 위와 같이 사용할 수 있다. Future Callable 인터페이스의 구현체인 작업 Task는 가용 가능한 쓰레드가 없어서 실행이 미뤄질 수도 있고, 작업 시간이 오래 걸릴 수 있다. 이를 위해서 실행 결과를 바로 받지 못하고 미래의 어느 시점에 얻을 수 있는데, 미래에 완료된 Callable의 반환값을 구하기 위해서 사용되는 것이 Future이다. Future는 비동기 작업을 가지고 있어 미래에 실행 결과를 얻도록 도와준다. 비동기 작업의 현재 상태 확인, 기다리기, 결과를 얻는 법 제공 cancel 작업을 취소시키고 취소 여부를 반환함 cancel 후에 isDone()은 항상 true 반환 isDone 작업의 완료 여부를 반환 isCancelle

[JAVA] CompletableFuture [내부링크]

CompletableFuture java8에 추가 Future의 한계 외부에서 완료시킬 수 없고, get의 타임아웃 설정으로만 작업 완료가 가능하다. get(블로킹 코드)를 통해서만 이후의 결과를 처리할 수 있다. 여러 Future를 조합하고 예외 처리할 수 없다. CompletableFuture Future을 외부에서 완료시킬 수 있어서 CompletableFuture CompletionStage 인터페이스도 구현하고 있다. 작업들을 중첩시키거나 완료 후 콜백을 위해 추가 몇 초 이내에 응답이 안 오면 기본값을 반환 같은 거 추가 가능 외부에서 작업을 완료 시킬 수 있고 콜백 등록 및 Future 조합 가능 비동기 runAsync 비동기이면서 반환 값이 없는 경우에 사용한다. 반환 값이 없기에 CompletableFuture<Void>를 반환한다. CompletableFuture는 별도의 스레드에서 작업이 실행된다. supplyAsync 리턴 값이 runAsync와 다르게 존재한다

[JAVA] 멀티 스레드 [내부링크]

멀티 프로세스, 멀티 스레드 운영체제는 실행 중인 프로그래밍을 프로세스 멀티 태스킹은 두 가지 이상의 작업을 동시에 처리 멀티 태스킹 != 멀티 프로세스 하나의 프로세스가 멀티 스레드를 통해서 두 가지 이상의 작업을 처리할 수 있다. 멀티 프로세스가 프로그램 단위의 멀티 태스킹 각 프로세스들은 독립적이기에 하나의 프로세스에서 오류가 발생해도 다른 프로세스에게 영향을 미치지 않는다. 멀티 스레드는 프로그램 내부에서의 멀티 태스킹 각 프로세스가 프로세스 내부에서 생성되기에 하나의 스레드가 예외를 발생하면 프로세스가 종료되기에 다른 스레드에게 영향을 미침. 멀티 스레드 애플리케이션 자바는 메인 스레드가 main 메서드를 실행하면서 시작 메인 스레드가 코드를 실행하면서 필요에 따라서 추가 스레드를 만들어서 실행 가능 멀티 스레드에서는 실행 중인 스레드가 하나라도 있으면 프로세스는 종료되지 않는다. 심지어 메인 스레드가 먼저 종료돼도 작업 스레드가 계속 실행 중이면 프로세스는 종료되지 않는다

[JAVA] 스레드 동기화 [내부링크]

스레드 동기화 멀티 스레드는 하나의 객체를 공유해서 작업 가능하다. 다른 스레드에 의해서 객체 내부 데이터가 변경될 수 있기에 다른 결과가 나올 수 있다. 이를 위해서 스레드 작업이 끝날 때가지 다른 스레드가 변경할 수 없도록 스레드 작업이 끝날 때까지 객체에 잠금을 걸면 된다. 다음과 같이 Lock을 걸면 Lock을 건 스레드만 접근 가능하고 다른 스레드는 접근할 수 없다. Lock을 걸지 않은 메서드는 접근 가능하다. synchronized 일반적인 set 메서드를 가지는 Total Class를 만들자. ExThread2에서는 total 값을 3333으로 바꾼다. ExThread1에서는 total 값을 9999으로 바꾼다. 실행해 보면 둘 다 3333으로 나오게 된다. Synchronized를 사용하게 되면 위와 같이 정상적으로 나오게 된다. wait()과 notify()를 이용한 스레드 제어 두 개의 스레드를 번갈아가면서 실행하기 위해서는 wait()와 notify()를 사용한

[1년 전 오늘] 류리의 자취 일기 시즌 2 [내부링크]

2022.2.14. 1년 전 오늘 류리의 자취 일기 시즌 2 2019년 9월 1일 ~ 2019년 12월 24일 자취 일기 시즌 1이 끝나고 다시는 자취 일기 안 쓸 줄 알았는데.. 이번 연도부터 자취하게 돼서 자취 일기 시즌 2 시작합니다!!!!!!!!!! 오예!!!!!!!!!!! 1학기 2학년 자취하고 2학년 1학기 집에서 2학년 2학기 ~ 3학년 2학기 겨울방학까지 기숙사에서 쭉 살다가 4학년부터는 혼자 살면... 류리상자 자취 일기를 쓸려고 했지만.. 그냥 일상으로 써버렸네 블챌도 하고!! 그리고!!! 다른 집도 계약완료했다!!!! 빨리 이사 가고 싶다!

Spring boot Filter [내부링크]

일하면서 filter를 쓰게 되었는데 구글링하면서 급하게 쓰게 되니 개념들이 흩어져 있는 것 같아서 이 기회에 한 번 싹 정리하려고 한다. 목차 Filter란 무엇인가 Filter 사용법 GenericFilterBean OncePerRequestFilter Filter란 무엇인가 스프링 MVC 요청 라이프 사이클 그림 스프링에서 공통 작업을 처리할 수 있는 기능을 제공하는 데 그중 하나가 Filter이다. 위 그림에서 알 수 있듯이 Filter는 DispatcherServlet 앞에 위치하게 된다. DispatcherServlet 앞에 위치해서 HTTP 요청 전달 전후로 url 패턴에 맞게 공통 작업을 수행할 수 있게 한다. 이때 DistpatcherServlet은 스프링의 가장 앞단에 있는 프런트 Controller에 있기에 Filter는 스프링 밖에서 처리가 된다. Filter가 속한 패키지를 보면 servlet에 속하게 된다. 그렇기에 스프링과 무관하게 전역적으로 처리해야 하는

[서평] 자바에서 코틀린으로 Java to Kotiln 코틀린으로 리팩터링하기 (덩컨 맥그레거, 냇 프라이스 지음, 오현석 옮김 [내부링크]

이번에 한빛 미디어에서 받은 책은 자바에서 코틀린으로 Java to Kotiln 코틀린으로 리팩터링하기 책입니다. 앞표지에는 사향고양이의 일종인 하우사제넷이 그려져 있네요. 저는 한빛미디어 책에 이렇게 멸종 동물이 그려져 있는 게 좋더라고요 뒤표지에는 책을 요약한 부분이 써져있습니다. 이 책은 자바에서 코틀린으로 넘어가는 개발자를 위한 책입니다. 하지만 단순히 코틀린의 문법을 가르쳐 주는 책은 아니고 자바에서 코틀린으로 넘어갈 때 어떻게 코틀린 식으로 생각을 해야 되는지 코틀린으로 짰을 때의 장점이 무엇인지 코틀린 다운 코드가 무엇인지를 보여줍니다. 그리고 단계 단계별로 차근히 코드가 변환되는 과정을 보여줍니다. 챕터는 총 23장까지 있고 537쪽까지 있습니다. 책의 초반 부분에서는 어떻게 프로젝트를 세팅해야 되는지까지 친절하게 설명해 주고 있습니다. 책의 크게 자바 코드를 보여주고 코드를 설명해 준 다음에 이 코드를 어떻게 코틀린으로 변환하는지를 보여주고 있습니다. 먼저 옵셔널로

[JAVA] 스트림 [내부링크]

스트림 요소들이 하나씩 흘러가면서 처리된다는 의미를 가진다. Iterator와 Stream 왼쪽이 이터레이터 오른쪽이 Stream Stream은 내부 반복자이기에 처리 속도가 빠르고 병렬 처리에 효율적 람다식으로 다양한 요소 처리 정의 가능 중간 처리와 최종 처리를 수행하도록 파이프라인 형성 가능 내부 반복자 for 문과 iterator는 컬렉션의 요소를 컬렉션 바깥쪽으로 반복해서 가져와 처리한다. 이를 외부 반복자 컬렉션의 요소를 외부로 가져오는 코드와 처리하는 코드를 모두 개발자가 가지고 있어야 함 iterator의 hasNext를 통해서 있는지 확인하고 next()를 통해서 외부로 가져온 다음에 처리하는 코드가 있어야 함 스트림은 요소 처리 방법을 컬렉션 내부로 주입시켜서 요소를 반복 처리하는 것인데 이를 내부 반복자라고 한다. 개발자 코드에서 제공하는 데이터 처리 코드를 가지고 컬렉션 내부에서 요소를 반복 처리한다. 내부 반복자는 멀티 코어 CPU를 최대한 활용하기 위해 요소

ElasticSearch [내부링크]

GET products/_search { "query": { "bool": { "must": [ { "match": { "name": "laptop" } }, { "range": { "price": { "gte": 500, "lte": 2000 } } } ], "must_not": [ { "term": { "discounted": true } } ], "should": [ { "term": { "brand.keyword": "Apple" } }, { "term": { "brand.keyword": "Samsung" } } ] } } } must 쿼리가 모두 참인 문서만 검색 AND 조건 must_not 쿼리가 모두 거짓인 문서만 검색 AND 조건 should 쿼리 중 하나만 만족하면 검색함 OR 조건 많은 쿼리가 만족할 수록 score 상승 filter 쿼리가 모두 참인 문서만 검색 AND 조건 must보다 속도가 빠르다. score를 산정하지 않는다. 캐시 가능

2월 [내부링크]

2월 한 방에 쓴다. 3월 초반에 한 번 1시간 정도 걸려서 썼는데 실수로 다 날아가버렸다.. 요즘 내 최애 음식 규카츠.. 존맛탱 꼭 먹어보세요~ 사수가 퇴사를 해서.. 송별회 할 겸 점심에 서울역 근처에 있는 이쁜 브런치 카페로 왔다. 4명이서 4개 시켰다. 음식 다 맛있다. 샐러드랑 피자도 맛있다. 같은 날 저녁에 먹은 돈까스 집.. 맨날 가보려다가 이번에 처음 가봤는데!! 완전 맛있다. 영화 바빌론 보러 간 날 영화 보러갈 때 마다 앤티앤즈 사가지고 간다. T1 팝업 스토어가 있어서 구경해봤다. 우리 롤드컵은 언제 우승하니..? 바빌론.. 한 영화에 여러 개의 에피소드로 구성된 느낌이다. 3시간의 런닝 타임인데 갠적으로 재밌게 봤다. 2월 7일에 집도 이사했다. 윽.. 지금 보니 엄청 작은 집에서 1년을 살았구나 짐 엄청 많다. 짐을 1층에 두고 계속 집을 청소 하고 있었는데 폐지 줍는 할머니분들이 계속 쓰레기인 줄 알고 가져가려고 해서 당황했다. 처량한 S.. ㅋㅋㅋㅋㅋㅋㅋ

롯데월드 나들이 [내부링크]

2월 26일에 롯데월드 갔다 왔다. 눈치게임은 실패했지만 재밌게 놀다 왔다. 내 기억으로 고등학교 1학년 때 온 게 마지막인 것 같다.. 11년 만에.. 온 롯데월드 이런 게 있었나.. 바로 혜성특급을 타러 갔다!!!! 혜성 특급 줄.. 내 평생 본 것 중 제일 길었다. 줄이 기니까 바로 맛있는 거 사 왔다. 혜성특급 앞 쪽에 130분이라 적혀 있는데 정말 귀신같이 130분 걸렸다 ㅋㅋㅋㅋㅋ 흑흑 줄 서서 여기까지 오는데 딱 130분.. 3분 정도 타는데.. 어지러웠지만 재밌었다.. 130분 혜성특급! 혜성특급 한 번 타보고 다른 거 타는 건 거의 불가능할 것 같다고 빠르게 판단해서 줄 별로 없는 것만 골라서 탔다. 어린이용 환타지 드림.. ㅎ 찰리와 초콜릿 공장 같은 느낌 어린이용답게 잘 꾸며져 있다. 출발!!!! 근데 개인적으로 좀 무섭게 느껴졌다. ㅋㅋㅋㅋㅋㅋ 지금 사진 보니 무섭네.. 그래도 실제로 보면 잘 꾸며져 있어서 이쁘다. 점심으로는 타코 먹었다. 존맛탱이긴하다. 점심

문래역, 홍대입구역 나들이 [내부링크]

문래역에 창작촌이 있다고 해서 가봤다. 금강산도 식후경이라고.. 일단 점심부터 먹었다. 분짜에 쌀국수 맛있다. 창작촌이라고 해서 기대하고 갔는데. 오잉~!~! 다나카 벽이 있길래.. 사진 하나 찍었다. 허허. . 창작촌.. 볼 게 없었다. 실제로 가서 보면.. 약간 좀비 영화에서 좀비 발생 후 10년 뒤의 모습이랄까.. 아포칼립스 느낌 그래도 #러스트베이커리 는 괜찮았다. 공장을 개조한 카페! 직접 가서 봤을 땐 몰랐는데 사진으로 보니 진짜 공장 같네 나름 잘 꾸며져있다. 빵은 맛있다. 푸딩이랑 에그타르트랑 하나 뭐였지.. 아.. 아이스아메키라노는 내가 지금까지 마셔본 것 중에서 제일 쓴맛이었다. 티라미슈 푸딩 맛있다. 이거 두 개도 맛있다. 오.. 이 사진 좀 느낌 있는데 맛있게 잘 먹고 갑니다. 문래역은 할 게 없어서 홍대입구역으로 가서 잠시 만화카페 갔다가 #또보겠지떡볶이 먹으러 갔다. 떡볶이 맛있다. 하지만!!!!!!! 이 감자튀김이 진짜 맛있다!!!!!!!!!!!!! 무조건

싱글톤 패턴 [내부링크]

싱글톤 패턴 인스턴스를 오직 한 개만 제공하는 클래스가 필요할 때 싱글톤 패턴이 필요하다. public class Setting { private Setting(){ } public static Setting getInstance() { return new Setting(); // 다르게 나와버림 } } 먼저 싱글톤 패턴을 하기 위해서는 외부에서 new 연산을 사용하지 못하게 만들어야 한다. 이를 위해서 private 기본 생성자를 만들어준다. Private를 하게 되면 외부에서 인스턴스를 생성할 수 없게 된다. 다만 위의 코드에서는 getInstance()에서 return new를 사용하고 있기에 매 생성할 때마다 다른 인스턴스가 나오게 된다. public class Setting { private static Setting instance; //static 선언으로 별도의 지정된 메모리 공간에만 존재. private Setting() { } public static Setting

팩토리 메서드 패턴 [내부링크]

팩토리 메서드 패턴 생성 패턴 중 하나로 객체를 생성할 때 어떤 클래스의 인스턴스를 만들지 서브 클래스에서 결정하게 된다. public class ShipFactory { public static Ship orderShip(String name, String email) { // validate if (name == null || name.isBlank()) { throw new IllegalArgumentException("배 이름을 지어주세요."); } if (email == null || email.isBlank()) { throw new IllegalArgumentException("연락처를 남겨주세요."); } prepareFor(name); Ship ship = new Ship(); ship.setName(name); // Customizing for specific name if (name.equalsIgnoreCase("whiteship")) { ship.setLogo

스프링 트랜잭션 [내부링크]

@Transactional @Transactional 애노테이션을 사용하면 트랜잭션 프록시가 트랙잰션 처리 로직을 모두 가져간다. 트랜잭션을 처리하는 프록시를 적용해 준다. @Transactional과 Proxy @Transactional 애노테이션이 있으면 트랜잭션 AOP는 Proxy를 만들어서 스프링 컨테이너에 등록 실제 서비스 객체 대신에 프록시를 스프링 컨테이너 빈에 등록한다. 프록시 내부에서는 실제 서비스를 참조하게 된다. Client에서 Service를 호출하면 트랜잭션을 사용할 수 있는지 확인을 하게 된다. 트랜잭션 애노테이션이 붙어 있으면 트랜잭션을 적용하고 붙어 있지 않으면 트랜잭션을 적용하지 않는다. 프록시 내부 호출 문제 @Transactional을 적용하면 프록시 객체가 요청을 먼저 받아서 트랜잭션을 처리하고 실제 객체를 호출 그렇기에 트랜잭션을 적용하려면 항상 프록시를 통해서 대상 객체를 호출해야 된다. 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 A

스프링 트랜잭션 전파 [내부링크]

스프링 트랜잭션 트랜잭션이 둘 이상 있을 때 스프링이 제공하는 트랜잭션 전파 개념을 사용할 수 있다. @Test void double_commit() { log.info("트랜잭션1 시작"); final TransactionStatus tx1 = transactionManager.getTransaction(new DefaultTransactionAttribute()); log.info("트랜잭션1 커밋 시작"); transactionManager.commit(tx1); log.info("트랜잭션2 시작"); final TransactionStatus tx2 = transactionManager.getTransaction(new DefaultTransactionAttribute()); log.info("트랜잭션2 커밋 시작"); transactionManager.commit(tx2); } 트랜잭션을 두 번 하는 코드이다. 첫 번째 트랜잭션에서 conn0 커넥션을 획득하고 커밋 한 다음

추상 팩토리 패턴 [내부링크]

추상 팩토리 패턴 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴 관련성이 있는 여러 종류의 객체를 일관된 방식으로 생성하는 경우에 유용하다. 클라이언트 코드에서 구체적인 클래스의 의존성을 제거한다. 팩토리 메서드 패턴과의 차이 팩토리 메서드 패턴은 팩토리를 구현하는 방법에 초점 팩토리 인터페이스를 구현하여 하나의 객체를 생성하는 데 사용이 된다. 추상 팩토리 패턴은 팩토리를 사용하는 방법에 초점 팩토리 객체가 아닌 다른 객체 내부에 구현되어 해당 객체에서 여러 타입의 객체를 생성하기 위해 사용된다. 추상 팩토리 코드 public interface ShipPartFactory { Anchor createAnchor(); Wheel createWheel(); } ShipPartFactory 인터페이스 하나에 Anchor와 Wheel을 만드는 코드가 정의되어 있다. Ship 1개가 아닌 Anchor, Wheel을 만든다. pub

빌더 패턴 [내부링크]

빌더 패턴 복합 객체의 생성 과정과 표현 방법을 분리해 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다. 말이 너무 어렵다. 그냥 복잡한 객체들을 단계별로 생성할 수 있게 만드는 디자인 패턴이다. 사용 예시 package me.whiteship.designpatterns._01_creational_patterns._04_builder._01_before; import java.time.LocalDate; import java.util.List; @Getter @Setter public class TourPlan { private String title; private int nights; private int days; private LocalDate startDate; private String whereToStay; private List<DetailPlan> plans; public TourPlan() { } public TourPlan(String t

Optimistic Lock 이용 동시성 문제 해결 [내부링크]

Optimistic Lock Lock을 이용하지 않고 Version을 이용해서 정합성을 맞추는 방법 데이터를 읽은 후에 update를 수행할 때 현재 내가 읽는 버전이 맞는지 확인해서 업데이트를 한다. 만약 읽은 버전에서 수정사항이 생겼을 경우 application에서 다시 읽은 후에 작업을 수행해야 됨 Optimistic Lock을 사용하기 위해서는 Entity에 @Version을 추가해줘야된다. OptimisticLockStockService를 추가해준다. @Lock(value = LockModeType.OPTIMISTIC)을 이용해서 사용할 수 있다. OptimisticLock을 사용할 때 실패 했을 때 재시작할 수 있는 로직을 추가해줘야한다. 개발자가 직접 추가 해야됨 테스트를 해보게 되면 성공한다. OptimisticLock을 Lock을 사용하지 않기에 비관적 락보다 성능상 이점이 있다. 충돌이 빈번하게 일어나면 비관적 락이 더 좋을 수 있다. MySQL을 사용한다면 Iso

Named Lock 이용 동시성 문제 해결 [내부링크]

Named Lock 이름을 가진 metadata Locking이다. 이름을 가진 Lock을 획득한 후 해제할 때까지 다른 세션은 이 Lock을 획득할 수 없도록 한다. 다만 Transaction이 종료될 때 Lock이 자동으로 해제되지 않는다. 별도의 명령어로 해제를 하거나 선점시간이 끝나면 해제된다. Named Lock을 사용하기 위해서 Repository를 만들어준다. get_lock을 이용해서 Lock을 얻어오고 release_lock을 통해서 Lock을 해제해준다. Named Lock을 활용할 떄는 데이터소스를 분리해야한다. 모든 Lock이 해제되지 않는다면 데이터소스가 부족해지는 현상이 발생할 수 있다. 특히 Named Lock은 커넥션을 2개 사용한다. lock 획득에 필요한 connection 1개, transaction에 필요한 커넥션 1개 같은 데이터베이스 소스를 사용한다면 커넥션 풀을 넉넉하게 잡아주자. Facade class를 만들어서 Get, release를 해

Lettuce 이용 동시성 문제 해결 [내부링크]

redis 활용 분산락 구현 트래픽이 많은 서비스에서는 redis를 사용하는 것이 가장 좋다. 인메모리데이터베이스라 굉장히 빠르기에 Lettuce setnx 명령어를 활용하여 분산락 구현 Setnx : set if not exist 키와 벨류를 Set 할 때 기존의 값이 없을 때만 set spin lock 방식 retry를 개발자가 직접 작성해줘야됨 lock을 획득하려는 thread가 반복적으로 확인하면서 lock을 획득하는 방식 Redis를 사용하기에 RedisRepository를 구현해준다. Facade를 만들어서 lock을 획득할 때까지 while문을 돌린다. spin Lock 방식이기에 Redis에 부하를 줄 수 있어서 sleep을 넣어줬다. lock을 획득하면 decrease 메서드를 수행하고 꼭 UnLock 한다. 테스트 코드를 작성하면 테스트가 정상 수행된다. 이때 redis를 킨 상태여야되고, redis에 해당 Key 값이 없어야된다. 출처 : 재고시스템으로 알아보는

Redisson 이용 동시성 문제 해결 [내부링크]

Redisson 락을 획득하지 못했을 때 Lettuce에 비해 재시도 횟수가 적어서 Redis에 부하가 적다. Redisson은 Lock 관련 Class를 제공하기에 별도로 class를 만들 필요가 없다. 로직 실행 전후로 Lock 획득, 해제는 해줘야 하기에 Class가 필요하다. Facade를 구현해 준다. redissonClient에서 getLock을 통해서 Lock을 얻을 수 있고 tryLock으로 시도해본다. Lock을 얻으면 decrease 메서드를 실행하고 꼭 마지막에 unLock 해준다. 테스트 코드를 실행해 보면 정상 작동한다. Lettuce vs Redisson Lettuce 구현이 간단하다. Spring-data-redis를 이용하기에 Lettuce가 기본 제공 Spin Lock 방식이기에 동시에 많은 Thread가 Lock 획득 대기 상태면 Redis에 부하가 갈 수 있다. Redisson Lock 획득 재시도를 기본으로 제공한다. Pub-Sub으로 구현되어 있

[서평] 혼자 공부하는 컴퓨터 구조 + 운영체제 강민철 지음 [내부링크]

한빛미디어에서 새로 출판한 혼자 공부하는 컴퓨터 구조 + 운영체제입니다. 책 표지는 혼공 시리즈를 그대로 따라갑니다. 책 왼쪽 아래에 보면 전공자를 위한 필수 용어 + 비전공자를 위한 쉬운 그림이라고 써져 있는데 정말 그림도 쉽게 나와서 이해하기도 쉽고 필수 용어들도 다 잘 되어있는 것 같습니다. 책만 보기 힘들면 유튜브 강의도 있으니 같이 보시는 걸 추천드립니다. 독자의 한 마디만 봐도 이 책이 얼마나 쉽게 설명한 지를 알 수 있습니다. 저도 처음에는 비전공자를 위한 책이니 쉬운 내용만 담겨 있겠지라고 생각했지만 읽어보니까 전공 수업에서 배웠던 내용들이 그대로 수록되어 있습니다. 전공 수업에서 어렵게 설명했던 내용들이 여기서는 쉬운 그림과 함께 쉽게 설명해 줘서 좋았습니다. 책 그림도 잘 보이고 귀여우며 책 가독성도 좋습니다. 한 챕터의 마지막에는 마무리가 있어서 복습하기 좋습니다. 중요한 개념들에는 꼭 그림이 다 들어가 있어서 이해하기 쉽게 만들었습니다. 뒷부분에서 배울 내용들은

12월 셋째 주 [내부링크]

블챌이 끝나니 확실히 쓰기가 귀찮아지네.. 롯데몰에 있는 편백나무찜 먹어봤다. 요거는 전골 이게 편백나무찜 맛있다. 건강한 맛 오랜만에 헬스장도 갔다.. 회사 점심 회식! 오랜만에 회 먹었다! 튀김도 있고 뭐 먹을 게 많이 있었다! 회 먹고는 빵집! Our 빵집이었는데 괜찮다 커피도 마시고 빵도 많이 먹고 회사에서 캔미팅 비용을 지원해 줬기에 캔미팅 비용으로 케이크까지 샀다. 이 케이크랑 한 개 더 있다. 나는 이미 점심에 먹은 걸로 당이 충분했기에 한 입도 안 먹었다. 샤롯데에 스위니토드 보러 갔다. 아마 중3 때 학교에서 보러 간 루나틱이 한국에서 본 마지막 뮤지컬일 거다. # 스위니토드 무슨 내용인 지도 모르고 갔다가 뮤지컬 시작하기 전에 구글에 쳐봐서 내용 파악했다. 사람들 많다! 샤롯데 내부도 고급스럽다. 나는 1층 객석에서 봤다. 자리 좋아서 잘 보였다.! 공연 시간은 2시간 50분.. 근데 너무 재미있어서 3시간짜리 인지도 몰랐다!! 꼭 보자!! 너무 재밌다. 배우들도

2022년 회고 [내부링크]

매년 회고 글을 쓸 때마다 드는 생각 "시간 정말 빠르다" 그래도 지금까지와 다른 게 있다면 옛날에는 한 해의 마지막 날이 되었을 때 "아니 뭐 했다고? 벌써 한 해가 끝났을까"라고 생각을 했다. 하지만.. 이번 연도는!! 아주 많을 걸 했어! 내 인생에서 가장 기억에 남고 잘 풀린 연도이다. 이번 연도를 문장으로 나타내면 대학생 끝, 직장인 시작 연애도 시작!!!!!!!!!!! 우왕 내 인생에 이렇게 좋은 일이 한 번에 일어난 적은 처음이다. 가끔 이래도 되나 싶은데 다시 생각해 보고 나는 이래도 된다고 생각하고 넘긴다 ㅎ 원래는 1월부터 12월까지 쓱 정리하는데 이렇게 되면 너무 오래 걸릴 것 같아서 특별한 것만 정리해야겠다. 대학 산업공학과 컴퓨터공학과 대학교 생활도 이제 끝이다. 2016.03 ~ 2023.02 대학생활 재밌게 하고 갑니다~ 저번에는 영어 성적이 없었어가지고 교양 시험이 불합격 떴었는데 이번에 토익 응시하고 성적 등록해서 교양 시험까지 합격으로 변했다. 201

12월 마지막 주 [내부링크]

엄마랑 정자역에서 만나서 #진대감 갔다. 내부 시설 괜찮다. 다만.. 가격이 엄청 비싸고.. 양은 적다... 물론 맛있긴 함.. 저 위에 사진이 56000원.... 진짜 맛있긴 함.. 다만.. 너무 비싸!!!!!!!! ㅎ 그래서 결국 배고파서 롯데리아 가서 햄버거 2개 ~~~ 먹었다.. 오랜만에.. 내 최애 배달음식인 김치찜 먹었다.. 서울대벤처타운역에 있는 #만푸쿠 먹으러 갔다. 다만 아쉽게도.. 하필 연어 음식은 안된다고 했다 ㅠ 그래서 연어 서비스로 2조각 받고.. 김치전이랑.. 새우튀김도 서비스로 받았다.. 장어텐동 먹어봤는데 먹을만하다. 다음에는 연어로 먹어보고 싶다. 밥 먹고는 그림 그리러 갔다. 내부 깔끔하다. 한 번에 2시간.. 나는 고양이 그림 그렸다. 밑그림이 있어서 색칠만 하면 된다. 생각보다 오래 걸린다. 정말 이거 그리면서 예체능 쪽으로 갔으면 망했을 거다고 생각했다. 그래도 나름 다 그리고 보니까 괜찮다. 배경색을 분홍색으로 한 게 신의 한 수! 짜잔~! 분

[1년 전 오늘] 네이버 부스트캠프 AI Tech 3기 합격 [내부링크]

2022.1.4. 1년 전 오늘 네이버 부스트캠프 AI Tech 3기 합격 인생은 정말 아무도 모른다. 이걸 추합으로 붙을 줄은 몰랐네요.. 나도 다른 사람들 쓰는 것처럼 써봐야지. 정보 - 전공자(주전공 : 산공, 복수전공 : 컴공) - ai 관련 통계, 수학, 이론 수업 많이 들었고 따로 공부도 많이 했습니다. 동아리 활동도 하고 - 22년 기준 4학년 됩니다. - 백준 플래티넘 5, 약 690문제 정도 풀... 류리상자 진짜 아직도 궁금하다. 이거 참가했으면 지금 어떤 삶을 살고 있을까 너무 궁금해

Synchronized 동시성 문제 해결 [내부링크]

요청이 동시에 여러 개 들어오면 어떻게 될까? @Transactional을 사용해도 다른 스레드에서 사용 가능 @Service @RequiredArgsConstructor public class StockService { private final StockRepository stockRepository; @Transactional public synchronized void decrease(Long stockId, Long quantity) { final Stock stock = stockRepository.findById(stockId).orElseThrow(); stock.decrease(quantity); stockRepository.saveAndFlush(stock); } } @Test void stock_decrease() { stockService.decrease(1L, 10L); final Stock stock = stockRepository.findById(1L).or

Pessimistic Lock 이용 동시성 문제 해결 [내부링크]

Lock 동시성 문제를 DB에서 제공하는 방법으로 해결할 수 있다. Pessimistic Lock DB에서 데이터에 Lock을 걸어서 정합성을 맞추는 방법 Pessimistic Lock을 사용하게 되면 다른 트랜잭션에서는 Lock이 해제되기 전에 데이터를 가져갈 수 없게 된다. 다만 데드락이 걸릴 수 있기에 주의해야 한다. Row나 table 단위임 Lock을 사용하기 위해서 @Lock 어노테이션 사용 Lock을 위한 서비스를 만들어준다. 테스트를 돌려보면 성공하게 된다. 충돌이 빈번하게 일어나면 Optimistic Lock 보다 성능이 좋고 Lock을 잡기에 데이터 정합성이 어느 정도 해결할 수 있다. 별도의 Lock을 잡기에 성능 감소가 있을 수 있다. 출처 : 재고시스템으로 알아보는 동시성이슈 해결방법(최상용) - 인프런 재고시스템으로 알아보는 동시성이슈 해결방법 - 인프런 | 강의 동시성 이슈란 무엇인지 알아보고 처리하는 방법들을 학습합니다., - 강의 소개 | 인프런...

소주톤 얼레벌레 크리스마스 후기 [내부링크]

소주톤 : 얼레벌레크리스마스 | Festa! Festa에서 당신이 찾는 이벤트를 만나보세요. festa.io GDSC KR 채널에 올라와서 할까 말까 고민하다가 큰 맘 먹고 신청해서 한 해커톤 다른 해커톤과 다르게 굉장히 짧다. 6시간동안 다 해야된다.!! 어린이 대공원역에 있는 엘리스 Lab 서울특별시 성동구 아차산로17길 48 성수낙낙 2층 엘리스 랩에서 해커톤 했다. 시설 깔끔하고 좋다! 여기는 행사 하는 곳! 아! 실제 코딩하는 곳을 안 찍었네 코딩 하는 곳도 진짜 좋다. 소문난 주니어 해커톤이라서 소주톤이다! 이렇게 귀여운 명찰을 준다. 행사 소개 하고 자기 소개, 아이스 브레이킹 하고 팀빌딩 했다. 나는 팀빌딩 시작하자마자 마이크 써서 팀 모집했다. 백엔드 한 분이 나한테 오셔서 백엔드 2명 되고 그 다음으로 기획자랑 디자이너분이 마이크 잡아서 팀 모으길래 바로 달려갔다! 때마침 앱 개발자님도 오셔가지고 5명이서 팀 이뤘다! 주제는 기획자 분이 생각하신 크리스마스 mbti

11월 마지막 주 [내부링크]

블챌도 마지막이구나! 연어가 땡겨서 또 연어시장 갔다 언제 먹어도 연어시장은 맛있다!! 지금 이 순간에도 또 먹고 싶다. 인터넷에서 투움바 파스타 글 보고.. 아 투움바 파스타 먹고 싶다는 생각이 들었는데 ㅎ 아웃백 가서 투움바 파스타를 먹을 수는 없어서.. CU 가서 뭐 맛있는 거 없나~ 둘러보다가 발견한 투움바! 먹을만하다! 먹고.. 후식까지!! 이게 6000원이야!! 하나당 500원짜리!! 친구가.. 크리스마스라고 준 exe 프로그램 ㅎ 맥북에서는 안돼서 윈도우에서 해봤다. 신입사원 cheer up 프로그램이 있어서 출근한 회사! 점심으로 사 먹은 아 뭐였더라 아무튼 맛있는 거 에그 햄버거! 멕시칸 랩!! 멕시칸 랩 존맛~ ㅎ cheer up 프로그램에서 뭘 하나 했더니 칵테일 만들기였다! 게임 열심히 해서 재료도 많이 모았다! 첫 번째는.. 회사 사람들을 위해서 만든 칵테일 두 번째는 회사 신입 사원분들을 위한 칵테일 음하하하!! 2번째 칵테일로 우리 팀이 맛 평가 1등을 해

[2022 마이 블로그 리포트] 올해 활동 데이터로 알아보는 2022 나의 블로그 리듬 [내부링크]

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 또 내가 Top3네.. 2022년 내 인생 최고의 한해다~ 2022 마이 블로그 리포트 2022년 올해 당신의 블로그 리듬을 알아볼 시간! COME ON! campaign.naver.com

12월 첫째 주 [내부링크]

공릉동 내가 찜한 닭.. 언제 먹어도 맛있다. 이날은 특히 더 맛있었다! 후식으로 설빙~ 회사에서 네일 받았다 ㅎ 팀원분이 받아보라고 하셔서 한 번 받아봤는데 아주 마음에 ㅡㄷㄴ다!! 아주 깔끔해졌다! 회사 점심으로 먹은 도쿄스테이크의 채끝살 스테이크 존맛탱구리~ 일하다가 사내 카페로 와서 먹은 베이글.. 이걸 왜 이제야 먹어봤을까.. 너무 맛있다! 이날은 저녁까지 회사에서 먹고 갔다.. 수요일에는.. 산업공학과 캡스톤경진대회가 있었다.. 조그마한 곳에서 발표한다. 우리 조가 만든 포렌식 관점에서의 Element 인스턴스 메시지 분석! 같이 하시는 분은 유능한 인재라서 이날 대만에 학회 참석하러 가서.. Zoom으로 참석하셨다.. 내가 계속 발표하느라 쉽지 않았다 ㅠ 끝나고 받은 먹거리들 샐러디랑 에그 타르트!! 오렌지 주스!! 점심으로 먹었다! 샐러디 멕시칸랩 존맛탱 에그타르트는 그럭저럭 결과가 그다음 날 바로 나왔다. 금상 받았다!!!! 우와아아아아!!!! 하지만 인간의 욕심은

대학생활 끝 [내부링크]

과제까지 제출 완료..!!!!!!!!! 대학생활 끝이다!!!!!!!!!!!! 안녕!!!!!!! 드디어 끝났다!!!!!!!!!!!!!!!!!!!!!!... 아 이거 제출하니.. 좀 싱숭생숭하네.. 일이나 하러 가야지..

금상 받았다. [내부링크]

끼야후 오늘 시상식했다. 시상식 시간이 길면 어쩌나 했는데 후딱 끝났다! 두 번째로 상 받았다! ㅎ 팀원 분 들어갈 때 나는 사진찍었다 ㅋㄷㅋㄷ ㅋㅋㅋㅋㅋ 엘리베이터에서도 한 컷!!! 대학생활동안 금상 1개 은상 1개 받았네 상 하나도 못 받을 줄 알았는데 2개씩이나~ 이야후!

12월 둘째 주 [내부링크]

회사에서 나눠준 신년 달력 및 다이어리 키크니가 그림 그렸다. 색깔 잘 뽑혀서 마음에 든다! 이 날은 일이 많아서 10시쯤에 퇴근했다. 퇴근하고 종로 3가 가서 치킨 먹었다!! 아주 좋은 일이 있었다!! CTO 팀 송년회에서 문제 맞춰서 가습기 받았다. 차량용.. 난 차가 없는데!! ㅎㅎ 금상도 받았고.. 서울 감자탕도 먹었다. 종강하고 학교도 한 번 놀러갔다. 빕스갔다. 와인이 무한이었는데 난 와인은 아직도 잘 못 마시겠어가지고 2잔 정도만 마셨다. 빕스.. 생각보다 먹을 게 없다. 아쉽다 아쉬워.. 디저트는 맛있게 먹었고.. 카프리제를 제일 많이 먹었다.. 빕스 먹고는 건대 호수 구경갔다. 건대 넘모 좋다. 상권도 좋고 호수도 크고.. 집 앞 카페에 있는 강아지 ㅎㅋ 오랜만에 이삭 토스트! 2개 먹었다! 이번엔 참맛 갔다. 서울 감자탕이나 참맛이나 비슷비슷하다. 하남 스타필드 갔다왔ㄷㅏ. 가는 길 너무 추웠다. 입구 들어서면 피카추가 있다! 대왕 피카추도! 골전도 이어폰 너무 신

[1년 전 오늘] 진짜 종강 [내부링크]

2021.12.20. 1년 전 오늘 진짜 종강 17일 날 시험이 끝났지만 19일 11시 59분까지가 팀플 마감일이었다.. 미루고 미루다가 18일부터 시작했다가 잘못하면 못 할 뻔했다.. 이번 학기 팀플 3개 있었는데 후.. 정말 쉽지 않았다,, 정말롴ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 팀플 3개 다 잘 마무리한 것 같다. 2개는 팀원들도 잘 만나서 별로 스트레스 없었는데 1개는 정말 팀원이... 류리상자 1년 전의 나.. 고생 많이 했구나 역시 사망년인가.. 1년 전에 이렇게 썼는데.. 취업은 1학기 끝나자마자 하고.. 대학원은 가지 않고.. 밥은 너무나 잘 먹어서 살이 찌고 있고.. 결국 백엔드 개발자를 하고 있다! 인생 정말 알 수 없다! 좋은 방향으로 잘 풀려서 다행이다. 1년 뒤의 나는 뭘 하고 있으려나

크리스마스 트리 테스트 [내부링크]

해커톤에서 크리스마스 트리 테스트 만들어보았습니다. 크리스마스 트리 성향테스트 sojuton tree-test-28875.web.app 한 번씩 해주시면 감사합니다 ㅎ

명동 나들이 [내부링크]

한 달 만에 출근했다! 오랜만에 출근하면 피곤하긴 한데 확실히 집중은 잘 되긴 한다. 퇴근하고는 명동 #딘타이펑 갔다.!! 대기는 한 10분 정도 했다. 세트 A 시켰다! 멘보샤! 나는 멘보샤가 왜 이리 좋지! 탄탄면!.. 흠 비주얼이 그냥 못생겼다.. 맛은 좀 애매하다.. 볶음밥 샤오룽바오! 육즙은 인정이다. 한 입 베어 물면 육즙 쏟아진다.. 다만 맛은.. 엄청 맛있지는 않다. 먹을만한 느낌 요거는 초콜릿 샤오룽바오.. 진짜 딱 이 느낌이다. 한 입 먹으면 초콜릿이 온몸을 감싸는 느낌 엄청 달다 ㅋㅋㅋㅋㅋ 이거 먹는 바람에 입맛이 사라져버려서 명동에서 길거리 음식도 못 먹었다. 구원자 다이소가 보이네요 ㅎ 꺄후~! 오랜만에 오는 명동.. 한국인이 은근 없다. 외국인 천국!! 역시.. 겨울이라.. 트리도 있다!ㅈ 명동예술극장. 오스트리아에서 본 극장이 생각났다. 길거리를 이쁘게 장식했다. 롯데 백화점 구경 갔다!! 차넬 CHANEL == 채널! 고정! 롯데 백화점에서 밀고 있는 크

청담동 케이하우스 [내부링크]

#청담동 #케이하우스 케이하우스 서울특별시 강남구 도산대로90길 16 케이하우스 청담동 케이하우스에 킹크랩 먹으러 갔다!! 단체석이라 안쪽으로 들어갔다. 기본 세팅은 위와 같다. 킹크랩 먹었다. 1인당 23만 원이다!! 메뉴 순서는 위에 적힌 그대로 나온다. 전채요리부터 시작!! 나는 4번째 감태튀김이 젤 맛있었다. 다른 것들도 맛있다. 시금치 게살무침... ㅎ 초딩입맛이라 나랑 안 맞았다. 오쯔꾸리 광어, 방어, 농어다. 킹크랩 나오기 전에 새우튀김, 꽈리고추 튀김이 같이 나온다. 참고로 당연히 음식은 직원분들이 다 서빙해서 자리까지 다 가져다주고 다 먹은 그릇들도 바로바로 치워주고 물도 다 마셨으면 계속 계속 채워준다!! 가면 먹기만 하면 된다!! 대망의 킹크랩!!!!! 킹크랩은 찌는데 30분 정도 걸린다!! 그럼 위의 사진처럼 나오고.. 와인을 뿌리고 불을 붙인다! 불타오르네!! 크.. 총 6마리 나왔다. 2인당 1마리로 보면 된다! 몸통이랑 다리 다 손질해 주신다. 먹기 편하

강남 나들이 [내부링크]

오랜만에 강남역! 저녁으로 쉑쉑버거!! 나는 스모크 햄버거 ... 무난하다.. 치즈감자는 맛있다! 그다음으로 #키이스케이프 오랜만에 방탈출!! 내부 자체는 조그맣다.. 그래서 괜찮을까? 싶었는데 너무 마음에 들었다 ㅎㅎ 테마도 이쁘게 꾸몄고.. 난이도도 적당하다!! 10분 남기고 성공했다!! 스토리도 마음에 든다.. 방탈출하고는 #곱창고 한우모듬곱창 시켰다..) 잘 익어가는 중.. 맛은 양호하다.. 볶음밥은 맛있다!!! 갬성 글귀.. 오랜만에 술도 마시고 ㅎ 같이 마신 사람의 손.. 엄청 빨갛다 ㄷ ㅏ 먹고 미니스탑 아이스크림.. 믹스 아이스크림으로 시켰는데.. 초콜릿이 나왔다.. 과연 누가 잘못한 것일까. 다 먹고 인생네컷 찍었다!! 원래 영화볼까 하다가.. 강남역 온 건데!! 아주 재밌게 놀았다!!

11월 넷째 주 [내부링크]

오랜만에 출근도 했었고 명동도 갔다 오고 킹크랩도 먹고! 먹고 2차로 가서 치킨도 먹고! 김치전도 먹고! 팔찌를 가지고 싶어서 무신사에서 하나 장만했다. 헝헝 할머니들이 만들어서 파는 팔찌이다. 파는 수익 중 일부는 기부하고 이런 편지까지 ㅠ 팔찌도 이쁘다 이거 보고 울 뻔 ㅠ 공릉동 #솔직하다 에서 스프카레도 먹어봤다. 처음 먹어보는데 맛있다. 쉑쉑버거도 먹어주고! 방 탈출도 하고! 에버랜드도 갔다 왔다.! 아쉽게도 불꽃놀이는 하지 않아서 퍼레이드까지 보고 왔다. 에버랜드 포스팅은 따로 해야지 이제 대학생활 마지막 시험 기간이다,, 시험기간 + 해커톤 + 외부 교육 + 밀려오는 일 아주 기대되는구만!! 빨리 시험 기간부터 끝났으면!!

[서평] 적정 소프트웨어 아키텍처 리스크 주도 접근법(조지 페어뱅크스 지음) [내부링크]

적정 소프트웨어 아키텍처 - 리스크 주도 접근법 책입니다. 표지.. 외국 감성이 느껴지네요 뒷장에서는 내용이 간략히 요약되어 있습니다. 소프트웨어 개발을 시작할 때 볼만한 가이드북 리스크는 무엇인고, 아키텍처의 설계 원칙은 어떻게 적용하고 해결하는지 책 앞 부분에 추천사나 지은이, 옮긴이의 말을 보면 소프트웨어 개발을 "시작할 때" 보면 좋은 책인 걸 알 수 있습니다. 즉 실제 개발을 하기 전에 설계를 할 때 보면 좋은 책입니다. 책 자체의 가독성은 딱 소프트웨어 설계 책 느낌입니다. 무난 무난합니다. 그림보다는 글 위주로 채워져 있습니다. 그림은 별로 없지만 글 자체가 굉장히 자세히 써져 있습니다. 아무래도 글 위주이다 보니 책 중간중간에 예제를 넣어서 이해를 하기 쉽게 만들어줬습니다. 예제를 보면서 흐름에 따라가면서 읽으면 책이 전달하고자 하는 내용을 잘 알 수 있습니다. 순서대로 어떻게 적용시켜야 되는지 알 수 있게 구성을 만들었습니다. 글로만 이해하기 어려운 부분은 그림도 넣

SK Tech Summit 첫 번째 날 후기 [내부링크]

11월 8일 ~ 9일 그랜드 워커힐 호텔에서 열리는 SK Tech Summit에 가봤다. https://sktechsummit.com/ SK TECH SUMMIT SK 그룹의 새로운 기술적 성취와 의미 있는 경험을 공유합니다. 지금 바로 등록하세요! sktechsummit.com 오랜만에 세미나도 가보고 싶어서 신청해 봤다. 워커힐 좋다.. 입구 들어가면 바로 등록하는 곳이 있다. 이쁜 전시회 이름 명찰이랑 기념품 준다. 여기도 이쁘다 워커힐 호텔 거의 다 쓰는 느낌 4층 임직원 전시는 휴게 공간 있고 조그맣게 전시공간 있다. 키노트 들으러 갔는데 들어가자마자 우와했다!! 엄청 좋다!! 사람들도 많이 있다! 동영상도 찍어보고.. 먹을거리도 있다.. 이거 맛있었다 합격 안내 로봇도 있는데 귀엽다 기념품에는.. 스티커랑 친환경(?) 물이다. ㅋㅋㅋㅋ 요거는 통역기! 키노트 발표자분 중에서 구글에서 일하시는 분도 있어서 통역기가 필요했다. 실시간으로 통역 되는 거 처음 들어보는데 통역사분

11월 둘째 주 [내부링크]

광나루역에 있는 탐앤 탐스 투썸인가? sk tech summit 갔다 왔다. 이건 썼으니 패스! 군자역 #이이요 저번에 가려다가 줄이 길어서 못 갔는데 tech summit 갔다가 혹시나 싶어서 가봤는데 다행히 줄 없어서 바로 먹었다. 이건 야끼돈부리 연어마끼.. 이이요 합격이다 합격!!! 우동까지 준다!!! 송파나루역 #피자네버슬립스 피자 먹고 싶어서 한 번 가봤다. 진짜 페퍼로니 존맛탱 무조건 더블 페퍼로니 먹어야 된다. 포테이토 피자는.. 음 엄청 맛있는 건 아니고.. 먹을만했다. #광장시장 종로3가역에 있는 광장시장 놀러 갔다 왔다. 이건 따로 포스팅 해야징 청계천도 걸었다. 아! "When it rains heavily, the path will be closed." 계단에 이렇게 적혀 있길래 순간 명언인 줄 알았는데 ㅎ 그냥 비가 내리면 산책로가 침수되어 출입을 통제한다는 의미였다. 머쓱 ㅎ DDP도 가보고.. 좀 구경했다. 오늘은 치킨 먹고 싶어서 치킨 먹었다. 올릴 사

광장시장 나들이 (부촌육회, 박가네 빈대떡, 찹쌀꽈배기) [내부링크]

광장시장 서울특별시 종로구 창경궁로 88 종로 5가 역에 있는 광장시장에 갔다 왔다. 원래는 망원시장 가려다가 멀어서 중간에 급선회했다. 입구 딱 갔을 때 우와 했다. 천장에 걸려있는 국기도 이뻤고 음식이 엄청 많았다. 아주 돌아다니면서 계속 이곳저곳 보면서 침 삼켰다. 사람들이 다 술을 마시길래 왜 술을 마실까 0.75초 정도 고민하다가 바로 납득했다. 내가 간 곳은 육회로 미슐랭을 받은 #부촌육회 웨이팅이 좀 있어서 포기할까 하다가 이 정도는 기다릴 수 있을 것 같아서 기다렸다. 한 20분 정도 기다렸다. 매년 미슐랭 받은 게 신기하다 메뉴는 위와 같다. 보통 육회 + 육회 비빔밥 먹는 것 같다. 여기에 탕탕이 추가하거나,, 음식은 진짜 한 3분 안에 바로 나온다. 이건 육회 비빔밥 공깃밥이랑 소스까지 같이 준다. 진짜 존맛탱 미슐랭 받을만하다. 요건 육회 노른자 터트려서 배랑 같이 먹으면 맛있다. 사람들 다 술 마시길래 여기서도 한 0.25초 정도 고민하다가 역시 육회에는 술이

[Spring] 트랜잭션 동기화 [내부링크]

트랜잭션 동기화 Service에서 트랜잭션을 시작하기 위해 만든 Connection Object를 특별한 저장소에 보관해두고, 이후 호출되는 method에서는 저장된 Connection을 가져다가 사용하게 하는 방식 작업 스레드마다 독립적으로 Connection 오브젝트를 저장하고 관리하기에 다중 사용자를 처리하는 서버의 멀티 스레드 환경에서도 충돌이 날 염려가 없다. 흐름도 UserService는 Connection을 생성한다. Connection을 트랜잭션 동기화 저장소에 저장해고 Connection의 SetAutoCommit(false)를 호출해 트랜잭션을 시작시킨 후에 DAO 기능을 이용하기 시작 첫 번째 update() 메서드가 호출되고, update() 메서드 내부에서 이용하는 JdbcTemplate 메서드에서는 가장 먼저 트랜잭션 동기화 저장소에 현재 시작된 트랜잭션을 가진 Connection 오브젝트가 존재하는지 확인한다. 2번의 메서드 시작 부분에서 저장해둔 Conn

11월 셋째 주 [내부링크]

마라탕.. 엄청 맛있었던 게 있었다 베라.. 요즘 식비 아끼려고.. 쿠팡에서 사는 중 카레! 고등어! 오랜만에 먹는 일상다반 가격이 너무 올랐다 귀여운 고양이 ㅎ 미스터피자 방문포장 60% 할인! 더빛남 쌀국수! 웨이팅 없이 바로 갔다! 치이킨! 롯데몰 앞 트리 구경!! 트리 이쁘다! 롤렉스가 16530원 ㄷㄷ 하나 살까 하다가 내 갤럭시 워치가 더 비싸서 그냥 안 샀다 ㅎ 롯데몰에 있는 환장하는 레이싱.. 이쁘게 꾸몄다! 다꾸 스티커 파는 곳이 있어서 구경갔다 귀여운 거 많아서 몇 개 샀다! 귀엽 난 자취방이 넘 휑한 거 같아서 고양이로 샀다 고양이 스티커도.. 고양이로 유명 짤들 패러디 했다 ㅎ 당신은 몇 개를 알고 있나요~ 완전 귀엽다!! 카페도 갔다! 인스타 갬성 카페 에그타르트 맛있고 까놀레 맛있다 안에는 요렇게~ 캡틴! 미니언즈! 소원 이벤트 하길래 소원 적어서 우체통에! 요즘 목도리.. 아는 사람 결혼식 갔다. 멀어서 갈까 고민하다가 갔다. 친구들이랑~! 모자이크 처리를

Test Double [내부링크]

Test Double 테스트를 진행하기 어려운 경우 테스트를 진행할 수 있도록 만들어주는 객체를 의미한다. 즉 테스트하려는 객체와 연관된 객체를 사용하기 어려울 때 연관된 객체를 대신해 줄 수 있는 객체를 테스트 더블이라고 한다. Dummy 가장 기본적인 테스트 더블 인스턴스화된 객체가 필요하지만 기능은 필요하지 않는 경우에만 사용한다. Dummy 객체의 메서드가 호출되었을 때 정상 동작은 보장하지 않는다. 객체는 전달되지만 사용하지 않는 객체. -> 동작하지 않아도 테스트에는 영향을 미치지 않는 객체를 Dummy 객체 Fake 원래 객체의 단순화된 버전 로직이나 객체 내부에서 필요로 하는 다른 외부 객체들의 동작을 간단히 구현한 객체 동작을 구현하기에 사용할 수는 있지만 실제로 사용할 수는 없다. 실제 객체와 동일한 역할을 하도록 만들어 사용하는 객체 Stub Dummy 객체가 실제로 동작하는 것처럼 보이게 만들어 놓은 객체이다. 인터페이스 또는 기본 클래스가 최소한으로 구현된 상

템플릿 메서드 패턴 [내부링크]

템플릿 메서드 패턴 상속을 통해 슈퍼 클래스의 기능을 확장할 때 사용하는 방법 변하지 않는 기능은 슈퍼 클래스에 만들어둔다. 자주 변경되고 확장할 기능은 서브 클래스에서 만든다. 슈퍼클래스에서는 미리 추상 메서드 또는 Override 가능한 메서드를 정의해두고 이를 활용해서 코드의 기본 알고리즘을 담고 있는 템플릿 메서드를 만든다. 슈퍼클래스에서 디폴트 기능을 정의해두거나 비워뒀다가 서브 클래스에서 선택적으로 오버라이드 할 수 있도록 만들어둔 메서드를 Hook 메서드라고 한다. 서브 클래스에서는 추상 메서드를 구현하거나, 훅 메서드를 오버라이드 하는 방법을 이용해 일부 확장한다. 먼저 SuperClass는 abstract class로 만든다. superMethod는 변하지 않는 기능이기에 super Class에서 구현해 준다. hookMethod는 기본 메서드로 구현을 한다. 이걸 SubClass가 다시 오버라이드 해서 재사용하면 된다. 또한 abstractMethod를 구현해서 S

팩토리 메서드 패턴 [내부링크]

팩토리 메서드 패턴 팩토리 메서드는 부모 클래스에서 객체를 생성할 수 있는 인터페이스를 제공하지만 자식 클래스들이 생성될 객체의 유형을 변경할 수 있도록 하는 생성 패턴이다. 부모 클래스에서는 서브 클래스에서 구현할 메서드를 호출해서 필요한 타입의 오브젝트를 가져와서 사용한다. 이 메서드는 주로 인터페이스 타입이기에 오브젝트를 리턴하므로 자식 클래스에서 어떤 클래스의 오브젝트를 만들어 리턴할지는 슈퍼 클래스에서는 알지 못한다. 즉 서브 클래스에서 오브젝트 생성 방법과 클래스를 결정할 수 있도록 미리 정의해둔 걸 팩토리 메서드라고 하고, 이 방식을 통해서 오브젝트 생성 방법을 나머지 로직, 즉 슈퍼클래스의 기본 코드에서 독립 시키는 방법을 팩토리 메서드 패턴이라고 한다. 구현 먼저 부모 클래스를 만든다. Sport를 상속받는 Soccer Sport를 상속받는 BaseBall를 만든다. 팩토리 메서드 패턴에서 사용할 SportFactory를 만들어준다. 그다음 SportFactory를

전략 패턴 [내부링크]

전략 패턴 자신의 기능 Context에서, 필요에 따라 변경이 필요한 알고리즘을 인터페이스를 통해 통째로 외부로 분리시키고 이를 구현한 구체적인 알고리즘 클래스를 필요에 따라 바꿔서 사용할 수 있게 해주는 디자인 패턴 여기서 알고리즘은 독립적인 책임으로 분리가 가능한 기능 디자인 패턴의 꽃이며,, 개방 폐쇄 원칙의 실현에도 가장 잘 들어 맞는다. Context는 Strategy의 메서드를 호출해서 사용하는 클래스이다. Strategy는 전략을 사용하기 위한 인터페이스 ConcreteStrategyA, B,C 는 : Strategy 인터페이스를 실제로 구현한 클래스. 구현 전략 패턴에서는 인터페이스를 이용해서 구현한다. 즉 인터페이스를 이용해서 각 전략에 맞게 사용할 수 있게 한다. AttackStrategy는 전략 패턴에서 Strategy이다. AttackStrategy를 구현한 CatAttackStrategy Cat은 ConcreteStrategy이다. DogAttackStrate

Spring application context [내부링크]

Bean 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 Bean이라고 부른다. Spring이 IoC 방식으로 관리하는 오브젝트 스프링이 직접 생성과 제어를 담당하는 오브젝트만을 Bean이라고 부른다. Spring Bean 스프링 컨테이너가 생성과 관계 설정, 사용 등을 제어해 주는 제어의 역전이 적용된 오브젝트 Bean Factory Spring의 IoC를 담당하는 핵심 컨테이너를 가리킨다. Bean을 등록, 생성, 조회하고 돌려준다. 또한 빈을 관리하는 기능을 담당한다. Spring에서는 Bean의 생성과 관계 설정 같은 제어를 담당하는 IoC 오브젝트를 Bean Factory라고 부른다. 보통은 Bean Factory를 좀 더 확장한 application context를 더 많이 사용한다. Application context Bean Factory를 확장한 IoC Container Bean을 등록하고 관리하는 기본적인 기능은 Bean Factory와 동일하다.

11월 첫째 주 [내부링크]

"블로그 챌린지 쉬는 주인 거 알고 있음" 예비군 갔다 왔다. 오랜만에 입어보는 전투복.. 자신감 급상승 예비군 갔는데 해병대 안 보여서 잘못 온 줄 알았다. 예비군 가서.. 수분 크림 3개 샀다.. 흑 더 살껄!!! 예비군은 4시간만 하고 끝났다!! 개이득!! 예비군 끝날 때쯤 누가 말 걸길래 봤는데 같은 해병대였다. 어디 과냐고 내가 물어봤는데 나랑 같은 산공과여서 얘기 많이 나눴다. 구글에서 후원 받으면서 창업하고 있는 아주 멋있는 사람이었다!! 공릉에 있는 지동 가봤다. 옛날에는 카페인 줄 알았는데 ㅋㅋㅋ 닭갈비 파는 곳~ 우삼밥~ 병원 갔다가 들린 김가네 김밥이랑~ 떡만둣국~ 군자역에서 공부하러 갔다. 뭐 먹을까 하다가 연어시장 있길래 또 갔다.. 장소 자체는 군자역이 좋은데 맛은 석계역이 더 좋다 먹고 스벅으로 공부하러 갔다. 잠실 롯백 디저트 팝업 스토에서 파는 벨라쿠키!! 카카오 맛인데 맛있다!! 고척에 한국 시리즈 3차전 보러 갔다!! 이태원 사건 이후로 경찰이랑 안

10월 셋째 주 [내부링크]

블챌 하면서 모은 스티커.. 모든창문 쫓아내자! 활짝열어 바이러스! 군자역에 있는 스터디카페에서 공부하다가 유가네 닭갈비 먹으러 왔다! 닭갈비 존맛탱 치즈도 맛있었다. 구일역에 야구 보러 가야 돼서 정말 오랜만에 출근했다. 점심으로 먹은 샐러드! 야구장 가기 전에 애플파이도 사 갔다! 고척 야구장! 2번째 방문! 아 야구장에서 많이 먹었는데 사진을 안 찍었다. 오징어 맛있다. 키움 vs KT 전 보러 갔다. 완전 노잼에 답답했다. 1회전에 KT한테 2점 내주고 그 뒤로 두 팀 다 득점 없이 게임 그대로 끝났다. 가을 야구 한 번 보러 가면 돈 많이 깨지는데 진짜 너무 노잼이라서 짜증 났다. 으이구!! 그 뒤로 더 짜증 나는 건 2경기 더 했는데 키움이 다 이겼다. 심지어 나 보러 간 그다음 날에는 아예 9점씩이나 내버려서 Kt 박살 내버렸다. 진짜 너무하다 키움 오랜만에 바른치킨 먹었다. 바른치킨 순살 존맛탱 포장해서 먹으면 뭔가.. 치킨이 퍽퍽한 살만 있었던 느낌이었는데 매장에서

10월 마지막 주 [내부링크]

스터디 카페에서 열심히 공부하는 중~ 왜 이렇게 돼지 같지 ㅎ 스터디 카페에서 공부하다가.. 오랜만에 라면이 먹고 싶어져서.. 라면 먹으러 갔다. 역시 라면은 존맛탱.. 저녁으로는 노브랜드 버거 도전해 봤다. 미안하다.. 롯데리아 하위 호환이다.. 미안.. 너는 누구니..? 족제비..? 엔티엔즈 사서 집에서 먹었다. 내 최애 디저트 우오아!!! 키움 LG 2차전 보러 갔다!!! 잠실이라서 그런지 사람 엄청 많았다. 특히 LG 팬들 진짜 많다. 나는 다행히 키움 응원석이라서.. 주변에 LG가 거의 없어서 좋았다. 진짜 압도적으로 이길 줄 알았는데 7 대 6까지 따라 잡힌 거 보고 엄청 조마조마했는데 마지막 LG의 고마운 병살타~~ 이때 분위기 엄청났다.. 역시 스포츠는!!! 직관을 해야 돼!! ㅎㅎ 이 뒤에도.. 키움이 LG 계속 이겨서 결승 갑니다~ 내 최애 동영상.. 잠실구장에서 울려펴지는 응원가.. 경기할 때 부르는 것보다 나갈 때 부르는 게 더 재밌었다. 야구장에서.. KFC,

안국역 나들이 [내부링크]

안국역 주변.. 확실히 이쁘다. 공릉에서 살다가 여기로 가보니 완전히 다른 세상 느낌~ 나왔을 때의 분위기부터 다르다~ 꽃이 꽃을 찍는 중 ~ 꽃이 꽃을 찍는 중 ~ (2) 먼저 국립현대미술관 갔다.. 휴.. 다행히!!!!! 아직 대학생이라서!!!! 무료로 볼 수 있었다..!!!!!! 요즘 핫한 전시물.. 인스타를 한다면 한 번쯤은 봤을거다. 진짜 공 한 번도 안 떨어진다. 처음에는 공만 보다가 나중에는 밑에서 받쳐주는 사람 봤는데 뭔가.. 굉장히 고통스러워 보였다. 이건 뭔지 모르겠지만 이쁘다. 요건 무한한 공간이다.. 진짜 신기하다 ㅎ 방주를 나타낸 거라는데!! 30분마다 한 번씩 움직여서 구경해 봤다. 뭘 나타내려는 걸까.. 나는 개발자라서 그런지.. 과연 이걸 어떻게 구현했을까.. 밖에 생각이 안 든다. 앞에서 보면.. 뭔가 거미 같다 이거 실제로 보면 이쁘다. 집에 가져갈 뻔~ 붉은색 무언가.. 차 전등 가져와서 만든 것.. 오우 .. 실제로 보면 좀 무섭다. 엄청 큰 얼굴

[1년 전 오늘] 9만이다 [내부링크]

2021.11.2. 1년 전 오늘 9만이다 어느새 9만을 넘겨버렸다! 이번 연도안에 10만 가는게 목표인데 과연 갈 수 있을까.. 두 달 남았으니 하루에 될 것 같기도하고 아슬아슬하게 안될 것 같기도 하고ㅋㅋㅋㅠ 류리상자 엇 지금은 17만이다.. 1년만에 8만이 증가했네.. 빠르다!! 20만 가자!!

Junit 5 Annotation 정리 [내부링크]

BeforeAll, BeforeEach, AfterAll, AfterEach, Disabled beforeAll, AfterAll은 모든 테스트를 실행할 때 각각 한 번씩만 수행됨 static으로 선언해야 됨 afterEach, beforeEach는 각각의 테스트가 실행이 될 때 수행됨 Disabled는 테스트를 사용하지 않을 때 @DisplayName, @DisplayNameGeneration 기본적으로는 메서드 이름이 테스트 이름이 됨 @DisplayName으로 테스트 이름을 만들 수 있음 -> 보통 이거 사용 충분 Assertion assertEquals -> 실패했을 때 메시지도 적을 수 있음 첫 번째 기댓값, 두 번째 실제 값, 세 번째 실패했을 때 메시지 메시지는 Suppler 이용해서 메시지 작성 가능 람다식으로 만들면 딱 필요한 시점에만 하기에 더 효율적임 람다식으로 안 만들면 성공/실패에 상관없이 메시지를 실행 assertTrue assertAll -> 모든 테스트를

Mockito 정리 [내부링크]

Mockito Mock : 진짜 객체와 비슷하게 동작하지만 프로그래머가 직접 그 객체의 행동을 관리하는 객체 Mockito : Mock 객체를 쉽게 만들고 관리하고 검증할 수 있는 방법을 제공한다. 과연 모든 걸 Mocking 해야될까? 이미 프로덕션 코드가 있는데 그걸 Mock으로 해야될까? 유닛 테스트가 어디까지일까를 생각해보자. 철저히 Mock을 이용해서 의존성을 다 끊고 메서드 한 개만을 테스트 해야될까? 연관된 행동을 하는 객체들을 하나로 묶어서 이걸 유닛테스트로 보고 테스트를 해야될까? Mock 활용 테스트 Mock을 만드는 방법 Mock이 어떻게 동작해야 하는지 관리하는 방법 Mock의 행동을 검증하는 방법 위의 3가지를 알면 테스트를 쉽게 작성할 수 있다. Mock 없는 경우 Mock StudyRepository studyRepository = Mockito.mock(StudyRepository.class); 2. Mock Annotation 을 사용할 수 있다. @M

when().thenReturn 과 doReturn().when() [내부링크]

아무리 봐도 똑같은 메서드인데 왜 두 개나 있을까 싶어서 찾아봤다. when().thenReturn() Strict Mode when.thenReturn은 메서드를 실제 호출하고 mock 객체 리턴 값 반환 그렇기에 메서드 작업이 오래 걸릴 경우 끝날 때까지 기다려야 함 또한 실제 메서드를 호출하기에 해당 메서드에 문제가 생기면 발견할 수 있다. doReturn().when() Lateinit Mode doReturn.when.method는 실제 메서드를 호출하지 않고 mock 객체 리턴 값 반환 실제 메서드를 호출하지 않기에 메서드가 문제가 생겨도 알 수가 없다. 뭘 쓸까? 찾아보니 대부분의 경우 when.thenReturn을 쓰고 이게 가독성이 더 좋다고 한다. 하지만 void형을 test 할 때는 doReturn을 써야 된다. 위와 같은 InterFace가 있고 이 인터페이스의 리턴 값이 void인 Work 메서드를 테스트한다고 해보면 위와 같이 when.then은 컴파일 에러

10월 1주 차 [내부링크]

제일 가지고 싶었던.. 별 수호자 징크스가 떴다.. 징크스.. 스킨 거의 다 모아간다. 일~월요일 부산 갔다. 이거에 대한 포스팅은 따로 해야지 바로 부산 락페스티벌!! 야후~~~ 인생 첫 락페스티벌인데 굉장히 만족스럽게 즐겼다.. 물론 이번 락페는 좀 운영적 미숙함, 공연 중단, 자원봉사자 태도, 단수.. 등 뭐가 문제가 많았는데 난 그냥 재밌게 즐겼다. 최근에 다리가 계속 저려서 신경외과에 가보니 허리에 문제가 생겼다고 한다. 허리 디스크일까 봐 엄청 걱정했는데 다행히 그건 아닌 것 같고.. 확실한 건 이제 관리를 해야 된다는 거다. 그래서 허리에 좋다는 장비들 다 구매하고.. 척추의 신! 정선근 Tv 도 보면서 허리 잘 관리한다. 병원 갔다 온 이후로 완전 바른 자세로만 살고 있다. 헬스도 바로 등록했다. 허리에 무리 가지 않게 조심하면서 할 거다. 붕어방에는 다양한 동물들이 산다.. 대따 큰 왜가리도 산다. 하늘이 이뻐서 인스타 갬성으로 한 번 찍어봤다. 갬성 아니면 말구~

실전! 스프링 데이터 JPA 완강 후기 [내부링크]

인프런 김영한 강사의 실전! 스프링 데이터 JPA 강의 이름 그대로 spring data jpa 가르쳐준다. CRUD 사용법, JPA -> Spring data jpa 넘어가는 과정 spring data Jpa의 여러 가지 기능들, jpa의 영속성 개념들에 대해서 알려준다. 나는 이미 spring data jpa을 좀 사용해 봐서 모든 내용이 새롭지는 않았지만 들으면서 몇몇 기능들은 처음 보는 거라서 유용하게 배웠고 flush, proxy, 영속성 개념 다시 정립할 수 있었다. spring data jpa을 배우고 싶으면 들으면 좋다. 다만 jpa를 한 번도 안 해봤으면 약간 어려울 수도..?

[공릉] 경성초밥 갔다 옴 [내부링크]

경성초밥 서울특별시 노원구 공릉로 119-5 초밥이 먹고 싶어서 어디 갈까 고민하다가 공릉에 있는 스시쟁이, 로지스시는 가봐서 이번에는 경성초밥 가봤다. 공릉경성초밥이지만 태릉입구역에서 더 가까울 것 같다. 나는 운 좋게 웨이팅 없었다. 내부는 그렇게 크지 않다. 음.. 다만 약간 아쉬운 게 있다면 가격이 비싸다 ㅎ 초밥을 시켰을 때 우동이나 간단한 스끼다시라도 주면 좋을 것 같긴 하다. 모둠초밥 20000원, 특초밥 28000원이다. 모둠초밥이랑 특초밥 시켰다. 초밥은 맛있다. 공릉에서 먹은 초밥 중에서 제일 맛있는 것 같긴 하다. 특초밥 구성은 사진과 같다. 가면 계란찜 준다. 나는 초밥이 한 번에 다 나올 줄 알았는데 오마카세 느낌으로 준다.. 광어! 도미뱃살 존맛탱 연어는.. 뭐 당연히 맛있다. 광어 지느러미.. 새우장! 나는 새우가 맛있다.. 참다랑어 생각보다 크다! 도미! 관자! 장어 성게알! 전복! 이것도 생각보다 크다. 다른 곳에 비해서 맛있긴 하다 확실히,, 회도 크

[공릉] 웅파이 갔다 옴 [내부링크]

웅파이 공릉숲길점 서울특별시 노원구 동일로182길 63-1 1층 공릉 철길에 있는 웅파이 EUNPIE! 가게만 보면 미국 느낌 난다. 메뉴는 다음과 같다. 이미 만들어져 있기에 가서 주문하면 바로 나온다. 내부는 다음과 같다. 그렇게 크지 않다! 아기자기한 미국 식당 느낌 나는 비프 파이랑 양송이 파이 먹었다. 양송이 파이는 진짜 양송이 수프 맛이고 비프는.. 음.. 케첩이 곁들어진 비프 느낌 맛있다. 파이 먹고 싶으면 갈만한 것 같다.

10월 둘째 주 [내부링크]

산책 겸 철길 걷다가 발견한 플리마켓 노원 걷기 대회랑 같이 한 것 같다. 내 자취방은 우풍이 굉장히 심하고.. 보일러가 없는 것과 다름 없기에.. 난방텐트를 사봤다.. 사진 꺼보다 돈 2배 더 주고 좋은 걸로 샀다. 오랜만에 쭈꾸미 먹으러 갔다.. 역시.. 내 최애 쭈꾸미.. 언제 먹어도 맛있다. 치즈폭탄 계란찜!! 집에 커튼이 있지만 달기 귀찮아서 다이소에서 5천원 주고 간단히 설치할 수 있는 블라인드 샀다. 나는 갠적으로 굉장히 만족한다. 암막 기능은 없지만 어쨌든 밤에 더 어둡고 아침에도 햇빛을 어느정도 막아줘서 좋다. 뭐 붙이는 암막 시트도 있다고 하는 데 이러면 아예 햇빛을 못 볼 것 같아서 안 샀다. 아침에는 요렇다. 적당히 햇빛 들어오고 좋다. 산책하다가 소방차랑 경찰차가 많아서 뭐지 싶었다. 네코정쪽에서 연기가 나길래 불 난 줄 알았는데 친구말로는 아니었다고 한다. 뭐지!? 낭만 한강.. 회식 가다가 한강 나오길래 쓱 봤는데 너무 이뻐서 바로 찍었다. #일일향 나의

어린이 대공원 가봄 [내부링크]

인생 처음으로 가본 어린이 대공원.. 어른이라서 못 들어가면 어쩌지 했는데 다행히 들어갈 수 있었다^^ 날씨 좋군요~ 어린이 대공원답게.. 대부분 가족 단위이다. 가장 먼저 보이는 수목원으로 들어갔다.. 쓱쓱 보고 나왔다.. 어린이 대공원은 보이는 곳 아무 곳이나 들어가 보면 다 동물이 있다.. 미어캣!! 옆모습.. 어떤 미어캣은.. 유리 가까이 와서 망 보고 그랬다.. 눈 감은 수달!!!!! 사막 여우.. 이때 갔을 때 잠시 .. 사막 여우 집에 떨어진 밤송이 치우느라.. 사람 들어가 있어서 사막 여우들이 안으로 들어가 있었다. 요것은.. 제주 말인가..! 얘네 둘은 계속 이러고만 있었다.. 개코원숭이 저기서 뛰어서 넘어오면 어쩌나 했는데 사이에 보면 절벽(?) 같은 게 있다. 원로해보이는 원숭이.. 긴팔원숭이.. 실제로 보면 좀 무섭다 지능이 엄청 높은 원숭이라고 하는데.. 뭔가 사람이 원숭이를 보는 게 아니라 원숭이가 사람을 구경하는 느낌이 들었다.. 코끼리도 보고.. 코끼리

[여의도] 여의도 불꽃 축제 갔다 옴 [내부링크]

2022년 10월 8일 3년 만에 열린 여의도 불꽃 축제 갔다 왔다. 일본, 이탈리아, 한화순으로 했는데 (대한민국이라고 쓰는 건 한화한테 실례다) 한화 압도적이다.. 3년간 모은 원기옥 터트렸다.. 당연히 여의도 주변에서 밥을 먹는 건 힘들 거라고 생각해서 상왕십리에서 밥 먹었다. 슬로우 캘리 먹으려다가 ㅎ 가는 길에 누구나 홀딱 반한 닭이 있길래 자연스럽게 들어갔다ㅋㅋㅋㅋㅋㅋ 바베큐 존맛탱 소스 존맛탱 감자튀김 존맛탱 왕십리로 가서 5호선 타고 갔다. 지하철 자체에 사람 엄청 많을 줄 알았는데 생각보다 없어서 띠용했다. 출퇴근 지옥철이 훨씬 힘든 느낌 마포에서 많이 내리기도 했다. 여의나루역에서 나오니 사람들이 쏟아져 나오긴 했는데 내가 생각했던 것보다는 적었다. 나는 아예 사람들 사이에 엄청 낑겨서 물 흐르듯이 갈 줄 알았는데 그냥 자연스럽게 걸어갔다. 여의나루역.. 너무 깊다!! 3번 출구로 나왔는데 사람 많았다. 2016년에 탄핵 집회하러 갔을 때의 느낌 물론 그때보단 적었

[Refactoring] 내부자 거래 [내부링크]

내부자 거래 어떤 모듈이 다른 모듈의 내부 정보를 지나치게 많이 알고 있는 코드 냄새, 그로 인해 지나치게 강한 결합도가 생길 수 있다. 적절한 모듈로 함수 옮기기와 필드 옮기기를 사용해서 결합도를 낮출 수 있다. 여러 모듈이 자주 사용하는 공통적인 기능은 새로운 모듈을 만들어 잘 관리하거나, 위임 숨기기를 사용해 특정 모듈의 중재자처럼 사용할 수도 있다. 상속으로 인한 결합도를 줄일 때는 슈퍼 클래스 또는 서브 클래스를 위임하는 방법을 사용할 수 있다. public class Ticket { private LocalDate purchasedDate; private boolean prime; public Ticket(LocalDate purchasedDate, boolean prime) { this.purchasedDate = purchasedDate; this.prime = prime; } public LocalDate getPurchasedDate() { return purcha

[Refactoring] 슈퍼 클래스 추출하기 [내부링크]

거대한 클래스 어떤 클래스가 너무 많은 일을 하다 보면 필드도 많아지고 중복 코드도 보이기 시작한다. 클라이언트가 해당 클래스가 제공하는 기능 중에 일부만 사용한다면 각각의 세부 기능을 별도의 클래스로 분리할 수 있다. 클래스 추출하기를 사용해 관련 있는 필드를 한곳으로 모을 수 있다. 상속 구조를 만들 수 있다면 슈퍼 클래스 추출하기 또는 타입 코드를 서브 클래스로 교체하기를 적용할 수 있다. 클래스 내부에 산재하는 중복 코드는 메서드를 추출해서 제거할 수 있다. 슈퍼클래스 추출하기 두 개의 클래스에서 비슷한 것들이 보인다면 상속을 적용하고, 슈퍼클래스로 필드 올리기와 메서드 올리기를 사용한다. 대안으로는 클래스 추출하기를 적용해 위임을 사용할 수 있다. 우선은 간단히 상속을 적용한 이후, 나중에 필요하다면 슈퍼 클래스를 위임으로 교체하기를 적용한다. public class Department { private String name; private List<Employee> sta

[Refactoring] 서로 다른 인터페이스의 대안 클래스들 [내부링크]

비슷한 일을 여러 곳에서 서로 다른 규약을 사용해 지원하고 있는 코드 냄새 대안 클래스로 사용하려면 동일한 인터페이스를 구현하고 있어야 한다. 함수 선언 변경하기와 함수 옮기기를 사용해서 서로 동일한 인터페이스를 구현하게끔 코드를 수정할 수 있다. 두 클래스에서 일부 코드가 중복되는 경우에는 슈퍼클래스 추출하기를 사용해 중복된 코드를 슈퍼클래스로 옮기고 두 클래스를 새로운 슈퍼클래스의 서브 클래스로 만들 수 있다. 서로 다른 인터페이스의 대안 클래스들 public class OrderProcessor { private EmailService emailService; public void notifyShipping(Shipping shipping) { EmailMessage emailMessage = new EmailMessage(); emailMessage.setTitle(shipping.getOrder() + " is shipped"); emailMessage.setTo(shipp

[Refactoring] 레코드 캡슐화하기 [내부링크]

데이터 클래스 데이터 클래스 : Public 필드 또는 필드에 대한 getter와 Setter만 있는 클래스 코드가 적절한 위치에 있지 않기 때문에 이러한 냄새가 생길 수 있다. 예외적으로 단계 쪼개기에서 중간 데이터를 표현하는 데 사용할 레코드는 불변 객체로 데이터를 전달하는 용도로 사용할 수 있다. public field를 가지고 있다면 레코드 캡슐화하기를 사용해 getter or setter를 통해서 접근하도록 고칠 수 있다. 변경되지 않아야 할 필드에어는 세터 제거하기를 적용할 수 있다. getter와 setter가 사용되는 메서드를 찾아보고 함수 옮기기를 사용해서 데이터 클래스로 옮길 수 있다. 메서드 전체가 아니라 일부 코드만 옮겨야 한다면 함수 추출하기를 선행해서 옮길 수 있다. 레코드 캡슐화하기 변하는 데이터를 다룰 때는 레코드보다는 객체를 선호한다. 여기서 레코드란 public field로 구성된 데이터 클래스를 말한다. 데이터를 메서드 뒤로 감추면 객체의 클라이언트

[Refactoring] 상속 포기 [내부링크]

상속 포기 서브 클래스가 슈퍼클래스에서 제공하는 메소드나 데이터를 잘 활용하지 않는다는 것은 해당 상속 구조에 문제가 있다는 뜻이다. 기존의 서브 클래스 또는 새로운 서브클래스를 만들고 슈퍼클래스에서 메소드와 필드 내려주면 슈퍼 클래스에 공동으로 사용하는 기능만 남길 수 있다. 서브 클래스가 슈퍼클래스의 기능을 재사용하고 싶지만 인터페이스를 따르고 싶지 않은 경우에는 슈퍼클래스 또는 서브클래스를 위임으로 교체하기 리팩토링을 적용할 수 있다. 아주 심각한 코드는 아니다. 간단하게 리팩토링을 할 수 있다. public class Employee { protected Quota quota; protected Quota getQuota() { return new Quota(); } } Employ가 부모 클래스이다. public class Salesman extends Employee {} 간단하다 Quota가 클래스가 Saleman에서 많이 사용되고 있으면 Saleman으로 내린다. pu

[Refactoring] 어서션 추가하기 [내부링크]

어서션 추가하기 당연히 이 값이 있을 것이다라고 생각할 때 사용 종종 코드로 표현하지 않았지만 기본적으로 가정하고 있는 조건들이 있다. 그런 조건을 알고리즘으로 파악하거나 주석을 읽으면서 확인할 수 있다. 그러한 조건을 Assertion을 사용해서 보다 명시적으로 나타낼 수 있다. Assertion은 If나 switch문과 달리 항상 true이길 기대하는 조건을 표현할 때 사용한다. 프로그램이 Assertion에서 실패한다면 프로그래머의 실수로 생각할 수 있다. Assertion이 없어도 프로그램이 동작해야 한다. (자바에서는 컴파일 옵션으로 assert 문을 사용하지 않도록 할 수 있다. 특정 부분에선 특정한 상태를 가정하고 있다는 것을 명시적으로 나타냄으로써 의사소통적인 가치를 지니고 있다. package me.whiteship.refactoring._24_comments._43_introduce_assertion; public class Customer { private Dou

인프런 코딩으로 학습하는 리팩토링 강의 완강 [내부링크]

9월 14일부터 10월 6일까지 해서 강의 완강 제대로 들은 건 9월 26일부터.. 이 강의는 마틴 파울러의 리팩토링 2판 강의를 자바로 설명해 주는 강의이다. 자바 백엔드 개발자라면 필수다.. 정말 정말 필수다!! 특히 혼자 공부하는 사람들, 개발 경험이 별로 없는 사람들, 개발자 준비하는 사람들, 취준생, 대학생, 신입, 주니어 코드 리뷰를 어떻게 해야 될지 모르겠는 사람들한테 강추다!! 그냥 무조건 듣자!! 리팩토링에 대한 정말 많은 케이스들을 알려주면서 그걸 코드로 다 보여준다. 나는 이 강의를 들으면서 많이 배웠다. 어떻게 코드를 작성해야 되는지 어느 정도 감을 잡을 수 있게 되었다. 이 강의 들으면서 코드 리뷰도 한 번 해봤는데 전보다 확실히 시야가 넓어진 것 같다. 계속 복습하고 실제 코드에 적용하면서 체화할 수 있도록 노력해야겠다!

[Refactoring] 반복문을 파이프라인으로 바꾸기 [내부링크]

최근에는 반복문에 비해서 더 나은 대안책이 생겼다. 반복문을 파이프라인으로 바꾸는 리팩토링을 적용하면 필터나 맵핑과 같은 파이프라인 기능을 사용해서 보다 빠르게 어떤 작업을 하는 지 파악할 수 있다. 반복문을 파이프라인으로 바꾸기 컬렉션 파이프라인(자바의 Stream) 고전적인 반복문을 파이프라인 오퍼레이션을 사용해 표현하면 코드를 더 명확하게 만들 수 있다. 필터 : 전달받은 조건의 true에 해당하는 데이터만 다음 오퍼레이션으로 전달 맵 : 전달 받은 함수를 사용해 입력 값을 원하는 출력값으로 변환해서 다음 오퍼레이션으로 전달 public class Author { private String company; private String twitterHandle; public Author(String company, String twitterHandle) { this.company = company; this.twitterHandle = twitterHandle; } static p

[Refactoring] 계층 합치기 [내부링크]

성의없는 요소 여러 프로그래밍적인 요소를 만드는 이유 나중에 발생할 변화를 대비해서 해당 함수 또는 클래스를 재사용하려고 의미있는 이름을 지어주려고 가끔 그렇게 예상하고 만들어 놓은 요소들이 기대에 부응하지 못 하는 경우가 있는데 그런 경우에 해당 요소들을 제거해야 한다. 관련 리팩토링 기술 함수 인라인 클래스 인라인 불필요한 상속 구조는 계층 합치기를 사용할 수 있다. 그냥 필요없는 요소들 계층 합치기 상속 구조를 리팩토링 하는 중에 기능을 올리고 내리다 보면 하위 클래스와 상위 클래스 코드에 차이가 없는 경우가 발생할 수 있다. 그런 경우에 그 둘을 합칠 수 있다. 하위 클래스와 상위 클래스 중에 어떤 것을 없애야 하는가? 둘 중에 보다 이름이 적은 적절한 쪽을 선택하지만, 애매하다면 어느쪽을 선택해도 문제 없다. public class Reservation { private LocalDateTime startDateTime; private LocalDateTime endDate

[Refactoring] 죽은 코드 제거하기 [내부링크]

추측성 일반화 나중에 필요할 것 같아서 만들었지만 결국에는 쓰이지 않는 코드가 발생한 경우 죽은 코드 제거하기 사용하지 않는 코드가 애플리케이션 성능이나 기능에 영향을 끼치지는 않는다. 하지만, 해당 소프트웨어가 어떻게 동작하는지 이해하려는 사람들에게는 꽤 고통을 줄 수 있다. 실제로 나중에 필요해질 코드라 하더라도 지금 쓰이지 않는 코드라면 삭제해야 한다. 나중에 정말로 다시 필요해진다면 git과 같은 버전 관리 시스템을 사용해 복원할 수 있다. 정리 출처 : 코딩으로 학습하는 리팩토링 - 백기선

[Refactoring] 특이 케이스 추가하기 [내부링크]

임시 필드 클래스에 있는 어떤 필드가 특정한 경우에만 값을 갖는 경우 어떤 객체의 필드가 특정한 경우에만 값을 가진다는 것을 이해하는 것은 일반적으로 예상하지 못하기에 이해하기 어렵다. null, empty 등 관련 리팩토링 클래스 추출하기를 사용해서 해당 변수들을 옮길 수 있다. 함수 옮기기를 사용해서 해당 변수를 사용하는 함수를 특정 클래스로 옮길 수 있다. 특이 케이스 추가하기를 적용해 특정한 경우 해당하는 클래스를 만들어 해당 조건을 제거할 수 있다. 특이 케이스 추가하기 어떤 필드의 특정한 값에 따라 동일하게 동작하는 코드가 반복적으로 나타난다면, 해당 필드를 감싸는 특별한 케이스를 만들어 해당 조건을 표현할 수 있다. 이러한 메커니즘을 특이 케이스 패턴이라고 부르고 Null Object 패턴을 이러한 패턴의 특수한 형태라고 볼 수 있다. package me.whiteship.refactoring._16_temporary_field._36_introduce_special_c

[Refactoring] 위임 숨기기 [내부링크]

메시지 체인 레퍼런스를 따라 계속해서 메소드 호출이 이어지는 코드이다. 예) this.member.getCredit().getLevel().getDescription() 해당 코드의 클라이언트가 코드 체인을 모두 이해해야 한다. 체인 중 일부가 변경된다면 클라이언트의 코드도 변경해야 한다. 관련 리팩토링 위임 숨기기를 사용해 메시지 체인을 캡슐화를 할 수 있다. 함수 추출하기로 메시지 체인 일부를 함수로 추출한 뒤 함수 옮기기로 해당 함수를 적절한 곳으로 이동할 수 있다. 위임 숨기기 캡술화란 어떤 모듈이 시스템의 다른 모듈을 최소한으로 알아야한다는 것이다. 그래야 어떤 모듈을 변경할 때, 최소한의 모듈만 그 변경에 영향을 받을 것이고, 그래야 무언가를 변경하기 쉽다. 처음 객체 지향에서 캡슐화를 배울 때 필드를 메소드로 숨기는 것이라 배우지만, 메소드 호출도 숨길 수 있다. person.department().manager() -> person.getManager() 이전의 코드는

[Refactoring] 중재자 제거하기 [내부링크]

위임 숨기기의 반대에 해당하는 리팩토링 무조건 캡슐화는 옳지 않다!! 필요한 캡슐화의 정도는 시간에 따라 그리고 상황에 따라 바뀔 수 있다. 캡슐화의 정도를 중재자 제거하기와 위임 숨기기 리팩토링을 통해 조절할 수 있다. 위임하고 있는 객체를 클라이언트가 사용할 수 있도록 getter를 제공하고, 클라이언트는 메시지 체인을 사용하도록 코드를 고친 뒤에 캡슐화에 사용했던 메서드를 제거한다. Low of Demeter를 지나치게 따르기보다는 상황에 맞게 활용하도록 하자. 디미터의 법칙, 가장 가까운 객체만 사용한다. 중재자 제거하기 public class Department { private Person manager; public Department(Person manager) { this.manager = manager; } public Person getManager() { return manager; } } Department class public class Person { p

[Refactoring] 슈퍼클래스를 위임으로 바꾸기 [내부링크]

객체지향에서 상속은 기존의 기능을 재사용하는 쉬우면서 강력한 방법이지만 때로는 적절하지 않은 경우도 있다. 서브 클래스는 슈퍼클래스의 모든 기능을 지원해야 한다. stack이라는 자료 구조를 만들 때 List를 상속받는 것이 좋을까? 서브 클래스는 슈퍼클래스 자리를 대체하더라도 잘 동작해야 한다. 리스코프 치환 원칙 서브 클래스는 슈퍼클래스의 변경에 취약하다. 그렇다면 상속을 사용하지 않는 것이 좋은가? 상속은 적절한 경우에 사용한다면 매우 쉽고 효율적인 방법 따라서 우선 상속을 적용한 이후에 적절치 않다고 판단이 된다면 그때 리팩토링을 적용하자. 슈퍼클래스를 위임으로 바꾸기 public class CategoryItem { private Integer id; private String title; private List<String> tags; public CategoryItem(Integer id, String title, List<String> tags) { this.id =

[Refactoring] 기능 편애 [내부링크]

어떤 모듈에 있는 함수가 다른 모듈에 있는 데이터나 함수를 더 많이 참조하는 경우에 발생한다. 예) 다른 객체의 getter를 여러 개 사용하는 메서드 관련 리팩토링은 다음과 같다. 다른 모듈에 있는 걸 많이 참조한다면 위치가 잘못된 것이기에 함수 옮기기를 통해서 적절한 위치로 옮긴다. 함수의 일부분만 다른 곳의 데이터와 함수를 많이 참조한다면 함수 추출하기로 함수를 나눈 다음에 함수를 옮길 수 있다. 만약에 여러 모듈을 참조하고 있다면, 그중에서 가장 많은 데이터를 참조하는 곳으로 옮기거나, 함수를 여러 개로 쪼개서 각 모듈로 분산 시킬 수도 있다. 데이터와 해당 데이터를 참조하는 행동을 같은 곳에 두도록 하자. 기능 편애 package me.whiteship.refactoring._09_feature_envy; public class Bill { private ElectricityUsage electricityUsage; private GasUsage gasUsage; publi

[Refactoring] 데이터 뭉치 [내부링크]

항상 뭉쳐 다니는 데이터는 한곳으로 모아두는 것이 좋다. 여러 클래스에 존재하는 비슷한 필드 목록 여러 함수에 전달하는 매개변수 목록 관련 리팩토링 기술 클래스 추출하기를 통해서 여러 필드를 하나의 객체나 클래스로 모을 수 있다. 매개변수 객체 만들기 또는 객체 통째로 넘기기를 사용해서 메서드 매개변수를 개선할 수 있다. 데이터 뭉치 public class Employee { private String name; private String personalAreaCode; private String personalNumber; public Employee(String name, String personalAreaCode, String personalNumber) { this.name = name; this.personalAreaCode = personalAreaCode; this.personalNumber = personalNumber; } public String personalPh

[JPA] saveall 사용 시 주의사항 [내부링크]

문제점 테스트 코드를 짜던 도중.. 며칠 동안 내가 예상한 결과랑 다르게 나오는 상황이 발행했다. 처음에는 내가 쿼리를 잘못짠 줄 알았지만 아니었고 그다음에는 혹시 자료형 때문인가 싶었는데 아니었다. 그렇게 문득 든 생각이 혹시 데이터가 잘못 들어간건가라는 생각이 들었다. 그래서 지금 db에서 확인을 해보았고 원래대로라면 90개가 들어야가야 되는데 단 10개 밖에 들어가지가 않았다. 뭔가 문제일까 싶어서 로그를 보다가... 내가 생각했을 때는 saveall를 했으면 insert into 쿼리만 나와야되는데 보니까 select 쿼리도 나가고 update 쿼리도 나가는거였다. select 쿼리는 뭐 db에 저장하는 거랑은 상관없긴 했는데 select가 일어나는 것 자체가 쿼리를 더 날리는 거니 이것도 문제이고 update 쿼리는 왜 나가는지도 모르겠고 딱 봐도 insert 대신 update가 발생해서 9개 밖에 저장이 안되는 것 같았다. 바로 saveall 관련해서 구글링을 해보았다.

[Refactoring] 기본형을 객체로 바꾸기 [내부링크]

기본형 집착 애플리케이션에서 다루고 있는 도메인에 필요한 기본 타입을 만들지 않고 프로그래밍 언어가 제공하는 기본 타입을 사용하는 경우가 많다. 예) 전화번호, 좌표, 돈, 범위, 수량 원시 타입 (int, boolean, double) 등을 사용하면 기능을 만들기 어렵다. 기본형으로 단위 또는 표기법을 표현하기 어렵다. 관련 리팩토링 기술 기본형을 객체로 바꾸기 타입 코드를 서브 클래스로 바꾸기 조건부 로직을 다형성으로 바꾸기 클래스 추출하기 매개변수 객체 만들기 기본형을 객체로 바꾸기 개발 초기에는 기본형으로 표현한 데이터가 나중에는 해당 데이터와 관련 있는 다양한 기능을 필요로 하는 경우가 발생한다. 예) 문자열로 표현하던 전화번호의 지역 코드가 필요하거나 다양한 포맷을 지원하는 경우 예) 숫자로 표현하던 온도의 단위를 변환하는 경우 기본형을 사용할 데이터를 감싸줄 클래스를 만들면 필요한 기능을 추가할 수 있다. public class Order { private String

[Refactoring] 단계 쪼개기 [내부링크]

서로 다른 일을 하는 코드를 각기 다른 모듈로 분리한다. 어떤 것을 변경해야 할 때, 그것과 관련 있는 것만 신경 쓸 수 있다. 여러 일을 하는 함수의 처리 과정을 각기 다른 단계로 구분할 수 있다. 전처리 -> 주요 작업 -> 후처리 컴파일러 -> 테스트 읽어오기 -> 실행 가능한 형태로 변경 서로 다른 데이터를 사용한다면 단계를 나누는 데 있어 중요한 단서가 될 수 있다. 중간 데이터를 만들어 단계를 구분하고 매개변수를 줄이는데 활용할 수 있다. 데이터를 기반으로 구별하자!!! 데이터를 기반으로 프로세스를 쪼개자. 단계 쪼개기 public class PriceOrder { public double priceOrder(Product product, int quantity, ShippingMethod shippingMethod) { final PriceData priceData = getPriceData(product, quantity); return applyShipping(pri

[Refactoring] 함수 옮기기 [내부링크]

모듈화가 잘 된 소프트웨어는 최소한의 지식만으로 프로그램을 변경할 수 있다. 관련 있는 함수나 필드나 모여있어야 더 쉽게 찾고 이해할 수 있다. 하지만 관련 있는 함수나 필드가 항상 고정적인 것은 아니기에 때에 따라 옮겨야 할 필요가 있다. 함수를 옮겨야 하는 경우 해당 함수가 다른 문맥에 있는 데이터를 더 많이 참조하는 경우 해당 함수를 다른 클라이언트(클래스)에서도 필요로 하는 경우 함수를 옮겨갈 새로운 문맥(클래스)이 필요한 경우에는 "여러 함수를 클래스로 묶기" 또는 클래스 추출하기를 사용한다. 함수를 옮길 적당한 위치를 찾기가 어렵다면, 그대로 두어도 괜찮다. 함수 옮기기 package me.whiteship.refactoring._07_divergent_change._25_move_function; public class Account { private int daysOverdrawn; private AccountType type; public Account(int day

[Refactoring] 클래스 추출하기 [내부링크]

클래스가 다루는 책임이 많아질수록 클래스가 점차 커진다. 클래스를 쪼개는 기준 데이터나 메서드 중 일부가 매우 밀접한 관련이 있는 경우 일부 데이터가 대부분 같이 바뀌는 경우 데이터 또는 메서드 중 일부를 삭제한다면 어떻게 될까? 하위 클래스를 만들어 책임을 분산 시킬 수도 있다. 클래스 추출하기 public class Person { private String name; private String officeAreaCode; private String officeNumber; public String telephoneNumber() { return this.officeAreaCode + " " + this.officeNumber; } public String name() { return name; } public void setName(String name) { this.name = name; } public String officeAreaCode() { return officeA

[Refactoring] 필드 옮기기 [내부링크]

Shotgun Surgery 어떤 한 변경 사항이 생겼을 때 여러 모듈을 (여러 함수 또는 여러 클래스를) 수정해야 하는 상황. 하나의 일로 여러 곳을 손보는 경우 뒤엉킨 변경과 유사하지만 반대의 사황이다. 뒤엉킨 변경은 여러 가지 이유로 하나의 클래스를 손보는 경우 ex) 새로운 결제 방식을 도입하려면 여러 클래스의 코드를 수정해야 한다. 변경 사항이 여러 곳에 흩어진다면 찾아서 고치기도 어렵고 중요한 변경 사항을 놓칠 수 있는 가능성도 생긴다. 관련 리팩토링 기술 함수 옮기기 또는 필드 옮기기를 사용해서 필요한 변경 내역을 하나의 클래스로 모을 수 있다. 비슷한 데이터를 사용하는 여러 함수가 있다면 여러 함수를 클래스로 묶기를 사용할 수 있다. 단계 쪼개기를 사용해 공통으로 사용되는 함수의 결과물들을 하나로 묶을 수 있다. 함수 인라인과 클래스 인라인로 흩어진 로직을 한곳으로 모을 수 있다. 필드 옮기기 좋은 데이터 구조를 가지고 있다면, 해당 데이터에 기반한 어떤 행위를 코드로

[Refactoring] 함수 인라인 [내부링크]

함수 추출하기의 반대에 해당하는 리팩토링 추출하기 : 함수로 추출해 함수 이름으로 의도를 표현하는 방법 인라인 : 다시 가져오는 거임 함수 본문이 함수 이름만큼 또는 그보다 더 잘 의도를 표현하는 경우가 있다. 함수 리팩토링이 잘못된 경우에 여러 함수를 인라인 하여 커다란 함수를 만든 다음에 다시 함수 추출하기를 시도할 수 있다. 단순히 메서드 호출을 감싸는 우회형 메서드라면 인라인으로 없앨 수 있다. 상속 구조에서 오버라이딩 하고 있는 메서드는 인라인 할 수 없다. 함수 인라인 public class Rating { public int rating(Driver driver) { return moreThanFiveLateDeliveries(driver) ? 2 : 1; } private boolean moreThanFiveLateDeliveries(Driver driver) { return driver.getNumberOfLateDeliveries() > 5; } //moreThan

[Refactoring] 클래스 인라인 [내부링크]

클래스 추출하기와 반대에 해당하는 리팩토링 리팩토링을 하는 중에 클래스의 책임을 옮기다 보면 클래스의 존재 이유가 빈약해지는 경우가 발생할 수 있다. 두 개의 클래스를 여러 클래스로 나누는 리팩토링의 경우, 우선 클래스 인라인을 적용해서 두 클래스의 코드를 한곳으로 모으고 그런 다음에 클래스 추출하기를 적용해서 새롭게 분리하는 리팩토링을 적용할 수 있다. 클래스 인라인 음.. 이 부분 예제는 어차피 합치는 거나 다름없다. package me.whiteship.refactoring._08_shotgun_surgery._29_inline_class; public class Shipment { private TrackingInformation trackingInformation; public Shipment(TrackingInformation trackingInformation) { this.trackingInformation = trackingInformation; } public Tr

9월 마지막 주 [내부링크]

점심으로 먹은 서브웨이 2개.. 에그마요랑 로스트 치킨 59년 만에 달보다 밝은 목성이다. 나는 몰랐는데 친구가 단톡방에 말해줘서 낭만 좀 챙길 겸 구경하러 갔다. 알고 보니 다음에 목성을 볼 수 있는 건 2100년 이후라고 해서 좀 오래 봤다. 목성.. 이때 진짜 밝기는 했다. 언제 목성 봐보냐.. 내 학교생활 처음으로 동학 가봤다. 다행히 졸업하기 전에 가본다. 몇 번 가보려고 했는데 갈 때마다 사람 많아서 못 갔는데.. 드디어 갔다!! 동학주 먼저 시키고.. 칠면조 바로 시켰다. 엄청 기대했는데!! 음.. 맛있긴 하다 ㅎ 그리고 해물파전이랑 감자전도 시켰는데 오우 나는 전이 너무 맛있었다. 음식 나오고 한 컷.. 물론 이것만 시키지는 않았다. 칠면조도 추가하고 전도 2번 정도 더 시키고 술도 더 시키고.. 엄청 많이 나올 줄 알았는데 4명이서 12만 원.. 이 정도면 괜찮다. 아 전 또 먹고 싶네 법인.. 카드..를 발급.. 받았습니다.. 호오!!!! 영롱하다!! 9월 28일에

[Refactoring] 파생 변수를 질의 함수로 바꾸기 [내부링크]

파생 변수란 어디선가 계산된 데이터 불변 값이 파생변수에는 리팩토링을 적용할 필요가 없다. 변경할 수 있는 데이터를 최대한 줄이도록 노력해야 한다. 계산해서 알아낼 수 있는 변수는 제거할 수 있다. 계산 자체가 데이터의 의미를 잘 표현하는 경우도 있다. 해당 변수가 어디선가 잘못된 값으로 수정될 수 있는 가능성을 제거할 수 있다. 계산에 필요한 데이터가 변하지 않는 값이라면 계산의 결과에 해당하는 데이터 역시 불변 데이터이기에 해당 벼수는 그대로 유지할 수 있다. 파생 변수를 질의 함수로 바꾸기 package me.whiteship.refactoring._06_mutable_data._21_replace_derived_variable_with_query; public class Discount { private double discountedTotal; private double discount; private double baseTotal; public Discount(double

[Refactoring] 여러 함수를 변환 함수로 묶기 [내부링크]

관련 있는 여러 파생 변수를 만들어내는 함수가 여러 곳에서 만들어지고 사용된다면 그러한 파생 변수를 변환 함수를 통해 한 곳으로 모아둘 수 있다. 소스 데이터가 변경될 수 있는 경우에는 여러 함수를 클래스로 묶기를 사용하는 것이 적절하다. 소스 데이터가 변경되지 않는 경우에는 두 가지 방법을 모두 사용할 수 있지만, 변환 함수를 사용해서 불변 데이터의 필드로 생성해 두고 재사용할 수도 있다. 여러 함수를 변환 함수로 묶기 변환 함수를 사용한다. 클래스 3개에서 똑같은 메서드가 사용되고 있기에 이 부분을 변환 함수로 바꿔본다. public class Client2 { private double base; private double taxableCharge; public Client2(Reading reading) { this.base = baseRate(reading.month(), reading.year()) * reading.quantity(); this.taxableCharge

[Refactoring] 참조를 값으로 바꾸기 [내부링크]

레퍼런스 객체와 값 객체를 구별하자. 변하는 값을 변하지 않는 값으로 레퍼런스 객체는 객체 내부의 값이 바뀔 수 있다. 밸류는 객체의 동일성을 안에 있는 값으로 판별한다. 값 객체는 객체가 가진 필드의 값으로 동일성을 확인한다. 값 객체는 변하지 않는다. 어떤 객체의 변경 내역을 다른 곳으로 전파시키고 싶으면 레퍼런스, 아니면 값 객체를 사용한다. 레퍼런스는 바뀐 값 그대로 사용할 수 있다. 참조를 값으로 바꾸기 public class Person { private TelephoneNumber officeTelephoneNumber; // 레퍼런스 //이걸 VO로 바꾸고 싶다! public String officeAreaCode() { return this.officeTelephoneNumber.areaCode(); } public void officeAreaCode(String areaCode) { this.officeTelephoneNumber.areaCode(areaCode);

[Spring boot] @CreationTimeStamp null after update [내부링크]

@Column(name = "CREATE_DT") @CreationTimestamp private LocalDateTime createDt; 기존에 createDt를 사용할 때 @CreationTimestamp을 사용해서 insert 할 때 자동으로 값이 생성되게 했다. 하지만 이 방식에는 문제가 존재하는데.. 똑같은 걸 한 번 더 save 하면 createDt가 null로 바뀌어버린다.. 처음 POST를 날리면 잘 들어가지만.. 한 번 더 날리면 null로 바뀐다. @CreationTimestamp column sets to null when I update it from POST method I'm trying to set a field in my database to write the date when a row is modified. To do that, I'm using the anotations provided by Hibernate. When I create the ro

[서평] 이것이 자바다 개정판 - 신용권, 임경균 지음 [내부링크]

2015년에 초판이 발간된 이것이 자바다 책이 2022년에 완전 컬러판으로 업그레이드해서 개정판이 나왔습니다!! 책 앞 부분은 위와 같이 생겼습니다. 뒷부분은 다음과 같습니다. 기존 책에 비해서 많은 내용이 보강되었습니다. Java 17 문법까지 추가되었고 데이터베이스 관련한 부분도 추가가 되었습니다. 기존 책도 많이 유명하고 좋았지만 이번 개정판은 확실히 책도 더 깔끔해지고 많은 내용을 담았습니다. 참고로 책은 984 페이지입니다. 책은 총 20개의 챕터로 구성되어 있습니다. 자바로 할 수 있는 웬만한 건 다 들어가 있다고 보면 됩니다. 기본기부터 해서 java 8 문법 java 17문법 자바를 활용한 데이터베이스, 네트워크 등 다 들어가 있습니다. 참고하시면 될 것 같습니다. 이 부분이 새롭게 추가된 부분입니다. 책은 굉장히 깔끔하게 구성되어 있습니다. 자바를 시작하기 위해서 이클립스를 다운 받는 부분인데 설치 과정에서 어려움을 느끼지 않도록 설정 부분까지 다 그림으로 나와있고

[Refactoring] 질의 함수와 변경 함수 분리하기 [내부링크]

눈에 띌만한 사이드 이펙트 없이 값을 조회할 수 있는 메서드는 테스트하기도 쉽고, 메서드를 이동하기도 편하다. 명령-조회 분리(command-query separation) 규칙 : 어떤 값을 리턴하는 함수는 사이드 이펙트가 없어야 한다. 값 조회, 변경 함수를 구분해서 만들자. 눈에 띌만한 사이드 이펙트 캐시는 중요한 객체 상태 변화는 아니다. 따라서 어떤 메서드 호출로 인해, 캐시 데이터를 변경하더라도 분리할 필요는 없다. 질의 함수와 변경 함수 분리하기 public class Billing { public double getTotalOutstandingAndSendBill() { // 조회를 하고 이메일을 보내는 2가지 일을 하고 있음 double result = customer.getInvoices().stream() .map(Invoice::getAmount) .reduce((double) 0, Double::sum); sendBill(); return result; } p

[Refactoring] 매개변수 객체 만들기 [내부링크]

같은 매개변수들이 여러 메소드에 걸쳐서 나타난다면 그 매개변수들을 묶은 자료 구조를 만드는 것이 좋다. 이렇게 자료구조를 만들면 해당 데이터간의 관계를 보다 명시적으로 나타낼 수 있다. 함수에 전달할 매개변수 개수를 줄일 수 있다. 도메인을 이해하는데 중요한 역할을 하는 클래스로 발전할 수도 있다. 매개변수 객체 만들기 private double getRate(int totalNumberOfEvents, Participant p) { long count = p.homework().values().stream() .filter(v -> v == true) .count(); double rate = count * 100 / totalNumberOfEvents; return rate; } private String getMarkdownForHomeWork(int totalNumberOfEvents,Participant p, double rate) { return String.format(

[Refactoring] 객체 통째로 넘기기 [내부링크]

여러 파라미터가 있는 경우 -> 한 개의 오브젝트, 레코드일 때, 객체를 통째로 넘겨서 파라미터를 줄일 수 있다. 이건 오브젝트가 있는 경우 사용한다. 이 리팩토링을 사용하기 전에 의존성을 고려해야 한다. 메서드의 위치가 적절하지 않을 수 있다. 객체 통째로 넘기기 package me.whiteship.refactoring._03_long_function._09_preserve_whole_object; import java.util.HashMap; import java.util.Map; public record Participant(String username, Map<Integer, Boolean> homework) { public Participant(String username) { this(username, new HashMap<>()); } public void setHomeworkDone(int index) { this.homework.put(index, true); }

[Refactoring] 함수를 명령으로 바꾸기 [내부링크]

함수를 독립적인 객체인, Command로 만들어서 사용할 수 있다. 커맨드 패턴에 관련한 내용 -> 디자인 패턴임 오퍼레이션 하나를 인스턴스 하나로 만드는 패턴 복잡해질 수 있다. 부가적인 기능으로 Undo 기능을 만들 수도 있다. 더 복잡한 기능을 구현하는데 필요한 여러 메서드를 추가할 수 있다. 상속이나 템플릿을 활용할 수도 있다. 복잡한 메서드를 여러 메서드나 필드를 활용해 쪼갤 수도 있다. 대부분의 경우 커맨드보다는 함수를 사용하나, 커맨드 말고 다른 방법이 없는 경우 사용 함수의 분리를 고민해 보자, 더 복잡해질 것 같다. 함수를 명령으로 바꾸기 기존 함수를 private method로 뺀다. private void extracted(List<Participant> participants) throws IOException { try (FileWriter fileWriter = new FileWriter("participants.md"); PrintWriter writer

[Refactoring] 조건문 분해하기 [내부링크]

여러 if 문에 따라서 달라지는 코드를 작성하게 되면 긴 함수가 만들어질 수 있다. 조건과 액션 모두 의도를 표현해야 한다.! 함수 추출하기와 동일한 리팩토링이지만 의도만 다를 뿐이다. 조건문 분해하기 private Participant findParticipant(String username, List<Participant> participants) { Participant participant; if (participants.stream().noneMatch(p -> p.username().equals(username))) { participant = new Participant(username); participants.add(participant); } else { participant = participants.stream().filter(p -> p.username().equals(username)).findFirst().orElseThrow(); } return part

[Refactoring] 반복문 쪼개기 [내부링크]

하나의 반복문에서 여러 개의 작업을 하는 코드들이 있다. 해당 반복문을 수정할 때 여러 작업을 모두 고려하면서 코딩을 해야 한다. 반복문을 여러 개로 쪼개면 보다 쉽게 이해하고 수정할 수 있다. 성능 문제를 야기할 수 있겠지만, 리팩토링과 성능 최적화는 별개의 작업이다. 리팩토링을 마친 이후에 성능 최적화 시도 가능 반복문 쪼개기 for (GHIssueComment comment : comments) { Participant participant = findParticipant(comment.getUserName(), participants); participant.setHomeworkDone(eventId); if (firstCreatedAt == null || comment.getCreatedAt().before(firstCreatedAt)) { firstCreatedAt = comment.getCreatedAt(); first = participant; } } 기존의 for 문

[Refactoring] 조건문을 다형성으로 바꾸기 [내부링크]

여러 타입에 따라 각기 다른 로직으로 처리해야 하는 경우에 다형성을 적용해서 조건문을 명확하게 분리할 수 있다. 반복되는 switch 문을 각기 다른 클래스를 만들어서 제거할 수 있다. 공통으로 사용되는 로직은 상위 클래스에 두고 달라지는 부분만 하위 클래스에 둠으로써, 달라지는 부분만 강조할 수 있다. 당연히 모든 조건문을 다형성으로 바꿔야 하는 것은 아니다!! 복잡한 경우, 달라지는 부분에만 고려하는 것이 좋다! 조건문을 다형성으로 바꾸기 package me.whiteship.refactoring._03_long_function._13_replace_conditional_with_polymorphism; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Comparator; import java.util.List; public class StudyPri

[Refactoring] 매개변수를 질의 함수로 바꾸기 [내부링크]

어떤 함수에 매개변수가 많을수록 함수의 역할을 이해하기 어려워진다. 매개변수가 많으면 과연 그 함수가 한 가지 일을 하고 있는 게 맞는가를 의심해 보자! 함수를 쪼개자! 불필요한 매개변수는 없는가! 하나의 매개변수로 다른 매개변수를 추론할 수 있는가! 하나의 Object로 뭉칠 수 있는 매개변수 목록은 없는가! 어떤 매개변수를 다른 매개변수를 통해서 알아낼 수 있으면! "매개변수를 질의 함수로 바꾸기" 기존 자료구조에서 세부적인 데이터를 가져와서 여러 매개변수로 넘기는 대신, 객체 통째로 넘기기! 일부 매개변수들이 대부분같이 넘겨진다면, 매개변수 객체 만들기! 매개변수가 플래그로 사용된다면, 플래그 인수 제거하기! 여러 함수가 일부 매개변수를 공통적으로 사용한다면 여러 함수를 클래스로 묶기를 통해서 매개변수를 질의 함수로 바꾸기 함수의 매개변수 목록은 함수의 다양성을 대변하고, 짧을수록 이해하기 좋다. 어떤 한 매개변수를 다른 매개변수를 통해 알아낼 수 있으면 중복 매개변수라 생각할

[Refactoring] 플래그 인수 제거하기 [내부링크]

플래그는 보통 함수에 매개변수로 전달해서, 함수 내부의 로직을 분기하는 데 사용한다. 플래그를 사용한 함수는 차이를 파악하기 어렵다. bookConcert(customer, false), bookConcert(customer, true) bookConcert(customer), premiumBookConcert(customer) 과연 여기서 Boolean 값이 하는 게 무엇일까! 조건문 분해하기를 활용할 수 있다. 함수 추출이 주를 이룬다. 플래그 인수 제거하기 package me.whiteship.refactoring._04_long_parameter_list._15_remove_flag_argument; import java.time.LocalDate; public class Shipment { public LocalDate deliveryDate(Order order, boolean isRush) { if (isRush) { int deliveryTime = switch (or

[Refactoring] 변수 캡슐화하기 [내부링크]

전역 데이터는 아무곳에서나 변경될 수 있다는 문제가 있음 어떤 코드로 인해 값이 바뀐 것인지 파악하기 어렵다. 클래스 변수(필드)도 비슷한 문제를 겪을 수 있다. 변수 캡슐화하기를 적용해서 접근을 제어하거나 어디서 사용하는지 파악하기 쉽게 만들 수 있다. 변수 캡슐화하기 메소드는 점진적으로 새로운 메소드로 변경할 수 있으나, 데이터는 한 번에 모두 변경해야 한다. 데이터 구조를 변경하는 작업을 그보다는 조금 더 수월한 메서드 구조 변경 작업으로 대체할 수 있다. 데이터가 사용되는 범위가 클수록 캡슐화를 하는 것이 더 중요해진다. 함수를 사용해서 값을 변경하면 보다 쉽게 검증 로직을 추가하거나 변경에 따른 후속 작업을 추가하는 것이 편리하다. 불변 데이터의 경우에는 이런 리팩토링을 적용할 필요가 없다. public class Thermostats { public static Integer targetTemperature = 70; public static Boolean heating

[Refactoring] 변수 쪼개기 [내부링크]

데이터를 변경하다 보면 예상치 못했던 결과나 해결하기 어려운 버그가 발생한다. 함수형 프로그래밍 언어는 데이터를 변경하지 않고 복사본을 전달한다. 다른 프로그래밍 언어는 데이터 변경을 허용하고 있다. 따라서 변경되는 데이터 사용 시 발생할 수 있는 리스크를 관리할 수 있는 방법을 적용하는 것이 좋다. 관련 리팩토링 변수 캡슐화하기를 통해서 데이터를 변경할 수 있는 메서드를 제한하고 관리할 수 있다. 변수 쪼개기를 사용해 여러 데이터를 저장하는 변수를 나눌 수 있다. 코드 정리하기를 사용해 데이터를 변경하는 코드를 분리하고 피할 수 있다. 함수 추출하기로 데이터를 변경하는 코드로부터 사이드 이펙트가 없는 코드를 분리할 수 있다. 질의 함수와 변경 함수 분리하기를 적용해서 클라이언트가 원하는 경우에만 사이드 이펙트가 있는 함수를 호출하도록 API를 개선할 수 있다. 가능하다면 세터 제거하기를 적용한다. 계산해서 알아낼 수 있는 값에는 파생 변수를 질의 함수로 바꾸기를 적용할 수 있다.

[Refactoring] 코드 정리하기 [내부링크]

관련 있는 코드끼리 묶여있어야 코드를 더 쉽게 이해할 수 있다. 다른 리팩토링을 하기 위한 전처리 과정 함수에서 사용할 변수를 상단에 미리 정의하기보다는 해당 변수를 사용하는 코드 바로 위에 선언하는 것이 좋다. 관련 있는 코드끼리 묶은 다음, 함수 추출하기 (Extract Function)를 사용해서 더 깔끔하게 분리가 가능하다. 코드 정리하기 인텔리제이 기준 option + shift + 화살표 누르면 코드 자유자재로 이동 가능.. 헐 대박이다!!!!!! private void printReviewers() throws IOException { GitHub gitHub = GitHub.connect(); GHRepository repository = gitHub.getRepository("whiteship/live-study"); GHIssue issue = repository.getIssue(30); // Get reviewers Set<String> reviewers = ne

[Refactoring] 메서드 올리기 [내부링크]

중복 코드는 당장은 잘 동작하더라도 미래에 버그를 만들어 낼 빌미를 제공한다. 여러 하위 클래스에 동일한 코드가 있다면 메서드 올리기를 적용할 수 있다. 상위 클래스도 메서드를 올리는 것이다. 비슷하지만 일부 값만 다른 경우 함수 매개변수화하기 리팩토링을 적용한 후에 이 메서드 올리기 사용 가능 하위 클래스에 있는 코드가 상위 클래스가 아닌 하위 클래스 기능에 의존하고 있다면 필드 올리기를 적용한 이후에 이 방법을 적용할 수 있다. 두 메서드가 비슷한 절차를 따르고 있다면, "템플릿 메서드 패턴" 적용을 고려할 수 있다. 메서드 올리기 DashBoard를 상속받는 class A public void printParticipants(int eventId) throws IOException { // Get github issue to check homework GitHub gitHub = GitHub.connect(); GHRepository repository = gitHub.getR

[Refactoring] 임시 변수를 질의 함수로 바꾸기 [내부링크]

긴 함수가 있을 때 사용하는 리팩토링 기술 긴 함수 vs 짧은 함수 작은 함수가 코드량이 적어서 좋기는 하다. 주석을 남기기보다는 함수를 만들어서 함수의 이름으로 의도를 표현하자. 긴 함수가 있을 때는 함수 추출하기로 해결 가능하다. 함수를 분리할 때 해당 함수로 전달해야 할 매개변수가 많아진다면 아래의 리팩토링을 고려해 볼 수 있다. 임시 변수를 질의 함수로 바꾸기 매개변수 객체 만들기 객체 통째로 넘기기 조건문 분해하기를 사용해서 조건문을 분리할 수 있다. 같은 조건으로 여러 개의 Switch 문이 있다면, 조건문을 다형성으로 바꾸기를 사용할 수 있다. 반복문 안에서 여러 작업을 하고 있어서 하나의 메서드로 추출하기 어렵다면, 반복문 쪼개기를 적용할 수 있다. 임시 변수를 질의 함수로 바꾸기 임시 변수를 만드는 표현식을 함수로 만들자! 변수를 사용하면 반복해서 동일한 식을 계산하는 것을 피할 수 있고, 이름을 사용해 의미를 표현할 수도 있다. 긴 함수를 리팩토링할 때, 그러한 임

144444 [내부링크]

오우 딱 144,444네 의미는 없으나 깔끔해보인다

[Effective Java] 멤버 클래스는 되도록 static으로 만들라. [내부링크]

멤버 클래스는 되도록 static으로 만들라. 중첩 클래스 중첩 클래스란 다른 클래스 안에 정의된 클래스를 말한다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하고 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야 한다. 중첩 클래스 종류 정적 멤버 클래스 비정적 멤버 클래스 익명 클래스 지역 클래스 4가지로 나뉜다. 1번을 제외한 나머지는 inner class (내부 클래스)에 해당한다. 각각이 왜 쓰이고 언제 사용하는지 알아보자. 정적 멤버 클래스 정적 멤버 클래스는 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다는 점만 제외하고는 일반 클래스와 똑같다. 정적 멤버 클래스는 다른 정적 멤버와 똑같은 접근 규칙을 적용받는다. private으로 선언하면 바깥 클래스에서만 접근할 수 있다. 정적 멤버 클래스는 바깥 클래스와 함께 쓰일 때만 유용한 public 도우미 클래스로 쓰인다. public class Calculator { public

[Effective Java] 톱레벨 클래스는 한 파일에 하나만 담으라. [내부링크]

톱레벨 클래스란? A top level class is a class that is not a nested class. 중첩 클래스가 아닌 클래스이다. 일반적으로 사용하는 클래스. 톱레벨 클래스는 한 파일에 하나만 담으라. 소스 파일 하나에 톱레벨 클래스를 여러 개 선언하는 건 아무런 득도 없고 위험을 감수해야 한다. 한 클래스를 여러 가지로 정의할 수 있게 되고 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일 하느냐에 따라 달라진다. public class Main { public static void main(String[] args) { System.out.println(Utensil.NAME + Dessert.NAME); } } 메인 클래스 하나를 담고 있고 메인 클래스는 다른 톱레벨 클래스 Utensil과 Dessert를 참조한다. class Utensil { static final String NAME = "pan"; } class Dessert{ static fina

[Effective Java] 지역변수의 범위를 최소화하라 [내부링크]

지역변수의 범위를 최소화하라 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지 보수성이 높아지고 오류 가능성은 낮아진다. 자바에서는 문장을 선언할 수 있는 곳이면 어디서든 변수를 선언할 수 있다. 지역변수의 범위를 가장 좋은 방법은 가장 처음 쓰일 때 선언하기이다. 사용하지 않는 데 미리 선언해두면 코드가 어수선해지고 가독성이 떨어진다. 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다. try-catch 문은 규칙에서 예외다. 변수를 초기화하는 표현식에서 검사 예외를 던질 가능성이 있다면 try 블록 안에서 초기화해야 한다. 변숫값을 try 블록 바깥에서도 사용해야 한다면 try 블록 앞에서 선언해야 한다. 반복문 반복문은 변수 범위를 최소화해준다! 반복문에서는 loop variable의 범위가 반복문의 몸체, for 키워드와 몸체 사이의 괄호 안으로 제한된다. 그렇기에 반복 변수의 값을 반복문이

7월 마지막 주 [내부링크]

정보처리기사 본 날에 먹은 아침.. 아 과연 합격할 수 있을까! 제발요! 점심인가 저녁으로 먹은 KFC 넘모 맛있어 자취방에서 나오다가 본.. 고양이.. 발만 쪼끔 나온 게 넘 귀엽다 오랜만의 학식.. 역시 돈 아낄 거면 학식이 최고다.. 이날 정처기 본 날이었나 공릉 풍경이 이뻐서 찍어보았다. 흑흑 2학년 1학기 ~ 4학년 1학기까지 한 국제학생회가 끝났다. 2학기까지 해서 6학기 하고 졸업할까 하다가.. 더 이상은 못 할 것 같아서 그만두었다. 그래도 나름 재밌게 즐겼다. 요즘 운동도 열심히 한다. 러닝하고 맨몸 운동! 집 앞에 있던 화난 고양이! 진짜 3개월 만에 롤을 해봤다. 들어가 보니 시간의 상점이 있길래 까봤는데 내가 좋아하는 챔피언 3개 있길래 바로 질렀다. 중간에 르블랑 스킨이 화려하면서 이쁘다. 런데이로 100km 뛰었다. 다만 함정이 있다면.. 이 runday.. 1년정도 됐다 크흠.. 오랜만에 아소코 가서 연어 덮밥 먹었다. 연어는 언제 먹어도 맛있다. 건대입구

[Effective Java] 전통적인 for 문보다는 for-each 문을 사용해라. [내부링크]

전통적인 for 문보다는 for-each 문을 사용해라. 스트림이 제격인 작업이 있고 반복이 제격이 작업이 있다. for(Iterator<Element> i = c.iterator() ; i.hasNext();){ Element e = i.next(); } for(int i = 0;i<a.length;i++){ } 위 두 코드 while 문보다는 낫지만 더 좋은 방법이 있다. 반복자(iterator)와 인덱스 변수 모두 코드를 지저분하게 할 뿐이고 진짜 필요한 건 원소들이다. 위의 2개처럼 쓰게 되면 사용되는 요소 종류가 늘어나기에 오류가 생길 가능성이 높아진다. 1회 반복에서 반복자가 세 번 등장하고 인덱스는 a[i]까지 하면 4번 접근이 된다. 잘못 사용하면 컴파일러가 잡아준다는 보장도 없고 컬렉션이나 배열이냐에 따라 코드 형태가 상당히 달라지기에 주의해야 한다. 위의 문제들은 for-each 문을 사용하면 모두 해결된다. 반복자와 인덱스 변수를 사용하지 않으니 코드가 깔끔해지고

GDSC SeoulTech 2기 Core Member를 모집합니다! [내부링크]

c GDSC Seoultech 2기 Core Member를 모집합니다 지원 기간 8월 1일 ~ 8월 7일 20시까지! GDSC Seoultech이 돌아왔습니다! Google Developer Student Clubs은 구글 개발자 기술에 관심이 있는 대학생들을 위한 커뮤니티입니다. 개발자로서 성장하는 것에 관심이 있는 모든 학우들을 환영합니다. 22-23 시즌 GDSC는 2022.08~2023.08 1년 동안 활동합니다. 서울과학기술대학교의 두번째 GDSC! 함께 성장할 열정 가득 Core 를 모집합니다! (일반 멤버는 8월 중순 모집 예정입니다.) 자세한 사항은 아래 노션을 참고해주세요! :) ️ 노션 ️ https://puffy-dumpling-10f.notion.site/GDSC-Seoultech-Core-Recruiting-b9c0e4f9af3844e4ad813054d8ac9752 ️ 1기 인터뷰 보러가기 ️ https://puffy-dumpling-10f.notion.s

[Effective Java] 박싱된 기본 타입보다는 기본 타입을 사용하라. [내부링크]

박싱된 기본 타입보다는 기본 타입을 사용하라. 자바의 데이터 타입은 기본 타입과 참조 타입으로 나뉜다. 기본 타입에는 대응하는 참조 타입이 있고 이걸 박싱된 기본 타입이라고 한다 int, double, boolean (기본 타입) -> Integer, Double, Boolean (박싱된 기본 타입) 기본 타입과 박싱된 기본 타입의 차이 기본 타입은 값만 가지고 있으나 박싱된 기본 타입은 값에 더해 식별성(identity)란 속성을 갖는다. 즉 박싱된 기본 타입의 두 인스턴스는 값이 같아도 서로 다르다고 식별될 수 있다. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값 null을 가질 수 있다. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. 위의 세 가지 차이 때문에 주의하지 않고 사용하면 문제가 발생할 수 있다. 잘못된 구현 Comparator<Integer> naturalOrder = (i,j) -> (i < j) ? -1 :

[Effective Java] 다른 타입이 적절하다면 문자열 사용은 피하라. [내부링크]

다른 타입이 적절하다면 문자열 사용은 피하라. 이번 아이템에서는 문자열을 쓰지 않아야 할 사례에 대해서 알아본다. 문자열은 다른 값 타입을 대신하기에 적합하지 않다. 입력받을 데이터가 진짜 문자열일 때만 데이터를 문자열로 받는 것이 좋다. 받은 데이터가 수치형이라면 int, float, BigInteger 등 적당한 수치 타입으로 변환해야 한다. 기본 타입이든 참조 타입 이든 적절한 값 타입이 있다면 그것을 사용하고 없으면 새로 작성! 문자열은 열거 타입을 대신하기에 적합하지 않다. 상수를 열거할 때는 문자열보다는 열거 타입이 월등히 낫다. 문자열은 혼합 타입을 대신하기에 적합하지 않다. 여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 좋지 않다. String compoundKey = className + "#" + i.next(); 두 요소를 구분해 주는 문자 '#"이 두 요소 중 하나에 쓰였다면 혼란스러운 결과를 초래 각 요소를 개별로 접근하려면 문자열을 파싱 해야 해

[Effective Java] 문자열 연결은 느리니 주의하라. [내부링크]

문자열 연결은 느리니 주의하라. 문자열 연결 연산자로 문자열 n 개를 잇는 시간은 n^2에 비례한다. String은 불변이라서 두 문자열을 연결할 경우 양쪽의 내용 모두 복사해야 하기에 성능 저하가 반드시 발생한다. StringBuilder 성능을 포기하고 싶지 않다면 String 대신 StringBuilder를 사용하자. public String statement2(){ StringBuilder b = new StringBuilder(numItems() * LINE_WIDTH); for(int i = 0;i< numItems();i++) b.append(lineForItem(i)); return b.toString(); } String을 사용했을 때와 몇 배의 성능 차이가 난다. 핵심 정리 성능에 신경 써야 한다면 많은 문자열을 연결할 때는 문자열 연결 연산자(+)를 피하자. 대신 StringBuilder의 append 메서드를 사용하라. 문자열 배열을 사용하거나, 문자열을 연결하

8월 첫째 주 [내부링크]

프로젝트 사람들이랑 해서 4명이서 먹은 백종원 씨의 솔루션이 들어간 기찻길 풍경 곱창.. 꿀맛.. 다만 아쉬웠던 게.. 주먹밥을 2개 시켰는데.. 1개만 왔다.. 러닝을 했는데 .. 3.99km.. !! 10M만 더 갔으면 4km인데.. 흑흑!! 마침내... GDSC도 끝났다.. 수료증까지 받았다.. 리드님의 정성 어린 싸인이 들어간 .. 수료증.. 1년 동안.. 모두 고생했다!!! 거의 2주 만에 출근했다.. 회사가 완전 자율 출퇴근이라 넘 좋다.. 점심으로 먹은 우육짬뽕!! 오랜만에 앉은 내 자리.. 확실히 2주 만에 가니까 집중이 잘됐다.. 이날.. 콘치즈가 먹고 싶어서 장 봐서 만들어 먹었다.. 내 2호 자취방에서 처음 만들어본 음식.. 치즈 쫘라라라라라띾 올리고.. 바로 전자레인지!! 짜잔!!! 그럴싸하다!! 생각보다 맛있었다.. 맥주도 같이 마셨는데 원래 캔맥주 안 좋아하는데 이날은 아주 맛있게 먹었다! 야식으로 남은 거 조합해서 먹었다.. 원래 있던 무드등이 고장 나서

애드포스트 정산 완료 [내부링크]

지금까지 123007원 모았다. 원래 백만 원 되면 바꾸려고 했지만 생각해 보니 굳이 돈을 썩힐 이유가 없을 것 같아서.. 바꿨다..!! 나는.. 한 번에 다 바꿀 수 있을 줄 알았고.. 바로바로 정산될 줄 알았는데 그게 아니었다!! 심지어 현금으로 주는 건 줄 알았는데.. 네이버 페이라니.. 흑흑 이건 좀 아쉽다.. 그래도 네이버 페이로 뭐 사면되니.. 괜찮다.. 그래서 뭘 샀냐!! 맥북용 키보드가 필요해서 로지텍 mx keys for mac으로 샀다. 키크론이 예뻐서 키크론으로 살까 하다가.. 개인적으로 사무용으로 기계식 키보드를 별로 안 좋아해서 노트북 느낌 나는 키보드로 샀다. 나는 낮은(?) 키보드가 좋다.. 펜타그래프 키보드가 맞나..? 하튼.. 블로그 열심히 해서 키보드 샀다~ 개꿀~ 빨리 왔으면 좋겠다.!

[Effective Java] 객체는 인터페이스를 사용해 참조하라. [내부링크]

객체는 인터페이스를 사용해 참조하라. 적합한 인터페이스만 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라. 객체의 실제 클래스를 사용해야 할 상황은 오직 생성자를 생성할 때뿐이다.!!! Set<Son> sonSet = new LinkedHashSet<>(); 인터페이스를 타입으로 사용한 좋은 예이다. LinkedHashSet<Son> sonSet = new LinkedHashSet<>(); 클래스를 타입으로 사용한 나쁜 예이다. 인터페이스를 타입으로 사용하면 프로그램이 훨씬 유연해진다. 나중에 구현 클래스를 교체하고자 하면 새 클래스의 생성자 혹은 다른 정적 팩터리를 호출해 주기만 하면 된다. Set<Son> sonSet = new HashSet<>(); 위와 같이 다른 코드는 바꾸지 않고 새로 구현한 클래스로 교체가 완료된다. 주의할 점 원래의 클래스가 인터페이스의 일반 규약 이외의 특별한 기능을 제공하고, 주변 코드가 이 기능에 기대어서 동작한다

8월 둘째 주 [내부링크]

나는 전국통...!! 책상에서 책 읽으려고 하면 그늘이 져서.. 바로 스탠드를 하나 샀다.. 무난하다!! 키보드 산 것도 왔다..!! 너무 마음에 든다.. 맥북 키보드랑 느낌도 비슷하고 소리도 거의 안 나서 좋다 장마가 잠시 멈추고 오랜만에 본 하늘.. 하지만 이날도 거의 집에만.. 회사에서 진행한 이벤트 당첨돼서 받은 요기요 3만 원 쿠폰으로 사 먹은 족발 + 막국수 역시 공짜로 먹는 게 젤 맛있어! 오랜만에 금요일날 출근해 봤다. 이날 정말 빡 집중했다. 딱 봐도 복잡해 보이는 도로.. 한산 영화를 봤다. 롯데시네마에서 영화 정말 오랜만에 본다. 일단 사람 없어서 좋았다. 한산.. 국뽕이 가득 차오르는 영화.. 마침내.. 왜구와.. 헤어질.. 결심.. 건대입구역에 있는 토비도 갔다. 인테리어가 마음에 든다. 근데 자꾸 저 돼지가 쳐다보는 것 같은 느낌이 들었다. 가오.. 나시 하이볼도 마셨다. 저번에 짱구 극장판 보는데 야끼소바로 세상을 구하는 장면이 나와서.. 야끼소바 먹고 싶

Caused by: org.hibernate.MappingException: Could not determine type for: 복합키 구성 문제 [내부링크]

IdClass Mapping 문제 복합 키를 구성하기 위해서 IdClass를 만들었는데 자꾸 오류가 떴다.. 우리 조씨에게 물어보니.. 처음에 IdClass에 자료형을 Entity 로 해줬는데 복합키를 구성할 때는 아래와 같이 Long, String 등 으로 해줘야된다고 했다.. 후.. 바로 해결

8월 셋째 주 [내부링크]

20층에서 작업 중인.. 아저씨.. 어우.. 엄청 무서울 것 같다.. 출근해서 점심으로 먹은 카레 할 게 많아서 한 7시 30분 넘어서 퇴근했다. 오랜만에 보는 서울역의 밤하늘 저녁도 안 먹고 일했어가지고 배고파서 공릉 와서 바로 뼈해장국!! 로제 떡볶이를 먹고 싶어서 엽떡에서 한 번 시켜보았다.. 오.. 굉장히 맛있게 먹었다. 토요일에는 친구 공연 보러 신촌을 갔다. 신촌을 갈 때마다 느끼는 거지만 놀 게 엄청 많아서 부럽다.. 우리 공릉은.. 흑흑.. 너무 없다. 신촌 몽향으로 갔다. ㅎ 들어가자마자 나 같은 아싸가 있기에는 힘든 곳이구나!라고 직감이 왔다.. 다행히 바로 친구 찾아서.. 마음의 안정을 찾았다. 멋있게 공연 중인... 친구 생각보다 엄청 좋았다. 자작곡도 3곡 정도 불렀는데 다 좋았다. 친구의 본업(?)을 보니 내가 알던 모습과는 달라서 신기했다. 역시 다들 자기 본업에서는 열심히 살고 있는 것 같다. 끝나고 같이 공연 보러 온 나의 오랜 친구들과 같이 사진 한

[2년 전 오늘] 수강신청 [내부링크]

2020.8.26. 2년 전 오늘 수강신청 8월 19일에 우선수강신청으로 4과목 : 자료구조, 데이터통신, 디지털 논리, 프로그래밍입문(2) 성공 사실 데이터통신은 120명 수업이라서 당연히 되고 디지털논리는 교수님 평가가 너무 안 좋아서 당연히 되고 자료구조는 조금 애매할 수도 있겠다 싶었는데 되고.. 프로그래밍입문(2)는 사실 왜 됐는지 모르겠고 아무튼 기... 류리상자 2년 전의 나.. 수강신청 실패했구나.. 나도 이번에 실패했어ㅎ 신청 누르니 수강신청 기간이 아니라고 떠서.. 하지만 1과목이니 괜찮아~~

8월 넷째 주 [내부링크]

오랜만에 친구들과 논.. 나는.. 갑자기.. 새벽에 몸이 아프길래.. 집에 하나 남아있던.. 자가키트를 해봤는데 당연히 아닐 줄 알았는데 희미하게 2줄 떠서.. 어이구야!!!!!!!!!!!! 바로 코로나! 병가 바로 7일 받고 계속 잠만 잤다. 기침, 콧물 없고.. 열은 살짝 있고 몸에 너무 힘이 없었다. 제일 힘들었던건 땀이 너무 많이 난다ㅋㅋㅋㅋ 인턴 최종 발표는 31일이었는데 코로나 이슈로.. 9월 2일로 밀리고 흠 으아그으으으아가ㅡ악아그ㅏ으가으가으가ㅡ아그아ㅡㄱㅇ 준비해야 되는데 의의릐ㅏ느링늬리ㅡ이ㅡ이ㅡ이ㅡ이읨느임ㄴ

[3년 전 오늘] [일상] 류리의 자취일기 [내부링크]

2019.9.1. 3년 전 오늘 [일상] 류리의 자취일기 2019.08.31 자취 시작! 어제 가족들이랑 열심히 짐 풀고 다시 집 가서 오늘(1일)에 자취방 도착! 와서 바닥 정리하고 짐 정리 또 하고 제습제 놓고 디퓨저 놓고 화장실 청소하고 계속 청소만...! 청소 끝나고는 밥 만들기... 사실 살면서 밥을 만들어 본 적이 없음 반성하자! 밥을 씻기 위한 그릇(?) 오늘의 주인공들.. 쌀... 류리상자 3년 전의 나.. 자취 시작했구나.. 3년 만에 학교도 가고.. 벌써 시간이 흘러 막학기라니!!!!! 19년도 1학년 다닐 때 졸업 언제하나라고 생각했는데 내년 2월 졸업이라니!!!!! 으아아아아아악!!!

9월 첫째 주, 둘째 주 [내부링크]

블챌 점점 귀찮아지네 ㅎ 2주 치를 몰아서 쓴다 8월 말에 파마 한 번 했다. 원래는 가르마펌 하려다가 손질이 어렵다는 말에 다른 펌으로.. 결과는 만족이다!! 인터넷에서 본 공감되는 짤.. 개발자가 키보드를 빠르게 치고 있다면.. 그건 개발이 아니다!! 마지막이 될 뻔한 서울역 풍경 최종발표 잘 마무리 하고 수료증이랑 선물 받았다. 혹시 몰라서 내 자리 깨끗하게 치우고 사진도 찍었다 만년필도 받았다. 일단 인턴 계약기간이 끝났으니 사직서다 제출했다. 깨끗해진 내 자리 인턴 고생했다고 친구한테 꽃도 선물 받았다. 장미꽃이다. 실제로 보면 완전 이쁘다. 퇴근하고 놀러갔다. 잠실에 있는 대형 피카추! 그렇게 오후 2시 30분에 최종발표 마치고 저녁 6시에 합격 전화 받았다. 그 뒤에 온 합격 문자까지! 며칠 뒤에 간 영등포 타임스퀘어 일단 점심으로 찜닭 먹었다. 홍수계 찜닭 존맛탱 영등포에는 주렁주렁 보러갔다. 진짜 엄청 재밌다. 지금까지는 유리창 너머에 있는 동물들만 봤는데 여기는 완

[3년 전 오늘] [일상] 류리의 추석일기 [내부링크]

2019.9.15. 3년 전 오늘 [일상] 류리의 추석일기 2019.09.12~09.15 11일 수업 다 마치고 헬스 하고 바로 집으로~~ 12일 누나 일 끝나고 바로 집으로 와서 4시에 출발! 외할머니댁 한 번 빠르게 들리고 시골 10시에 도착 그래도 추석 전 날에 6시간이면 괜찮은 듯 원래 전남 장흥까지 4~5시간 이니까 내 사촌은 10시간정도 걸려서 도착ㅋㅋㅋ 시골 도착하자마자 바로 누리한... 류리상자 누리 귀엽네.. 이게 벌써 3년 전!

9월 셋째 주 [내부링크]

귀엽고 예쁜 사람이 그려준 나의 모습.. 마음에 든다! 정규직 입사 후에 받은 M1 맥북 노트북 영롱하다.. 근데 느낌상 Intel 맥북이 더 빠른 것 같은데..? 확실한 건 무겁다.. 첫 출근했는데 아무도 안 계셔서 뭐 먹을까 하다가.. 팀장님이 갑자기 출근하셔서 먹은 라멘집.. 여기 서울역 맛집 중 하나이다. 점심시간 시작하자마자 줄이 가득하다. 사실 엄~~~~~~~~~~청 맛있는 건 아니고 맛있긴 하다(?) 2년 동안 블로그 애드포스트 번 돈 현금으로 전환했다. 123000원.. 개꿀~~ 이건 왜 사진이 이거 밖에 없지..? 건대입구역 만덕인가.. 인스타에서 사진 보고 가봤는데 역시.. 인스타 사진은 믿으면 안 된다. 그래도 맛있긴 하다. 나의 정규직 전환 기념으로 팀원분들이랑 점심시간에 다 같이 밥 먹었다. 식당 이름이 기억이 안 나네.. 음식 사진은 4개지만 5개 시켰다. 다른 팀원분이 5개면 많지 않을까요 했는데.. 내가 괜찮다고!! 5개 시켰는데 다 먹고 나서 한 2~3

[영등포] 주렁주렁 다녀옴 [내부링크]

9월 8일에 갔다 온 영등포 주렁주렁 진짜 여기 무조건 가야 된다. 무조건 롯데타워 아쿠아리움이랑 비교가 안될 정도로 재밌다. 주렁주렁 입구 참고로 인터넷 예매했으면 매표소에서 표 바꾸고 가야 된다. 안으로 들어가면 잘 꾸며져있다. 표 보여주고 들어가면 가장 먼저 보이는 새 2마리.. 처음에 인형인 줄 알았다.. 근데 진짜 동물이다. 어디 날아가지도 않고 사람 무서워하지도 않는다. 카멜레온도 있다. 참고로 펜스 없다. 개구리도.. 나는 정말 안 뛰어오르는 게 너무 신기하다 그다음으로 가면 반기는 홍학.. 얘는 날아다닌다 ㅋㅋㅋㅋ. 홍학도 자유롭게 살고 있다. 다람쥐도 있다. 다람쥐는 다른 새들이랑 있어서 그런지 케이지에 있다. 내가 살면서 다람쥐를 이렇게 가까이서 볼 줄이야. 넘모 귀엽다. 여기 있는 애들한테 먹이 주면 된다. 먹이 던지면 팍팍팍 먹어버린다!! 얘는 사람들 다니는 곳에 있었다. 그다음 보러 간 곳에는 미어캣이.. 사람처럼 앉아있다ㅋㅋㅋㅋㅋㅋㅋ 졸고 있는 미어캣을 봐서

9월 넷째 주 [내부링크]

이번 주부터 학교 축제가 시작되었다. 생각보다 학교에 사람이 많아서 놀랬다. 진짜 16년도 이후로 처음 보는 축제인데,, 후.. 이제야 원래 대학으로 돌아온 느낌이었다. 잠시.. 사가정역 역할맥 가서 먹은 돈까스! 모기가 너무 많아서 한 30분도 안 돼서 먹고 나왔다ㅎ 바른치킨이 급 땡겨서 먹었다. 사회자가 누군가 했더니 #유튜브섭이네 였다. 진행을 엄청 매끄럽게 잘한다. 학교 존에서 보다가 연구실 동생들이랑 보려고 밖으로 나왔다. 스테이시 봤는데 확실히 멀리서 보면 별로 감흥이 없다.. 3곡 하고 가버렸다.. 스테이씨.. 아쉽다.. 학교 앞에 내가 찜한 닭에서 오랜만에 찜닭 먹었다. 나 생각보다 찜닭 좋아할지도..? 아이스티에 샷을 추가해서 먹어보았습니다.. 크흠... 흠.. 흠.. ㅎ 맛있네요 오랜만에 와플대학에서 와플도 먹어보고.. 와플 들고 축제 좀 구경하다가!!! 타이거 JK 7시 30분에 타이거 JK & 비지 & 윤미래 와서 바로 학교 존으로!!!!! 진짜 이 사람들 미쳤

[Refactoring] 함수 선언 변경하기 [내부링크]

함수 이름 변경 private void studyReviews(GHIssue issue) throws IOException { List<GHIssueComment> comments = issue.getComments(); for (GHIssueComment comment : comments) { usernames.add(comment.getUserName()); reviews.add(comment.getBody()); } } 메서드 이름을 보고 스터디를 리뷰하는 것인지, 리뷰를 가져오는 것인지 헷갈린다. 먼저 주석을 작성해보자 스터디 리뷰 이슈에 작성되어 있는 리뷰어 목록과 리뷰를 읽어온다. 읽어오는 것이기에 로딩이 더 맞지 않을까?? private void loadReviews() throws IOException { List<GHIssueComment> comments = issue.getComments(); for (GHIssueComment comment : comments)

[Refactoring] 변수 이름 바꾸기 [내부링크]

파라미터 값 변경 studyDashboard.getUsernames().forEach(System.out::println); studyDashboard.getReviews().forEach(System.out::println); 람다식은 범위가 작기 때문에 줄여서 써도 되고 변수를 안 사용해도 된다. 변수명 변경 private void loadReviews() throws IOException { GitHub gitHub = GitHub.connect(); GHRepository repository = gitHub.getRepository("whiteship/live-study"); GHIssue issue = repository.getIssue(30); List<GHIssueComment> comments = issue.getComments(); for (GHIssueComment comment : comments) { usernames.add(comment.getUserName(

[Refactoring] 필드 이름 바꾸기 [내부링크]

필드 이름 변경 프로그램 전반에 걸쳐서 참조될 수 있는 필드들은 이름을 짓는 것이 매우 중요하다. private Set<String> usernames = new HashSet<>(); username보단 리뷰를 남긴 사람들을 불러오는 것이기에 reviewers가 맞을 것 같다. private Set<String> reviewers = new HashSet<>(); Record 사용 자바 17부터 Record를 사용할 수 있다. Getter, Setter, HashandEquals, ToString 자동으로 만들어준다. private Set<String> reviewers = new HashSet<>(); private Set<String> reviews = new HashSet<>(); 위의 코드를 Record를 사용하면 아래처럼 바꿀 수 있다. private Set<StudyReview> studyReviews = new HashSet<>(); 물론 겉에만 보면 Class다 그냥

[Refactoring] 함수 추출하기 [내부링크]

코드를 어떤 기준으로 분리할 것인가? 중복 코드인가, 너무 긴 건가? 중복 코드의 횟수는? 의도와 구현을 분리하자 어떤 메서드가 어떤 일을 하는지 잘 파악이 된다면 잘 작성된 것이다. 그렇지 않으면 당연히 잘 작성되지 않은 것 어떤 코드를 보고 무엇을 하는지 알아내는 데 시간이 오래 걸리면 그건 "구현"된 것이기에 메서드를 추출해서 메서드의 이름을 보고 "의도"를 파악할 수 있어야 됨. 함수 추출의 장점은 이름을 줄 수 있다는 것이다. 의도를 잘 들어낼 수만 있다면 한 줄짜리 코드도 빼는 것도 괜찮다. 코드 추출하기 private void printParticipants(int eventId) throws IOException { // Get github issue to check homework GitHub gitHub = GitHub.connect(); GHRepository repository = gitHub.getRepository("whiteship/live-study");

[서평] 파워포인트 디자인 실무 강의 with 신프로 - 감각적인 PPT 템플릿으로 단숨에 실력을 업그레이드하는 디자인 실무 비법 [내부링크]

이번에 서평해볼 책은 신강식님이 지은 파워포인트 디자인 실무 강의 with 신프로 - 감각적인 PPT 템플릿으로 단숨에 실력을 업그레이드 하는 디자인 실무 비법 입니다. 파워포인트 책 답게 책 표지부터 파워포인트와 잘 어울리네요. 책에서 사용하는 디자인 예제 및 템플릿은 한빛미디어 사이트에서 다운 받을 수 있습니다. 책에 친절히 설명이 나와있으니 따라서 하면 무난히 다운로드 받을 수 있습니다. 책 앞 부분에서 책에서 할 프로젝트를 미리 볼 수 있습니다. 각각의 주제마다 다른 느낌의 파워포인트를 작성합니다. 이정도만 만들 수 있어도 충분하지 않을까요.. 당연히 무료 제공 템플릿 30종을 제공합니다. 다 깔끔한 템플릿들이라서 필요하면 사용해도 될 것 같습니다. 목차는 위와 같습니다. 총 챕터가 5개로 이루어져있습니다. 준비부터 시작해서 ppt 사용법 도형, 텍스트, 이미지, 레이아웃 등 ppt에 필요한 모든 것들을 연습합닌다. 디자인, 템플릿 만드는 법도 배울 수 있습니다. 프로젝트도

앞으로 해야할 것 [내부링크]

자바 자바 8 자바의 정석 이펙티브 자바 OOP 조영호 오브젝트 책 아키텍처 클린 아키텍처 책 Spring 토비의 스프링 1장 ~ 6장 , 8장, 9-3장 김영한 강의 복습 JPA, QueryDsl 최범균 유튜브 김영한 강의 복습 Spring batch 인프런 스프링 배치 강의 스프링 배치 완벽 가이드 Oracle 불친절한 sql 프로그래밍 그 외 켄트백 테스트 주도 개발 junit https://www.youtube.com/watch?v=60lLSe1phks&list=PLeQ0NTYUDTmMM71Jn1scbEYdLFHz5ZqFA 백명섭님 클린코더스 여기 있는 거 다하면 어디든 갈 수 있지 않을까 싶은데

[Effective Java] 인터페이스는 구현하는 쪽을 생각해 설계하라. [내부링크]

인터페이스는 구현하는 쪽을 생각해 설계하라. 자바 8부터 인터페이스에 메서드를 추가할 수 있는 디폴트 메서드가 추가됨 디폴트 메서드를 선언하면, 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않는 모든 클래스에서 디폴트 구현이 쓰이게 된다. 하지만 모든 구현체들과 매끄럽게 연동된다는 보장이 없음. 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어렵다. java 8의 Collection 인터페이스에 추가된 removeIf이다. 이 코드도 충분히 범용적이지만 그렇다고 해서 이 코드가 모든 Collection 구현체와 잘 어울리는 것은 아니다. 대표적으로 SynchronizedCollection이다. 이 클래스는 모든 메서드에 주어진 락 객체로 동기화한 후 내부 컬렉션 객체에 기능을 위임하는 래퍼클래스이다. 만일 removeIf를 사용한다면 모든 메서드 호출을 동기화해주지 못한다. removeIf의 구현은 동기화에 관해 아무것도 모르기에 객체를 사용할

[Effective Java] 인터페이스는 타입을 정의하는 용도로만 사용하라. [내부링크]

인터페이스는 타입을 정의하는 용도로만 사용하라. 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 즉, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해 주는 것이다. 인터페이스는 오직 이 용도로만 사용하자.! 위의 지침에 맞지 않는 예로 상수 인터페이스가 있다. 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스를 말한다. public interface PhysicalConstants { public static final double AVOGADROS_NUMBER = 6.022_140_857e23; public static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; } 상수 인터페이스 안티 패턴은 인터페이스를 잘못 사용한 예이다. 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당한다. 따라서

[Effective Java] 태그 달린 클래스보다는 클래스 계층구조를 활용하라. [내부링크]

태그 달린 클래스보다는 클래스 계층구조를 활용하라 두 가지 이상의 의미를 표현할 수 있고, 현재 표현하는 의미를 태그 값으로 알려주는 클래스들이 있다. public class FigureWithTag { enum Shape {RECTANGLE, CIRCLE} ; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 쓰인다. double length; double width; // 다음 필드는 모양이 원(CIRCLE)일 때만 쓰인다. double radius; // 원용 생성자 public FigureWithTag(double radius) { this.shape = Shape.CIRCLE; this.radius = radius; } // 사각형용 생성자 public FigureWithTag(double length, double width) { this.shape = Shape.RECTANGLE; t

7월 둘째 주 [내부링크]

블챌 열심히 해서 받은 스티커들 학교에서 겨울인가에 나뭇잎들을 한 번 싹 다 잘랐는데 조금 자랐다. 맛집을 찾다가 친구 블로그에서 발견한 거의 없는 목 연어 포케 먹었다. 처음 먹어보는 음식인데.. 나중엔 샐러드 먹어야징 ㅎ 무슨 파스타더라 아무튼 맛있는 파스타 사실 친구 블로그에서 이 음식 사진 보고 가고 싶다는 생각이 바로 들었다. 스테이크, 감자, 바질 3개의 조화가 잘 어울리는 스테이크다. 오랜만에 연구실에서 동생들과 먹은 피스자쿨 3판.. 행복 그 자체.. 학교에서 프로젝트 하나 하고 있는데 문득 회의하던 도중에 회의실에서 회의하는 모습이 그럴싸해 보여서 사진 찍어보았다.. 정자역에서 회식이 있어서 이번에는 수내역으로 출근을 해봤다. 서울역으로 출근하는 것보다 더 힘든 느낌이다.. 지하철에서 제일 많이 한 생각이.. 아 미금역에서 계속 살았다면.. 얼마나 편했을까..?라는 생각 ㅎ 일하기에는 서울역이 훨씬 더 좋은 것 같다.. 그리고 수내역 딱 도착했는데 생각해 보니 오피스

[Effective Java] 상속보다는 컴포지션을 사용하라 [내부링크]

상속보다는 컴포지션을 사용하라 상속은 코드를 재사용하는 강력한 수단이나 항상 최선은 아니다. 잘못 사용하면 오류를 만들어내기 쉽다. 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서 사용하면 상속도 안전하다. 하지만 일반적인 구체 클래스를 패키지 경계를 넘어, 즉 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. 이번 챕터에서의 상속은 클래스가 다른 클래스를 확장하는 구현 상속을 말한다. 문제점 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다. 다음 릴리스에서 상위 클래스에 새로운 메서드를 추가하면 어떻게 될까? 컬렉션에 추가된 모든 원소가 특정 조건을 만족해야만 하는 프로그램을 생각 컬렉션을 상속하여 원솔ㄹ 추가하는 모든 메서드를 재정의해 필요한 조건을 먼저 검사 하지만 이 방식은 상위 클래스에 또 다른 원소 추가 메서드가 만들어지기 전까지만 통한다. 두 문제 모두 메서드

[잠실] 롯데월드 아쿠아리움 다녀옴. [내부링크]

저번 주 금요일에 롯데월드 아쿠아리움 갔다 왔다. 옛날부터 가보고 싶었던 곳인데.. 드디어 가봤다!!! 입구다.. Share the Nature 들어가자마자 반겨주는 실한.. 아니.. 멋있는 물고기~ 누가.. 이걸 보고.. 마트.. 야채.. 코너 같다고... 중절모처럼 생긴.. 김다미를 닮은 우파루파.. 진짜 악어다. 저러고 그냥 가만히~~~~~~~~~~~~ 있는다~~~~~~~~~ 잘 보면 뭔가 있다! 숨어 있던 녀석도 찰칵했다. 여기도 잘~~~ 보면 개구리가 있다. 빨간색 물고기 알비노 물고기랑 돼지코 거북이가 한꺼번에 있는 수조이다. 색감이 이쁜 물고기 장어.. 아주.. 군침이.. 싹... 도네...>! 기괴한 하트.. 살몬... 살몬이다!!!!!!!!!! 새끼라고 한다.. 연어 먹고 싶다.. 저거 다 커서 먹으면.. 흑흑.. 이렇게 귀여운 수조들도 있다. 이 친구들은.. 뭐더라 아무튼 엄청 큰 물고기라고 한다. 너는 누구니~? 눈동자가 인상 깊은 물고기 좁은 수조에 이렇게 많은

[Effective Java] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라. [내부링크]

상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라. 메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리해 문서로 남겨야 한다. 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야 한다. API 문서의 메서드 설명에 "Implementation Requirements"로 시작하는 절을 볼 수 있는데 메서드의 내부 동작 방식을 설명하는 것이다. 이 절은 메서드 주석에 @implSpec 태그를 붙여주면 java doc 도구가 생성해 준다. 하지만 @ImplSpec을 이용해서 문서를 작성하는 건 상속이 캡슐화를 해치기에 상속만 아니었다면 기술하지 않았어야 할 내부 구현 방식을 설명해서 좋은 API 문서를 작성하는 방법과 대치가 된다. 효율적인 하위 클래스를 큰 어려움 없이 만들 수 있게 하려면 클래스의 내부 동작 과정 중간에 끼어들 수 있는 hook을 잘 선별해

[Effective Java] 추상 클래스보다는 인터페이스를 우선하라. [내부링크]

추상 클래스보다는 인터페이스를 우선하라. 자바가 제공하는 다중 구현 메커니즘은 인터페이스, 추상 클래스이다. 이 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다. 자바는 단일 상속만 지원하니 추상 클래스 방식은 새로운 타입을 정의하는 데 제약이 있다. 인터페이스가 선언한 메서드를 모두 정의하고 규약을 잘 지킨 클래스 면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다. 인터페이스의 장점으로는 기존 클래스에도 새로운 인터페이스를 implements 해서 구현해 넣으면 된다. 하지만 기존 클래스 위에 새로운 추상 클래스를 넣기는 어렵다. 만일 두 클래스가 같은 추상 클래스를 확장하길 원한다면, 추상 클래스는 계층 구조상 두 클래스의 공통 조상이어야 한다. 인터페이스는 믹스인 정의에 안성맞춤이다. 믹스인 이란 클래스가 구현할 수 있는 타입으로, 믹스인을 구현한 클래스에 원래의 주된 타입 외에도 특정 선택적 행

7월 셋째 주 [내부링크]

연구실에서 저녁으로 먹은 KFC 징거더블다운맥스 진심 안 먹어 본 사람들 꼭 먹어보세요 무조건 먹어야 됨 ㄹㅇ ㅋㅋ 캡처 기능 있는 거 아는데 다시 찍기 귀찮다. 오픈톡방에서 우영우 얘기가 나오길래 그런갑다 했는데 누가 갑자기 우병우라고 해서 피식했다ㅋㅋㅋ 이상한 검사 우병우;; 회사에서 점심으로 먹은 만리재비스트로.. 파스타 2개랑 피자 1개 순삭 해버렸다!! 그리고 애플파이까지 먹었는데.. 요건 사진이 없네 1년 만에 헬스를 했다. 회사 헬스장 등록하고 처음 가봤는데 내가 가 본 헬스장 중 제일 좋다. 이날 회사 팀원 분과 같이 갔는데,, 어우 나를 빡세게 운동 시켜주셨다.. 운동하고 먹은 샐러디.. 후.. 작년에는 어떻게 샐러드만 먹었지 샐러드 먹은 날과 다른 날 샐러디에서 파는 랩도 먹어봤다. 매장 내에서 식사할 수 있는 시간이 지나서 그냥 건물 의자에 앉아서 먹었다. 흑흑 최근에 귀가 간지러워서 신나게 긁었다. 그러다가 금요일쯤에 귀를 만져보니 진물이 나오는 것 같아서 아

7월 첫째 주 [내부링크]

출근하면서 집 앞에서 본 고양이 2마리.. 하루의 시작이 좋았다! 탕웨이랑 박해일 나온 ... 결심 영화 봤다. 이름이 좀 마음에 안 드는 영화이긴 한데,, 내용은,, 흠 좀 난해했다. 내 아는 사람은 2번 봤다고,, 영화 보고 얼그레이 하이볼이랑 치킨 먹었다. 얼그레이 하이볼은 또 먹고 싶다. 하루 일과 다 마치고 집 가는 길에 본 고양이 2마리 한 마리가 누워있길래 찍으려는 순간 다른 한 마리가 쓱 지나갔다. 원래 찍으려는 사진 ㅎ 프로젝트 회의하다가 너무 추워서 입은 22학번 과잠,, ㄷㄷ 22학번에게 16학번이란..? 프로젝트 회의 새벽에 끝나고 집 가는 길에 오토바이 위에 뭐가 있길래 봤는데 고양이였다. 바로 옆 카페에서 키우는 고양이인데 역시 사람 손을 타서 그런지 얌전하다. 오랜만에 고양이를 만졌다. 하품하는 고양이 재택 하다가 먹은 서브웨이 2개..! 건강식이니 2개 먹어도 된다. 수요일 잠실야구장에 키움 vs 두산 보러 갔다. 흠.. 두산의 곽빈 선수.. 그러면 안

mbti를 해보았다. [내부링크]

헉 나도 이제 E로 승급했다.. 뭐지 왜 E지!!!!!!!!! 원래 ISFJ 였는데 외향형 53%로 E가 나와버렸다. 사실 E 나온 건 그렇게 놀랍지는 않은뎈ㅋㅋㅋ SFJ가 그대로 나온건 다행(?) 스럽다.. !

[Effective Java] 클래스와 멤버의 접근 권한을 최소화하라. [내부링크]

클래스와 멤버의 접근 권한을 최소화하라. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다. 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않는다. 정보 은닉 혹은 캡슐화 개념 정보 은닉의 장점 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기에 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅 가능, 다른 컴포넌트로 교체하는 부담도 적다. 성능 최적화에 도움을 준다. 소프트웨어 재사용성을 높인다. 외부에 거의 의존하지 않고 독자적으로 동작할 수 있는 컴포넌트라면 그 컴포넌트와 함께 개발되지 않는 낯선 환경에서도 유용하게 쓰일 가능성이 크다. 큰 시스템을 제작하는 난이도를 낮춰준다. 자바는 정보 은닉을 위해서 다양한 장치 제공 접근 제어 메커니즘으로 클래스, 인터페이스, 멤버의 접근성을 명시 기본 원칙 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다. 즉, 소프트웨어

[Batch] SpringBatch 설정 및 MySql 연결 [내부링크]

@SpringBootApplication @EnableBatchProcessing public class SpringbatchApplication { public static void main(String[] args) { SpringApplication.run(SpringbatchApplication.class, args); } } @EnableBatchProcessing 어노테이션 추가 spring: datasource: url: driver-class-name: com.mysql.jdbc.Driver username: password: jpa: show-sql: true hibernate: ddl-auto: create properties: hibernate: format_sql: create batch: jdbc: initialize-schema: always logging: level: org: hibernate: sql : debug type : trace spring b

[Effective Java] public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라. [내부링크]

public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 class Point{ public double x; public double y; } 이러한 클래스는 데이터 필드에 직접 접근할 수 있기에 캡슐화 이점을 제공하지 못함 api를 수정하지 않고는 내부 표현을 바꿀 수 없고 불변식을 보장할 수 없고 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없다. public class Point { private double x; private double y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y) { this.y = y; } } 보통은 이렇게 필드를

[Effective Java] 변경 가능성을 최소화하라. [내부링크]

변경 가능성을 최소화하라. 불변 클래스는 인스턴스의 내부 값을 수정할 수 없는 클래스이다. 클래스를 불변으로 만들기 위한 다섯 가지 규칙 객체의 상태를 변경하는 메서드를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. 하위 클래스에서 부주의하게, 나쁜 의도로 객체의 상태를 변하게 만드는 사태를 막아준다. 모든 필드를 final로 선언한다. 새로 생성된 인스턴스를 동기화 없이 다른 스레드로 건네도 문제없이 동작하게끔 보장하는데도 필요하다. 모든 필드를 private로 선언한다. 필드가 참조하는 가변 객체를 클라이언트에서 직접 접근해 수정하는 일을 막아준다. public final로만 선언해도 불변 객체가 되지만, 이렇게 하면 다음 릴리스에서 내부 표현을 바꾸지 못하기에 권하지는 않는다. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 클래스에 가변 객체를 참조하는 필드가 하나라도 있다면 클라이언트에서 그 객체의 참조를 얻을 수 없도록 해야 한다. 클라이언트가 제공한 객

6월 셋째 주 [내부링크]

네이버 블로그 챌린지 주 시작을 잘못했다. 하지만 뚝심 있게 밀고 나갈 생각이다.. 영화 보러 간 건물 옥상에서 찍은 뷰 정말 롯데타워는 어디서나 잘 보인다. 마녀 2 봤다. 음,, 마녀 1만큼의 유치함과 재미다. 사실 나는 웬만한 영화 다 재밌게 봐서 다 재밌다고 한다. 학교에서 본 고양이.. 다가가기 사라졌다. 혼밥으로 한 스테이크 덮밥.. 음.. 메뉴판 사진 비주얼에 비해서 맛은 아쉬웠다. 높은 곳에서 바라본 서울역 뷰.. God View.. 입주할 때부터 에어컨이 안되었는데.. 필요성을 느끼고 ㅎ.. 에어컨 기사 불러서 고쳤다. 기사님 오셔서 기사님이 가져온 리모컨 한 번 누르니 바로 고쳐졌다. 하드웨어에 옵션 값을 넣은 거라고 하셨다.. 아침을 안 먹어서 그동안 해보고 싶었던 서브웨이 2개 먹기를 해봤다.. 이날 이거 먹고 아무것도 안 먹었다.. 자취방 침대에 있다가 콘센트에 꽂혀있는 충전기를 실수로 깔고 뭉갰다. 박살 났길래 손으로 꺼내려다가 순간 전기 찌지지지지직 통해서

[서평] 소문난 명강의 - 소플의 처음 만난 리액트 - 리액트 기초 개념정리부터 실습까지 - 이인제 지음 한빛미디어 [내부링크]

이인제님이 지은 소플의 처음 만난 리액트 책입니다. 앞 표지는 위와 같이 생겼습니다. 깔끔하게 나왔네요. 뒷면은 한빛미디어 느낌으로.. 이 책은 리액트에만 집중하기에 초보자를 위한 책입니다. 또한 무료 동영상까지 제공하니 같이 보면 좋을 것 같네요 위의 사진을 보면 알 수 있듯이 책에 최대한 핵심만 담겨 있습니다. 여기서도 알 수 있듯이 리액트를 처음 접하는 입문자를 위한 책입니다. 또한 리액트를 하기 전에 HTML, CSS, JS를 해야 되나라고 고민하는 경우가 많은데 이런 고민을 덜어낼 수 있도록 3개에 대한 기초적인 내용도 담겨있습니다. 크게 4개 요소로 나눠져있고 챕터는 16개가 있습니다. 리액트가 무엇인지, 리액트의 기본 요소, 스타일링 그리고 마지막에 프로젝트까지도 진행할 수 있게 책을 만들었네요. 저는 책의 가독성을 굉장히 중요하게 생각합니다. 이 책은 중요한 부분에 하이라이트도 되어있고 그림도 자세하게 나와있어서 좋았습니다. 코드도 읽기 쉽게 글씨가 이쁘게 나와져있습니

[2년 전 오늘] 공부하기 싫다. [내부링크]

2020.6.27. 2년 전 오늘 공부하기 싫다. 아직 시험 1개 과제 2개 남았는데 하기 싫다~~~~~~~~~ 30일 날 온라인 시험 봐야 되는데 흑 이 과목은 뭘 공부해야 될지를 모르겠네 이거 말고 다른 거 들을걸ᅲ 쓸모도 없어 보이는 이 과목ㅠ 류리상자 와우.. 이번에는 5월달에 종강이었는데 진짜 우리 학교 종강이 빠르긴했구나.. 총장님.. 감사합니다..

[2년 전 오늘] 새로운 도전 [내부링크]

2020.6.28. 2년 전 오늘 새로운 도전 아니 1월 1일 날 새해 인사한 게 엊그제 같은데 벌써 반년.. 시간 너무 빠르다.. 헬스나 다시 해볼까 생각 중 헬스 할 때는 복싱 같은 걸 배워보고 싶었는데 복싱을 하니 역시 몸 좋은 게 최고라는 생각이 들면서 헬스를 다시 하고 싶어짐 교수님들 랩실도 한 번 들어가 보고 싶은데 컨택하기가 무섭네 류리상자 헬스를 했나? 한 것 같기도 하다. 연구실은 저 때 글 쓰고 바로 들어가서 아직도 연구실에 있다,, 요즘은 일하느라 잘 못 가기는 하는데,,

6월 넷째 주 [내부링크]

저번 주 일요일.. 우리 학교 실세랑 같이 카페에서 프로젝트 진행했다. 아침에 만나서 저녁 7시까지 했다. 실세랑 같이 먹은 점심 볶음밥.. 저녁도 같이 먹으려고 했는데.. 실세가 따로 먹는다고 해서.. 흑 나 혼자 눈물을 훔치면서 먹은 바른치킨.. 회사에서 아침으로 먹은 샌드위치.. 비 오는 날의 풍경인가.. 회사 팀원분이랑 먹은 우육면.. 동시에 국물을 한 입 먹자마자.. 감탄을 내뱉으며.. 아무 말도 없이 흡입했다.. 낙곱새가 먹고 싶어서.. 친구랑 낙곱새 먹으러 갔다.. 맛있쪙 후식으로 먹은.. 홍콩와플 ... 흠.. 음... ㅡ.. ㅡㅡ..ㅇㅇ으응ㅁ.... 과거의 어느 날 아침으로 먹은 삼각김밥.. 나는!!!!!!!!1 참치마요가 너무 맛있다.!!!!!!!!! 점심.. 혼밥.. 순댓국... 합격.. 프로젝트 회의하러 가기 전에 먹은.. 서브웨이 2개.. 너무 배고파서 그만 2개를.. 우리만의 공간~ 너무 깔끔하기는 한데 ㅎ.. 연구실 동생들과 먹은.. 학식 저녁.. 돼지국밥

캡슐화(Encapsulation) [내부링크]

데이터 + 관련 기능 묶는 것 객체가 기능을 어떻게 구현했는 지 외부에 감추는 것이다. 구현에 사용된 데이터의 상세 내용을 외부에 감춘다. 정보 은닉 의미 포함한다. 외부에 영향 없이 객체 내부 구현 변경 가능 무슨 의미인 지? 캡슐화를 하지 않으면 요구사항의 변화가 데이터 구조/사용에 변화를 발생시킨다. 데이터를 사용하는 코드의 수정 발생 캡슐화를 하면 기능을 제공하고 구현 상세를 감춘다. 내부 구현만 변경하면 된다. 캡슐화는 연쇄적인 변경 전파를 최소화한다. 요구사항의 변화가 내부 구현을 변경한다. 캡슐화 시도 -> 기능에 대한 의도 이해를 높인다. 캡슐화 규칙 Tell, Don't Ask 데이터 달라하지 말고 해달라고 하기 Demeter's law 메서드에서 생성한 객체의 메서드만 호출 파라미터로 받은 객체의 메서드만 호출 필드로 참조하는 객체의 메서드만 호출 가능라면 객체 그래프를 따라서 객체를 get,get,get 하는 형태로 작성하지 말고 바로 접근할 수 있는 객체의 메서

[Clean Architecture] 경계 간 매핑하기 [내부링크]

8장 경계 간 매핑하기 매핑하지 않기 전략 포트 인터페이스가 도메인 모델을 입출력 모델로 사용하면 두 계층 간의 매핑을 할 필요가 없어진다. 모든 계층이 같은 모델을 사용하니 계층 간 매핑을 할 필요가 없다. 하지만 매핑하지 않기 전략을 사용했을 경우의 결과는 아래와 같다. 웹 계층과 영속성 계층은 모델에 대해서 특별한 요구 사항이 발생할 수 있다. 이럴 경우 도메인과 애플리케이션 계층은 웹이나 영속성과 관련된 요구사항에 관심이 없음에도 불구하고 도메인 클래스는 모든 요구사항을 다뤄야한다. 이 경우 Account 클래스는 웹, 어플리케이션, 영속성 계층과 관련된 이유로 인해 변경돼야 하기에 단일 책임 원칙을 위반한다. 각 계층이 Account 클래스에 특정 커스텀 필드를 두도록 요구하게 되면 오로지 한 계층에서만 필요한 필드들을 포함하는 파편화된 도메인 모델로 이어질 수 있다. 매핑하지 않기 전략은 모든 계층이 정확히 같은 구조의, 정확히 같은 정보를 필요로 한다면 완벽한 선택지이다

[Hackerrank] Weather Observation Station 6 oracle [내부링크]

https://www.hackerrank.com/challenges/weather-observation-station-6/problem?isFullScreen=true Weather Observation Station 6 | HackerRank Query a list of CITY names beginning with vowels (a, e, i, o, u). www.hackerrank.com select distinct city from station where city LIKE 'A%' or city LIKE 'E%' or city LIKE 'O%' or city LIKE 'I%' or city LIKE 'U%'; like나 정규표현식 이용 select distinct city from station where regexp_like(city,'^[AEIOU]');

[Hackkerank] Weather Observation Station 9 [내부링크]

Weather Observation Station 9 | HackerRank Query an alphabetically ordered list of CITY names not starting with vowels. www.hackerrank.com select distinct city from station where not (city like 'A%' or city like 'E%' or city like 'I%' or city like 'O%' or city like 'U%'); 모음으로 시작하지 않는 문자를 뽑아야하기에 위와 같이 select distinct city from station where regexp_like(city,'^[^AEIOU]'); 정규표현식을 쓰면 더 간단히 가능하다.

6월 둘째 주 [내부링크]

교수님 덕분에 오마카세를 먹어보았다.. 너무 맛있었다. 왜 비싼 돈 주고 오마카세 가는 지 알 것 같다. 친구랑 백화점 놀러갔는데 인스타에서 맨날 마지막 장에 보이는 책이 있어서 찍었다. 망고빙수는 맛있다. 친구랑 서울 둘레길 가봤다. 휴 쉽지 않았다. 처음부터 길을 잘못 들어서 계속 헤매면서 갔다ㅋㅋㅋ 아예 핸드폰 없이 걸어보았는데 정말 현대사회에서 핸드폰에 대한 의존성이 얼마나 큰 지 알게 되었다. DIP가 필요하다 광나루역에서 화랑대역까지 걸었다. 음음 강동쪽 한강이다. 첫 출근했다. 나는 누구..? 여긴 어디..? 도대체 내가 왜..? 명함도 바로 받았다.. 호호호.. 이쁘다. 주변 사람들도 다 이쁘다고 한다. 첫 출근 저녁으로 먹은 일식 맛있었다. 나에게 정말 운 좋게 주어진 기회이니 후회하지 않을 각오로 열심히 해야겠다. 동생이랑 쉐프의 그릴 먹었다. 맛있다! 회의실에서 풍경을 찍어보았다.. 퇴근하고 서울부띠끄 가서 맛있게 냠냠했다. 남산도 가보았다. 전경이 이쁘다. 처음

[Spring boot] ResponseStatusExceptionResolver [내부링크]

ResponseStatusExceptionResolver 예외에 따라서 HTTP 상태 코드를 지정해 주는 역할을 한다. @ResponseStatus가 달려있는 예외 ResponseStatusException 예외 @ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "잘못된 요청 오류") public class BadRequestException extends RuntimeException { } 어노테이션 사용하면 HTTP 상태 코드를 변경해 준다. BadRequestException 예외가 컨트롤러 밖으로 넘어가면 ResponseStatusExceptionResolver 예외가 해당 어노테이션을 확인 후 오류 코드를 HttpStatus.BAD_REQUEST 400으로 변경하고, reason을 통해서 메시지도 담는다. @GetMapping("/api/response-status-ex1") public String responseStat

[Spring boot] @ExceptionHandler, @ControllerAdvice [내부링크]

ExceptionHandler 스프링은 API 예외 처리 문제를 해결하기 위해서 @ExceptionHandler 어노테이션을 사용해서 예외 처리 기능을 제공한다. import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class ErrorResult { private String code; private String message; } public class ApiExceptionV2Controller { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(IllegalArgumentException.class) public ErrorResult illegalExHandle(IllegalArgumentException e) { log.error("[exceptionHandle] ex", e); return new ErrorResult

Inner Join, outer join [내부링크]

관계가 있는 걸 inner 관계가 없는 걸 outer라고 한다. Inner Join inner join을 사용하면 관계가 있는 것만 합친다. -> Outer를 제거한다. inner join = join inner join을 적용하면 공통된 부분만 나온다. 왼쪽 테이블은 1개 오른쪽 테이블은 3개 이기에 왼쪽 테이블을 3개로 늘려줘서 맞춰준다. /* ANSI SQL */ select * from member m inner join team t on m.id = t.member.id Outer Join 기본적인 방법은 inner join, 관계가 있는 것만 관계가 없는 걸 outer 왼쪽에 있는 outer를 포함하면 left outer join 오른쪽에 있는 outer를 포함하면 right outer join left outer join이면 왼쪽에 있는 테이블에 관계가 없는 것까지 포함하는 것이다. 오른쪽 테이블의 파란색 행은 관계가 없기에 제거한다. 그다음 왼쪽의 주황색 1개와 오른쪽

oracle 문법 [내부링크]

문자열 char, varchar 찾을 때 속도차이가 생김 고정길이면 char, char(2,char) 2개의 문자가 됨,nchar(2)가 더 바람직함 가변 길이면 varchar nchar LONG - 잘 안씀 CLOB - 대용량 텍스트 데이터 타입 최대 4기가 NCLOB - 대용량 텍스트 유니코드 데이터 타입 최대 4기가 NUMBER - 정수, 실수 한 번에 처리 number(4) - 최대 4자로 number(6,2) - 최대 6자리인데 소수점 2자리까지 소수점 둘째 자리에서 반올림 number - number(38,*) DATE - 연 월 일 TIMESTAMP - 연 월 일 시간 분 초 까지 테이블 수정 변경 alter table member modify id nvarchar(20); 변환이 가능한 값으로만 가능함 길이도 마찬가지임 삭제 alter table member drop column age; 추가 alter table member add email varchar2(200)

[2년 전 오늘] [유럽] 오스트리아 잘츠부르크 미라벨 게트라이데거리 호엔잘츠부르크 요새 프라터 놀이공원 [내부링크]

2020.5.8. 2년 전 오늘 [유럽] 오스트리아 잘츠부르크 미라벨 게트라이데거리 호엔잘츠부르크 요새 프라터 놀이공원 오스트리아 3일째 되는 날 정말 오스트리아는 열심히 돌아 다닌 듯 #잘츠부르크 가는 기차에서 오늘은 뭐 할까 고민하다가 빈은 많이 본 것 같아서 근교로 가기로 결정 원래는 혼자 갈까 하다가 계속 같이 다니던 형이랑 감. 약간의 해프닝이 있었음. 기차역 갔는데 가장 빨리 출발하는 기차가 곧 출발할 것 같아서 바로 뛰... 류리상자 크.. 오스트리아 재밌었지.. 같이 동행했던 형은 결혼 했던데~~ 축하합니다!

GDSC SeoulTech 끝! [내부링크]

2021년 8월 15일 ~ 2022년 5월 10일 흑백으로 가득 찼던 나의 대학생활을 컬러로 채워준 GDSC가 끝났다. GDSC로 활동했던 시간이 C++처럼 빠르게 지나갔다. ㅎ 내 HDMI선 ~ 5월 10일에 리드랑 코어 먼저 도착해서 세팅했다. 원래는 빔프로젝터 이용해서 화면을 띄우려다가 해보니까 생각보다 별로여서 대형 TV(?) 이용해서 화면 딱 띄웠다. 이게 훨씬 나았다~ 이때까지는 좀 준비하느라 바빠서 감흥(?) 같은 게 없었다. 모여서 보는 중~ 7시 30분까지 모이기로 했는데 다행히 다 제시간에 왔나..? 아닌가.. 2명이 늦었나.. 가물가물하네 가물치~ 이때부터 슬슬,, 아 끝났다는 생각이 들었다. 프로젝트 발표 중 일단 가장 먼저 했던 건 GDSC에서 겨울방학 동안 했던 프로젝트 발표하기,, 원래 막내한테 발표 시키려고 했다가 ㅎ 결국 코어이면서 팀장인 내가 발표했다.(이게 맞지) 굉장히 간단한 구조를 가졌으나 우리 팀 정말 고생하고 밤도 며칠 새 가면서 만든 Can

[Clean Architecture] 계층형 아키텍처의 문제 [내부링크]

계층형 아키텍처 웹 계층, 도메인 계층, 영속성 계층으로 구성된 전통적인 웹 애플리케이션 구조이다. 상위 수준 관점에서 일반적인 3계층 아키텍처를 표현한 것 웹 계층에서는 요청을 받아 도메인 혹은 비즈니스 계층에 있는 서비스로 요청을 보낸다. 서비스에서는 필요한 비즈니스 로직을 수행 도메인 엔티티의 현재 상태를 조회하거나 변경하기 위해서 영속성 계층의 컴포넌트 호출 문제점 1 : 데이터베이스 주도 설계를 유도한다. 계층형 아키텍처의 토대는 데이터베이스이다. 웹 계층 -> 도메인 계층 -> 영속성 계층에 의존하기에 결국 데이터베이스에 의존하게 되기에 모든 것이 영속성 계층을 토대로 만들어진다. 상태가 아니라 행동을 중심으로 모델링 한다.????? 애플리케이션이든 상태가 중요한 요소이긴 하지만 행동이 상태를 바꾸는 주체이기에 행동이 비즈니스를 이끈다. 전통적인 아키텍처에서는 의존성의 방향에 따라서 데이터베이스의 구조를 먼저 생각하고 이를 토대로 도메인 로직을 구현한다. 하지만 비즈니스

[Clean Architecture] 의존성 역전하기 [내부링크]

2장에서는 계층형 아키텍처의 대안에 대해서 이야기하고 단일 책임 원칙과 의존성 역전 원칙에 대해서 이야기한다. 단일 책임 원칙 하나의 컴포넌트는 오로지 한 가지 일만 해야 하고, 그것을 올바르게 수행해야 한다. 일반적으로는 위와 같이 해석하지만 이는 단일 책임 원칙의 실제 의도가 아니다. 단일 책임 원칙의 실제 정의는 컴포넌트를 변경하는 이유는 오직 하나뿐이어야 한다. 책임을 오로지 한 가지 일만 하는 것보다는 변경할 이유로 해석해야 한다. 컴포넌트를 변경할 이유가 오로지 한 가지라면 컴포넌트는 딱 한 가지 일만 하게 된다. 하지만 이보다 더 중요한 것은 변경할 이유가 오직 한 가지라는 것이다. 아키텍처에서의 의미는 만일 컴포넌트를 변경할 이유가 한 가지라면 우리가 어떤 다른 이유로 소프트웨어를 변경하더라도 이 컴포넌트에 대해서는 전혀 신경 쓸 필요가 없다는 의미이다. 소프트웨어가 변경되더라도 여전히 우리가 기대한 대로 동작할 것이기 때문이다. 하지만 변경할 이유라는 것은 컴포넌트

6월 첫째 주 [내부링크]

학교에서 촬영을 하길래 뭔 촬영인가 했더니 넷플릭스 종말의 바보 촬영이었다. 오랜만에 돈까스 김밥과 라면이 끌려서 김밥천국으로 먹으러 갔다. 김밥과 라면을 점심으로 먹은 날에 저녁으로 햄버거가 끌려서 햄버거도 먹었다. 오랜만에 중국집 가서 간짜장하고 탕수육도 먹었다. 건강검진받으러 간 날에 먹은.. 규동.. 아.. 16시간 정도 금식하고 물도 안 마시고 먹은 첫 끼였는데 맛이 없어서 실망했다. 규동 먹고 영풍문고 한 번 쓱 구경해 봤다. 영풍문고가 포스코 건물에 있어서 구경해 봤는데 좋았다. 엄마랑 누나랑 서울역에서 만나기로 해서 서울역으로 갔다. 건물이 웅장하다. 서울역! 엄마가 준 감정 어휘 책.. 다 읽을게요~ 엄마랑 누나랑 토끼정 가서 맛있게 먹었다. 사실 토끼정 처음 먹어본다. 합격이다 토끼정 서울스퀘어도 구경해 봤다. 좋다 ㅎ

[Clean Architecture] 영속성 어댑터 구현하기 [내부링크]

계층형 아키텍처에서는 모든 것이 영속성 계층에 의존하게 되어 데이터베이스 주도 설계가 된다는 문제가 있다. 이러한 의존성을 역전시키기 위해 영속성 계층을 애플리케이션 계층의 플러그인으로 만드는 방법을 알아본다. 의존성 역전 코어의 서비스가 영속성 어댑터에 접근하기 위해 포트를 사용한다. 애플리케이션 서비스에서는 영속성 기능을 사용하기 위해 포트 인터페이스를 호출한다. 이 포트는 실제로 영속성 작업을 수행하고 데이터베이스와 통신할 책임을 가진 영속성 어댑터 클래스에 의해 구현된다. 포트는 애플리케이션 서비스와 영속성 코드 사이의 간접적인 계층이다. 영속성에 대한 코드 의존성을 없애기 위해 이러한 간접 계층을 추가하고 있다. 런타임에도 의존성은 애플리케이션 코어에서 영속성 어댑터로 향한다. 영속성 어댑터의 책임 입력을 받는다. 입력을 데이터베이스 포맷으로 매핑한다. 입력을 데이터베이스로 보낸다. 데이터베이스 출력을 애플리케이션 포맷으로 매핑한다. 출력을 반환한다. 영속성 어댑터는 포트

[Hackerrank] Weather Observation Station 5 oracle [내부링크]

SELECT * FROM (SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY), CITY) WHERE ROWNUM = 1 UNION SELECT * FROM (SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY) DESC, CITY) WHERE ROWNUM = 1; oracle sql 구문을 이용해서 품 mysql에는 limit이 있지만 oracle에서는 없기에 rownum을 사용해야 되고 이걸 위해서 따로 구현해 줘야 한다. from 절에서 조건을 만족하는 구문을 작성하고 마지막에 rownum = 1로 한 개만 출력한다.

[백준] 4803번 트리 C++ [내부링크]

4803번: 트리 문제 그래프는 정점과 간선으로 이루어져 있다. 두 정점 사이에 경로가 있다면, 두 정점은 연결되어 있다고 한다. 연결 요소는 모든 정점이 서로 연결되어 있는 정점의 부분집합이다. 그래프는 하나 또는 그 이상의 연결 요소로 이루어져 있다. 트리는 사이클이 없는 연결 요소이다. 트리에는 여러 성질이 있다. 예를 들어, 트리는 정점이 n개, 간선이 n-1개 있다. 또, 임의의 두 정점에 대해서 경로가 유일하다. 그래프가 주어졌을 때, 트리의 개수를 세는 프로그램을 작성하시오. 입력 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테... www.acmicpc.net 이렇게 많이 틀리면 알고리즘 너무 하기 싫어~ 유니온 파인드 이용해서 풀었다. 근데 뭔가 좋은 풀이는 아닌 것 같긴 한데 ㅎ 먼저 dfs 돌려서 연결된 점들을 방문해 준다. 그리고 다시 union-find 돌려서 사이클이 있는지 판단해 준다. dfs를 먼저 돌리는 이유는 1 1 1 2 2 3 과 같은 경

[백준] 14267번 회사 문화 1 C++ [내부링크]

14267번: 회사 문화 1 14267번 제출 맞힌 사람 숏코딩 재채점 결과 채점 현황 강의 질문 검색 회사 문화 1 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 2 초 512 MB 3141 1225 932 37.687% 문제 영선회사에는 매우 좋은 문화가 있는데, 바로 상사가 직속 부하를 칭찬하면 그 부하가 부하의 직속 부하를 연쇄적으로 칭찬하는 내리 칭찬이 있다. 즉, 상사가 한 직속 부하를 칭찬하면 그 부하의 모든 부하들이 칭찬을 받는다. 모든 칭찬에는 칭찬의 정도를 의미하는 수치가 있는데, 이 수치 또한 부하들에게 똑같이 칭찬 받는다. 직속 ... www.acmicpc.net 문제에서 중요한 것 한 사람이 여러 번 칭찬을 받을 수 있다. 그렇기에 입력받을 때 dp[a] += b로 해줘야 된다. 칭찬 초깃값 세팅해 주고 dfs 돌면서 dp 이용해서 그전까지의 칭찬 값을 더 해주면 된다. #include <iostream> #include <vector> #includ

[프로그래머스] 단체사진 찍기 C++ [내부링크]

코딩테스트 연습 - 단체사진 찍기 단체사진 찍기 가을을 맞아 카카오프렌즈는 단체로 소풍을 떠났다. 즐거운 시간을 보내고 마지막에 단체사진을 찍기 위해 카메라 앞에 일렬로 나란히 섰다. 그런데 각자가 원하는 배치가 모두 달라 어떤 순서로 설지 정하는데 시간이 오래 걸렸다. 네오는 프로도와 나란히 서기를 원했고, 튜브가 뿜은 불을 맞은 적이 있던 라이언은 튜브에게서 적어도 세 칸 이상 떨어져서 서기를 원했다. 사진을 찍고 나서 돌아오는 길에, 무지는 모두가 원하는 조건을 만족하면서도 다르게 서는 방법이 있지 않았을까 생각해보게 되었다. 각 프렌즈가 원하는 조건을 입력으... programmers.co.kr next_permutation을 이용해서 모든 경우의 수를 다 보면서 조건을 만족하는 지 보면 된다. 내가 헤맸던 부분은 옆에 붙어 있으면 인덱스의 차이를 0으로 해야되는데 자꾸 1로 해서 틀렸다. 그래서 int term에 + 1을 해줘서 값을 맞춰줬다. #include <string

@ManyToOne 이용 회원, 게시글, 댓글 연관관계 설정 [내부링크]

연관관계와 관계형 데이터 베이스 설계 회원과 게시글의 관계 한 명의 회원은 여러 게시글을 작성할 수 있다. 하나의 게시글은 한 명의 회원에 의해서 작성된다. -> 일대일 관계처럼 보일 수 있으나 실제 테이블 설계에는 맞지 않는다., 이 문장은 게시글 데이터에 작성자 칼럼이 하나만 필요하다는 뜻이지 작성자가 여러 개라는 사실을 찾아낼 수 없다. 테이블 간의 관계는 특정한 PK가 다른 곳에서 몇 번 FK로 사용되었는지가 중요하다. 데이터베이스에서 관계를 해석할 때는 항상 PK 쪽에서 해석해야 된다. 위의 두 명제는 1. 한 명의 회원은 여러 게시글을 작성할 수 있다.(PK에서 해석) 하나의 게시글은 한 명의 작성자만을 표시할 수 있다. PK로 설계, FK로 연관관계 해석 JPA를 이용해서 연관관계를 해석할 때는 PK를 기준으로 잡고, 데이터베이스를 모델링 하는 방식 회원, 게시글, 댓글의 관계를 PK로 설계하면 아래와 같은 구조 회원이 있어야만 게시글을 작성할 수 있기에 회원 테이블을

org.hibernate.LazyInitializationException: could not initialize proxy [내부링크]

fetch = FecthType.Lazy @ManyToOne(fetch = FetchType.LAZY) 위와 같이 지연 로딩을 할 때 발생하는 문제이다. board와 member와 N 대 1 연관관계를 가진다고 해보자. 먼저 지연 로딩 방식으로 로딩하기에 board 테이블만 가져와서 sout으로 board를 출력하는 건 문제가 없지만 board를 가져온 뒤 getWriter()와 같이 Member entity에 접근하려면 문제가 발생한다. 이는 getWriter()를 하려면 member table을 로딩해야 하는데 이미 데이터베이스와의 연결은 끝난 상태이기 때문이다. 'No Session'이라는 메시지가 이런 경우에 발생한다. 이 문제를 해결하기 위해서는 다시 한번 데이터베이스와의 연결이 필요한데 이때 @Transaction을 사용하면 된다. @Transaction은 해당 메서드를 하나의 트랜잭션으로 처리하라는 의미이다. 트랜잭션으로 처리하면 속성에 따라 다르게 동작하지만, 기본적으

[백준] 1949번 우수 마을 C++ [내부링크]

1949번: 우수 마을 1949번 제출 맞힌 사람 숏코딩 재채점 결과 채점 현황 질문 검색 우수 마을 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 2 초 128 MB 5523 2691 1901 51.686% 문제 N개의 마을로 이루어진 나라가 있다. 편의상 마을에는 1부터 N까지 번호가 붙어 있다고 하자. 이 나라는 트리(Tree) 구조로 이루어져 있다. 즉 마을과 마을 사이를 직접 잇는 N-1개의 길이 있으며, 각 길은 방향성이 없어서 A번 마을에서 B번 마을로 갈 수 있다면 B번 마을에서 A번 마을로 갈 수 있다. 또, 모든 마을은 연결되어... www.acmicpc.net 트리 dp를 활용하는 문제 dp[i][2]로 해서 0이면 우수 마을 1이면 안 우수 마을이다. dp[i][0]은 i가 우수마을 일 때의 최댓값이다. i가 우수 마을 일 때는 접해있는 마을이 안 우수 마을이어야 하기에 dp[i][1]을 더해준다. dp[i][1]은 i가 우수 마을이 아닐 때의 최댓값이

[백준] 2213번 트리의 독립집합 C++ [내부링크]

2213번: 트리의 독립집합 2213번 제출 맞힌 사람 숏코딩 재채점 결과 채점 현황 강의 질문 검색 트리의 독립집합 스페셜 저지 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 2 초 128 MB 4381 2094 1567 48.141% 문제 그래프 G(V, E)에서 정점의 부분 집합 S에 속한 모든 정점쌍이 서로 인접하지 않으면 (정점쌍을 잇는 간선이 없으면) S를 독립 집합(independent set)이라고 한다. 독립 집합의 크기는 정점에 가중치가 주어져 있지 않을 경우는 독립 집합에 속한 정점의 수를 말하고, 정점에 가중치가 주어져 있으면 독... www.acmicpc.net 트리 dp를 활용하는 문제 dp[i][0] = i 번 노드를 root로 하는 서브트리에서 i를 포함했을 경우의 답 dp[i][1] = i 번 노드를 root로 하는 서브트리에서 i를 미포함했을 경우의 답이다. dp[i][0]인 경우 자식 노드를 포함하지 않아야 되기에 자식을 제외한 서브트리의

[프로그래머스] 합승 택시 요금 C++ [내부링크]

코딩테스트 연습 - 합승 택시 요금 밤늦게 귀가할 때 안전을 위해 항상 택시를 이용하던 무지 는 최근 야근이 잦아져 택시를 더 많이 이용하게 되어 택시비를 아낄 수 있는 방법을 고민하고 있습니다. "무지"는 자신이 택시를 이용할 때 동료인 어피치 역시 자신과 비슷한 방향으로 가는 택시를 종종 이용하는 것을 알게 되었습니다. "무지"는 "어피치"와 귀가 방향이 비슷하여 택시 합승을 적절히 이용하면 택시요금을 얼마나 아낄 수 있을 지 계산해 보고 "어피치"에게 합승을 제안해 보려고 합니다. 위 예시 그림은 택시가 이동 가능한 반경에 있는 6개 지점 사이의 이동 가능한 택... programmers.co.kr 정점들 간의 최소 거리를 구해주기 위해서 플로이드 와샬 알고리즘을 이용했다. 문제에서 가장 핵심이 되는 부분은 어떤 경유지를 선택 해야될까이다. 역시나 가장 간단한 방법은 모든 정점을 경유지로 선택해서 요금을 계산하고 최솟값을 구해주면 된다. 플로이드 와샬로 먼저 정점 간의 최소 거

Thymeleaf 문법 [내부링크]

text <h1 th:text="${data}"></h1> model를 이용해서 data 부분에 값을 넣을 수 있다. each th:each = "변수: ${목록}" each를 이용하면 반복문 사용 가능하다. 목록 부분에 model.addAttribute로 값을 받고 변수로 값을 받아서 사용 가능하다. state 객체 반복문에는 순번, 인덱스 번호, 홀수/짝수 등을 지정할 수 있는 상태 객체를 이용할 수 있다. 제어문 Thymeleaf의 제어문 처리는 if 문으로 사용 가능하다. th:if ~ unless th:if="${dto.sno % 5 == 0}" 위의 if 코드를 이용해서 sno의 값이 5의 배수만 출력 가능하다. 4 9 14 19로 찍히는 건 state의 값이기 때문이다. unless를 이용할 수 있다. 위의 경우 sno가 5로 나눈 나머지가 0이민 경우 sno 출력 아니면 first를 출력하는 것이다. 삼항 연산자로도 처리가 가능하다. if 문을 이용해서 css 적용도

Querydsl [내부링크]

gradle // 여기서부터 추가 def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } configurations { compileOnly { extendsFrom annotationProcessor } querydsl.extendsFrom compileClasspath } 단일 항목 검색 @Test void 테스트쿼리(){ Pageable pageable = PageRequest.of(0,10, Sort.by("gno").descending()); QGuestbook qGuestbook = QGuestbook.guestbook; //

Spring boot 목록 처리 [내부링크]

목록 처리에는 아래를 고려해야한다. 화면에서필요한 목록 데이터에 대한 DTO 생성 DTO를 Pageable 타입으로 전환 Page<Entity>를 화면에서 사용하기 쉬운 DTO의 리스트 등으로 변환 화면에 필요한 페이지 번호 처리 목록 처리를 위한 DTO 보통 목록 처리하는 기능에는 페이지 번호나 한 페이지당 몇 개나 출력될 것인가와 같은 기능을 가진다. 페이지 요청 처리 DTO (PageRequestDTO) PageRequestDTO는 목록 페이지를 요청할 때 사용하는 데이터를 재사용하기 쉽게 만든 클래스 목록 화면에서는 페이지 처리를 하는 경우가 많이 있기에 페이지 번호, 페이지 내 목록의 개수, 검색 조건들이 많이 사용된다. PageRequestDTO는 이러한 파라미터를 DTO로 선언하고 나중에 재사용하는 용도로 사용한다. 화면에서 전달되는 목록 관련된 데이터에 대한 DTO를 PageRequestDTO로 생성 화면에서 필요한 결과는 PageResultDTO로 생성 PageReq

@Query 어노테이션 [내부링크]

@Query 어노테이션 Spring Data JPA가 제공하는 쿼리 메서드는 검색과 같은 기능을 작성할 때 편리함을 제공하기는 하나 조인이나 복잡한 조건을 처리해야 하는 경우네는 And, Or 등이 사용되면서 불편할 때가 많다. 그렇기에 간단한 처리만 쿼리 메서드를 이용하고, @Query를 이용하는 경우가 더 많다. @Query의 경우는 메서드의 이름과 상관없이 메서드만 추가한 어노테이션을 통해서 원하는 처리가 가능하다. @Query의 value는 JPQL로 작성하는데 객체지향 쿼리라고 불리는 구문이다. @Query를 이용해서는 아래와 같은 작업을 수행할 수 있다. 필요한 데이터만 선별적으로 추출하는 기능 데이터베이스에 맞는 Native SQL 사용하는 기능 insert, update, delete와 같은 select가 아닌 DML 등을 처리하는 기능(@Modifying과 함께 사용) JPQL 쿼리는 테이블 대신 entity 클래스를 사용하고 테이블 칼럼 대신 클래스에 선언된 필드를

List 반환과 Object 반환 [내부링크]

Controller에서 List로 반환하게 되면 Json 형식에 대한 확장성이 떨어지게 된다. @GetMapping("/api/v1/members") public List<Member> membersv1(){ //엔티티가 다 노출됨 //원하지 않는 정보는 jsonignore에 넣으면 된다. //array를 반환하면 json 확정성이 떨어진다. List<Member> findMembers = memberService.findMembers(); return findMembers; } @GetMapping("/api/v2/members") public Result memberV2(){ List<Member> findMembers = memberService.findMembers(); List<MemberDto> collect = findMembers.stream().map(m -> new MemberDto(m.getName())) .collect(Collectors.toList()); r

시험이 끝나고 [내부링크]

우리 학교는 개강이 2월 21일이라 저번 주에 시험이 끝났다. 시험 과목이 2과목밖에 없어서 수월했지만 역시 시험 기간은 스트레스이다.. 시험 끝나고 그 다음날 구씨 만나러 갔다. 신논현에서 만나기로 해서 만나기 전에 교보문고 잠시 들러봤다. 책 제목이 재미있어서 보는데 미술관에 간 개발자는 없어서 좀 아쉬웠다. 구씨 만나자마자 식당으로 갔다. 원래는 다른 식당으로 가려다가 웨이팅도 있고 생각보다 평이 안 좋은 것 같아서 가려던 식당 바로 앞에 있는 식당으로 갔다. 결과는 대성공~ 아주 맛있게 잘 먹었다. 오른쪽 음식이 입에서 살살 녹았다. 1차는 우리 구씨가 사줬습니다~ 2차로는 엄청 고민하다가 와플 먹으러 갔다. 여기도 맛있게 먹었다. 약간의 해프닝이 있어서 돈까지 환불받아서 개이득~ 구씨랑도 오랜만에 만났는데 역시 동네 친구 좋습니다. 16일에는 처음으로 코어 멤버 다 모여서 회식했다. 1차로 동학 가려다가 아니 뭔 5시 조금 넘어서 갔는데 사람이 꽉 차서 꼬치집으로 갔다. 처

scp 이용 window에서 aws ubuntu로 파일 올리기 [내부링크]

최대한 자세하게 적어봅니다. aws ec2 public 주소 사용해야 됩니다! 먼저 프로그램 추가 제거의 앱 및 기능으로 들어간 다음에 선택적 기능을 클릭합니다. 여기서 openssh 클라이언트가 있어야 가능합니다.! cmd 창에 scp를 쳤을 때 usage가 나와야 정상적으로 가능합니다. 저는 window에 컴공캡스톤_key에 있는 test.txt 파일을 aws ubuntu에 올려보겠습니다. C:\Users\Ryool\Desktop\컴공캡스톤_key\test.txt window의 경로는 다음과 같습니다. scp를 사용할 명령어는 다음과 같습니다. scp -r -i [pem file] [upload file] [user id]@[ec2 public IP]:~/[transfer address] 먼저 저는 pem file이 C:\Users\Ryool\Desktop\capston_key\caom_key.pem 여기에 있습니다. 보낼 파일도 같은 폴더에 위치합니다. 저기 위에 test.tx

[서평] 도메인 주도 개발 시작하기 DDD 핵심 개념 정리부터 구현까지 - 최범균 지음 [내부링크]

이번에는 딱 원하는 책이 걸렸다. 개발 시작할 때부터 DDD를 들어봐서 DDD에 대해서 공부해 봐야지라고 생각했었다. 정말 때마침 이번 차수에 DDD 관련 책이 있어서 바로 3권 중에 1권으로 넣었고 제발~~ 제발~~ 하면서 당첨되길 기도했다. 내 기도가 먹혔는지 다행히 이 책이 왔다. 리뷰 먼저 이 책은 DDD를 처음 접하는 개발자를 위한 책으로 DDD 입문자를 대상으로 하는 책이다. DDD의 호기심을 채워주는 책 책에서 사용한 언어는 JAVA , Spring MVC, JPA(ORM)이다. 또한 maven, java 18, spring boot, jpa, 타임리프, MySQL을 이용해서 예제 코드를 작성한다. https://github.com/madvirus/ddd-start2 GitHub - madvirus/ddd-start2 Contribute to madvirus/ddd-start2 development by creating an account on GitHub. github

Spring Data JPA 페이징/정렬 처리 [내부링크]

findAll() Spring Data JPA에서 페이징 처리와 정렬은 findAll 메서드 사용 findAll()는 JpaRepository 인터페이스의 상위인 PagingAndSortRepository의 메서드로 파라미터로 전달되는 Pageable이라는 타입의 객체에 의해서 실행되는 쿼리를 결정 여기서 리턴 타입을 Page<T> 타입으로 지정하면 반드시 파라미터를 pageable 타입을 이용해야 한다. Pageable 인터페이스 페이지 처리를 위한 가장 중요한 인터페이스 Pageable 인터페이스는 페이지 처리에 필요한 정보를 전달하는 용도의 타입으로, 인터페이스이기에 실제 객체를 생성할 때는 구현체인 PageRequest라는 클래스를 사용한다. PageRequest 클래스의 생성자는 protected로 선언되어 new를 사용할 수 없기에 static 한 of()를 처리한다. 생성자에는 page, size, Sort라는 정보를 이용해서 객체를 생성한다. of(int page, i

쿼리 메서드 [내부링크]

쿼리 메서드 기능 Spring data jpa의 경우에는 여러 가지 검색 조건이 필요한 경우 여러 방법을 제공한다 쿼리 메서드 : 메서드의 이름 자체가 쿼리의 구문으로 처리되는 기능 @Query : SQL과 유사하게 엔티티 클래스의 정보를 이용해서 쿼리를 작성하는 기능 Querydsl 등의 동적 쿼리 처리 기능 쿼리 메서드 이름 그대로 메서드의 이름 자체가 질의문이 되는 기능이다. 주로 findBy나 getBy로 시작하고 이후에 필요한 필드 조건이나 And, Or과 같은 키워드를 이용해서 메서드의 이름 자체로 질의 조건을 만든다. Spring Data JPA - Reference Documentation Spring Data JPA - Reference Documentation Oliver Gierke Thomas Darimont Christoph Strobl Mark Paluch Jay Bryant version 2.6.4, 2022-04-19 2008-2022 The origi

GDSC KR WINTER 해커톤 굿즈 [내부링크]

와우 오늘 굿즈 배송 왔다. 스티커 넘 귀엽 노트북에 붙여야지 옷.. 잘 입겠습니다 ㅎㅎ,, 이건 WANTED 에코백 디자인 좋네 잘 쓸 것 같습니다~ 채용 정보 | 원티드 나에게 딱 맞는 글로벌 10,000개 회사, 지금 원티드에서 만나보세요. www.wanted.co.kr 요거는 멜릭서 립밤. 립밤도 많이 쓸 것 같다. 비건화장품 - 민감성 피부 에 탁월한 멜릭서 공식 스토어 여드름, 민감성 피부. 채식주의 개념을 화장품으로 확장한 한국 최초 비건 스킨케어, 비건화장품. 멜릭서 kr.melixirskincare.com 비건 화장품 회사이다.

함께 자라기 애자일로 가는 길 [내부링크]

함께 자라기 저자 김창준 출판 인사이트 발매 2018.11.30. 인프런에서 강의 듣다가 강사분이 이 책을 추천하는 댓글을 달아서 한 번 읽어봤다. 제목이 애자일로 가는 길이어서 애자일 방법론에 대한 A to Z에 관한 글인 줄 알았다. 하지만 애자일을 설명하긴 하나 애자일스럽게 자기 계발을 하는 방법에 대해서 알려주는 책이다. 어떻게 하면 더 좋은 소프트웨어 개발자가 될 수 있고 팀장이 될 수 있고 실수를 관리하고 좋은 팀이 될 수 있으며 실력 있는 개발자는 어떻게 공부하는 지 등등을 알려준다. 자기 계발서를 별로 좋아하지 않으나 개발자에 대한 자기 계발 방법론이라서 읽으면서 많이 배운 것 같다. 물론 뒷장에서는 어떻게 하면 애자일을 성공적이게 도입하고 애자일의 성공에 영향을 끼치는 요소가 무엇인지 알려주긴 한다. - 자신이 업무 시간 중에 불안함이나 지루함을 느끼는 때가 대부분이면, 실력이 도무지 늘지 않는 환경에 있는 것 - 적절한 난이도를 가지는 일을 해야지만 실력이 향상 된

Parameter value [1] did not match expected type [내부링크]

쿼리를 이렇게 짜서 member가 쓴 모든 글을 불려오려고 했다. 근데 자꾸 오류가 나서 찾아보니 p.member 자체는 객체이고 memberId는 Long이여서 바인딩이 안돼서 나는 오류였다. https://stackoverflow.com/questions/56872364/how-pass-a-parameter-for-a-foreign-key-in-a-jpa-query-when-its-an-object How pass a parameter for a foreign key in a JPA query when it's an object? I have a class called Affecter with some attributes, and some ManyToOne foreign key. I want to create a query which search some data with a parameter for this foreign key. But, this foreign key is s

[1년 전 오늘] [1년 전 오늘] 1년 후 [내부링크]

2021.4.3. 1년 전 오늘 [1년 전 오늘] 1년 후 와 이 글을 1년 전에 썼네 후회가 없도록 살려고 했으나 여전히 후회 속에서 살고 있네.. 반성하자 코로나는 아직도 안 끝났네 1년 전에 무사히 종식 되기를 원한다고 썼는데.. 오히려 1년 전보다 더 한 느낌이다.. 언제 끝나냐 1년 뒤에는 어떨까?? 4학년이네 .. 코로나는 풀릴려나 류리상자 1년 전 오늘의 1년 전 오늘 20년에는 21년에는 코로나가 잠잠해질 줄 알았는데 아니었다 ㅋ 21년에는 그래도 22년에는 코로나가 끝나있을 줄 알았는데 ㅋㅋㅋㅋ 말도 안 되는 상상이었다~ 2년 동안 코로나가 줄기는 커녕 계속 늘었다~~ 23년에는 끝나있겠지? ㅎ 음 후회 없도록 살려고 여전히 노력했으나 인간이 후회 없이 사는 게 가능한가,, 그래도 작년보단 후회 없이 사는 것 같다. 지난 1년 동안 많이 성장한 기분이다. 좋은 동아리에 들어가서 좋은 사람들 만나고 프로젝트도 하고 백엔드도 열심히 공부하고~ 21년도에 비해서 더 나은

[백준] 2636번 치즈 C++ [내부링크]

2636번: 치즈 문제 아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓여 있지 않으며 치즈에는 하나 이상의 구멍이 있을 수 있다. 이 치즈를 공기 중에 놓으면 녹게 되는데 공기와 접촉된 칸은 한 시간이 지나면 녹아 없어진다. 치즈의 구멍 속에는 공기가 없지만 구멍을 둘러싼 치즈가 녹아서 구멍이 열리면 구멍 속으로 공기가 들어가게 된다. <그림 1>의 경우, 치즈의 구멍을 둘러싼 치즈는 녹지 않고 ‘... www.acmicpc.net #include <iostream> #include <vector> #include <string> #include <algorithm> #include <map> #include <queue> using namespace std; using ll = long long; int N, M; int boar

[2년 전 오늘] 새로운 도전 [내부링크]

2020.4.17. 2년 전 오늘 새로운 도전 자격증 나도 한때 많이 땄었지.. 블로그 시작한 것도 자격증 공부한 거 올리려고 시작한거니까ㅋㅋㅋㅋ 공부도 새로운 도전일까.. 흠 웹 공부를 요즘 좀 안 하기는 했지.. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 아니 하다가 내가 이걸 왜 하고 있지라는 생각이 드니까 갑자기 하기 싫어짐 공부를 하긴 하는데 컴공 특성상 이걸 어디다가 써... 류리상자 결국 백엔드를 공부하고 있고 자료구조는 A+을 맞았다.. 복싱도 잠깐 다니긴했다

Solution Challenge 마무리! [내부링크]

야호 ~ 드디어 솔루션 챌린지도 마무리,, 쉽지 않았지만 좋은 경험 했습니다.. 이걸 발판 삼아서 앞으로 더 나아가겠습니다!

[Effective Java] toString을 항상 재정의하라. [내부링크]

toString을 항상 재정의하라 - Object의 기본 toString 메서드가 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다. - 단순히 클래스_이름@16진수로_표시한_해시코드를 반환 - toString의 일반 규약은 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야한다. - toString의 규약은 모든 하위 클래스에서 이 메서드를 재정의하라고 한다. - toString을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고(?), 클래스를 사용한 시스템은 디버깅하기 쉽다. - 실전에서 toString은 그 객체가 가진 주요 정보 모두를 반환하는 게 좋다. {Jenny=707-867-5309} 포맷 - toString을 구현할 때변 반환값의 포맷을 문서화할 지 정해야 함 - 전화번호나 행렬 같은 값 클래스라면 문서화하기를 권함 - 왜냐 포맷을 명시하면 그 객체는 표준적이고, 명확하고 사람이 읽을 수 있게 된다. - 그 값 그대로 입출력에 사용하거나 CSV 파일

c++ split 구현 [내부링크]

문자열 최악인 c++ 맨날 split 기능 필요해서 블로그에 남겨놓는다 vector<string> split(string input, string delimiter) { vector<string> ret; long long pos = 0; string token = ""; while ((pos = input.find(delimiter)) != string::npos) { token = input.substr(0, pos); ret.push_back(token); input.erase(0, pos + delimiter.length()); } ret.push_back(input); return ret; }

[2년 전 오늘] [일상] 아산 지중해마을 [내부링크]

2020.4.1. 2년 전 오늘 [일상] 아산 지중해마을 출발 하기전 집 앞에서 한 컷ㅋㅋㅋㅋㅋㅋㅋㅋ 이건 보정이 너무 심하네; 아빠가 며칠동안 가자고 가자고 해서 간 지중해마을 BLUE CRYSTAL VILLAGE.. 나는 3월 30일날 갔는데 알고보니 31일날 드라마촬영예정이였음.. 하루만 늦게 갔으면 볼 수 있었는데 송승헌이랑 서지혜가 주연으로 나오는 드라마 흠... 류리상자 요게 벌써 2년 전이라니.. 시간 너무 빨라~

[HTTP] 메서드의 속성, 안전, 멱등, 캐시 가능 [내부링크]

GET, POST, PUT, PATCH, DELETE만 생각 안전(Safe Methods) - 메서드를 호출해도 리소스를 변경하지 않는 걸 안전이라고 한다. - 안전은 해당 리소스만 고려한다. - GET만 해당한다. 멱등(Idempotent Methods) - 한 번 호출하든 두 번 호출하든 100번 호출하든 결과가 똑같은 것이다. - GET : 여러 번 메서드를 사용해도 조회이기에 같은 결과가 조회 - PUT : 결과를 대체한다. 그렇기에 같은 요청을 여러 번 해도 최종 결과는 같다. - DELETE : 결과를 삭제한다. 같은 요청을 여러 번 해도 삭제된 결과는 똑같다. - POST : 멱등이 아니다!!!!!!!!!!!!!!! 여러 번 호출하면 같은 결제가 중복해서 발생할 수 있다. - 멱등은 자동 복구 매커니즘에서 사용이 된다. -> 서버가 TIMEOUT 등으로 정상 응답을 못 주었을 때, 클라이언트가 같은 요청을 다시 해도 되는가에 대한 판단 근거를 제공해 준다. - 멱등은 외

[HTTP] 상태 코드 200, 201, 202, 204 [내부링크]

2xx (Successful) - 클라이언트 요청을 성공적으로 처리했다는 의미이다. 200 OK - 클라이언트에서 GET를 보냈을 때 요청이 성공했다는 의미이다. 201 created - 서버 쪽에서 생성하는 상태 코드, POST와 관련 - 새로운 리소스를 생성한다. - 생성된 리소스는 응답의 Location 헤더 필드로 식별한다. 202 Accepted - 요청이 접수되었으나 처리가 완료되지 않았음을 의미한다. - 배치 처리 같은 곳에서 사용 - 요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리한다. - 하지만 잘 사용하지 않는다. 204 No Content - 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없다. - save 버튼의 결과로 아무 내용이 없어도 되고 버튼을 눌러도 같은 화면을 유지해야 한다. 200과 201 - 기본은 200이다. - 대부분 200을 주로 사용하고, 간간이 API 설계에서 201을 제공하는 경우도 있다. 출처 : 모든

[HTTP] 상태 코드 300, 301, 302, 303, 304, 307, 308 [내부링크]

HTTP 상태 코드 3xx - redirction에서 사용한다. - 요청을 완료하기 위해 유저 에이전트의 추가 조치가 필요하다. 리다이렉션 이해 - 웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동한다. 1. url : /event로 get을 요청 2. 하지만 url이 /event에서 /new-event로 바뀌어서 서버가 다시 Location으로 응답 3. 자동 리다이렉트로 url 변경, 클라이언트 단에서 스스로 자동 리다이렉트 4. 다시 /new-event로 get 요청 -> 처음부터 다시 요청한다. 5. 정상적으로 성공했기에 200 OK 응답 영구 리다이렉션 - 특정 리소스의 URI가 영구적으로 이동한다. /members -> /users /event -> /new-event 301 Mover Permanently - 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있다. 1. POST로 요청 2. 301, Lo

[HTTP] 상태 코드 400, 401, 403, 404 [내부링크]

4xx (Client Error) - 클라이언트에서의 오류를 나타내는 400번대 상태 코드 - 클라이언트의 요청에 잘못된 문법 등으로 서버가 요청을 수행할 수 없게 되는 경우이다. - 오류의 원인이 클라이언트에 있다. - 클라이언트가 이미 잘못된 요청을 했고 데이터를 보내고 있기 때문에 똑같은 재시도가 실패한다. 400 Bad Request - 요청 구문, 메시지 등에서 오류가 발생한 경우이다. - 클라이언트는 요청 내용을 다시 검토하고 보내야 한다. - 요청 파라미터가 잘못되거나, API 스펙이 맞지 않을 때 발생한다. 401 Unauthorized - 인증(Authentication) 되지 않는다. - 401 오류 발생 시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명한다. - 인증(Authentication) : 본인이 누구인지 확인한다 -> 로그인 - 인가(Authorization) : 권한부여(ADMIN 권한처럼 특정 리소스에 접근할 수 있는 권한, 인

[HTTP] 상태 코드 500, 503 [내부링크]

5xx (Server Error) - 서버 문제로 오류가 발생했을 때 발생하는 상태 코드 - 서버에 문제가 있기 때문에 재시도 하면 성공할 수도 있다.(복구가 되거나) - 절대로 발생해서는 안 되는 코드 500 Internal Server Error - 서버 내부 문제로 오류가 발생했을 때이다. - 애매하면 500 오류 갈겨버리자. 503 service Unavailable - 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없을 때 발생 - Retry-After 헤더 필드로 얼마 뒤에 복구되는지 보낼 수도 있다.

[Effective Java] try-finally보다는 try-with-resources를 사용하라 [내부링크]

try-finally보다는 try-with-resources를 사용하라 - 자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. - 자원 닫기는 놓치기 쉬워 예측할 수 없는 성능 문제로 이어진다. - 이런 자원들이 finalizer를 활용하고 있지만 finalizer는 안전하지 않다. - 보통 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class FirstLine { static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try{ return br.readLine(); } finally { br.c

[Effective Java] equals를 재정의하려거든 hashCode도 재정의하라 [내부링크]

equals를 재정의하려거든 hashCode도 재정의하라 - equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다. - 재정의하지 않으면 hashCode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킨다. - equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 HashCode는 똑같은 값을 반환해야 한다. -> hashCode 재정의를 잘못했을 때 크게 문제가 되는 조항은 2번째다. 즉 논리적으로 같은 객체는 같은 해시 코드를 반환해야 한다. Map<PhoneNumber,String> m = new HashMap<>(); m.put(new PhoneNumber(707,867,5309), "제니"); m.get(new PhoneNumber(707,867,5309)); - put을 한 뒤 get을 하면 "제니"가 아니라 'null'을 반환한다. - 여기에서는 new를 2

[서평] LINUX 처음 만나는 WSL - 개발자 및 IT 전문가를 위한 리눅스용 윈도우 하위 시스템 실무 안내서 [내부링크]

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다." 표지부터 귀여운 책이다. 책 자체가 다른 개발 서적에 비해서 굉장히 얇다. 200쪽도 안된다. 보통 기본서는 최소 300쪽 이상이라서 보기 부담스러운데 이 책은 얇아서 좋다. wsl 이란 WSL 이란, "리눅스용 윈도우 하위 시스템은 윈도우 10에서 네이티브로 리눅스 실행 파일을 실행하기 위한 호환성 계층이다". 즉 윈도우에서 리눅스를 사용할 수 있게 만든 것이다. wsl이 나오기 전까지 개발자들은 리눅스 기반의 데스크톱을 사용하거나 유닉스 터미널 환경에 가까운 맥 OS를 주로 사용했다. 하지만 WSL의 등장 이후 맥북을 사지 않아도 되고 기존의 컴퓨터의 OS를 재설치하는 시간과 수고 없이도 윈도우 OS에서 리눅스 터미널 환경을 이용할 수 있게 된다. 와우! 후기 WSL을 입문하고 싶은 사람에게 좋은 책이다. 이런 입문서에는 그림이나 사진이 중요한데 이 책은 중요한 개념들을 그림으로 보여주고 실습할 때는

게티 이미지 사진전 [내부링크]

3월 13일에 남씨랑 예술의 전당 한가람 미술관에서 진행 중인 게티 이미지 사진전 갔다 왔다 남씨가 블로그에 사진전 간 거 보고 나도 갈래라고 댓글 달았다가 바로 가자고 해서 갔다. 바람도 쐬고 오랜만에 문화생활해서 재밌었다. 고3 때 와보고 처음 와 본 예술의 전당 ㄷㄷ 고3이 벌써 1년 전이네 ㅠ 시간 빠르다. 게티 이미지 사진전 세상을 연결하다 포토존인 듯 네이버로 티켓 예약하고 가서 뽑았다. 입구로 들어가면 이렇게 사진에 gettyImages 찍을 수 있게 도와준다. 나는 강아지 있어서 이걸로 골랐다. 지금 보니 티켓에 있는 사진이네 조금 흔들렸네; 사진을 올려도 되나 싶어서 네이버에 쳐보니 사람들도 올리길래 나도 올린다. 사실 너무 오랜만의 문화생활이고 맨날 개발 쪽에만 관심 가지다 보니 처음엔 사진 봐도 감흥이 없었다. 그래서 이쁘고 재밌는 것만 찍었다ㅎㅋㅋㅋㅋㅋㅋㅋㅋㅋ 요거는 재밌는 건 아닌데 인상 깊어서 찍어봤다. 고등학생이 칼부림하는 사진이다. 맨날 인스타에서만 보던

[Effective Java] private 생성자나 열거 타입으로 싱글턴임을 보증하라. [내부링크]

private 생성자나 열거 타입으로 싱글턴임을 보증하라 - singleton 이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. - 함수와 같은 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트가 대표적인 예시이다. - 무상태란 상태를 공유하는 필드 변수가 없는 것을 의미한다. 특정 클라이언트가 의존할 수 있는 필드 변수가 존재하면 안 된다. 값을 변경할 수 없어야 하고 가능한 메서드를 이용한 값을 읽기만 할 수 있도록 한다. - 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어려워질 수 있다. -> 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 mock 구현으로 대체할 수 없기 때문이다. 싱글턴 만드는 방식 - 보통 두 가지 방식이다. - 두 방식 모두 생성자는 private로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련해둔다.

[Effective Java] 인스턴스화를 막으려거든 private 생성자를 사용하라. [내부링크]

인스턴스화를 막으려거든 private 생성자를 사용하라. - 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들고 사용할 때 -> Math, Arrays처럼 기본 타입 값이나 배열 관련 메서들 모아놓기 -> 특정 인터페이스를 구현하는 객체를 생성해 주는 정적 메서드 -> final 클래스와 관련한 메서드들을 모아놓을 때도 사용한다. - 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아니다 그렇기에 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만든다. 즉 public 생성자가 만들어진다. - 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. -> 하위 클래스로 인스턴스화하면 된다. - 컴파일러가 기본 생성자를 만드는 경우는 명시된 생성자가 없을 때뿐이다. 그렇기에 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. public class Practice { private Practice() { //인스턴스화 방지용

[Effective Java] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. [내부링크]

자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. - Dependency Injection 의존성 주입 관련 글 - 많은 클래스가 하나 이상의 자원에 의존한다. -> 자원은 무엇일까? - 맞춤법 검사기는 사전(dictionary)에 의존하는데, 이런 클래스를 정적 유틸리티 클래스로 구현하기도 한다. 정적 유틸리티 클래스란 - 객체 상태 정보가 없고, 즉 인스턴스 메서드와 인스턴스 변수를 제공하지 않는다. - 정적(static) 함수만을 제공하는 클래스이다. - 정적 유틸리티 클래스가 존재하는 이유는 java에서는 모든 함수가 클래스 내부에 있어야 하기 때문이다. - 비슷한 기능의 메서드와 상수를 모아서 캡슐화한 것이 유틸리티 클래스. import java.util.List; public class SpellChecker { private static final Lexicon dictionary; private SpellChecker(){} public static SpellCh

[Effective Java] 불필요한 객체 생성을 피하라 [내부링크]

불필요한 객체 생성을 피하라 - 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 낫다. - 불변 객체는 언제든 재사용할 수 있다. String s = new String("string"); - new을 이용해서 string 인스턴스를 생성하면 상수 영역을 참조하지 않고 매번 새로 만든다. - 이 문장이 계속 반복된다면 string 인스턴스가 계속 만들어지는 문제가 발생한다. String s = "string"; - new를 사용하지 않고 바로 할당하는 방식은 상수 영역에 저장을 하기에 상수 영역에 만들려는 문자열이 있다면 새로 만들지 않고 저장된 것을 그대로 가져온다. - 즉 같은 변수를 가리킨다. - 위 방식을 사용하면 같은 가상 머신 안에서 위와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다. - 생성자 대신 정적 팩토리 메서드를 제공하는 불변 클래스에서 정적 팩토리 메서드를 사용해 불필요한 객체 생성을 피할 수 있다. - >

[Effective Java] 다 쓴 객체 참조를 해제하라 [내부링크]

다 쓴 객체 참조를 해제하라. - 자바는 가비지 컬렉터를 갖추기에 다 쓴 객체를 알아서 회수해 준다. - 하지만 가바지 컬렉터를 사용한다고 해서 메모리 관리에 더 이상 신경 쓰지 않아도 된다고 생각하는 건 오해이다. - 스택 구현 코드 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } return elements[--size]; } pr

[Effective Java] finalizer와 cleaner 사용을 피하라. [내부링크]

finalizer와 cleaner 사용을 피하라. finalizer - 객체 소멸자이다. - 예측할 수 없고, 상황에 따라 위험할 수 있기에 일반적으로 불필요하다. - 자바 9부터는 deprecated 되어있다. cleaner - 객체 소멸자이다. - finalizer보단 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다. - finalizer와 cleaner는 c++의 파괴자와는 다른 개념 - 자바에서는 비메모리 자원 회수를 try-with-resources와 try-finally를 사용해서 해결한다. - finalizer와 cleaner로는 제 때 실행되어야 하는 작업은 절대 할 수 없다. - 예를 들어 시스템이 동시에 열수 있는 파일 개수에 한계가 있기에 파일 닫기를 finalizer와 cleaner에 맡기면 중대한 오류를 일으킨다. - 상태를 영구적으로 수정하는 작업에서는 절대 finalizer와 cleaner에 의존해서는 안된다. - finalizer와

[HTTP] GET, POST 메서드 [내부링크]

GET - GET은 리소스를 조회할 때 쓴다 - 서버에 전달하고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)을 통해서 전달 - 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많기에 권장하지 않는다. GET /search?q=hello&hl=ko HTTP/1.1 Host: www.google.com POST - POST는 요청 데이터를 처리할 때 쓴다. - 메시지 바디를 통해서 서버로 요청 데이터를 전달한다. - 서버는 요청 데이터를 처리한다. - 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행한다. - 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용한다. - 신규 리소스 식별자를 생성한다. -> 예를 들어 post를 통해서 회원가입을 하면 /members/100이라는 리소스 식별자 생성 POST /members HTTP/1.1 Content-Type: application/json { "username" : "hello",

[HTTP] PUT, PATCH, DELETE 메서드 [내부링크]

PUT - 리소스가 있으면 대체 - 리소스가 없으면 생성 모든 개발자를 위한 HTTP 웹 기본 지식 - 덮는 걸로 생각하면 된다. - 클라이언트가 리소스를 식별한다!!! 클라이언트가 리소스 위치를 알고 URI 지정 POST와의 차이점이다 -> POST는 클라이언트가 리소스 위치를 모른다. PUT /members/100 HTTP/1.1 Content-Type:application/json { "username" : "hello", "age" : 20 } PATCH - 리소스 부분 변경할 때 쓴다. PATCH /members/100 HTTP/1.1 Content-Type:application/json { "age" : 50 } DELETE - 리소스를 제거할 때 사용 DELETE /members/100 HTTP/1.1 Host: localhost:8080 출처 : 모든 개발자를 위한 HTTP 웹 기본 지식 인프런

[JPA] JPQL 조인 [내부링크]

내부 조인 - 교집합 외부 조인 - 합집합 세타 조인 - 연관관계가 없는 것들을 조인할 때 사용한다. 서브 쿼리 - 나이가 평균보다 많은 회원 - 한 건이라도 주문한 고객 서브 쿼리 지원 함수 - [NOT] EXISTS (Subquery) : 서브쿼리에 결과가 존재하면 참 - ALL | ANY | SOME - ALL : 모두 만족하면 참 - ANY, SOME : 같은 의미, 조건을 하나라도 만족하면 참 - NOT IN subquery : 서브 쿼리의 결과 중 하나라도 같은 것이 있으면 참 - 팀 A 소속인 회원 - 전체 상품 각각의 재고보다 주문량이 많은 주문들 - 어떤 팀이든 팀에 소속된 회원 JPA 서브 쿼리 한계 - JPA는 WHERE, HAVING 쩔에서만 서브 쿼리 사용 가능 - SELECT 절도 가능 - FROM 절의.......

[Clean Code] 챌린지 수료 [내부링크]

강의 듣다가 갑자기 생각나서 글 쓴다. 노마드 코더에서 진행한 노개북 2기 클린코드 수료했다. 맨날 읽어야지 읽어야지 했다가 때마침 클린코드로 노개북 하길래 신청했다. 8장 제외하고 1장 ~ 10장까지 읽었다. 클린코드에서 하지 말라는 건 내가 다 하고 있어서 재밌게 읽었다. 사실 모든 내용을 다 기억하지는 않지만 이제 개발할 때 틈틈히 클린코드 TIL 읽으면서 적용해보도록 해야겠다.

[Effective Java] 생성자 대신 정적 팩토리 메서드를 고려하라. [내부링크]

생성자 대신 정적 팩토리 메서드를 고려하라. - 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자 - 클래스는 생성자와 별도로 정적 팩토리 메서드 제공 가능 장점 1 : 이름을 가질 수 있다. - 생성자에 넘기는 매개변수와 생성자 자체만으로 반환될 객체의 특성을 제대로 설명하지 못한다. - 생성자를 이용해서 객체를 만들었는데 매개변수만 보고 어떤 객체가 반환될지 예측하기 어렵다. - 정적 팩토리 메서드를 사용하면 name과 age를 가지는 객체가 생성된다는 걸 쉽게 알 수 있다. - 생성자는 하나의 시그니처로는 생성자를 하나만 만들 수 있다. - 위와 같이 작성하면 오류가 발생한다. 생성자에서는 - 하지만 정적 팩토리 메서드.......

[Spring] Annotation 정리 [내부링크]

@ComponentScan - @Component와 @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean을 찾아서 Context에 bean 등록을 해준다. -@Component로 한 번에 처리할 수 있지만 각각에 맞게 쓰는 게 좋다. @AutoWired - field, settet, constructor에서 사용하며 Type에 따라 알아서 Bean을 주입 - 스프링이 자동적으로 값을 할당 - Controller 클래스에서 DAO나 Service에 관한 객체들을 주입 시킬 때 많이 사용 @Controller - Spring의 Controller를 의미한다. - API와 view를 동시에 사용하는 경우에 사용 - 대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체 반환 - view 리턴이 주목적 @RestController - Spri.......

[1년 전 오늘] [일상] 내가 이렇게까지 약속이 많았나 싶은 3월. 1년 약속 다 끝냈다! [내부링크]

1년 전의 3월 굉장히 재밌게 놀았구나,, 이번 연도 3월은 심심하구마~

[Effective Java] 생성자에 매개변수가 많다면 빌더를 고려하라. [내부링크]

생성자에 매개변수가 많다면 빌더를 고려하라. - 생성자가 별로인가 item 1은 생성자 대신에 정적 팩토리 메서드를 활용하라고 하고 - item 2는 매개변수가 많으면 빌더를 고려하라고 하네 - 그럼 생성자는 안 써야 되는 거 아닌가? 왜 있는 거지 - 정적 팩터리와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다. - 매개변수가 많을 때 프로그래머들은 점층적 생성자 패턴을 많이 사용했다. 이것은 필수 매개 변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개, 선택 매개변수 2개.. 등등 선택 매개변수를 전부 다 받는 생성자까지 늘려가는 방식 - 이렇게 클래스를 만들고 원하는 매개변수를 모두 포함한 생성자 중 가장 짧.......

[JPA] @MappedSuperClass [내부링크]

@MappedSuperClass - Entity에서 공통 매핑 정보가 필요할 때 사용한다. - Member와 Seller에 id와 name이 공통이기에 이걸 BaseEntity로 빼준다. - 상속관계 매핑이 아니다. - 엔티티도 아니고 테이블과 매핑되지 않는다. - 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공한다. - 조회, 검색 불가 - 직접 생성해서 사용할 일 없기에 추상 클래스 권장 - 테이블과 관계없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 한다. - 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용 - @Entity 클래스는 엔티티나 @MappedSuperClass로 지정한 클래스만 상속 가능하다. - Base.......

[JPA] 프록시 [내부링크]

프록시 - Member 엔티티를 조회할 때 불필요하게 team까지 조회를 계속하게 되면 DB 성능에 영향을 미치게 된다. - Member만 조회할 수 있게 JPA에서는 지연 로딩과 프록시라는 개념을 사용한다. em.getReference() - 지연 로딩을 이해하기 위해서는 프록시 개념을 제대로 이해해야 한다. - em.find()는 DB를 통해서 실제 엔티티 객체를 조회하는 메서드 -&#62; 즉 DB까지 직접 접근 - em.getReference()는 DB까지 접근하지 않고 프록시 엔티티 객체를 조회하는 메서드 - em.getReference()로 조회를 하면 실제로 필요한 시점에 데이터베이스에 쿼리가 나간다. - getClass()로 객체를 확인하면 HibernateProxy 객체이다. 프록시 특징 - 프록시는 실.......

[JPA] 즉시 로딩과 지연 로딩 [내부링크]

즉시 로딩과 지연 로딩 - 단순히 member 정보만 사용하는데 team의 정보까지 조회하면 비효율적이다. - JPA는 지연 로딩으로 프록시로 조회하는 방법으로 해결한다. - 메인 함수에 팀과 멤버를 저장하고 조회해 보면 - Team 객체의 클래스를 확인하면 Proxy 객체가 조회된다. - 팀의 이름과 같이 팀 객체의 조회가 필요한 시점에 쿼리가 나간다. 지연 로딩(LAZY) - 로딩될 때 Lazy로 설정되어 있는 Team 엔티티는 프록시 객체로 가져온다. - 실제 Team 객체를 사용할 때 초기화가 된다. -&#62; DB에 쿼리가 나간다. - getTeam()으로 Team을 조회하면 프록시 객체가 조회 - getTeam().get~()으로 팀이 가지고 있는 필드에 접근할 때 쿼리가 나간다.......

[JPA] 영속성 전이 : CASCADE [내부링크]

영속성 전이 : CASCADE - 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 CASCADE를 사용한다. - 즉 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하는 것이다. - 부모 엔티티가 삭제될 때 자식 엔티티도 삭제되는,, 영속성 전이 : 저장 주의사항 - 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없다. - 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함만 제공한다. 종류 고아 객체 - 고아 객체 제거 : 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제한다. - 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능 - 참조하는 곳이.......

[JPA] 값 타입, 임베디드 타입 [내부링크]

엔티티 타입 - @Entity로 정의하는 객체이다. - 데이터가 변해도 식별자로 지속해서 추적 가능하다. - 회원 엔티티의 키나 나이 값을 변경해도 인식 가능 값 타입 - int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 - 식별자가 없고 값만 있기에 변경 시 추적 불가 - 자바 기본 타입(int, doulbe) - 래퍼 클래스(Integer, Long) - String 기본 값 타입 - String, int - 생명주기를 엔티티에 의존 -&#62; 회원을 삭제하면 이름, 나이 필드도 함께 삭제 - 값 타입은 공유하면 안 된다. 임베디드 타입 - 새로운 값 타입을 직접 정의할 수 있다. - JPA는 임베디드 타입이라 한다. - 주로 기본 값 타입을 모아서 만들어서 복.......

[JPA] JPQL 기본 문법 [내부링크]

- update 문과 delete 문은 한 번에 업데이트하거나 삭제할 때 bulk 연산 - sql과 다른 부분은 Member가 Entity이다. - 별칭은 필수이다! TypeQuery, Query - TypeQuery는 반환 타입이 명확할 때 사용한다. - 위와 같이 query를 작성하면 Member.class에서 가져오니 반환 타입이 Member라는 게 명확하다. - 하지만 username은 string, age는 int이기에 반환 타입이 명확하지 않다. 이럴 땐 Query를 쓴다. 결과 조회 API - 결과가 여러 개 일 때는 getResultList() - 결과가 없으면 빈 리스트 반환하다. - 결과가 하나 일 때는 getSingleResult(); - 결과가 정확히 하나가 나와야 된다. - 결과가 없거나 둘 이상이면 오류가 뜬다. - 오류가 나면 s.......

[JPA] 프로젝션 [내부링크]

프로젝션 - SELECT 절에 조회할 대상을 지정하는 것 - 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입 가능) - Member를 가져오니 엔티티 프로젝션 - Member와 연관된 team entity를 가져오니 entity 프로젝션 - 하지만 이렇게 짜면 자체에서 join이 나가는데 sql과 비슷하게 써야 된다. - 이렇게 짜야 join이 되고 sql도 join이 된다는 걸 한 번에 파악할 수 있음. - 임베디드 타입 프로젝션 - 스칼라 타입 프로젝션 - result에 있는 member도 영속성 컨텍스트에서 관리가 된다. 개수 상관없이 프로젝션 - 여러 값 조회 - Object[] 타입으로 조회 - new 명령어로 조회 - 마치 생성자를 이용해서 만드는 느낌이 - 단순 값을.......

[1년 전 오늘] 이런 답장 싫어 [내부링크]

지금도 너무 싫다. 하지만 난 여전히 누구에게나 빠르게 해준다. 최대한 그냥 그런갑다 하면서 살려고 노력중이다

[Effective Java] clone 재정의는 주의해서 진행하라. [내부링크]

clone 재정의는 주의해서 진행하라. - 이번에는 clone 메서드를 잘 동작하게 구현하는 방법과 언제 그렇게 해야하는 지, 가능한 다른 선택지에 대해서 논의 - 메서드 하나 없는 Cloneable 인터페이스는 Object의 protected 메서드인 clone의 동작 방식을 결정한다. - cloneable을 구현한 클래스의 인스턴스에서 clone을 호출하면 그 객체의 필드들을 하나하나 복사한 객체를 반환하고, 그렇지 않은 클래스의 인스턴스에서 호출하면 CloneNotSuppotrtedException을 던진다. - 실무에서 Cloneable을 구현한 클래스는 clone 메서드를 public으로 제공하고, 사용자는 당연히 복제가 제대로 이뤄진다고 생각한다. clone 메서드 일반 규약 - 이 객체의.......

[JAVA] 람다식(Lambda expression) [내부링크]

람다식이란? - 람다식은 메서드를 하나의 식으로 표현한 것이다. - 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해준다. 와 같이 나타낼 수 있다. - 만일 람다식을 사용하지 않으면 메서드를 만들어야 된다. - 모든 메서드는 클래스에 포함되기에 클래스도 새로 만들어야 하고, 객체도 생성해야지만 메서드를 호출할 수 있다. - 람다식은 모든 과정 없이 오직 람다식 자체만으로도 메서드의 역할을 대신할 수 있다. - 람다식은 메서드의 매개변수로 전달되는 것이 가능하고, 메서드의 결과로 반환될 수도 있다. - 람다식을 익명 함수라고도 한다. 람다식 작성 - 람다식은 익명 함수이기에 메서드에서 이름과 반환 타입을 제거한다. - 매개.......

[JPA] 일대일(1:1) [내부링크]

일대일 - 일대일 관계는 그 반대도 일대일 - 주 테이블이나 대상 테이블 중에 외래 키 선택 가능 - 주 테이블에 외래 키, 대상 테이블에 외래 키 - 외래 키에 데이터베이스 유니크(UNI) 제약 조건 추가 코드 Locker와 member를 1 대 1로 만든다. Member에 Locker locker를 해주고 일대일이니 @OneToOne 을 쓰고 꼭 JoinColumn을 해줘야한다. 연관관계 주인 - 다대일 양방향 매핑처럼 외래 키가 있는 곳이 연관관계의 주인 - 반대편은 mappedBy 적용 대상 테이블에 외래 키 단방향 - 단방향 관계는 JPA 지원하지 않는다. - 양방향 관계는 지원 - 명확하게 일대일이면 이런 그림이 좋다. 일대일 정리 - 주테이블에 외래 키 1. 주 객체가 대상 객체.......

[JAVA] 스트림(stream) [내부링크]

스트림 - 스트림은 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의했다. - 데이터 소스를 추상화했다는 것은, 데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있게 되었다는 것과 코드의 재사용성이 높아진다는 것을 의미 - 문자열 배열과 같은 내용의 문자열을 저장하는 List가 있다 - List를 정렬할 때는 Collection.sort()을 사용해야 하고 배열을 정렬할 때는 Arrays.sort()를 사용해야한다. - stream으로 변환하면 정렬하고 출력하는 방법은 동일하게 바뀐다. - 스트림은 데이터 소스를 변경하지 않는다. - 데이터 소스로 부터 데이터를 읽기만할 뿐, 데이터 소스를 변경하지 않는다는 차이가 있다. - 필.......

[JPA] 다대다 [N:M] [내부링크]

다대다 - 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다. - 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야함 - 물론 ManyToMany 이용하면 할 수 있다. - @JoinTable로 연결 테이블 지정한다. 단점 - 추가 정보를 넣을 수가 없음 - 중간 테이블이 숨겨져 있음 - 실무에서는 사용하지 않는다. 다대다 한계 극복 - 연결 테이블용 엔티티 추가 - @ManyToMany -&#62; @OneToMany, @ManyToOne - ORDER의 PK는 의미 없는 값으로 하는 게 나중에 좋다. 출처 : 자바 ORM 표준 JPA 프로그래밍 강의 김영한

[JPA] 상속 관계 매핑 [내부링크]

상속관계 매핑 - 위와 같이 코드를 만들고 실행하면 기본적으로 단일 테이블 전략으로 만들어진다. - 부모 클래스인 Item에 자식 클래스 3개의 속성이 들어간다. Join 전략 - Join 전략을 사용하면 단일 테이블 말고 Join 할 수 있는 테이블로 만들 수 있다. - 위의 사진처럼 - 부모 클래스에 위 코드를 사용하면 item에 DTYPE이 들어간다. -&#62; entity 명이 들어간다. - 자식 클래스에 DiscriminatorValue를 사용하면 부모 테이블의 DTYPE에 기록된 자식 클래스의 이름을 바꿀 수 있다. - 장점 1. 테이블 정규화 2. 외래 키 참조 무결성 제약조건 활용 가능 3. 저장 공간 효율화 - 단점 1. 조회 시 조인을 많이 사용, 성능 저하 2. 조회 쿼리가.......

이럴수가 [내부링크]

캡스톤 미팅 끝나고 캡스톤같이 하는 사람이랑 동아리 박람회 한 번 걸어봤는데 단 한 명도 말을 걸어주지 않는다ㅠ 말 딱 2명 걸어줬는데 공군 ROTC랑 육군 ROTC ㅠ 흑! 22학번 과잠이라도 입고 갈 걸

[JPA] 기본 키 매핑 @Id [내부링크]

@Id - 직접 할당 때 사용 @GeneratedValue - IDENTITY : 데이터베이스에 위임, MYSQL - SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE @SequenceGenerator 필요 - TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용 @TableGenerator 사용 - AUTO : DB에 따라 자동 지정, 기본 값 IDENTITY 전략 - 특징 - 기본 키 생성을 데이터베이스에 위임 - MySQL, PostgreSQL, SQL Server, DB2에서 사용 (ex : MySQL의 AUTO_INCREMENT) - JPA는 트랜잭션 커밋 시점에 INSERT SQL 실행 - AUTO_INCREMENT는 데이터베이스 INSERT SQL을 실행한 이후에 ID 값을 알 수 있음 - IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별.......

[JPA] 단방향, 양방향 연관관계, ManyToOne, OneToMany, JoinColumn, mappedBy [내부링크]

객체를 테이블에 맞추어 모델링 - 연관관계가 없는 객체이다. 참조 대신에 외래 키를 그대로 사용해서 코드를 짠다. Member에 Long teamId를 그대로 가지고 있다. member에 teamId를 저장하려면 team을 저장하고 team에서 getId를 한 뒤에 setTeamId를 해야 된다. 뭔가 객체지향에 어긋난 느낌 - 이렇게 객체를 테이블에 맞추어 데이터 중심으로 모델링 하면, 협력 관계를 만들 수 없다. - 테이블은 외래 키를 조인을 사용해서 연관된 테이블을 찾는다. - 객체는 참조를 사용해서 연관된 객체를 찾는다. - 테이블과 객체 사이에는 이런 큰 간격이 있다. 단방향 연관관계, 객체 지향 모델링 - Member(N) -&#62; Team(1) 일대다 관계 - 객체 지향 모.......

[JPA] 양방향 연관관계 주의사항 [내부링크]

@OneToMany(mappedBy &#x3D; &#34;team&#34;) 으로 설정되어 있기에 읽기 전용이다. member가 N 대 1이에서 N이므로 주인이기에 주인에게 팀을 넣어준다. - TEAM_ID가 null에서 1로 바뀌었다. 하지만 양방향 관계일 때는 양쪽에 값을 넣어주는 것이 좋다. - 양쪽에 다 넣어주면 번거롭기도 하니 한 줄로 바꿀 수 있게 entity의 set Method를 바꾸자 - 양방향 매핑시에 무한 루프 조심 - toString(), lombok, JSON 생성 라이브러리 - controller에는 entitiy를 절대로 반환하지마라! - controller에서는 dto로 변환해서 반환하자. 양방향 매핑 정리 - 단반향 매핑만으로도 이미 연관관계 매핑은 완료 -. 처음에 단방향으로 끝내야됨 - 양방향 매.......

[JPA] 다대일[N:1] [내부링크]

다대일[N:1] - 제일 많이 쓴다. - &#x27;다(N)&#x27; 쪽에 외래키(FK)를 넣어줘야됨 - 연관관계의 주인이 &#x27;다&#x27; 다대일 단방향 - &#x27;다&#x27;쪽에 @ManyToOne과 @JoinColumn 이용 다대일 양방향 - 외래키가 있는 쪽(N)이 연관 관계의 주인이다. - 양쪽을 서로 참조하도록 개발 - (1)쪽에 @OneToMany를 이용한다. - (1)쪽에서는 읽기만 가능하다. 출처 : 자바 ORM 표준 JPA 프로그래밍 김영한 강의

[HTTP] 웹 브라우저 요청 흐름 [내부링크]

1. resource 요청 시, 웹 브라우저가 http 메시지 생성 2. socket 라이브러리를 통해 TCP/IP로 3way handshake를 실행해서 ack를 받으면 서버와 연결 3. 운영체제 TCP/IP 계층으로 데이터 전송을 하기 위해 데이터를 전달한다. 4. http 메시지가 포함된 tcp/ip 패킷을 생성한다. 5. 패킷 정보가 인터넷으로 전송 6. 서버에 요청 패킷이 도착하여 http 메시지를 서버가 해석 7. http 응답 메시지를 마찬가지 방식으로 패킷을 생성해서 응답 패킷을 전달한다. 8. 응답 패킷이 도착하게 되면 웹 브라우저가 html 렌더링 하여 화면에 보여준다.

[JPA] @Id, @Column, @Enumerated, @Temporal, @Lob, @Transient [내부링크]

@Column - unique는 잘 안씀, 이름을 반영하기 어렵고, @Table에서 unique 사용 @Enumerated - 자바 enum 타입을 매핑할 때 사용 - ORDINAL 사용하지 말자!! @Temporal - 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용 - LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원) @Lob - 데이터베이스 BLOB, CLOB 타입과 매핑 - @Lob에는 지정할 수 있는 속성이 없다. - 매핑하는 필드 타입이 문자면 CLOB 매핑 - String, char[], java.sql.CLOB - 나머지는 BLOB 매핑 - byte[], java.sql.BLOB @Transient - 필드 매핑하지 않는다 - 데이터베이스에 저장하지 않고 조회도 안된다. - 주로 메모리상에서만 임.......

[JPA] 데이터베이스 스키마 자동 생성 hibernate.hbm2ddl.auto [내부링크]

옵션 주의점 - 운영 시에는 절대 create, create-drop, update 사용하면 안된다. - 개발 초기 단계는 create 또는 update - 테스트 서버는 update 또는 validate - 스테이징과 운영 서버는 validate 또는 none - 직접 적용하는 걸 권장 - 로컬에서만 사용하고 여러 명이서 사용할 때는 권장하지 않음 DDL 생성 기능 - DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다. 출처 : 자바 ORM 표준 JPA 프로그래밍 - 김영한

[JAVA] 열거형 enums [내부링크]

Enum - JAVA의 Enum은 열거형이 갖는 값뿐만 아니라 타입까지 관리한다. - 자바에서는 타입에 안전한 열거형으로 실제 값이 같아도 타입이 다르면 조건식의 결과가 false다. - 열거형 상수를 사용하면 기존의 소스를 다시 컴파일 하지 않아도 된다. 사용 - 열거형을 정의하는 방법은 enum을 쓰고 enum 명을 쓰고 {} 안에 상수의 이름을 나열하면 된다. - 열거형에 정의된 상수를 사용하는 방법은 &#x27;열거형이름.상수명&#x27;이다 - 클래스의 static 변수를 참조하는 것과 같다. - 열겨형 상수간의 비교에는 &#x27;&#x3D;&#x3D;&#x27;를 사용할 수 있다. - &#x27;&#62;&#x27;, &#x27;&#60;&#x27;와 같은 비교연산자는 사용할 수 없고 compareTo().......

[JPA] @Entity, @Table [내부링크]

@Entity - @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다. - JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 * 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) * final 클래스, enum, interface, inner 클래스로는 Entity로 매핑할 수 없다 * 저장할 필드에 final 사용하면 안된다. name - JPA에서 사용할 엔티티 이름을 지정한다. - 기본값 : 클래스 이름을 그대로 사용 - 같은 클래스 이름이 없으면 가급적 기본값을 사용 Table @Table은 엔티티와 매핑할 테이블 지정 출처 : 자바 ORM 표준 JPA 프로그래밍 - 김영한

문해력 [내부링크]

https://www.youtube.com/watch?v&#x3D;uZJGya0XBe8 노마드코더 slack 채널 보다가 발견해서 본 유튜브 영상을 보고 가장 먼저 했던 생각은 &#34;내 중고등학교 시절에 유튜브가 활성화 되지 않았다는데 정말 다행이다&#34;였다. 요즘 세대는 모든 정보를 영상으로 얻어서 그런지 문해력이 굉장히 부족한 것 같다. 학창 시절에 그래도 나름 국어 공부 열심히하고 모르는 단어도 다 찾아가면서도 공부하고 성인 돼서도 책을 읽고 있는 내가 뿌듯하게 느껴진다. 물론 나도 문해력이 엄청 좋지는 않으니,, 신문도 다시 읽어보고 책도 꾸준히 읽어보고 시간 되면 한문 공부도 해봐야겠다.

[JAVA] 제너릭스(Generics) [내부링크]

제너릭스 - 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능 - 객체의 타입을 컴파일 시에 체크하기에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다. - 타입의 안정성을 제공해 주고 타입 체크와 형변환을 생략할 수 있기에 코드가 간결해진다. 제너릭 클래스 선언 - 타입 변수를 사용하면 된다. T는 Type의 첫 글자에서 따왔고 T가 아닌 다른 것을 사용해도 무방하다. - 타입 변수가 여러 개인 경우에는 Map&#60;K, V&#62;와 같이 콤마를 구분자로 나열하면 된다. - 기호의 종류만 다를 뿐 임의의 참조형 타입을 의미한다는 것은 모두 같다. 용어 - Box&#60;T&#62; : 제너릭 클래스. &#.......

[Clean Code] TIL 10장 클래스 [내부링크]

TIL (Today I Learned) 2022년 03월 08일 오늘 읽은 범위 10장 클래스 책에서 기억하고 싶은 내용을 써보세요. 1. 클래스 체계 - static 공개 상수 -&#62; 정적 비공개 상수 -&#62; 정적 비공개 변수 -&#62; 비공개 인스턴스 변수 -&#62; 공개 함수 -&#62; 비공개 함수는 자신을 호출하는 공개 함수 직후, 추상화 단계가 순차적으로 내려감 2. 클래스는 작아야 한다. - 클래스는 작아야 한다!!!!!!!!!!!!!!!!!! - 클래스는 맡은 책임을 센다. - 클래스 이름은 해당 클래스 책임을 기술해야 한다. - 작명은 클래스 크기를 줄이는 첫 번째 관문 - 클래스 설명은 if, and, or, but을 사용하지 않고 25단어 내외로 가능 SRP(Single Responsibility Pricipl.......

[Clean Code] TIL 9장 단위 테스트 [내부링크]

TIL (Today I Learned) 2022년 3월 05일 오늘 읽은 범위 9장 단위 테스트 책에서 기억하고 싶은 내용을 써보세요. 1. TDD 법칙 세 가지 첫째 법칙 : 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 둘째 법칙 : 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 셋째 법칙 : 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 2. 깨끗한 테스트 코드 유지하기 - 테스트 코드는 실제 코드 못지않게 중요하다.. 테스크 코드는 사고와 설계와 주의가 필요하다. 테스트는 유연성, 유지 보수성, 재사용성을 제공한다. - 코드에 유연성, 유지 보수성, 재사용성을 제공하는 버팀목이 바.......

충전 [내부링크]

2022년 2월 9일 ~ 2022년 2월 11일의 기록 1년 만에 다시 온 서울역.. 여기 올 때부터 설렌다. 희재랑 만나자마자 돈까스 냠냠했다. 밥 먹고 좀 쉬다가 바로 KTX 타고.. 오대산 역으로.. 우리 친구들 오랜만^^! 크.. 이번 학회 숙소다. 방 2개에 화장실 2개.. 거실에 TV까지 완벽 그 자체.. 보온까지 완벽해서.. 따뜻하다 못해 더운.. 하.. 또 가고 싶다 이번 학회는 알펜시아 스키장에서 열렸다. 아.. 글을 쓰면서도 감동적이네 진짜.. 또 가고 싶어 1년 만에 스키장을 봤을 때의 그 기분이란 한국통신학회 hello~ 들어가서 이름표랑 사은품 받았다 이름표 사진 찍기는 국룰이죠. 저기 노란색 박스가 사은품이다. 카카오 우산이다 요거다 등록하.......

[프로그래머스] 우유와 요거트가 담긴 장바구니 [내부링크]

SUBQUERY NAME이 YOGURT에 속하는 CART_ID와 NAME이 MILK인 ID를 동시에 뽑음 JOIN 셀프 조인을 통해서도 가능하다.

[프로그래머스] 보호소에서 중성화한 동물 sql [내부링크]

JOIN문 이용해서 하면 된다. 중성화 여부가 다르다는건 들어올 때의 중성화 여부와 나갈 때의 중성화 여부가 다른 것이라고 생각해서 WHERE에 중성화 여부가 다른 걸 넣어줬다.

[백준] 13913번 숨바꼭질 4 c++ [내부링크]

숨바꼭질 응용 문제 최단 거리를 갱신할 때 전에 어디서 왔는 지를 넣어주기 위해서 trace 배열을 만들어줬다. trace[nx] &#x3D; cur은 nx에 오기 전에 cur에 왔다는 의미이다. bfs를 돌다가 동생의 위치에 도달하면 최단 거리를 출력해주고 trace[nx]을 탐색하면서 경로를 vector에 넣어준다. 그리고 vector에 있는 값을 출력해준다.

[백준] 1647번 도시 분할 계획 c++ [내부링크]

최소 스패닝 트리 복습과 class 5 취득을 위해서 푼 문제 우연히 아이디어를 얻게 돼서 풀었다. 일단 마을을 두 부분으로 나눠야되고 그 마을을 이루는 길의 합도 최솟값을 가져야한다. 그래서 먼저 마을 전체에 대해서 최소 스패닝 트리를 그려보았다. 이 상태로 두 부분으로 나누면 원래 전체가 최소 이기에 나눠진 두 개도 최소라고 생각했다. 그럼 마을을 나누기 위해서 길 하나를 없애야 되는데 두 마을이 최솟값을 가지기 위해서는 가장 큰 값을 가지는 길을 없애주면된다. 최소 스패닝 트리를 만들고 길 한 개만 없애주면 딱 두 부분으로 나눠지기에 가장 큰 값을 없애주면 된다. 그래서 간선의 개수가 N - 1개가 되었을 때 가장 마지막에.......

[Clean Code] TIL 7장 오류 처리 [내부링크]

TIL (Today I Learned) 2022년 3월 03일 오늘 읽은 범위 7장 오류 처리 책에서 기억하고 싶은 내용을 써보세요. 1. 오류 코드보다 예외를 사용하라 - 오류가 발생하면 예외를 던지는 편이 낫다. 2. Try-catch-Finally 문부터 작성하라 - try 블록에 들어가는 코드를 실행하면 어느 시점에서든 실행이 중단된 후 catch 블록으로 넘어갈 수 있다. - try 블록에서 무슨 일이 생기든 catch 블록은 프로그램 상태를 일관성 있게 유지하기에 try 문을 사용하는 게 낫다. 3. unchecked 예외를 사용하라 - 확인된 예외가 반드시 필요하지 않다는 사실이 분명해짐 - 확인된 예외는 Open Closed Principle(OCP)를 위반한다. 메서드에서 확인된 예외를 던졌.......

[백준] 17404번 RGB 거리 2 c++ [내부링크]

RGB 거리에서 원형이 추가된 문제 모든 경우의 수를 생각하려면 너무 복잡하기에 처음에 칠 할 색깔을 R, G, B로 고정시키고 DP를 돌리면 된다. 즉 처음을 빨강으로 고정시키고 DP를 돌리고 다 돌리고 난 뒤에 맨 마지막 색깔이 빨강인 건 제외하고 파랑과 노랑에서 최솟값을 구한다. 먼저 first 변수를 통해서 R, G, B를 고정시킬 수 있게 한다. 바로 밑에 있는 for 문을 통해서 색깔을 고정시킬 수 있게 한다. 여기서 i가 의미하는 건 첫 번째 집에 어떤 색깔을 칠할지를 정하는 것이다. i &#x3D;&#x3D; first 이면 첫 번째 집을 first가 의미하는 색깔로 칠한다는 것이기에 dp[0][i] &#x3D; board[0][i]로 해준다. i !&#x3D; first 이면 i + 1.......

[백준] 20040번 사이클 게임 c++ [내부링크]

처음에 너무 어렵게 생각했다. 그냥 정말 사이클만 찾아주면 되기에 union - find 이용하면 된다. 유니온 파인드를 merge 할 때 true가 나오게 되면 같은 집합에 있다는 것이기에 사이클이 만들어진다는 것이다. 크루스칼 알고리즘 생각하면 될 것 같다. 그래서 for 문 돌면서 유니온 파인드 true 나오는 지점에서 출력하면 된다. 만일 true가 한 번도 안 나오면 마지막에 0을 출력해주면 된다.

[백준] 2473번 세 용액 c++ [내부링크]

투포인터 응용인 3SUM을 이용한다. 인덱스를 3개 만든다. i, j, k (i &#60; j &#60; k)이다. i를 고정시키고 j와 k로 투포인터를 하면 된다. 세 개를 더해서 값이 0 이면 바로 리턴해주고 값이 0보다 크면 최솟값을 구할 answer을 절댓값을 취한 세 개의 합과 더 해준다. 0과 가까운 값을 구하기 위해서 절댓값으로 비교를 한다. 그리고 가장 마지막 인덱스를 k-- 해준다. 일단 배열이 오름차순으로 정렬되어 있기에 뒤로 갈수록 커지니까 값을 뒤에서 줄어야 값이 줄어든다. 값이 0보다 작으면 위의 경우와 마찬가지로 절댓값 비교 후 갱신해 주고 j++를 해준다.

Solved.ac Class 5 취득 [내부링크]

최근에 백준을 다시 열심히 풀고 있다. solved.ac 가서 학교 랭킹 봤는데 아니 내 주변으로는 다 클래스 5 이상이라서 나 혼자 4인 거는 좀 그래서 클래스 5 도전했다. 보니까 6문제만 남아서 빨리 해치웠다. 다행히 어렵지 않게 풀었다. 클래스 4가 150점이고 클래스가 5가 200점이어서 50점 더 얻어서 P4로도 승급했다. 학교 랭킹도 올랐네.. 클래스 6은 딸 생각이 1도 없다. 클래스 6부터는 아예 코테를 벗어나서 대회용 알고리즘 느낌이라 굳이 하고 싶지 않다. 기존에 있는 것도 잘 못하면서 대회 알고리즘을 하는건 시간 낭비라는 걸 뼈저리게 깨달아서 대회 알고리즘에 대한 관심은 옛날에 사라져버렸다. 이제는 코테 이상으로는 안 할 거.......

[백준] 17835번 면접 보는 승범이네 c++ [내부링크]

요런 스타일의 문제는 또 처음 보네 새로운 관점을 배웁니다. 가장 먼저 생각한 건 각 정점들에 대해서 다익스트라를 돌리고 면접장들에 대한 거리를 일일이 구해주는 것 이렇게 되면 당연히 시간 초과가 난다. 그럼 생각한 게 면접장들에서 각 지점으로 가는 건 어떨까를 생각했다. 그래서 역방향 그래프를 만들어준다. 역 그래프에서 d 배열이 의미하는 건 면접장에서 지원자들의 위치까지의 최단거리이다. 또한 역 그래프에서 돌린 다익스트라로 원본 그래프의 모든 노드에서 특정 노드 x까지의 최단 경로를 구할 수 있다. 또한 다익스트라를 하기 전에 q에 면접장을 다 넣어주고 시작한다. 이 문제를 풀기 전까지 다익스트라 알고리즘의 시작.......

[백준] 2467번 두 용액 c++ [내부링크]

2470번 용액이랑 똑같은 문제네 투 포인터 복습할 겸 다시 풀어보았다. s &#x3D; 0, e &#x3D; N-1로 포인터를 잡고 투포인터를 해본다. 당연히 둘의 합이 0이면 바로 출력을 해주면 되고 그게 아니면 계속 더 해보면서 절댓갑의 최솟값을 계속 구해본다. 절댓값을 안 하면 0에서 멀어질수도 있기에 최솟값이 갱신이 되면 그 값으로 answer을 바꿔주고 그 인덱스를 first와 second에 저장해준다. 투 포인터가 다 끝나면 first와 second를 출력한다.

[JAVA] 메서드에 예외 선언하기, finally [내부링크]

throws - 메서드의 선언부에 키워드 throws를 사용해서 메서드내에서 발생할 수 있는 예외를 적어주면 된다. - 예외가 여러 개일 경우에는 쉼표로 구분한다. - 메서드의 선언부에 예외를 선언함으로써 이 메서드를 사용하기 위해서 어떠한 예외 처리가 되어져야 하는 지 알 수 있다. - 메서드에 예외를 선언할 때 일반적으로 RuntimeException 클래스들은 적지 않는다. - 메서드의 throws를 명시하는 것은 예외를 처리하는 것이 아니라, 자신을 호출한 메서드에게 예외를 전달하여 예외처리를 맡기는 것이다. - 예외가 발생한 메서드에서 예외처리를 하지 않고 자신을 호출한 메서드에게 예외를 넘겨줄 수는 있지만 예외가 처리된 것은 아니고 예.......

[프로그래머스] 있었는데요 없었습니다 sql [내부링크]

left join을 활용한 문제 보호 시작일을 기준으로 하기에 왼쪽에 in table을 둔다. on으로 아이디가 같은 걸로 해서 where로 보호시작일 보다 입양일이 더 빠른 걸 찾을 수 있게 한다. left outer join과 left join은 똑같다고 한다.

[프로그래머스] 오랜 기간 보호한 동물(1) sql [내부링크]

LEFT OUTER JOIN 이용 보호소에 있는 동물이니 왼쪽에 ANIMAL_INS를 둔다. on은 아이디를 두고 이제 where에서 왼쪽 테이블과 오른쪽 테이블을 합칠 때 왼쪽 테이블에 없는 값이면 오른쪽 테이블에는 NULL 값이 되므로 outs.animal_id is NULL로 한다. 그리고 3개만 출력해야 되니 LIMIT 3

[프로그래머스] 오랜 기간 보호한 동물 2 sql [내부링크]

왼쪽에 INS table로 잡았다. on에 id를 넣어주고 table을 조인할 때 입양을 간 동물은 NULL 값이 아니고 입양을 가지 않은 동물은 NULL 값이기에 where OUTS.ANIMAL_ID IS NOT NULL을 넣어줬다. 보호기간이 가장 긴 건 입양 날짜에서 보호소 들어온 날짜를 오름차순 정렬해 주고 LIMIT 2 해서 2개만 출력한다.

[프로그래머스] 헤비 유저가 저장한 장소 sql [내부링크]

서브 쿼리를 이용한다. 를 이용하면 HOST_ID를 그룹으로 묶은 다음에 2개 이상 나오는 걸 찾을 수 있다. 이걸 서브 쿼리에 넣어준 뒤 WHERE IN 하게 되면 조건을 만족하는 쿼리를 찾을 수 있다.

[백준] 14938번 서강그라운드 c++ [내부링크]

플로이드 와샬 알고리즘 문제 플로이드 알고리즘으로 각 정점들간의 최단거리를 구해주고 다시 이중 for 문을 돌면서 예은이가 갈 수 있는 거리와 비교를 해서 그 거리와 짧으면 물건의 개수를 더해준다.

[백준] 21940번 가운데에서 만나기 c++ [내부링크]

알고리즘 할 때 정말 국어 실력도 중요한 것 같다. 문제가 이해가 안 됐다. 준형이와 친구들의 왕복 시간 들 중 최대가 최소가 되는 도시 X를 선택한다. 어우 어려워 나는 한 점을 잡고 그 점에서 친구들과의 모든 왕복 시간의 합인 줄 알았다. 근데 한 점과 친구들 각각의 왕복 시간의 최댓값을 구해서 거기서 최솟값을 구하는 것이다. 어렵다. 문제 자체는 플로이드 와샬 알고리즘 쓰면 된다. 문제에 주어진 정보로 플로이드 돌려서 최단거리를 구해주고 모든 점들을 도시 X로 잡고 왕복 거리를 구하면서 최솟값을 구하면 된다.

[백준] 1238번 파티 c++ [내부링크]

다익스트라 활용 문제 다익스트라 2번 돌리면 된다. for 문을 돌면서 한 정점으로부터의 모든 정점들까지의 최소 거리를 구해주고 거기서 X까지의 거리를 구해준다. 이게 한 점에서 X까지 가는 거리 그리고 왕복해야 되니 X에서 다시 한 점으로 가는 것도 구해준다. 그래서 다익스트라 2번 돌린다. 처음에는 한 점에서 X까지 가는 거리 * 2로 했다가 생각해 보니 단 방향 그래프이기에 X에서 한 점으로 돌아가는 최소 거리는 또 다를 수도 있다고 생각해서 시작점을 X 해서 다익스트라 돌렸다. 두 번 돌려서 나온 거리를 합치면 된다.

[백준] 1504번 특정한 최단 경로 c++ [내부링크]

흠 너무 어렵게 생각해서 못 풀고 있었다. 일단 1 -&#62; v1 -&#62; v2 -&#62; N 과 1 -&#62; v2 -&#62; v1 -&#62; N의 경로를 구해서 둘 중 더 짧은 걸 구해주면 된다. 이때 경로의 총합이 MAX보다 크면 경로가 없다는 의미기이게 -1 출력 근데 여기서 당연히 1 -&#62; v1 -&#62; v2 -&#62; N가 최단 경로인데 다른 곳을 거쳐 가는 게 최다 경로면 어떡하지 이 생각을 했다. 생각해 보면 다른 곳 거쳐서 v1 v2 지나면 그만큼 더 가니 최단 경로가 아니다. 즉 2가지 경우만 구해주면 된다. 다 엑스트라를 3번 돌렸다. 1번 정점을 기준으로 다익스트라를 돌리면 1 -&#62; v1, 1 -&#62; v2 구할 수 있다. v1 정점을 기준으로 다익스트라를 돌리면 v1 -&#62; v2,.......

[백준] 1261번 알고스팟 c++ [내부링크]

풀이 1 3차원 배열 BFS 이용 check[x][y][z]를 만들어서 x, y까지 오는데 z 개의 벽을 부쉈다를 저장한다. BFS를 돌면서 벽이 아니면 그대로 가면 되고 벽이면 nx, ny, nz + 1을 갔는지 확인하고 안 갔으면 간 다음에 nx, ny, nz + 1을 큐에 넣어준다. N, M까지 오는 경로가 여러 개 있을 수 있기에 N - 1, M - 1 도달하면 계속 값을 갱신해 준다. 풀이 2 가중치를 0과 1로 보고 다익스트라 이용해서 풀 수 있다. 정해는 다익스트라 같다. BFS랑 시간 차이가 너무 많이 난다. 2차원 배열 d를 만드는데 이건 x, y까지 가는데 d[x][y] 개의 벽을 부쉈다는 의미이다. 먼저 벽이 아닌 곳을 가면 d[nx][ny] &#x3D; d[x][y]를 해준다. 어차피 벽을 부수.......

[프로그래머스] DATETIME에서 DATE로 형변환 sql [내부링크]

DATE_FORMAT을 이용해서 DATETIME을 바꿀 수 있다.

[백준] 2295번 세 수의 합 c++ [내부링크]

시간초과 이유 무지성 N^3 for문 돌리면서 이분 탐색 N^3Log2N 당연히 안된다. N^2Log2N으로 줄일 수 있다. 먼저 이중 for문으로 배열의 값들을 다 더해서 넣어준다. 그러면 세 개의 수 중 2개의 수는 더 한게 되고 이걸 정렬을 한 번 해준다. 다시 v 배열을 이중 for문 돌면서 가장 마지막 인덱스부터와 가장 처음 인덱스부터 돌면서 그 값을 빼준 게 two vector에 있는 지 본다 two + v[i] &#x3D; v[j] 이기에 two &#x3D; v[j] - v[i] 로 생각할 수 있기에 가능하다. 이 값이 있으면 최댓값을 갱신해준다.

[1년 전 오늘] 플래티넘 [내부링크]

그렇게 21년 9월에 다이아를 간다던 나는.. 여전히 플래5이다..

[백준] 18869번 멀티버스 Ⅱ c++ [내부링크]

이렇게 또 한 번 문제 푸는 시야에 대해서 배웁니다. 값 그 자체로만 보면 어려운데 이걸 인덱스로 보는 순간 쉬워진다. 문제의 첫 번째 예시를 보면 1 3 2 12 50 31 일단 1 3 2 이건 1번 인덱스 &#60; 2번 인덱스, 2번 인덱스 &#62; 3번 인덱스, 1번 인덱스 &#60; 3번 인덱스 12 50 31 이건 1번 인덱스 &#60; 2번 인덱스, 2번 인덱스 &#62; 3번 인덱스, 1번 인덱스 &#60; 3번 인덱스 로 볼 수 있다. 값은 달라도 둘이 똑같은 형식(?)을 가지고 있다. 그럼 둘을 똑같은 형식으로 만들어줘서 비교만 하면 된다. 이를 위해서 좌표 압축을 해서 다 인덱스로 바꿔준다. 좌표 압축 뒤 이중 for 문 돌면서 벡터가 같은 지 확인하면 된다.

[JAVA] 예외처리(exception handling) [내부링크]

프로그램 오류 - 에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 메모리 부족, 스택오버플로우 - 예외 : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류 예외 클래스는 두 개의 그룹으로 나눌 수 있다. - RuntimeExceptionClass와 그 자손클래스 - Exception 클래스와 그 자손클래스 - RuntimeExceptionClass는 프로그래머의 실수로 발생하는 예외 - Exception클래스는 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 try-catch - 프로그램의 실행도중에 발생하는 에러는 어쩔 수 없지만, 예외는 프로그래머가 이에 대한 처리를 미리 해주어야한다. 예외처리 - 정의 : 프로그램 실행 시 발생할 수 있는 예외의 발.......

[Clean Code] TIL 6장 객체와 자료 구조 [내부링크]

TIL (Today I Learned) 2022년 3월 01일 오늘 읽은 범위 6장 객체와 자료 구조 책에서 기억하고 싶은 내용을 써보세요. 1. 자료 추상화 - 직교 좌표계 사용 - 개별적으로 좌표값을 읽고 설정하게 강제 - 구현을 노출 - 변수는 private이지만 get(), set() 함수를 제공하면 구현을 외부로 노출 - 위의 코드는 직교좌표계인지, 극 좌표계인지 모른다. - 인터페이스는 자료 구조를 명백하게 표현한다. - 클래스 메서드가 접근 정책을 강제한다. - 좌표를 읽을 때는 각 값을 개별적으로 읽어야 한다. - 하지만 좌표를 설정할 때는 두 값을 한꺼번에 설정 - 변수 사이에 함수라는 계층을 넣어도 구현이 저절로 감춰지지는 않는다. - 구현을 감추려면 추.......

[백준] 3151번 합이 0 cpp [내부링크]

최대 10000 C 3이기에 int형을 초과한다. 아무리 봐도 맞는 데 자꾸 틀렸다고 떠서 다시 보니 int cnt &#x3D; 0; 으로 해서 틀리고 있었다. 문제를 보고 가장 먼저 떠오르는 풀이는 당연히 3중 for 문을 활용한 방법 하지만 N이 최대 10000이기에 당연히 안된다. 이분 탐색을 활용하면 N^2lonN으로 줄일 수 있다. 간단하게 설명하면 먼저 이중 for 문을 돌면서 두 개의 합을 구한다. 이때 a + b + c &#x3D; 0이고 a + b &#x3D; - c이기에 음수로 바꿔줘야 원하는 값을 구할 수 있다. upper_bound와 lower_bound를 사용한 이유는 예시를 들어서 설명하면 먼저 입력값을 받고 정렬한다. 위와 같이 입력 값을 정렬했을 때 첫 번째 2개의 0을 골랐다.......

20대 대선 정보 앱을 만들었습니다. [내부링크]

동아리에서 프로젝트로 20대 대선 앱 만들어보았습니다. 저를 포함해서 모두가 다 프로젝트가 처음이라서 기능도 별로 없고 오류도 좀 있으나 호호호호,, 한 번씩 다운 받아주시면 감사합니다. 앱 이름은 Candiformation입니다. https://play.google.com/store/apps/details?id&#x3D;com.solution_challenge.candiformation 안드로이드로 만들어서 아이폰은 없습니다,, 다운로드 받아주시면 정말 감사합니다!

[프로그래머스] 없어진 기록 찾기 sql [내부링크]

Join - join은 두 테이블의 데이터를 일정한 조건에 의해 연결해서 하나의 테이블처럼 만드는 것 - INNER JOIN과 LEFT OUTER JOIN 자주 쓴다. LEFT OUTER JOIN - LEFT OUTER JOIN은 왼쪽에 오는 테이블 기준으로 오른쪽에 오는 테이블과 비교해 조건에 맞는 값이 있으면 JOIN해서 가져오고, 값이 없으면 null 값을 표시한다. - LEFT OUTER JOIN은 JOIN문을 수행할 때 왼쪽에 있는 데이터는 무조건 가져오고, 오른쪽에 오는 테이블과 JOIN을 수행해서 조건에 맞는 데이터가 없을 시 null을 표시 푸는 법 - 입양을 간 기록이 반드시 있기에 왼쪽 테이블을 out으로 한다. - out, in 테이블에서 animal_id 같은 것을 기준으로 left outer join을 하면.......

[JAVA] 내부 클래스(inner class) [내부링크]

내부 클래스 - 주로 AWT나 Swing과 같은 GUI 어플리케이션의 이벤트 처리 외에는 잘 사용하지 않는다. - 클래스 내에 선언된다는 점을 제외하고는 일반적인 클래스와 다르지 않다. - 내부 클래스는 클래스 내에 선언된 클래스 - 두 클래스가 서로 긴밀한 관계에 있기에 내부 클래스로 선언한다. - 장점 1. 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다. 2. 코드의 복잡성을 줄일 수 있다. 두 개의 독립적인 클래스 A가 외부 클래스 B가 A의 내부 클래스 - 내부 클래스 B는 외부 클래스인 A를 제외하고는 다른 클래스에서 잘 사용되지 않는다. 내부 클래스의 종류와 특징 - 내부 클래스의 종류는 선언 위치에 따른 종류와 같다. 내.......

[Clean Code] TIL 5장 형식 맞추기 [내부링크]

TIL (Today I Learned) 2022년 2월 28일 오늘 읽은 범위 5장 형식 맞추기 책에서 기억하고 싶은 내용을 써보세요. 1. 형식을 맞추는 목적 - 코드 형식은 의사소통의 일환 2. 적절한 행 길이를 유지하라. - 일반적으로 큰 파일보다 작은 파일이 이해하기 쉽다. 신문 기사처럼 작성하라 - 이름은 간단하면서도 설명이 가능하게 짓는다. - 이름만 보고도 올바른 모듈을 살펴보고 있는지 아닌지를 판단할 정도로 신경 써서 짓는다. - 소스 파일 첫 부분은 고차원 개념과 알고리즘 설명 - 아래로 내려갈수록 의도를 세세하게 묘사 - 마지막에는 가장 저차원 함수와 세부 내역이 나온다. 개념은 빈 행으로 분리하라 - 각 행은 수식이나 절을 나타내고, .......

[프로그래머스] 루시와 엘라 찾기 sql [내부링크]

풀이 1 풀이 2 풀이 2는 다른 사람들 코드 보고 알았다. name or 말고 name in도 있구나..

[프로그래머스] 중복 제거하기 sql [내부링크]

NAME에서 중복이 되면 안 되기에 distinct를 써주고 개수 세니 count NAME이 null이 되면 안 되기에 is NOT NULL 해준다. count(컬럼명)은 null을 제외하고 세주기에 where 안 써도 된다. count(*) NULL 값을 포함해서 count 한다.

[프로그래머스] NULL 처리하기 [내부링크]

IFNULL을 사용해서 NULL 이면 &#34;NO name&#34; 반환

[프로그래머스] 동명 동물 수 찾기 sql [내부링크]

NAME으로 그룹을 짓고 그룹을 지은 NAME의 개수를 having count로 세주고 order by NAME 해준다

[프로그래머스] 이름에 el 들어가는 동물 찾기 sql [내부링크]

LIKE를 이용한다. %는 글자 수 상관없이 찾는다. %EL 이면 끝자리가 EL인 데이터 EL%이면 처음이 EL 데이터 %EL%이면 EL이 들어가 있으면 된다.

[프로그래머스] 입양 시각 구하기 1 [내부링크]

시간에서 시간을 추출하는 HOUR로 DATETIME에서 시간을 추출한다. GROUP BY로 시간을 묶어주고 HAVING으로 HOUR에 조건을 걸어준다. ORDER BY HOUR로 정렬해준다.

[프로그래머스] 중성화 여부 파악하기 sql [내부링크]

CASE 문을 사용해야 된다. WHEN 절에 조건문을 넣고 THEN에는 참일 때 ELSE는 거짓일 경우 END로 닫아주면 된다.

[백준] 1600번 말이 되고픈 원숭이 c++ [내부링크]

감격스럽다. 1년 전에는 풀지 못 한 문제를,, 허허 이거 왠지 재채첨하면 까일 것 같기도 하고.. 벽 부수고 이동하기 문제랑 거의 똑같은 문제 똑같은 아이디어가 사용이 되는데 다만 차이는 벽을 부술 수는 없고 말처럼 이동할 때 지날 수 있다? 이정도 아이디어는 벽 부수고 이동하기처럼 했다. 3차원 배열로 만들어서 z에 말처럼 이동한 걸 몇 번 했는지 넣어줬다. check[x][y][z]는 x, y까지 말처럼 이동하는 걸 z 번 사용했다. 나는 배열에 원숭이처럼 이동하는 거 말처럼 이동하는 거 12개를 넣어주고 인덱스 4번 기준으로 나눴다. 4번 이상일 경우 말처럼 이동하는 데 k 번 제한 조건이 있기에 nz가 K 이상이면 더 이상 말처럼 이동할 수.......

[백준] 1240번 노드 사이의 거리 c++ [내부링크]

단순 BFS 문제. start를 잡고 이 점을 기준으로 bfs를 쭉 돌린 뒤에 return dist[end] 해주면 된다 .

[백준] 14940번 쉬운 최단거리 [내부링크]

2차원 배열상에서의 BFS 문제이다. 어렵지 않다. 먼저 board를 입력하면서 시작점이면 q에 넣어주고 dist를 0으로 초기화한다. 그다음 bfs 돌면서 4방향 탐색하면 된다. dist가 -1이 아니거나 board가 0이거나 하면 넘어가고 조건 2개를 넘어가면 거리를 + 1 해준다. 다 끝나면 다시 이중 for 문 도는데 이때 원래 갈 수 없는 곳이면 거리를 0으로 출력해 줘야 되기에 board[i][j] &#x3D;&#x3D; 0이면 0을 출력해 주고 나머지는 자신의 dist를 출력해 줬다.

[백준] 18405번 경쟁적 전염 c++ [내부링크]

윽 문제 잘못 읽어서.. 엄청나게 삽질했다. 배열의 크기는 N x N이다. 자꾸 N x K로 했다. 단, 매초 번호가 낮은 종류의 바이러스부터 먼저 증식한다. 문제에 이런 말이 있기에 우선순위 큐를 사용했다. 우선순위 큐를 넣으면 번호가 낮은 것부터 할 수 있기에 그다음 가장 고민이었던 게 1초마다 수행하는 걸 어떻게 해줘야 될까였다. 그래서 while(S--)로 1초마다 수행할 수 있게 해주고 딱 1초마다 할 수 있는 BFS만 돌려야 되기에 q 큐에 몇 개가 들어가 있는지를 세줘서 이 개수만큼 BFS를 돌렸다. firstCnt와 secondCnt로 이 개수를 파악했다. 그리고 q로 bfs를 시작하지만 q2에 다음 점들을 넣어줘서 딱 한 번만 bfs를 하게 해줬다. 다 끝.......

[백준] 1325번 효율적인 해킹 c++ [내부링크]

역시 알고리즘은 문제를 많이 풀어야 되나.. BFS/DFS 문제들 다 거기서 거기인 느낌 물론 이 문제는 SCC로 풀 수 있긴 하나 개인적으로 실버 1에는 DFS/BFS를 돌리는 게 더 맞지 않나 싶다. 문제 자체는 모든 점들에 대해서 dfs 돌려서 연결 요소의 개수들을 다 구해주면 된다. 다 구해서 가장 큰 값을 가지는 점들만 뽑아주면 된다. 물론 3328ms는 c++ 치고도 굉장히 느린 속도라 다른 풀이가 필요해 보인다. 코드를 조금 바꿔보았다. 최댓값 구하는 부분을 dfs 돌리는 부분에서 최대값을 바로 구해주면 코드가 훨씬 간단해진다.

[백준] 17086번 아기 상어 2 c++ [내부링크]

문제를 잘 이해하자! 자꾸 문제를 잘못 이해해서 못 풀고 있었다. 나는 아기 상어와 아기 상어의 거리를 안전거리로 봤는데 이게 아니라 그냥 모든 칸에 대해서 아기 상어와의 거리가 안전거리였다.. 아기 상어가 아닌 칸에 모든 칸에 대해서 BFS를 돌려서 아기 상어와의 최소 인접 거리를 다 구해주고 여기서 최댓값을 구해주면 된다. 그리고 좀 헷갈렸던 게 이런 경우면 과연 거리가 1칸인가 2칸인가 헷갈렸는데 2칸이었다. 나는 사이에 있는 칸만 보면 되는 줄 알았다. 음,, 내가 잘못했지!

[백준] 11047번 동전 0 c++ [내부링크]

옛날에는 왜 틀렸지 이해할 수 없네 동전이 오름차순이고 배수의 관계를 가지고 있기에 그리디 하게 풀면 된다. 가장 큰 것부터 사용할 수 있는지 보면서 사용할 수 있으면 최대 개수만큼 사용하면 된다. 이 개수를 계속 더하면 답이 나온다.

[백준] 2665번 미로 만들기 c++ [내부링크]

로직이 비슷한 문제가 굉장히 많네 미로 만들기, 벽 부수고 이동하기, 말이 되고픈 원숭이 다 똑같은 로직이다.. 역시 문제를 많이 풀어봐야 된다. bool dist[x][y][z]를 만들어서 x, y까지 가는 데 z 개의 검은 벽을 지났다를 만들어줬다. 처음에 두 개는 z &#x3D; 52로 해줬더니 틀렸다. 최대 n이 50이므로 50 * 50 &#x3D; 2500이므로 넉넉하게 z를 2500으로 잡았다. 검은 벽이 2500개 있다고 생각해서 구현은 bfs를 돌면서 흰 벽이면 체크 표시만 해주고 q에 넣어줬고 검은 벽이면 nx, ny, nz + 1을 방문했는지 보고 방문 안 했으면 체크 표시로 해주고 큐에 넣어줬다. 그러다가 x &#x3D;&#x3D; n - 1 , y &#x3D;&#x3D; n - 1에 도달하면 그때.......

백준 700문제 [내부링크]

백준 600문제를 2021년 3월 29일에 달성했으니 거의 1년 만에 700문제를 달성했다.. 마지막으로 푼 게 2021년 12월 14일이네.. 엄청 오랫동안 안 했구나,, 이때가 685문제 정도 됐을거다. 15문제만 더 풀면 됐는데 오랜 시간 동안 알고리즘에 흥미를 잃고,, 다른 거 해야 될 거 많아서 손 놓고 살았다.. 그러다가 최근에 알고리즘이 다시 필요하다는 걸 깨닫고 다시 하고 있다.. 3일 동안 딱 15개 풀어서 700 문제 만들었다.. 물론 내 채점 되면 어떻게 되지 모르지만.. 나의 700번째 문제는 미로 만들기 내 기억으론 옛날에 풀어보려다가 푸는 방법을 몰라서 못 풀었었다. 지금은 풀었네.. 발전한 건가 그냥 다른 문제를 풀어서 그런 건가.. 15개.......

[1년 전 오늘] 3월 [내부링크]

이미 개강한 지 일주일,, 아 벌써부터 강의 밀리네 ㅋㄷㅋㄷ 바쁘다 바빠

[JAVA] 인터페이스 (interface) [내부링크]

인터페이스란? - 인터페이스는 일종의 추상 클래스 - 인터페이스는 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. - 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않는다. - 인터페이스도 추상클래스처럼 완성되지 않은 불완전한 것이기에 그 자체만으로 사용되기 보다는 다른 클래스를 작성하는데 도움 줄 목적으로 작성된다. 인터페이스 작성 - 키워드로 class 대신 interface를 사용 - interface에더 class와 같이 접근제어자로 public 또는 default를 사용할 수 있다. - 모든 멤.......

[프로그래머스] 점프와 순간 이동 c++ [내부링크]

https://programmers.co.kr/learn/courses/30/lessons/12980 정말 이런 유의 아이디어 문제는 어렵다. 문제의 키포인트는 최대한 순간 이동을 많이 사용하는 것 연료를 적게 사용해야 되니 처음에 DFS로 풀어보려다가,, 흠 이게 N이 작으면 되는데 N이 10억이면 절대 할 수가 없다. A4에 끄적이다가 발견한 아이디어, 실제로 답도 이렇더라 6이면 1 -&#62; 2 -&#62; 4 -&#62; 8 안되고 그럼 1 -&#62; 2 -&#62; 3 &#62; 6이 된다. 이걸 반대로 생각하면 6 -&#62; 3 순간 이동 3은 홀수이기에 나눌 수 없으니 1을 빼줘서 2를 만들어준다 그러면 6 -&#62; 3 -&#62; 2 2는 짝수이기에 나누기 1을 해준다. 순간 이동 6 -&#62; 3 -&#62; 2 -&#62; 1 1은 홀수이기에.......

[프로그래머스] 스킬트리 c++ [내부링크]

skill에 없는 것들로만 이루어진 skill_tree도 생각해야된다. 예를 들어 skill CBD 이면 AEF 이런거는 무조건 찍을 수 있는데 이런 경우를 생각 안해서 계속 틀렸다. for문과 map 이용해서 skill의 순서를 넣어줬다. zeroCnt는 skill에 없는 skill이다. for문을 하나씩 돌면서 skill 과 관련된 것들만 result에 넣어주고 - 즉 CBD이면 skill_tree가 BACDE면 BACDE -&#62; BCD로 남기게 해준다. A와 E를 빼버린다. skill에 없는 것의 개수를 세준다. BACDE에서 A와 E를 세준다. zeroCnt가 skill_tree에 들어있는 문자열의 길이와 같다면 그건 skill과 관련 없는 스킬로만 이루어진 스킬트리이기에 무조건 찍을 수 있다는 의미이다. answer++ 해주고.......

[프로그래머스] 문자열 압축 c++ [내부링크]

정말 오랜만에 풀려고 하니 쉽지가 않다. 이거 풀면서 또 테크닉 한 개 배웠다. 항상 부분 문자열을 비교할 때 if(s[i] &#x3D;&#x3D; s[i+1]) 이런 식으로 만 했는데 이 문제 통해서 matchString을 뒤에 걸로 바꿔주면 더 편한다는 걸 배웠다. 일단 첫 번째 for 문에서 size / 2인 이유는 문자열을 길이의 반보다 크게 작으면 나눌 수 없기에 즉 첫 번째 for 문은 나눌 개수 matchString으로 해서 처음부터 나눠준다. 두 번째 for 문을 돌면서 macthString과 똑같은 개수로 나눠주면서 맞으면 개수를 증가시켜주고 아니면 지금까지 맞은 개수를 보고 2개 이상이면 숫자를 문자열에 추가해 주고 문자열을 넣어준다. 그리고 matchCnt &#x3D; 1로 초.......

[백준] 12904번 A와 B c++ [내부링크]

어우 8달 전에는 실패한 문제네 뿌듯하다. 8달 전에는 완전 탐색 이용해서 풀려 해서 당연히 시간 초과다. 이 문제에서 배운 아이디어는 거꾸로 생각하기. 처음 문제를 봤을 때는 S에서 A를 추가하거나 문자열의 뒤집고 B를 추가하는 걸로 생각했다가. 이걸 반대로 생각해서 T에서 A를 삭제하거나 B를 빼고 뒤집는 걸로 생각했다. 이렇게 되면 T의 맨 뒤의 문자열만 보면 된다. T의 맨 뒤 문자열이 A면 S에서 문자열 뒤에 A를 추가한 것이니 T에서 S로 가려면 A를 삭제하면 된다. T의 맨 뒤 문자열이 B면 S에서 문자열의 뒤집고 뒤에 B를 추가한 것이니 T에서 S로 가려면 B를 빼고 문자열의 뒤집으면 된다. 이런 과정을 반복하다가 길이기 같아졌.......

[백준] 12919번 A와 B 2 c++ [내부링크]

이것도 다시 풀었다. A와 B는 그리디라면 이건 백트래킹을 이용해서 푼다. 문자열의 경우의 수는 4가지로 봤다. 그리고 T에서 S로 만드는 경우로 생각했다. 위와 같이 총 4가지 경우이다. S의 길이가 T보다 커지면 안 되기에 return 해주고 둘이 같으면 answer을 1로 바꿔준다. 위의 4가지를 경우의 수로 나눠서 재귀 함수 돌려주면 된다.

[백준] 13023번 ABCDE c++ [내부링크]

A -&#62; B -&#62; C -&#62; D -&#62; E 0 -&#62; 1 -&#62; 2 -&#62; 3 -&#62; 4 인 경우와 같으므로 dfs를 돌리면서 깊이가 4인 것이 하나라도 있으면 답이 있는 거다. 전체 모든 점에 대해서 dfs를 돌려야 한다. 한 점에서만 돌리면 모든 경우를 볼 수 없기에 check[cur] &#x3D; true로 for문에서 시작하는 점을 방문 했다고 표시하고 찾는 게 depth가 4인 경우 이기에 기저 조건을 달아준다. for문을 돌면서 check가 true면 넘어가고 아니면 depth를 1 증가시켜서 dfs를 해준다. 다 끝나면 check[cur] &#x3D; false로 바꿔준다. 다음 dfs에 영향이 없게

[JAVA] 추상 클래스 abstract class [내부링크]

추상 클래스 - 추상 클래스는 미완성 설계도에 비유 가능하다. - 추상 클래스는 미완성 메서드를 포함하고 있다. - 추상 클래스는 인스턴스를 생성할 수 없다. - 추상 클래스는 상속을 통해서 자손 클래스에 의해서만 완성될 수 있다. - 추상 클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는 데 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다. - 어느 정도 틀을 제공해 주기 때문에 - abstract 키워드 사용 - 추상 클래스는 추상메서드를 포함하고 있다는 것만 제외하고는 일반 클래스와 전혀 다르지 않다. - 생성자, 멤버 변수, 메서드도 가질 수 있다. 추상 메서드 - 선언부만 작성하고 구현부는 작성.......

[Clean Code] TIL 3장 함수 [내부링크]

TIL (Today I Learned) 2022년 2월 22일 ~ 2022년 2월 23일 오늘 읽은 범위 3장 함수 책에서 기억하고 싶은 내용을 써보세요. 1. 작게 만들어라 - 함수를 만드는 첫째 규칙은 작게! 다 - 두 번째 규칙은 &#x27;더 작게!&#x27;다. 블록과 들여쓰기 - if/else/while 문 등에 들어가는 블록은 한 줄이어야 한다는 의미, 대개 거기서 함수를 호출한다. - 그럼 바깥을 감싸는 함수도 작아지고, 블록 안에서 호출하는 함수 이름을 적절히 짓는다면, 코드를 이해하기도 쉬워진다. - 중첩 구조가 생길 만큼 함수가 커지면 안 된다. 함수에서 들여쓰기 수준은 1 ~2단을 넘어서면 안 된다. 2. 한 가지만 해라! - 함수는 한 가지를 해야 한다. 그 한 가지를.......

Building Secure & Reliable Systems SRE를 위한 시스템 설계와 구축 (구글이 공개하는 SRE 모범 사례와 설계, 구현, 운영 노하우) [내부링크]

&#34;한빛미디어 &#60;나는 리뷰어다&#62; 활동을 위해서 책을 제공받아 작성된 서평입니다.&#34; 한빛 미디어 서평단에서 처음으로 받은 책입니다. 제목 그대로 SRE(사이트 신뢰성 엔지니어링)에 관한 책입니다. 저는 이 책을 받기 전까지 SRE가 무엇인지 몰랐습니다. 이 책 덕분에 SRE에 대해서 알게 되었습니다. 이 책을 통해서 - 구글의 SRE 운영 노하우를 알 수 있습니다. - 시스템 설계를 위한 신뢰성, 사용성, 보안에 대한 여러 사례를 들을 배울 수 있습니다. - 소프트웨어 개발에서 보안과 신뢰성은 최우선으로 고려해야 될 요소이기에 이 책을 통해서 보안과 신뢰성이 왜 중요하고 어떤 형태로 문제가 발생하거나 어떻게 예방할 수 있.......

[JAVA] instanceof 연산자, 참조변수와 인스턴스의 연결 [내부링크]

instanceof - 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다. - 주로 조건문에 사용되고, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입이 피연산자로 위치 - 연산의 결과로 true or false 반환 - true를얻으면 참조변수가 검사한 타입으로 형변환이 가능하다. 생성된 인스턴스는 FireEngine 타입이지만, Object 타입과 Car 타입의 instanceof 연산에서도 true를 결과로 얻었다. 그 이유는 FireEngine 클래스는 Object 클래스와 Car 클래스의 자손 클래스이기에 조상의 멤버들을 상속받았기 때문이다. - 같은 타입의 instanceof 연산 이외에 조상 타입의 instanceof 연산에도 true를 결과로.......

[JAVA] 매개변수의 다형성 [내부링크]

Product 클래스는 Tv와 Computer 클래스, Audio의 조상이고 Buyer는 제품을 구입하는 사람을 의미 Buyer 클래스에 물건을 구입하는 메서드를 추가. 구입하려는 대상이 필요하기에 매개변수로 구입할 제품을 넘겨줘야한다. 제품을 사려면 Tv, Computer, Audio에 대한 함수를 3개를 만들어줘야한다. 이러면 제품의 종류가 늘어나면 새로운 메서드를 계속 추가해줘야한다. 하지만 메서드의 매개변수에 다형성을 적용하면 아래와 같이 하나의 메서드로 간단히 해결할 수 있다. 매개변수를 Product 타입의 참조변수로 하게 되면 메서드의 매개변수가 Product 클래스의 자손 타입의 참조변수면 어느 것이나 매개변수로 받아들일 수 있다는 것이다.

[프로그래머스] 숫자의 표현 [내부링크]

와우 6개월 만의 알고리즘 포스팅; 너무 안 풀었네 무지성으로 1부터 n까지 for 문 돌면서 1씩 증가하면서 sum에 계속 더해서 target 값이 나오면 ture가 되면 개수를 증가하고 target보다 크면 false를 반환한다.

Clean Code TIL 4장 주석 [내부링크]

TIL (Today I Learned) 2022년 2월 24일 ~ 2월 25일 오늘 읽은 범위 4장 주석 책에서 기억하고 싶은 내용을 써보세요. - 주석은 순수하게 선하지 못하다. - 주석을 달 때마다 자신에게 표현력이 없다는 사실을 푸념해야 마땅하다. - 코드만이 정확한 정보를 제공하는 유일한 출처다. 우리는 주석을 가능한 줄이도록 꾸준히 노력해야 한다. 1. 주석은 나쁜 코드를 보완하지 못한다. - 코드에 주석을 추가하는 일반적인 이유는 코드 품질이 나쁘기에 - 표현력이 풍부하고 깔끔하며 주석이 거의 없는 코드가, 복잡하고 어수선하며 주석이 많이 달린 코드보다 훨씬 좋다. 2. 코드로 의도를 표현하라. - 많은 경우 주석으로 달려는 설명을 함수로 만들.......

[프로그래머스] 이진 변환 반복하기 [내부링크]

나는 문제 그대로 해줬다. - string을 for 문 돌면서 0의 개수를 세주고 전체 길이에서 빼주면 길이가 나오니까 이걸로 다시 이진수를 만들었다. - 0의 개수를 세준건 전체 0의 개수에 더해주고 한 번 돌 때마다 이진변환++ 해줬다. - 길이를 이진수로 변환한 걸로 다시 이진변환을 반복해서 &#34;1&#34;이 나올때 까지 한다.

4학년 개강 [내부링크]

그렇다 우리 학교는 2월 21일 개강이다. 바로 오늘 개강이다. 어떡하지 난 할 줄 아는 게 없는데 벌써 4학년이다. 군대 갔다 와서 19년에 1학년 2학기로 복학한 게 엊그제 같은데 시간이 c++처럼 빠르게 흐른다. 내 인생 마지막 대학교 인생이니 4학년 1학기 다짐이나 적어봐야겠다. 다짐 1. 4.5 맞고 졸업하자. - 4학년이라 좀 무의미하긴 한데 캡스톤 2개 6학점 3전공 9학점으로 15학점 할 거다. 지금까지는 4.43이 최고 학점이다. 내 인생 첫 번째 과탑.. 이 뒤로해 본 적이 없네 ㅎ 사실 12학점 하고 싶었는데 장학금이 15학점부터라 어쩔 수 없이 한다. 우리 학교 졸업학점이 140학점인데 4-1 끝나면 140학점 된다. 차라리 조기졸업을 노릴.......

GDSC KR WINTER HACK 수료증 [내부링크]

수료증 받았다. 캐릭터가 귀엽다. 해커톤 하면서 많이 배웠다~ 또 하고 싶다 해커톤 그리고 달달한 상품까지 감사합니다~

네이버에 GDSC를 치면 [내부링크]

내 글 중에 네이버, 구글 메인에 걸려있는 거 많이 있어서 메인에 있는 건 별 감흥이 없으나.. GDSC를 검색했을 때 내 블로그와.. 우리 king.. 이 나오는 게 뿌듯하다... . 아니 근데 왜 썸네일 내용에 하필 많고 많은 내용 중에 저게 나오지 ㅋㅋㅋ

[JAVA] static import 문 [내부링크]

static import 문을 사용하면 static 멤버를 호출할 때 클래스 이름을 생략할 수 있다. 특정 클래스의 static 멤버를 자주 사용할 때 편리 위와 같이 import문을 선언하면 코드를 간략히 할 수 있다.

[JAVA] 제어자 static, final, abstract, public, protected, private [내부링크]

static static은 클래스의 또는 공통적인 의미를 가지고 있다. static이 붙은 멤버 변수는 인스턴스에 관계없이 같은 값을 갖는다. 왜냐 하나의 변수를 모든 인스턴스가 공유하기 때문 static이 붙은 멤버변수와 메서드, 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이기 때문에 인스턴스를 생성하지 않고 사용할 수 있다. static은 멤버변수, 메서드, 초기화 블럭에 사용 가능 static 멤버변수 - 모든 인스턴스에 공통적으로 사용되는 static 변수가 된다. - static 변수는 인스턴스를 생성하지 않고도 사용 가능 - class가 메모리에 로드될 때 생성 static 메서드 - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다. - s.......

책 잘 읽는 방법 (폼나게 재미나게 티나게 읽기) [내부링크]

4학년이 돼서 책을 다시 읽어보려고 마음을 먹었다. 무작정 책을 읽기보다는 책을 잘 읽어보고 싶어서 네이버에 책 잘 읽는 방법이라고 쳐보니 이 책이 나와서 바로 빌렸다. 책 자체는 굉장히 가볍고 빠르게 읽을 수 있다. 몇 시간이면 다 읽을 수 있는 수준이다. 또한 개인적으로 책을 &#x27;잘&#x27; 읽는 법까지는 아닌 것 같다. 나는 어떻게 하면 속독을 하고 책 내용을 더 잘 기억할 수 있고 이런 내용을 생각했다. 하지만 그런 건 아니고 책을 잘 읽지 않는 사람들이 어떻게 하면 책과 잘 친해질 수 있는지를 써 놓은 책이다. 나는 그래도 군대에서 책 100권 읽고 전역하고도 나름 꾸준히 읽어서 책을 잘 읽지 않는 사람들은 아니어서 엄청.......

소원을 말해봐 [내부링크]

가로수길 건물 50채요~

[JAVA] 다형성 [내부링크]

다형성이란? - 여러 가지 형태를 가질 수 있는 능력 - 자바에서는 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현 보통은 인스턴스를 다루기 위해서 인스턴스의 타입과 일치하는 타입의 참조변수만을 사용했다. 두 클래스가 상속관계에 있을 경우, 부모 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하도록 하는 것도 가능하다. 인스턴스를 같은 타입의 참조변수로 참조하는 것과 부모타입의 참조변수로 참조하는 것은 어떤 차이를 알아보자 CaptionTV 인스턴스 2개를 생성하고 참조변수 c와 t가 생성된 인스턴스를 하나씩 참조하도록 했다. 위와 같은 경우 실제 인스턴스가 Capt.......

브레이킹 루틴 [내부링크]

조코딩 천인우 인터뷰 영상에서 댓글 이벤트로 당첨된 책 좋다 정리 - 자신의 인생 목표를 설계해 보자 - 나에게 필요한, 나에게 좋은 습관을 찾자 - 목표부터 정하자, 장기적 단기적 목표 - 시스템화를 통해서 나만의 노하우를 만들어라 - 회고의 시간을 가지면 결과보다 결과에 도달하는 과정에 집중하게 됨 -&#62; 성공 요인 분석 - 타인과의 약속을 레버리지 해라 - 나를 움직이게 하는 장치를 만들어라 - 스몰 빅 사이클 - 인생에서 하고 싶은 일이 무엇인 지를 명확히 알면, 괜히 돌아가는 헛수고를 줄일 수 있다. - 나 자신의 발전을 독려할 수 있는 목표 세우기 - 스스로를 칭찬하는 습관 - 좋은 생각을 습관화하자 - 내가 할 수 있는 것.......

[JAVA] 상속(inheritance) [내부링크]

상속이란? 상속은 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것. extends 상속을 구현하기 위해서는 클래스 이름 뒤에 상속받고자 하는 클래스의 이름을 extends와 쓰면 된다. 관계 Child class에 새로운 코드가 추가되어도 parent class는 아무런 영향도 받지 않는다. 반대로 parent class가 변경되면 Child class는 자동적으로 영향을 받게 된다. - 생성자와 초기화 블록은 상속되지 않는다. 멤버만 상속 - 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다. 즉 상속받는다는 것은 parent class를 확장(extend) 한다는 의미로 해석할 수 있기에 extends를 쓴다. - private 또는 default 멤버들은 상속은 받지만 child .......

[JAVA] 오버라이딩(Overriding) [내부링크]

오버라이딩이란? 부모 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. override의 사전적 의미는 ~위에 덮어쓰다이다. 부모 클래스부터 상속받은 메서드를 그대로 사용하기도 하지만 자손 클래스 자신에 맞게 변경해야 하는 경우가 많다. 조건 - 자식 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 - 이름이 같아야 하고 - 매개변수가 같아야 한다. - 반환 타입이 같아야 한다. 즉 선언부가 서로 일치해야 한다. 다만 접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다. 1. 접근 제어자는 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다. - 만일 조상 클래스에 정의된 메서.......

[JAVA] Super [내부링크]

super super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조 변수이다. 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때는 super를 사용해서 구별할 수 있다. 부모 클래스로부터 상속받은 멤버도 자식 클래스 자신의 멤버이기에 super 대신 this를 사용할 수 있다. 조상 클래스의 멤버와 자손 클래스의 멤버가 중복 정의되어 서로 구별해야 하는 경우에만 super를 사용하는 것이 좋다. static 메서드는 인스턴스와 관련 없다. this와 마찬가지로 super 역시 static 메서드에서는 사용할 수 없고 인스턴스 메서드에서만 사용할 수 있다. 부모 클래스와 자식 클래스의 멤버가 중복되지 않는 경우.......

Travis CI와 레포지토리 연동하기 [내부링크]

혼자 보려고 만든 거라 좀 뒤죽박죽 합니다. 하지만 이걸 이겨내면 구축할 수 있습니다. CI - git 등에 push가 되면 자동으로 테스트와 빌드가 수행되어 안정적인 배포 파일을 만드는 과정 (Continuous Integration) CD - 이 빌드 결과를 자동으로 운영 서버에 무중단 배포까지 진행되는 과정을 Continuous Deployment 지속적인 배포라고 함 Travis CI 연동 Travis CI는 깃허브에서 제공하는 무료 CI 서비스 Jenkins는 설치형이기에 이를 위한 EC2 인스턴스가 하나 더 필요하다. Travis CI 웹 서비스 설정 로 들어간다. org 말고 com으로 들어가자 로그인이 되면 오른쪽 상단 프로필 클릭 후 Settings activate 누르고 그다음 화면에서 install 누.......

[Clean Code] TIL-Assignment 01 [내부링크]

https://nomadcoders.co/c/clean-code/lobby 노마드코더 클린 코드 챌린지에 참여하게되었습니다~ 매일 기록해보도록 하죠.. TIL (Today I Learned) 오늘 읽은 범위 책에서 기억하고 싶은 내용을 써보세요. 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

[Clean Code] TIL 1장 깨끗한 코드 [내부링크]

TIL (Today I Learned) 2022년 2월 20일 오늘 읽은 범위 추천사 1장. 깨끗한 코드 책에서 기억하고 싶은 내용을 써보세요. - 사소한 곳에서 발휘하는 정직은 사소하지 않다. - 5S 정리 : 적절한 명명법 등과 같은방법을 사용해 무엇이 어디에 있는지 알아야 한다. 정돈 : 코드는 누구나 예상하는 위치에 있어야한다. 청소 : 과거 이력이나 미래 바람을 기억한 주석 혹은 주석으로 처리한 코드는 제거한다. 청결 :그룹 내에서 일관적인 구현 스타일과 기법의 필요성 생활화 : 관례를 따르고, 자기 작품을 자주 돌아보고, 기꺼이 변경하는 규율을 뜻한다. - 첫아이 이름을 짓듯이 심사숙고해서 변수 이름을 지어야한다. - 깨끗한 코드를 작성하는 방.......

10시간 동안 고생한 오류 해결 [내부링크]

이렇게 노란색 쳐져있길래 그런갑다 했는데 이게 문제였다 . 이렇게 들여쓰기 없애주니 됐다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

[Clean Code] TIL 2장 깨끗한 코드 [내부링크]

TIL (Today I Learned) 2022년 2월 21일 오늘 읽은 범위 2장 의미 있는 이름 책에서 기억하고 싶은 내용을 써보세요. - 의도를 분명히 밝혀라 : 의도가 분명한 이름이 정말 중요하다 - 변수의 존재 이유는? 수행 기능은? 사용 방법은? 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말이다. - 그릇된 정보를 피하라 : 그릇된 단서는 코드 의미를 흐린다. - 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용해도 안된다. - 계정을 담는 컨테이너가 실제 List가 아니라면 프로그래머에게 그릇된 정보를 제공하는 셈 -&#62; 실제 컨테이너가 List인 경우라도 컨테이너 유형을 이름에 넣지 않는 편이 바람직 - 서로 흡사한 이름을 사용하.......

GDSC KR Winter Hack: Play Your Stay 참가 후기 [내부링크]

생각의 흐름에 따라서 후기 적어봅니다. 시작 전 2월 4일 4시부터 2월 5일 오후 1시까지 열린 해커톤에 참가했습니다. 살면서 처음으로 해커톤을 참가해 보네요. 해커톤 시작하기 전까지는 온라인이니까 해커톤 기분이 생길까..? 아 오프라인이 나은 것 같은데? 이 생각을 정말 많이 했는데, 해커톤 시작하고 개발 좀만 해보니 온라인으로 해도 해커톤 기분이 굉장히 많이 났습니다. 오히려 온라인으로 하길 잘했다는 생각도 많이 들었네요. 만일 오프라인으로 했다면 모니터도 없이 조그마한 노트북 가지고 잘 씻지도 못하고 서로 피곤에 찌든 모습 봐야 되고.. 또 해커톤 장소까지 가고 새벽까지 하고 끝나고 집 오고.. 생각만 해도 피곤하네요.......

spring boot nginx 연결 [내부링크]

로 nginx을 다운로드해 준다. 잘 실행된다. 이때 aws를 사용한다면 80번 포트를 열어놓아야 한다. 을 통해서 test.conf 파일을 만든다. 위의 코드를 복사하고 proxy_pass 부분에 원하는 주소를 입력하면 된다. 즉 proxy_pass 원하는 주소; ex proxy_pass 1.23.456.789:8080; 위의 코드를 해석하면 80번 포트로 localhost에 들어오는 모든 request에 대해서 localhost:8080 포트로 접속하게 해준다. 심볼릭 링크를 만들어준다. 만약 already가 뜬다면 를 이용해서 덮어쓴다. 를 이용해서 심볼릭 링크 추가 확인 이 코드를 했을 때 default가 뜬다면 로 지워준다. 둘 중 하나를 통해서 다시 실행해 준다. 내가 연결한 주소는 :8080으로 위와 같이 뜨.......

류리의 자취 일기 시즌 2 [내부링크]

2019년 9월 1일 ~ 2019년 12월 24일 자취 일기 시즌 1이 끝나고 다시는 자취 일기 안 쓸 줄 알았는데.. 이번 연도부터 자취하게 돼서 자취 일기 시즌 2 시작합니다!!!!!!!!!! 오예!!!!!!!!!!! 1학기 2학년 자취하고 2학년 1학기 집에서 2학년 2학기 ~ 3학년 2학기 겨울방학까지 기숙사에서 쭉 살다가 4학년부터는 혼자 살면서 빡세게 공부하고 싶어서 자취를 시작했습니다. 바로 방부터 알아봤습니다. 첫 번째 부동산 가서 거의 열몇 개 봤는데 아.. 다 2%씩 부족해서 고민하고 있었는데,, 더 둘러보기 귀찮아서 바로 계약하려다가 주변에서 부동산 1개로는 안된다고 꼭 몇 개 더 보라고 해서 집단지성을 믿고 부동산 1개만 더 가봤는데 딱 처음.......

무지성 삭제를 주의하자.. [내부링크]

C 드라이브에 10GB 남아서 다운로드에서 필요 없는 거 삭제하다가 아 무슨 실수인지는 모르겠는데 shift를 두 번 연속 눌렀나 하여튼 전체 선택된 거 모르고 shift + delete 해서 다 날아가 버렸다.. 중요한 게 있었으려나,, 다운로드 폴더이기에 없었을 것 같긴 한데 찝찝하다 그래도 이거 삭제해서 10GB -&#62; 38GB로 용량 확장됐다.

AWS Lambda,cloudWatch 이용 python 주기적 크롤링 [내부링크]

함수 생성 클릭 새로 작성, 함수 이름, 런타임 그리고 밑으로 내려서 함수 생성 함수가 생성됨 lambda 자체에는 파이썬 라이브러리가 없기에 필요한 것들 다운 받아서 넣어줘야됨 폴더 하나 만들고 위 명령어들 이용해서 다운 받아줌 여기서 중요한 게 다운을 받고 최상단 폴더에 python을 만들어 주고 거기에 넣어주면 된다. 그리고 압축을 해야된다. 반드시 python으로! 위와 같은 그림이 나오면 된다. 왼쪽 햄버거 메뉴 이용해서 계층 계층 생성 원하는 이름으로 하고 bs4 zip 파일 업로드 이름이 조금 다르지만 어쨌든 zip 파일 넣어주면 됨 런타임은 여러 개 해도 된다. 다시 함수로 이동 layers 클릭하면 이렇게 아래로 내려가는데 add a l.......

[JAVA] static 메서드와 인스턴스 메서드 [내부링크]

- static을 붙이면 객체를 생성하지 않고도 class 이름. 메서드 이름과 같은 식으로 호출 가능 - 인스턴스 메서드는 반드시 객체를 생성해야만 생성 가능 - 인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는 인스턴스 변수를 필요로 하는 메서드 - 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 static 메서드로 정의한다. - 클래스 영역에 선언된 변수를 멤버 변수 - 멤버 변수에 static이 붙은 것은 static, 클래스 변수 - static이 붙지 않은 것이 인스턴스 변수 1. class를 설계할 때, 멤버 변수 중 모든 인스턴스에 공통적으로 사용해야 하는 것에 static을 붙인다. .......

[JAVA] 오버로딩 overloading [내부링크]

오버로딩이란 - 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 method overloading 조건 1. 메서드 이름이 같아야 한다. 2. 매개변수의 개수 또는 타입이 달라야 한다. - 오버로딩된 메서드들은 매개변수에 의해서만 구별되기에 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못 한다. 예제 매개변수의 순서가 다른 경우도 오버로딩이다. 매개변수의 값에 의해 호출된 메서드가 구분될 수 있기에 하지만 이렇게 순서를 다르게 하면 과같이 호출하게 되면 어느 메서드에서 호출된 것인 지 알 수 없기에 컴파일 에러가 발생 위와 같이 오버로딩 가능 장점 만약 메서드도 변수처럼 이름으로만 구별된다면 한 클래스 내의 모.......

[JAVA] 생성자 (Constructor) [내부링크]

생성자란? 생성자는 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드 생성자는 클래스 내에 선언되고 리턴 값이 없다. 리턴 값이 없다고 해서 생성자 앞에 리턴 값이 없음을 뜻하는 void를 붙이지는 않는다. 조건 1. 생성자의 이름은 클래스의 이름과 같아야 한다. 2. 생성자는 리턴 값이 없다. 사용 매개변수가 없는 생성자도 만들 수 있고 매개변수가 있는 생성자도 만들 수 있다. 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 건 아니다. 기본 생성자 만일 클래스 내에서 생성자가 없다면 컴파일러가 기본 생성자를 만들어준다. 눈에 보이지는 않지만 매개변수가 없는 기본 생성자가 만들어진다. 다만 와 같.......

웅장하다 트리플 모니터 [내부링크]

컨버터가 오늘 배송와서 바로 트리플 모니터 완성했다.. 웅장하다!! 이것이 개발자의 삶인가!!!!

Spring data jpa query문 오류 [내부링크]

spring data jpa에서 쿼리문을 사용하려면 table의 별칭을 Select안에 넣어줘야한다. 근데 이게 귀찮으니 nativeQuery &#x3D; true를 넣어주면 된다.

spring data jpa 랜덤 추출 [내부링크]

여러가지 방법이 있겠지만 native query이용해서 간단하게 했다. 전체를 찾는 데 이때 랜덤으로 딱 한 개만 찾아준다.

Could not resolve all files for configuration' :compileClasspath Could not find io.jsonwebtoken:jjwt [내부링크]

에러 Could not find io.jsonwebtoken:jjwt 라고 하길래 구글링 해보니 다 api, impl, jackson만 써서 혹시 몰라서 삭제 해보니 정상적으로 된다.

spring boot Execution failed for task ':test'. &gt; There were failing tests. [내부링크]

Execution failed for task &#x27;:test&#x27;. &#62; There were failing tests. 와 같이 testCode를 주석 처리 해주니 정상적으로 build가 된다.

Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set [내부링크]

mysql을 사용한다면 위의 코드를 application.properties에 추가해준다.

aws에 spring boot 올리기 [내부링크]

먼저 자신이 사용하는 java 버전 다운 받기 그다음 github 레포에 있는 거 clone 하기 cd 이용해서 폴더로 이동 로 권한 변경 로 build 하기 오류가 없다면 build가 정상적으로 된다. 를 통해서 build의 libs로 간다. ls 찍어보면 다음과 같은 파일이 있다. 두 번째 파일을 java -jar로 실행해 주면 서버가 가동된다. 물론 db 연결도 해놓아야 정상적으로 된다. 나는 DB 연결에서 막혔다. 크게 3가지 문제 때문에 안됐었다. 1. application.properties 1번에 mysql을 써야 되는데 admin을 썼다. 2번에는 admin을 써야 되는데 다른 db 이름을 썼다. 이거랑 연결할 것이기에 admin을 써줘야 된다. 2.spring.jpa.database&#x3D;mysql 를 application.......

spring boot pm2 이용 배포 [내부링크]

nginx나 apache를 써서 프록시 서버도 해줘야하나 시간 관계상 pm2만 노드 버전 관리자 nvm을 설치해줍니다. nvm 을 활성화합니다. NodeJS를 설치합니다. 으로 npm을 업데이트 해줍니다. pm2를 설치해줍니다. 을 통해서 app.json을 열어주고 다음 내용을 넣어줍니다. 저는 이렇게 했습니다. 처음에 /GDSC-WINTER-HACK 으로 했다가 안돼서 GDSC-WINTER-HACK, &#x27;/&#x27;를 빼주니까 됐습니다. 하면 실행이 됩니다.

Property of @IdClass not found in entity [내부링크]

N 대 M JPA를 구성하다가 오타가 나서 왜 났는지 찾아보니 어이없는 이유로 오타가 났다. 1번과 2번이 같은 글자여야 하는데 하나는 sentence Sentence여서 오류가 났다. 바꿔주고 밑에 생성자도 바꾸면 오류가 안 난다.

[Java] 형변환, final [내부링크]

ParseInt 문자열을 정수로 바꿀 때는 ParseInt를 사용한다. 이때 Wrapper 클래스인 Integer를 사용한다. 정수를 문자형으로 정수를 문자열로 바꾸는 가장 쉬운 방법은 정수 앞에 빈문자열을 더 해주는 것 String.valueOf 또는 Integer.toString()도 사용가능하다. final final은 자료형에 값을 단 한 번만 설정할 수 있게 강제하는 키워드이다. 한 번 값을 설정하면 그 값을 다시 설정할 수 없다. 재할당하려고 하면 컴파일 에러가 뜬다. Unmodifiable List List의 경우에는 final로 선언시 리스트에 값을 더하거나 빼는 것은 가능하다. 다만 재할당이 불가능하다. 만약 그 값을 더하거나 빼는 것도 불가능하게 하고 싶은 경우네는 List.of로 수.......

spring boot jwt (1) [내부링크]

JWT 토큰 흐름 1. 사용자를 인증한 다음에 토큰을 생성 2. 이때 생성된 토큰에 관련된 정보를 별도로 저장하지 않는다. 토큰에 연관되는 사용자 정보나 권한 등을 토큰 자체에 넣어서 저장한다. 3. 토큰을 이용해서 Resource Server에 있는 API를 호출한다. 4. API 서버는 토큰 내에 들어있는 사용자 정보를 가지고 권한 인가 처리를 하고 결과를 리턴한다. 토큰을 생성하는 단계에서는 생성된 토큰을 별도로 서버에서 유지할 필요가 없고 토큰을 사용하는 API 서버 입장에서는 API 요청을 검증하기 위해서 토큰을 가지고 사용자 정보를 별도로 계정 시스템 등에서 조회할 필요가 없다. JWT 가 유용한 상황 - 회원 인증 JWT를 사용하는 가장 흔한.......

spring boot jwt (2) [내부링크]

Spring security 인증 해제 spring security를 사용하며 인증 화면이 초기에 나오도록 되어있다. 이 spring security 초깃값 인증을 풀기 위해서는 SecurityConfig에 다음과 같이 작성한다. JPA Entity Model Class 만들기 먼저 모든 Entity가 기본적으로 상속받아 사용할 수 있는 BaseEntity 추상 클래스를 생성해서 중복되는 필드값을 공통으로 관리하도록 한다. BaseEntity Account을 만들어준다. 즉 DB에 넣을 값이다. 기본 생성자를 와 같이 lombok 어노테이션으로 처리했는데 접근 권한을 최소화하기 위해 사용했다. JPA에서는 프록시 생성을 위해서 기본 생성자를 반드시 하나를 생성해야 한다. 기본 생성자를 아무 이유 없이 열어두는 것.......

Spring boot jwt (3) [내부링크]

출처 : https://github.com/alalstjr/Java-spring-boot-security-jwt Spring Security 스프링 시큐리티 레퍼런스에서는 자바 EE 기반의 엔터프라이즈 소프트웨어 애플리케이션을 위한 포괄적인 보안 서비스들을 제공하고 오픈 플랫폼이면서 자신만의 인증 메커니즘을 간단하게 만들 수 있다. 스프링 시큐리티를 이해하기 위해서는 스피링 시큐리티가 애플리케이션 보안을 구성하는 두 가지 영역에 대해서 알아야 한다. 인증과 권한 - 인증 : 애플리케이션의 작업을 수행할 수 있는 주체라고 주장할 수 있는 것 - 권한 : 권한은 인증된 주체가 애플리케이션의 동작을 수행할 수 있도록 허락되었는지를 결정하는 것 권한 승인이 필요한 부분으로 접.......

[Java] 명명 규칙 [내부링크]

클래스 명 - 클래스명은 명사로 한다. - 여러 개의 단어가 섞이는 경우 각 단어의 첫 번째 문자는 대문자로(CamelCase) Method 명 한 개의 클래스 안에는 메소드가 여러 개 존재할 수 있다. - 메소드명은 동사로 - 여러 개의 단어가 섞이는 경우 각 단어의 첫 번째 문자는 대문자로, 단 처음 시작하는 문자는 항상 소문자 변수명 - 변수 이름은 짧지만 의미가 있어야 한다. (변수명을 통해서 사용 의도를 알 수 있어야 됨) - 순서를 의미하는 임시적인 정수의 변수명은 i, j, k, m, n을 사용한다. - 변수명에 _ , $ 기호를 사용할 수 있지만 시작 문자로 사용하지 않는다.

[Java] 숫자 자료형 [내부링크]

정수형 byte, short, int, long int는 -2147483648 ~ 2147483647 long은 -9223372036854775808 ~ 9223372036854775807 long 변수에 값을 댕비할 때는 숫자 값이 int 자료형의 최댓값보다 큰 경우는 &#x27;L&#x27; 접미사를 붙여주여야 컴파일 에러가 발생하지 않는다. 실수형 float과 double형이 있다. Java에서 실수형은 default가 double이기에 float 변수에 값을 대입할 때에는 &#x27;F&#x27; or &#x27;f&#x27; 접미사를 붙여주여야 컴파일 에러가 발생하지 않는다. e2는 10의 제곱을 의미한다. 8진수 16진수 8진수와 16진수는 int 자료형을 사용하여 표시한다. 숫자 0으로 시작하면 8진수 0x로 시작하면 16진수가 된다.

[Java] boolean , char [내부링크]

boolean 참 또는 거짓의 값을 갖는 자료형인 boolean char 한 개의 문자 값에 대한 자료형인 char char형은 &#x27; 로 감싸줘야한다.

[Java] String, Wrapper, String 내장 메소드 [내부링크]

String &#34; &#34;를 이용해서 문자열을 나타낸다. 선언 방법은 위와 같이 2가지이다. new 키워드는 객체를 만들 때 사용한다. 보통 첫 번째 방식인 리터럴 표기를 사용하는 게 좋다. 리터럴 표기를 사용하면 가독성에 이점이 있고 컴파일 시 최적화에 도움을 준다. 첫 번째 방법은 객체 생성 없이 고정된 값을 그대로 대입하는 방법이다. 리터럴 표기를 사용하면 문자열을 intern pool이라는 곳에 저장하고 그다음에 다시 동일한 문자열이 선언될 때는 cache된 문자열을 리턴한다. 두 번째인 new 방법은 항상 새로운 String 객체를 생성한다. 원시 자료형 int, long, double, float, char는 원시 자료형으로 new 키워드로 값을 생성할 수 없.......

[Java] StringBuffer [내부링크]

StringBuffer는 문자열을 추가하거나 변경할 때 많이 사용 append StringBuffer 자료형은 append 메소드를 사용해서 문자열을 추가할 수 있다. toString을 사용하면 String 자료형으로 변환 가능 String 과의 차이 StringBuffer 같은 경우는 객체가 한 번만 생성이 되고, String은 새로운 연산이 있을 때마다 새로운 String 객체가 생성이 된다. String 자료형은 한 번 값이 생성되면 값을 변경할 수 없는 immutable 하다. String 객체에 여러 메서드를 변경해 보면 문자열이 변경되는 것처럼 보일 수 있으나 이건 메서드 수행 후 새로운 String 객체를 생성해서 리턴하는 것이다. StringBuffer는 값을 변경할 수 있는 mutable 하다. StringBuffe.......

[Java] ArrayList [내부링크]

리스트는 배열과 비슷한 자바의 자료형으로 배열보다 편리한 기능을 많이 가지고 있다. 리스트와 배열의 가장 큰 차이는 크기가 정해져 있지 않고 동적으로 변한다는 것이다. 리스트는 크기가 정해져 있지 않아 원하는 만큼의 값을 담을 수 있다. ArrayList 를 import 해서 사용해야 한다. add ArrayList 객체에 add 메서드를 사용해서 값을 넣어줄 수 있다. 숫자만 적으면 순서대로 넣어지고 첫 번째 인자에 인덱스를 넣으면 그 위치에 넣을 수 있다. 제너릭스 - ArrayList를 생성할 때 객체를 포함하는 자료형도 어떤 객체를 포함하는지에 대해서 명확하게 표현할 것을 권고하고 있다. &#60;&#62; 안에 자료형을 넣는 것이 제너릭스이다. 보통 뒷.......

[Java] HashMap [내부링크]

key를 통해서 value를 얻어내는 HashMap 자료구조 Hashmap을 import 한 뒤에 사용한다. put put을 통해서 HashMap에 값을 넣을 수 있다. get get을 통해서 key에 해당하는 value 값을 얻을 수 있다. get 메서드를 사용했을 때 Map의 key값에 해당하는 value가 없을 경우에 get 메서드를 사용하면 null이 리턴이 된다. null 대신 default 값을 얻고 싶으면 getOrDefault 메서드를 사용한다. containsKey containsKey 메서드를 사용해서 Map에 해당 key가 있는지 확인한 뒤 결괏값을 리턴한다. remove remove 메서드는 Map의 항목을 삭제하는 메서드로 key에 해당하는 아이템을 삭제한 후 그 value 값을 리턴한다. size size 메서드는 Map의 개수를.......

[Java] HashSet [내부링크]

중복을 허용하지 않고 순서가 없는 set 자료구조 순서가 없기에 인덱싱으로 값을 얻을 수 없다. retainAll retainAll을 이용하면 교집합을 간단히 구할 수 있다. hashSet1의 데이터를 유지하기 위해서 hashSet1으로 intersection이라는 HashSet 객체를 Copy 해서 생성했다. 만일 intersection을 사용하지 않고 hashset1에 retainAll 메서드를 사용하면 hashSet의 내용이 변경된다. 을 하게 되면 교집합이 있으면 true를 리턴하고 없으면 false를 리턴한다. hashSet1을 다시 출력하게 되면 hashSet1이 [5, 6, 7]로 변한 걸 확인할 수 있다. addAll addAll 메서드를 사용해서 합집합을 구할 수 있다. 두 set에서 중복된 값은 한 개씩만 표현이 된다.......

[Java] Enum [내부링크]

Enum은 서로 관련이 있는 여러 개의 상수 집합을 정의할 때 사용하는 자료형이다. Enum 위와 같이 선언한 뒤에 불러올 때는 Developer. ~ 형식으로 불러온다. 숫자를 리턴하는 게 아니라 그 문자 그대로를 리턴한다.

python mysql에 현재 시간 insert 하기 [내부링크]

db table에 현재 시각을 넣어야 되는데 어떻게 넣어야 되는지 찾아보았다. 로 하면 된다.

GDSC KR WINTER 해커톤 [내부링크]

헷 난생 처음으로 해커톤 나가봅니다. 기대가 되는구만! https://linktr.ee/gdsckr.hackathon 신청은 여기서~

Error starting ApplicationContext. To display the conditions report re-run your application with 'de [내부링크]

Error starting ApplicationContext. To display the conditions report re-run your application with &#x27;debug&#x27; enabled. run - edit Configurations modify options 클릭 enable debug output 체크표시 하면 에러 해결

could not autowire. no beans of 'bcryptpasswordencoder' type found [내부링크]

spring config 파일 생성 후 @Bean 해줌 자기꺼에 맞게 해주면 됨

spring security 화면 없애기 [내부링크]

spring을 실행시키는데 만들지 않은 화면이 나와서 구글링 해보았다. 찾아보니 security를 dependency에 넣으면 자동으로 추가되는 화면이라고 한다. 이걸 없애려면 넣어주면 된다.

Docker 정리 [내부링크]

GDSC NestJS 스터디 용 Docker 정리 도커란? 서비스 형태의 플랫폼(Platform as a service, PaaS)은 서비스 제공 업체가 고객에게 플랫폼을 제공함으로써 고객이 일반적으로 소프트웨어 개발 프로세스에 필요한 인프라를 구축하고 유지할 필요 없이 비즈니스 애플리케이션을 개발, 실행, 관리할 수 있도록 하는 클라우드 컴퓨팅을 의미 이런 PaaS의 대표주자가 Docker 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 컨테이너는 독립적인 공간에서 프로세스가 동작하는 기술로, 가상화 기술의 하나이다. - 가상화 &#x3D;&#62; 현실이 아닌 것을 실제처럼 생각하고 봄, 또는 그렇게 함 &#x3D;&#62; 컴퓨터 용어에서는 물리적인 컴퓨터 리소스.......

docker 정리 2 [내부링크]

run run 명령어는 컴퓨터에 이미지가 없으면 Docker hub로부터 다운 받아서(pull) 내 컴퓨터에 컨테이너로 만들고 있으면 바로 실행한다. -it는 컨테이너를 열고 그 환경 안에서 CLI를 사용한다는 것 run 명령어 후 바로 이미지 파일이 실행되게 되어있다. images docker images 명령어를 통해서 다운로드 된 이미지들을 볼 수 있다. node 이미지가 있기에 docker run -it node를 하게 되면 다운로드하지 않고 바로 실행된다. pull run 명령어를 사용하면 이미지가 없을 때 자동으로 다운 받는 거고 pull은 최신 버전으로 다시 다운 받을 때 사용한다. 이미지가 업데이트된 경우는 pull 명령어를 통해서 새로 다운 받는다. rmi rmi 뒤에 이미지 I.......

한빛미디어 서평단 선정 [내부링크]

호호호 블로그 하면서 가장 해보고 싶었던 것 중 하나가 서평단이었는데 때 마침 한빛미디어에서 서평단을 모집해서 지원해 봤다. 블로그를 열심히 해서 붙여준 것 같다~ 아님 말고 ㅎ 한빛미디어에 개발 책들도 많아서 이 기회에 개발 책 많이 읽어봐야겠다 이야후~

io.jsonwebtoken.security.WeakKeyException: The signing key's size is 32 bits which is not secure eno [내부링크]

JWT 암호화 알고리즘을 사용할 때 secret key가 256bit를 넘겨야되는데 256bit 보다 작기 때문에 발생하는 오류이다. secretKey를 이렇게 길게 바꿔주니 오류없이 나오게 된다.

JAVA String class [내부링크]

Java에서 String을 선언할 때는 2가지 방법을 사용 new를 쓰지 않고 바로 String에 할당. 이렇게 사용하면 상수 영역에 저장이 된다. 즉 str3가 선언되고 난 뒤 str4를 선언하면 상수 영역에서 hello world가 있는지 보고 hello world가 있으면 같은 변수를 가리키게 한다. new를 사용해서 만들 수도 있다. 이 경우는 상수 영역을 참조하지 않기에 만들어질 때마다 다른 인스턴스이다. 문자열을 비교할 때 &#x3D;&#x3D;를 쓰게 되면 변수의 레퍼런스를 비교한다. 변수의 저장하는 문자열이 같은 지 확인하고 싶다면 equals 메서드를 사용하면 된다. 또한 String은 불변 클래스로 인스턴스가 될 때 가지고 있던 값을 나중에 수정할 수 없다. lengt.......

도커 설치 및 컨테이너 실행 [내부링크]

초보를 위한 도커 안내서 - 도커란 무엇인가?를 보고 정리한 내용입니다. 도커는 리눅스 컨테이너 기술이므로 windows에 설치할 경우 가상머신에 설치가 된다. windows에서는 홈페이지 들어가서 docker for windows 설치하면 된다. 버전 정보가 클라이언트와 서버로 나눠져있다. 도커는 하나의 실행파일이지만 실제로 클라이언트와 서버역할을 각각 할 수 있다. 도커 커맨트를 입력하면 도커 클라이언트가 도커 서버로 명령을 전송하고 결과를 받아 터미널에 출력해준다. 기본 값이 도커 서버의 소켓을 바라보고 있기에 사용자는 의식하지 않고 마치 바로 명령을 내리는 것 같은 느낌을 받는다. - daemon이 뭔지 찾아보기 ubuntu run 명령어를 사.......

[NestJS] IoC, DI, Singleton [내부링크]

provider - provider는 Nest의 기본 개념 - 대부분의 Nest 클래스는 service, repository, factory ,helper 등 provider로 취급될 수 있다. - provider의 주요 아이디어는 dependency로 주입할 수 있다. - dependency로 주입할 수 있다는 의미는 object가 다른 object와 다양한 관계를 만들 수 있고, 객체의 instance를 &#34;wiring up&#34; 기능은 NestJS runtime system에 위임될 수 있다. IoC Dependency Injection(DI)는 IoC 기술로, 사용자 자신의 코드로 종속성을 인스턴스화하는 대신 IoC 컨테이너(NestJS) 런타임 시스템)로 위임한다. - 개발자가 제어할 영역을 NestJS에게 넘겨줌 - NestJS는 providers 사이의 관계를 해결해 주는 내.......

Docker 배우기 [내부링크]

node 이미지는 리눅스에 Node.js가 설치된 상태를 클라우드에 올려놓은 것이다. 일단 도커는 나의 컴퓨터에서 node 이미지를 찾아보고 없으면 Docker Hub으로부터 해당 이름으로 등록된 이미지를 다운 받게 된다. run 명령어는 컴퓨터에 이미지가 없으면 다운 받아서 내 컴퓨터에 컨테이너로 만든다. -it는 컨테이터를 열고 그 환경 안에서 CLI를 사용한다는 것이다. 또한 이 이미지 파일은 다운로드 되면 바로 node가 실행되게 설정되어있다. 다운되어진 이미지들은 볼 수 있다. 현재는 node 이미지만 다운이 되어있다. 그렇기에 다시 docker run -it node를 하게 되면 이미지를 다운 받지 않고 바로 실행이 된다. 실행중인 컨테이너에 대한 정.......

[NestJS] 인증 구현을 위한 준비 [내부링크]

auth 모듈을 생성해 준다. user를 위한 dto을 생성해 준다. 유저에 대한 인증을 하는 것이니 유저가 필요하다. loginUser.dto.ts User Repository를 만들고 auth module 안에 넣어준다. authService에 UserRepository를 종속성 주입해 준다. 출처 : https://www.youtube.com/watch?v&#x3D;3JminDpCJNE&#38;feature&#x3D;youtu.be

[NestJS] 회원 가입 기능 구현 [내부링크]

유저 회원 가입 기능 구현 user.repository.ts auth.service.ts auth.controller.ts 흠.. user에다가 해준거랑 똑같은데 나중에 뭐 하려고 auth에다가 해준건가 출처 : https://www.youtube.com/watch?v&#x3D;3JminDpCJNE&#38;feature&#x3D;youtu.be

[NestJS] 비밀번호 암호화 구현 [내부링크]

비밀번호를 암호화 할 때는 bcryptjs 모듈을 사용한다. 사용할 때는

[NestJS] JWT 이용해서 토큰 생성하기 [내부링크]

JWT 모듈을 이용해서 토큰을 생성한다. 이때 passport라는 모듈도 함께 사용할 것인데 passport 모듈이 JWT 인증 처리하고 하는 등의 과정을 훨씬 쉽게 만들어준다. authmodule에 다음과 같이 넣어준다. secret의 토큰을 만들 때 이용하는 Secret 텍스트 ,Hashing 알고리즘에 사용이 된다. 토큰 생성 아무 문자열이나 넣어도 된다. expiresin : 정해진 시간 이후에 토큰이 유효하지 않게 된다. 단위는 second PassportModule에도. jwt를 추가해준다. 로그인 성공 시 JWT를 이용해서 토큰 생성해준다. AuthService에서 Signin 메서드에서 생성해주면된다. auth 모듈에 jwt를 등록해주었기 때문에 Service에서 JWT를 가져올 수 있다.

[NestJS] ERROR [ExceptionHandler] JwtStrategy requires a secret or key [내부링크]

어우 한 3시간 쓴 알고 보니 오류인데 import 잘못한 거였다. local.strategy.ts local.strategy.ts에서 passport-local로 해줘야 되는데 passport-jwt로 선언해서 안됐다. 심지어 구글링에서 계속 봤는데 영어 해석을 반대로 해서 못 고치고 있었다. 이럴 수가!!! jwt.strategy.ts jwt.strategy.ts에서는 jwt로 해줘야 한다.

[NestJs] ERROR [ExceptionsHandler] Unknown authentication strategy "jwt" [내부링크]

왜 안되나 했더니 authmodule에 provider에 jwtStrategy를 안넣어줘서 그랬다.

python과 mysql 연결 [내부링크]

구글링 해보면 많이 나오는데 설명이 좀 부족한 느낌 그리고 무지성 복붙하면 안된다. table 이름이 다 달라서 먼저 를 설치해 준다. mysql과 python을 연결할 수 있다. 먼저 host에는 127.0.01을 써주고 user에 root를 써준다. 자기 DB에 맞게 쓰면 된다. 비밀번호는 db 접속할 때 쓰는 걸로 쓰면 된다. db에는 왼쪽에서 내가 접근하려고 하는 db 이름을 써주면 된다. 나는 candiformation에 접근할 거기에 candiformation을 써줬다. curs를 만들어준다. curs는 데이터베이스에 sql 문을 실행하거나 실행된 결과를 돌려받는 통로이다. 그다음 중요한 게 자기 db 안에 있는 table 이름으로 써야 된다. user를 써야 됨 candiformation에 user가 있.......

잊지 못할 하루 [내부링크]

1월 11일 생일이다 이렇게 많은 생일선물과 축하를 받은 건 처음이다!!!!!!! 정말 평생 잊지 못할 하루이다!! 축하해 준 모든 분들도 잊지 않겠습니다. 인싸로 만들어준 GDSC ㅠㅠ 케이크 고마워요~~ 생일선물도 고마워요~~ 우리 GDSC 솔챌 팀원들 챙겨줘서 고마워요~~ 호호,, 생일선물과 축하 보내준 모든 분들 감사합니다~~

Docker [내부링크]

초보를 위한 도커 안내서 - 도커란 무엇인가?를 보고 정리한 내용입니다. 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼 - 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공해 프로그램의 배포 및 관리를 단순하게 한다. 컨테이너는 격리된 공간에서 프로세스가 동작하는 기술, 가상화 기술의 하나이지만 기존의 방식과는 차익 있다. 기존 가상화 방식은 주로 OS를 가상화. 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식이다 -&#62; 여러 가지 OS를 가상화(리눅스에서 윈도우) 할 수 있지만 무겁고 느려서 운영환경에선 사용할 수 없다. 이 문제를 개선하기 위해 CPU의 가상화 기술을 사용한 KVM(Kern.......

AWS RDS 생성 [내부링크]

AWS 홈페이지로 가서 RDS로 간 뒤 데이터베이스 생성을 눌러줍니다. 위와 같이 뜨는데 저는 MySQL을 사용할 것이기에 MySQL을 눌러줍니다. 스크롤을 내리면 위와 같이 뜹니다. 1번은 MySQL 버전 선택 2번에서 프리티어를 선택해 줍니다. 3번과 4번은 자동으로 생성됩니다. 처음에 바꿔도 됩니다. 5번에 암호를 설정합니다. 암호 확인해 주고 버스터블, 20으로 해줍니다. 기본으로 해줍니다. 퍼블릭 액세스를 예로 바꿔주고 기존 항목 선택입니다. 암호 인증 후 데이터베이스 생성 누르면 됩니다. DB 인스턴스로 가면 한 10분 뒤에 상태가 사용 가능으로 바뀔 겁니다. databaes-1을 클릭해 줍니다. 엔드포인트가 뜨는데 DB에 접근할 때 필요한 주.......

AWS RDS에 MySQL 연결 [내부링크]

MySQL을 키고 New Connection으로 갑니다. connection name은 원하는 거 Method는 TCP/IP Host Name은 아래의 사진처럼 AWS DB 인스턴스에서 엔드포인트를 써주면 됩니다. username은 DB를 만들 때 설정한 이름을 하면 됩니다. 만들 때 admin으로 했기에 username도 admin으로 합니다. store in ~을 눌러서 비밀번호를 설정하는 데 DB를 만들 때 admin에 한 비밀번호랑 똑같이 해줍니다. 다 했으면 ok를 누르고 aws db로 갑니다. VPC 보안 그룹으로 갑니다. default 클릭 인바운드 규칙, 편집 규칙 추가, MySQL, Anywhere, 규칙 저장 다시 mysql workbench로 갑니다. connection을 만들고 제대로 됐다면 비밀번호 입력이 뜹니다. 위와 같이 DB에.......

AWS에서 DB 연결 및 pm2 이용 서버 배포 [내부링크]

DB 연결 putty를 이용해서 aws ubuntu에 접속한 후 git clone 합니다. 저는 nestJS, prisma를 사용하기에 필요한 것들을 설치해 줍니다. 등등해줍니다. 이때 git clone 할 때 ignore에. env 파일 있었으면 새롭게 만들어주면 됩니다. npx prisma db push를 하면 db에 정상적으로 들어갑니다. 저는 이미 있어서 already라고 뜨긴 합니다. 물론 바로 prisma db push 한다고 해서 생성이 되는 게 아니라 schema.prisma로 가서 스키마 생성해 줘야지만 들어갑니다. 서버 배포 80번 3000번 443번을 인바운드 규칙에서 추가해 줍니다. EC 2로 가서 IPv4 퍼블릭 IP를 복사합니다. 다시 putty로 가서 를 합니다. 실행이 되면 위와 같이 뜨고 url에 을 입.......

Error: listen EADDRINUSE: address already in use :::3000 [내부링크]

를 했을 때 Error: listen EADDRINUSE: address already in use :::3000 이런 에러가 뜬다. 영어 해석에서 알다시피 이미 3000번 포트를 사용하고 있어서 발생하는 오류이다. 을 통해서 3000번 포트를 사용하는 프로세스를 보여준다. 지금 PID 10385가 사용하고 있다. 위의 코드로 10385 프로세스를 강제 종료 시킨다. 다시 lsof를 해보면 아무것도 뜨지 않는다.

Docker 설치 및 WSL2 해결 [내부링크]

https://www.docker.com/get-started 도커 사이트로 가서 Download for Windows를 누릅니다. 저는 둘 다 체크해주고 확인 눌렀습니다. 한 3~4분 기다리면 위와 같이 뜨고 Close 누릅니다. 바탕화면의 Docker를 클릭해줍니다. accept the terms를 누르고 Accept를 누릅니다. 원래는 WSL2 문제가 뜰텐데 저번에 해서 해결해서 안 뜨나 봅니다. https://velog.io/@kiyoog02/Docker-%EC%84%A4%EC%B9%98 WSL2 문제는 우리 ㄱㅇㅇ 블로그 가서 해결하면 됩니다.! 저는 잘 WSL2 해결하면 위와 같이 잘 뜹니다.

AWS EC2 생성 및 putty 이용 접속 [내부링크]

AWS EC2 생성 aws 사이트에 가서 로그인을 합니다. 주황색 인스턴스 시작을 누릅니다. 단계 1로 넘어가는데 저는 우분투를 사용할 것이기에 ubuntu Server 18.04를 선택합니다. 단계 2로 가면 기본 설정된 t2 micor 프리티어 사용가능이 있는데 이걸로 하고 아래의 다음을 누릅니다. 단계 3은 딱히 설정할 게 없습니다. 다음을 눌러줍니다. 단계 4에서는 프리트어는 30GB까지 사용하니 30으로 바꿔주고 다음을 누릅니다. 단계 5도 넘어가줍니다. 단계 6입니다. 쉽게 말해서 만든 ec2 서버에 누가 접속할지를 정해주는 것입니다. 규칙 추가를 누르고 유형을 SSH로 바꾸고 소스에서 내 IP를 누르면 자동으로 제 아이피로 설정이 됩니다. 설명에는 이.......

[NestJS] 게시물을 위한 entity 생성 [내부링크]

TypeORM을 사용할 때는 데이터베이스 테이블로 변환 되는 class이기 때문에 클래스를 생성한 후 그 안에 칼럼들을 정의해 주면 된다. src 밑의 boards에 board.entity.ts 파일을 만들어준다. @Entity() - Entity 데코레이터 클래스는 Board 클래스가 entity 임을 나타내는 데 사용된다. - Create Table board 부분이다. @PrimaryGeneratedColumn() - 이 데코레이터 클래스는 id 열이 Board 엔터티의 기본 키 열임을 나타내는 데 사용된다. @Column() - column() 데코레이터 클래스는 Board 엔터티의 title 및 description과 같은 다른 열을 나타내는 데 사용된다. 위의 코드를 통해서 Entity 클래스 Board가 생성된다. TypeORM은 데이터베이스의.......

[NestJS] Repository 생성하기 [내부링크]

Repository 레포지토리는 엔티티 개체와 함께 작동하며 엔티티 찾기, 삽입, 업데이트, 삭제등을 처리한다. 데이터베이스에 관련된 일은 서비스에서 하는게 아닌 repository에서 하면된다. 이걸 Repository Pattern이라고 부른다. INSERT, FIND, DELETE 등등 repository 생성 1. repository 생성하기 - board.repository.ts 2. 생성한 파일에 repository를 위한 class 생성하기 - 생성 시 Repository class를 extends 해준다. (Find, Insert, Delete 등 entity를 컨트롤 해줄 수 있다.) @EntityRepository() - class를 사용자 정의 저장소로 선언하는 데 사용된다. 사용자 지정 저장소는 일부 특정 엔터티를 관리하거나 일반 저장소 일 수 있다. 3.......

[NestJS] ID를 이용해서 DB에서 특정 게시물 가져오기 [내부링크]

지금까지는 메모리에서 데이터를 가져왔는데 이제는 메모리가 아닌 데이터베이스에서 가져오고 TypeORM을 쓸 때는 Repository 패턴을 사용한다고 했기에 Board 서비스(service)에 Board 레포지토티를 넣어주면 된다. constructor에서 service를 사용하기 위해서도 종속성 주입을 한 것처럼 service에서 repository를 사용하기 위해서도 종속성 주입을 한다. contructor와 다르게 respoitory를 주입하려면 @InjectRepository(BoardRepository) 데코레이터를 이용해서 이 서비스에서 BoardRepository를 이용한다고 알려주고 이걸 boardRepository 변수에 넣어준다. Service에서 getBoardById 메서드를 생성 - typeORM에서 제공하는 findOne 메서드.......

[NestJS] 게시물 생성하기 [내부링크]

DB를 이용해서 게시물을 생성한다. service에 아래 코드를 작성해 준다. createBoard 함수를 이용해서 board를 생성해 준다. create는 NestJS의 내장 메서드로 객체를 생성해 주고 save도 내장함수로 데이터베이스에 저장해준다. controller로 가서 Post 데코레이터를 이용해서 데이터를 생성하고 Pipes를 이용해서 유효성 검사를 해준다. return 값으로 board를 만들어준다. Postman을 이용해서 POST를 해보면 위와 같이 정상적으로 나온다. SQL에 가서 확인해 봐도 정상적으로 나온다. 데이터베이스 관련된 로직은 Repository로 이동하면 된다. Repository Pattern은 서비스에 있는 데이터베이스 관련 로직을 Repository 쪽으로 모아주면 된다.......

네이버 부스트캠프 AI Tech 3기 합격 [내부링크]

인생은 정말 아무도 모른다. 이걸 추합으로 붙을 줄은 몰랐네요.. 나도 다른 사람들 쓰는 것처럼 써봐야지. 정보 - 전공자(주전공 : 산공, 복수전공 : 컴공) - ai 관련 통계, 수학, 이론 수업 많이 들었고 따로 공부도 많이 했습니다. 동아리 활동도 하고 - 22년 기준 4학년 됩니다. - 백준 플래티넘 5, 약 690문제 정도 풀었습니다. - 일반전형 지원 서류 원래는 부스트캠프에 관심이 없었습니다. 그래서 지원조차 생각을 안 하고 있었습니다. 진로에 대한 고민을 정말 많이 했습니다. 연구자를 할지 개발자를 할지,, 근데 딱 한곳으로 정하기가 어렵더라고요, 연구자를 하기에는 공부 스타일이 안 맞는 것 같고 개발자 재밌는 것 같은데 뭔가 평.......

네이버 부스트캠프 AI Tech 3기 포기 [내부링크]

졸업 문제, 진로 문제 그리고 동아리가 더 소중해서ㅋㅋㅋㅋ 이거 하면 사실상 동아리 포기라,, 그건 안돼서 고민 끝에 포기합니다.. 2학기때도 관심 있으면 그때 다시 해 볼 생각입니다. 동아리랑 개인 공부 열심히 하겠습니다!

[NestJS] 1주차 과제 환경설정 및 user [내부링크]

1주차 과제는 아래와 같습니다. 복습 겸 처음부터 다 간단하게 작성해 보겠습니다. 시작하기 스터디에서는 TypeScript + NestJS + ORM + MySQL을 사용합니다. visual studio code를 키고 각자 파일에 를 통해서 nestjs/cli를 설치해 줍니다. 을 통해서 nestJS 프로젝트를 만들어줍니다. prisma를 설치해 주고 prisma를 로컬에서 호출해 줍니다. npx prisma init을 하면 위와 같이 prisma 폴더에 schema.prisma가 생성됩니다. mysql을 사용하기에 db의 provide를 mysql로 바꿔줍니다. 이제 MySQL로 갑니다. 아이디 root로 하고 port 3306으로 DB를 만들어줍니다. .env 파일로 DATABASE_URL을 위와 같이 바꿔줍니다. root:비밀번호@포트 번호/DB에.......

[NestJS] 파이프를 이용한 유효성 체크 [내부링크]

파이프를 이용해서 게시물을 생성할 때 유효성 체크를 해본다, 필요한 모듈 파이프를 만들 때 필요한 모듈 class-validator, class-transformer npm install class-validator class-transformer --save 현재까지의 코드는 title과 description이 &#34;&#34;여도 값이 전달이 된다. 하지만 빈 값은 전달되면 안되기에 파이프를 이용해서 유효성 검사를 해준다. @IsNotEmpty()를 이용해서 자동으로 유효성 검사를 해준다. controller로 가서 UsePipes를 이용한다. 이제 다시 포스트맨에서 send 해보면 다음과 같이 에러 메세지가 나오게 된다. 출처 : https://www.youtube.com/watch?v&#x3D;3JminDpCJNE&#38;feature&#x3D;youtu.be

[NestJS] 특정 게시물을 찾을 때 없는 경우 결괏값 처리 [내부링크]

현재까지는 특정 게시물을 ID로 가져올 때 만약 없는 아이디의 게시물을 가져오려고 한다면 결괏값으로 아무 내용이 없다고 돌아온다. 그렇기에 그 부분에 게시물이 없다면 없다고 내용을 넣어서 클라이언트로 보내준다. 다음과 같이 없는 아이디를 보내도 에러가 뜨지 않는다. 에러를 표출해 주기 위해서는 찾는 게시물이 없을 때 예외 인스턴스를 생성해서 이용해 주면 된다. Service로 가서 아래와 같이 만들어준다. found가 없으면 예외를 발생시켜준다. 다시 하게 되면 정상적으로 NotFound라고 뜨게 된다. 원하는 문구를 넣고 싶으면 NotFoundException에 문구를 넣어주면 된다.

[NestJS] 없는 게시물을 지우려 할 때 결괏값 처리 [내부링크]

없는 게시물을 지우려 할 때도 에러 값을 주는 걸 구현해 보도록 하자. 구현 방법은 getBoardById를 이용해서 지우려고 하는 게시물이 있는지 체크를 해준 후에 있다면 지워주고 없다면 에러 문구를 보내주면 된다. 기존에는 아래와 같다. 이렇게 바꿔준다. 이미 getBoardById에서 id가 없으면 에러를 발생시키고 아닌 경우가 return 해줬기에 위에서도 found를 하고 따로 if 문으로 예외 처리를 안 해줘도 된다. 출처 : https://www.youtube.com/watch?v&#x3D;3JminDpCJNE&#38;feature&#x3D;youtu.be

[NestJS] 커스텀 파이프를 이용한 유효성 체크 [내부링크]

NestJS에서 미리 구성해 놓은 bulit-in 파이프 말고도 따로 생성할 수 있는 커스텀 파이프가 있다. 커스텀 파이프 구현 방법 먼저 PipeTransform 인터페이스를 새롭게 만들 커스텀 파이프에 구현해 줘야 한다. 이 PipeTransform 인터페이스는 모든 파이프에서 구현해 줘야 하는 인터페이스이다. 이것과 함께 모든 파이프는 transform() 메서드를 필요로 한다. 이 메서드는 NestJS가 인자(arguments)를 처리하기 위해서 사용된다. 사용하기 위해서 boards 밑에 pipes 폴더를 만들고 board-status-validation.pipe.ts 파일을 만들어준다. Status는 update 하는 부분에서 사용되기에 위에서 만든 파이프를 update 부분에 넣어준다. 포스트맨을 이용.......

[NestJS] TypeORM [내부링크]

TypeORM TypeORM은 node.js에서 실행되고 TypeScript로 작성된 객체 관계형 매퍼 라이브러리이다. TypeORM은 MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana 및 WebSQL과 같은 여러 데이터베이스를 지원한다. ORM(Object Relational Mapping) 객체와 관계형 데이터베이스의 데이터를 자동으로 변형 및 연결하는 작업이다. ORM을 이용한 개발은 객체와 데이터베이스의 변형에 유연하게 사용할 수 있다. TypeORM 특징과 이점 - 모델을 기반으로 데이터베이스 테이블 체계를 자동으로 생성할 수 있다. - 데이터베이스에서 개체를 쉽게 삽입, 업데이트 및 삭제할 수 있다. - 테이블 간의 매핑(일대일, 일대다 및 다대다)을 만.......

[NestJS] TypeORM 애플리케이션에서 사용하기 [내부링크]

TypeORM을 사용하기 위해서 설치해야 하는 모듈 - @nestjs/typeorm NestJS에서 TypeOrm을 사용하기 위해 연동시켜주는 모듈 - typeORM TypeORM 모듈 - pg Postgres 모듈 src 밑에 config 폴더를 만들고 typeorm.config.ts를 만들어서 typeorm에 관한 설정을 해준다. entities를 이용해서 데이터베이스 테이블을 생성해 준다. 그래서 엔티티 파일이 어디에 있는지 설정해 준다. synchronize는 true 값을 주면 애플리케이션을 다시 실행할 때 엔티티 안에서 수정된 칼럼의 길이 타입 변경 값들을 해당 테이블을 Drop 한 후 다시 생성해 줍니다. app.module.ts로 가서 typeorm을 사용할 수 있게 연결해 준다.

[NestJS] 게시물 생성하기 Controller [내부링크]

Service에서 로직을 만들어줬기에 Controller에서 불러와준다. Request와 Response 부분 처리 Service에서 로직 부분을 처리했으면 request와 response 부분 처리는 Controller에서 해주면 된다. 클라이언트가 서버에 요청을 하기에 @Post()을 해주고 밑에 메서드를 만들어준다. 이때 여기서 클라이언트가 게시물의 이름 등 정보를 보내주기에 정보를 처리해 줘야 한다. NestJS에서는 @Body body를 이용해서 가져온다. 이렇게 하면 모든 request에서 보내온 값을 가져올 수 있고, 하나씩 가져오려면 @Body(&#x27;title&#x27;) title 혹은 @Body(&#x27;description&#x27;) description 이런 식으로 가져오면 된다. body 안에 게시물에 대한 정보가.......

[NestJS] Data transfer Object(DTO) [내부링크]

DTO는 계층 간 데이터 교환을 위한 객체이다. DB에서 데이터를 얻어 Service나 Controller 등으로 보낼 때 사용하는 객체를 말한다. DTO는 데이터가 네트워크를 통해 전송되는 방법을 정의하는 객체이다. Interface나 class를 이용해서 정의할 수 있고 NestJS에서는 클래스를 이용하는 것을 추천한다. DTO는 데이터 유효성을 체크하는 데 효율적이고 더 안정적인 코드로 만들어준다. 타입스크립트의 타입으로도 사용이 된다. Board를 위한 Property들을 여러 곳에서 사용하고 있다. (title , description)을 Controller와 Service에서도 사용한다. 간단한 애플리케이션에서는 몇 개의 프로퍼티만 불러주고 몇 군데에서만 불러주면 된다. 하지만 규.......

[NestJS] 게시물 생성을 위한 DTO [내부링크]

DTO 파일 작성 class는 interface와 다르게 런타임에서 작동하기 때문에 파이프 같은 기능을 이용할 때 더 유용하다. 그래서 class를 사용해서 DTO를 작성한다. boards 폴더 밑에 dto 폴더를 만들고 그 안에 create-board.dto.ts 파일을 만들어준다. 다음과 같이 Board를 만드는데 필요한 title, description을 선언해준다. controller로 가서 아래처럼 바꿔준다. 오류가 나는 이유는 service 부분도 똑같이 바꿔줘야하기 때문이다. 똑같이 createBoardDto를 넣어준다. const {title,description} &#x3D; createBoardDto;를 이용하면 한 번에 title과 description을 받을 수 있다. 출처 : https://www.youtube.com/watch?v&#x3D;3JminDpCJNE&#38;.......

[NestJS] ID로 특정 게시물 가져오기 [내부링크]

ID를 이용해서 특정 게시물을 가져오는 기능이다. CRUD 중 R 부분 service 부분에서 getBoardById를 만들어서 boards 배열에 매개변수로 들어온 id와 일치하는 board를 찾아서 return 해준다. Controller에서는 위와 같이 만든다. id를 받기에 Get(id)를 이용해 주고 이때 정보를 보낼 때 localhost:5000:?id&#x3D;2138120840 이런 식으로 보내는데 @Body로 할 수 없고 @Param을 이용한다. id로 가져오면 된다. @Param 값을 id에 넣어준다. id와 title이 같이 오는 경우는 아래와 같이 ()로 한 뒤 배열로 받으면 된다. 출처 : https://www.youtube.com/watch?v&#x3D;3JminDpCJNE&#38;feature&#x3D;youtu.be

[NestJS] ID로 특정 게시물 지우기 [내부링크]

ID를 이용해서 특정 게시물을 삭제하는 기능을 구현해 본다. CRUD에서 D 똑같이 Service에 기능을 구현해 준다. filter를 이용해서 아이디가 같지 않은 것만 남긴다. 즉 id가 같은 걸 제외해버리는 것이다. Controller에서는 아래와 같이 작성한다. @Delete 데코레이터를 이용한다. 출처 : https://www.youtube.com/watch?v&#x3D;3JminDpCJNE&#38;feature&#x3D;youtu.be

[NestJS] 특정 게시물의 상태 업데이트 [내부링크]

CRUD의 UPDATE에 관한 부분 특정 게시물의 상태를 업데이트해주는 기능을 구현해 본다. 똑같이 Service에 기능을 구현해 준다. updateBoardStatus 함수에 id와 status를 인수로 받는다. 그다음 getBoardById(id)를 이용해서 id에 해당하는 board를 받아오고 board는 status 속성을 가지기에 status를 바꿔주고 return board 해준다. Controller 부분에서는 Patch를 이용해서 경로를 받아온다. Id는 Param을 이용해서 받고 status는 Body를 이용한다. 그 후에 return 해준다. 출처 : https://www.youtube.com/watch?v&#x3D;3JminDpCJNE&#38;feature&#x3D;youtu.be

[NestJS] Pipes [내부링크]

Pipe 파이프는 @Injectable () 데코레이터로 주석이 달린 클래스이다. 파이프는 data transformation과 data validation을 위해서 사용이 된다. 파이프는 컨트롤러 경로 처리기에 의해 처리되는 인수에 대해 작동한다. Nest는 메소드가 호출되기 직전에 파이프를 삽입하고 파이프는 메소드로 향하는 인수를 수신하고 이에 대해 작동을 한다. Data Transformation - 입력 데이터를 원하는 형식으로 변환하는 것이다. 예를 들어 문자열에서 정수형으로 - 만약 숫자를 받기를 원하는 데 문자열 형식으로 온다면 파이프에서 자동으로 숫자로 바꿔준다. String to Integer Data Validation - 입력 데이터를 평가하고 유효한 경우 변경되지 않은 상태로.......

[NestJS] Controller [내부링크]

Controller 컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답을 반환한다. 각각 알맞은 controller로 요청을 받고 반환해줌 controller는 @Controller 데코레이터로 클래스를 데코레이션하여 정의된다. boards Controllers 생성하기 nest : using nestcil g : generate controller : controller schematic boards : name of the schematic //컨트롤러의 이름 --no-spec : 테스트를 위한 소스 코드 생성 x CLI로 명령어 입력 시 Controller 만드는 순서 1. cil는 먼저 boards 폴더 찾기 2. boards 폴더 안에 controller 파일 생성 3. boards 폴더 안에 module 파일 찾기 4. boards 파일 안에다가 controller 넣어주기 Handler Handler는 @G.......

[NestJS] Board Service 만들기 [내부링크]

Board Service 만들기 Service 안에서는 데이터베이스 관련된 로직을 처리한다. 데이터베이스에서 데이터를 가져오거나 데이터베이스 안에 게시판 생성할 때 그 생성한 게시판 정보를 넣어주는 등의 로직을 처리한다. - nest : using nestcil - g : generate - service - boards - --no-spec boards.modules.ts에 providers가 자동으로 추가된다. boards.service.ts 파일이다. 이 파일에는 Injectable 데코레이더가 있고 NestJS는 이걸 이용해서 다른 컴포넌트에서 이 서비스를 사용할 수 있게(Injectable) 만들어준다. Board Service를 Board Controller에서 이용할 수 있게 하려면 Dependency Injection을 한다. NestJS에서 Dependency Injecti.......

굿바이 2021 [내부링크]

공부를 하면서 보내고 있습니다. 21년 수고했다. 22년 열심히 하자!!!!!!! 화이팅!!!!!!!!

[NestJS] Providers, Service [내부링크]

Providers 프로바이더는 Nest의 기본 개념이다. 대부분의 기본 Nest 클래스는 서비스, 리포지토리, 팩토리, 헬퍼등 프로바이더로 취급될 수 있다. 프로바이더의 주요 아이디어는 종속성으로 주입할 수 있다는 것이다. 즉 객체는 서로 다양한 관계를 만들 수 있고 객체의 인스턴스를 연결하는 기능은 대부분 Nest 런타임 시스템에 위임될 수 있다. 컨트롤러에서 사용할 수 있게 객체를 넣어주는 것 Provider를 사용하기 위해서는 Nest에 등록해 줘야지 사용할 수가 있다. 등록하기 위해서는 module 파일에서 할 수 있다. module 파일에 providers 항목 안에 해당 모듈에서 사용하고자 하는 Provider를 넣어주면 된다. 알맞은 서비스를 providers에.......

[NestJS] Boards Service 만들기 [내부링크]

모든 게시물을 가져오는 서비스 만들기 Read 이 로직은 Service에 구현하면 된다. 원래는 DB와 연동하면 되지만 먼저 데이터를 로컬 메모리에 담아서 처리해 본다. boards 배열 안에 게시물 데이터를 저장한다. private를 쓴 이유는 만약 private를 사용하지 않는다면 다른 컴포넌트에서 이 BoardsService에 접근해서 boards 배열 값을 수정할 수 있기 때문이다. 모든 게시물의 데이터를 가져올 수 있게 메소드를 만들어서 return 해준다. service에서 만들 거 controller에서 사용하면 된다. 요청을 보내는 request에는 여러 가지가 있지만 여기서는 가져오는 Get이기에 @Get 데코레이터를 이용하고 밑에 메소드를 만들어준다. 요청이 왔을 때 원.......

[NestJS] Board Model 정의 [내부링크]

CRUD의 C를 하기전에 게시물에 필요한 데이터가 어떤 것이 필요한 지를 정의해주기 위해서 게시물의 모델을 만들어준다. 예를 들어 게시물 데이터에는 ID가 필요하고 이름이나 설명등이 필요하다. 모델을 정의하기 위해서는 Class, Interface 이용 가능하다. Interface는 변수의 타입만을 체크하고 class는 변수의 타입도 체크하고 인스턴스 또한 생성할 수가 있다. interface로 구조를 정의해준다. 여기서 status는 게시물이 공개 게시물인지 아니면 비밀 게시물인지 나눠주는 것이다. 이 두가지 상태 이외에는 나오면 안되기 때문에 이 두가지 상태만 나올 수 있게 하기 위해서 ts의 기능인 enumeration을 이용한다. 생성한 Board 모델을 이용.......

[NestJS] 게시물 생성하기 Service [내부링크]

CRUD에서 Create인 게시물 생성하기 게시물에 대한 모델을 정의해 줬기에 이제는 게시물 생성하는 기능을 만들어준다. 게시물에 관한 로직을 처리하는 곳은 Service이다. 그래서 먼저 Service에서 로직을 처리해 준 후에 Controller에서 서비스를 불러와준다. service로 가서 createBoard를 만들어준다. 하지만 model를 만들 때 id 속성도 넣었기에 board에는 id가 없어서 오류가 뜬다. ID는 모든 게시물에 유니크해야 한다. 만약 DB에 데이터를 넣어줄 때는 DB가 알아서 유니크한 값을 준다. 하지만 현재는 DB를 안 쓰기에 임의로 유니크한 값을 줘야 한다. 이때는 여러 방법을 쓸 수 있지만 uuid 모듈을 이용해서 유니크한 값을 준다. 을 이용.......

[NestJs] 프로젝트 시작 및 기본 구조 [내부링크]

폴더 안에서 nest 기본 구조 생성 앱실행 Nest JS 기본 구조 설명 eslintrc.js 개발자들이 특정한 규칙을 가지고 코드를 깔끔하게 짤 수 있게 도와주는 라이브러리 타입스크립트를 쓰는 가이드 라인 제시, 문법에 오류가 나면 알려주는 역할 주로 문법에 오류를 찾아줌 prettierrc 코드 형식을 맞추는 데 사용한다. 작은따옴표를 사용할 지 큰 따옴표를 사용할지, Indent 값을 2로 줄지 4로 줄지등등, 에러 찾는 것이 아닌 코드 포맷터 역할. nest-cli.json nest 프로젝트를 위해 특정한 설정을 할 수 있는 json 파일 sourceRoot는 대부분 프로젝트 로직이 src에 있다. tsconfig.json 어떻게 타입스크립트를 컴파일 할지 설정 tsconfig.build.jso.......

[NestJs] Module [내부링크]

Nest JS를 사용해서 만드는 앱 구조 - App module안에 BoardModule과 AuthModule이 있으면 각 모듈안에 Controller, Entity , Service 등이 있다. - 게시판에 해당하는 board - 인증을 담당하는 Auth Module 모듈은 @Module {} 데코레이터로 주석이 달린 class이다. @Module {} 데코레이터는 Nest가 애플리케이션 구조를 구성하는 데 사용하는 메타 데이터를 제공한다. 각 응용 프로그램에는 하나 이상의 모듈(root)이 있다. 루트 모듈은 Nest가 사용하는 시작점이다. - 모듈은 밀접하게 관련된 기능 집합으로 구성 요소를 구성하는 효과적인 방법이다. 기능별로 만든다. ex) user, order, chat - 같은 기능에 해당하는 것들은 하나의 모듈 폴더.......

2021년 12월 28일 10만 달성 [내부링크]

10만 달성 기념으로 블로그 일대기를 한 번 써봅니다. 딱 10만에 찍으려고 했는데 깜빡하고 놓쳐버렸습니다.. 12월 28일 기준으로 비공개 글 포함해서 762개의 글이 있습니다. 블로그 이름인 류리상자는 가수 유리상자에서 따왔습니다. 뭘로 할까 하다가.. 상자처럼 뭘 담아버리자(?)라는 생각이 들어서 이걸로 했습니다. 2015년 10월 4일 블로그를 언제 처음 만든 지는 정확히 몰랐는데 20년에 진행한 블로그 마이 리포트에 떠가지고 15년 10월 4일에 만들었다는 걸 알게 되었습니다. 이때쯤이면 재수생 수능 한 달 전인데 왜 만들었을까요..? 네이버 아이디를 만든 시점인가, 사실 옛날에 뜨던 네이버 아이디가 있었는데 어느 순간 갑자기 아이.......

[ts] typescript로 블록체인 만들기 [내부링크]

노마드코더의 typescript로 블록체인 만들기 매개변수로 하나씩 넘겨주기 interface 이용 object 넘겨주기 js 컴파일 가능하게 class 이용 js에서 인터페이스를 쓰고 싶다면 class 활용 블록체인 블록체인 자체는 딱히 이해 안 했고 ts 어떻게 쓰는지 배우려고 봤다. 난 사실 js도 잘 몰라서 ts가 얼마나 혁명적인지는 잘 모르겠는데,, 흠 ts 자체를 깊게 배우고 싶다면 다른 거 하는 게 괜찮고 가볍게 배우고 싶으면 볼만한 듯

2021년 끝 [내부링크]

와우 벌써 2021년이 끝이다. 시간 정말 빠르다. 2021년이 끝이라는 건 나의 3학년이 끝이라는 거고 드디어 고대하던 4학년이 시작이라는 거다,, 4학년 되면 뭐라도 될 줄 알았는데 역시 말하는 감자다. 진짜 어떡하지? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 2020년 마지막에 한 것처럼 2021년을 정리해 봐야겠다. 기억이 애매하긴 한데,, 하나씩 정리해 봐야겠다. 1월 1월 1일에는 일찍 일어나서 일출을 봤습니다. 물론 집에서요^^ 이때 내가 무슨 소원을 빌었을까? 빌긴 했나 싶기도 하고,, 1월 2일부터 바로 대형면허 따러 갔습니다. 원래는 2종 보통이었는데 아빠가 그래도 1종은 있어야 되지 않냐라는 말씀에 1종 보통 건너뛰.......

GDSC 10월 활동기 [내부링크]

다시 돌아온 GDSC 활동기,, 12월이지만 10월 꺼를 쓴다 10월에는 시험기간이 겹쳐 있어서 2번 밖에 활동을 안 했다. 10월 5일 10월 4일에 7차 코어 회의를 했다. 그 다음날이 킹의 코틀린 세미나여서 리허설도 했다. 킹을 위해 만들어준 두유 노유 클럽 시리즈ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 지금 봐도 재밌넼ㅋㅋㅋㅋ 10월 5일에는 앗 코틀린, java 보다 짧다! 세미나를 진행했다. 기억에 남는 건 코틀린은 섬 이름이라는 것과 java에 비해서 굉장히 짧다는 것ㅋㅋㅋㅋㅋㅋ 그리고 지금 알았는데 PPT에 9월 28일이라고 나와있네!!!!!!!!! 10월 7일 10월 7일에는 ㄱㅇㅇ 깜짝 생일파티하러 갔다 나포함 공릉에 있는 3명은 직접 만나고 멀리 있는 사람들은 영.......

[2년 전 오늘] [일상] 류리의 자취일기(10) [내부링크]

우와우 이게 벌써 2년 전이네,, 시간 빠르다 2년전에 비하면 더 나은 내가 되었을까,. 음 실력은 모르겠는데 친구는 많아졌다,, 그러면 됐지!

크리스마스이브 [내부링크]

현금 300억과 가로수길 건물 3채요

[NLP] 통계 기반 기법, 동시 발생 행렬 [내부링크]

자연어처리의 방법 중 하나인 통계 정보로부터 단어를 표현하는 통계 기반 기법 통계 기반 기법에는 corpus가 사용이 된다. corpus는 대량의 텍스트 데이터를 의미한다. 통계 기반 기법 분포 가설 단어의 의미를 정확하게 파악할 수 있는 벡터 표현을 NLP에서는 단어의 분산 표현(distributed representation)이라고 한다. 단어의 분산 표현은 단어를 고정 길이의 밀집 벡터(dense vector)로 표현한다. 밀집벡터는 대부분의 원소가 0이 아닌 실수인 벡터를 말한다. NLP에서 단어를 벡터로 표현하는 기법 중에서 가장 중요한 아이디어는 &#x27;단어의 의미는 주변 단어에 의해 형성된다&#x27;라는 것이다. 이를 분포 가설(distributed hypothesis).......

성탄절 [내부링크]

친구들이랑 게임 열심히 했습니당 4시간이나 했네 꿀잼ㅋㅋㅋㅋ

교훈을 얻다 [내부링크]

1. 많은 사람들을 만나자! 2. 함부로 아니라고 단정 짓지 말자!

가장 잘한 일 [내부링크]

이 글 보자마자 바로 생각난 GDSC.. 정말 잘한 일이다!

[1년 전 오늘] 빨리 끝나라 [내부링크]

뭐야 작년에도 오늘이 종강이었구나.. 그래 빨리 끝나라 10시에 PL만보면 일단 시험은 끝이다.. 19일까지 팀플 해야지,,

시험 끝 [내부링크]

오늘 아침 10시에 마지막 시험 봤는데 정말 아무런 감정이 없네ㅋㅋㅋㅋㅋㅋㅋ 기쁘지도않고.. 아직 팀플이 남아서 그런가.. 묘하네 4학년땐 수업을 거의 안 들을 생각이라 이게 마지막 학기나 다름 없는데.. 흠 자세한 생각은 나중에 써야겠다 일단 닭갈비 먹어야함

크리스마스에는~ [내부링크]

진짜 이번 연도는 다를 줄 알았는데 후.. 해리포터 보거나 게더타운에서 코딩이나 해야지

연말까지 해야 될 것 [내부링크]

1. 기계학습 팀플 2. 아케인 보기 3. 지옥 보기 4. 종이의 집 보기 5. 스파이더맨 보기 6. 웹툰 한 개 정주행 하기 7. 귀멸의 칼날은,, 난 한 번에 몰아서 보는 게 좋은데 고민 좀 8. 한마 바키 보기 9. 혹시 모르니 알고리즘 공부하기 10. 21년 정리 블로그 쓰기 11. GDSC 활동기 쓰기 아 또 뭘 해야 되지.. 다 할 수 있을까? 충분하지 ㅎ

진짜 종강 [내부링크]

17일 날 시험이 끝났지만 19일 11시 59분까지가 팀플 마감일이었다.. 미루고 미루다가 18일부터 시작했다가 잘못하면 못 할 뻔했다.. 이번 학기 팀플 3개 있었는데 후.. 정말 쉽지 않았다,, 정말롴ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 팀플 3개 다 잘 마무리한 것 같다. 2개는 팀원들도 잘 만나서 별로 스트레스 없었는데 1개는 정말 팀원이 너무 별로였다!!!!!!!!!! 드디어 3학년 2학기 끝!!!!!!!!!!!!! 나도 이제 4학년이다!!!!!!!!!! 1학년 때 복학해서 언제 4학년 되냐 생각했는데 벌써 4학년이다!!!!!!!!!!!!! 시간이 너무 빠르다!!!!!!!!!! 나는 지금도 말하는 감자인데 어떡하지!!!!!!!!!!!! 취직은 할 수 있을까!!!!!!!!!!!! 대학원은 갈 수 있을까!!!!!!.......

솔루션 챌린지 팀 [내부링크]

후.. 다행히 GDSC 솔루션 챌린지 팀을 정했다. 빨리 정해서 다행이다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 1시간 동안 얘기하면서 &#34;아 이 사람이랑 같이 하고 싶은데?&#34;라고 생각했던 사람들이랑 다 됐다. 호잇~ 이번 방학 폐관 수련 갑니다~. 잘 할 수 있을까라는 생각이 당연히 들지만 해야지,, 그럼 이제는 해야 돼 진짜로!!!!!!! 이제는 정말로 해야 돼!!!!!!!!!!!!! 파이팅!!!!!!!!!

NVIDIA DLI(Deep Learning Institute) 수료 [내부링크]

오늘 10시부터 5시까지 학교에서 NVIDAI DLI 특강 들었다. 딥러닝 전반에 대해서 한번 쓱 배울 수 있어서 좋았다. 특히 지금까지 PyTorch만 고수 해왔었는데 오늘 Tensorflow/keras 써보고 굉장히 잘못된 생각이라고 깨달았다ㅋㅋㅋㅋㅋㅋㅋ 두루두루 다 써볼 걸 그랬다. 조금 밖에 안 써봤지만 keras 깔끔한 느낌이었다. 사실 공부하기도 tf/keras가 자료가 더 많아서 편하긴 한데.. 역시 함부로 배제하지말자! 요건 수료증~

대설 [내부링크]

오늘은 이쁜 초승달이 떴네 눈은 언제오니~~

[2021 마이 블로그 리포트] 블로그 빅데이터로 알아보는 '2021 내 블로그 스타일' [내부링크]

우와.. 나의 추억을 기록해주고 나를 발전할 수 있게 만들어준 고마운 블로그 많은 공감을 눌러준 정민이와 진한님에게 진심으로 감사의 말씀을 전합니다! 아니 자기 자신은 빼줘야지 ㅎ 확실히 7월에 인공지능에 빠져서 계속 공부하느라 글을 제일 많이 썼네..ㅋㅋㅋ 참고로 나는 2번째로 높은(?) 스타일이다 ㅋㅋㅋㅋ

으악 [내부링크]

종강 7일 전! 과연 7일 후에 나는 웃을 수 있을 것인가!!! 심심해서 블로그 환경설정 가봤는데 기본 글씨체를 바꿀 수 있네 이거 이쁘다. 딱 블로그 감성이네

겨울 영화 [내부링크]

연말에는 해리포터가 최고지.. 몇 년동안 크리스마스에 해리포터 전편을 다 보고 있다.. 이번 연도에는 안 보나 했는데 이번에도 볼 것 같다 ㅎ 오 이게 블로그씨 100번째 글이네!

하루 끝 [내부링크]

기숙사 침대에 누워서 웹툰을 봅니다.. 이때만큼은 걱정이 없는 듯 하네ㅋㅋㅋ

오 이걸 [내부링크]

이걸 합격하네 조금 풀다 나왔는데 예상치 못했지만 어쨌든 합격하니까 기분 좋다~ 오랜만에 보는 합격이구만 2차는 kotlin이라서 할 수가 없네 나는 아직 Java로 밖에 안드로이드를 못 하니ㅠ 근데 어차피 4일에 딥러닝 특강이랑 겹쳐서 못 하긴 하는데 아 왜 우리 학교는 Java로 안드로이드를 가르쳐줄까 kotlin으로만 했어도 한 번 도전해 보는데!!

아니! [내부링크]

연구실에서 기숙사 가는 길에 고양이를 보고 너구리까지!? 오늘 뭐가 좋은 날이 되려나!!

[1년 전 오늘] 12월의 기적 [내부링크]

아니 벌써 12월.. 시간은 참 빨라~ 이번에도 성적 잘 나오게 해주세요..

12월 [내부링크]

마지막 한 달.. 17일까지는 학교 공부에 집중하고.. 끝나고는 동아리랑 신청한 프로그램하고 친구들좀 만나고 그냥 아무 생각 없이 쉬고싶다

일상 글에 관하여 [내부링크]

몇 개월동안 거의 쓰지 않은 일상 카테고리 마지막 글도 6월이다. 음 중국인 친구랑 건대갔었구나 추억이네 어느순간부터 일상 글을 잘 안 올렸다. 잘려고 침대에 누웠다가 갑자기 왜 안 올렸을까라는 생각이 들어서 생각을 해보니 ㅋㅋㅋㅋㅋ걍 맨날 똑같은 일상에 기숙사 밥 먹고 어딜 놀러가지를 않으니 특별한 일이 없어서 안 올렸던 것 같다. 그리고 아마 가장 큰 이유는 한 번에 모아서 올리기가 귀찮았던 것 같다. 그래서 요즘은 잡담 카테고리에 사소하게 하나씩 하나씩 올리고 있다. 이게 오히려 시간도 별로 안 걸리고 그때의 기분을 잘 작성할 수 있어서 좋다. 뭐 아무도 묻지 않았지만 그냥 자기 아까워서 써본다.. 더 길게 쓸까 3초.......

GDSC 커리큘럼 끝 [내부링크]

와 오늘 11월 30일부로 ML 커리큘럼이 끝났다. 책 한 권을 끝내버렸다! 이외에 과제도 많이 하고 오늘 멤버들한테 물어보니 학교보다 과제가 많다고 했다.ㅎ 하지만 다 꼭 필요한 과제에 다 도움이 됐다고 말해서 뿌듯했다 호호호. 하.. 벌써 끝날 줄이야 시간이 너무 빠르다. 곧 있으면 종강이고 그래도 멤버들이 못 따라오거나 탈주하면 어쩌나 싶었는데 잘 따라와 줘서 다행이다. 오늘은 딱히 커리큘럼 안 하고 20분 정도 잡담하고 끝내버렸다. 모두 12월 21일에 봬요~

라즈베리파이를 해보자 [내부링크]

이번에 기계학습할 때 라즈베리파이 + AWS + CNN를 사용할 거라서 라즈베리파이를 샀다. 호호 살면서 처음 라즈베리파이를 해본다. 하드웨어를 다뤄보는 건 또 처음이라 재밌네 오늘 온 라즈베리파이, 나는 스타터 팩으로 샀다ㅋㅋㅋ 물론 내 돈은 아니고~ 라즈베리파이가 이렇게 생겼습니다!! 케이스 끼우고 카메라도 연결한 모습 카메라가 저렇게 생겼다. USB 카메라가 더 나을 것 같기도 하고 초기 설정하고 있다. 사실 나는 9000원 주고 초기 설정까지 다 된 상태로 라즈베리파이라서ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 한글 패치 이런 것도 다 되어있었다. 배경이 너무 감성적이다.. 이건 카메라 켜서 사진 찍는 화면 처음에 보고 서로 오~~~~~~~~~ 이랬다.......

나의 롤 모델 [내부링크]

롤 모델이라.. 일단 내 앞에 있는 롤케이크부터 해치우겠습니다.

[Android] firestore recyclerview 연동 [내부링크]

기록용입니다, realtimebase랑 recylcerview 연동은 많은데 아무리 찾아도 firestore recyclerview는 없어서 유튜브 찾아보다가 발견한 외국 유튜버.. 한 줄기 빛.. Shoes.java CustomAdapter.java main_recyclerview.xml home_fragment.java

GDSC 첫 오프라인 진행 [내부링크]

원래는 10월 활동기를 먼저 올려야 되는데 이건 오늘 꼭 올리고 싶어서 이것부터 올린다 오늘 2021년 11월 9일 처음으로 오프라인으로 커리큘럼을 진행했다. 물론 그전에 이미 Web은 하고 있었는데 우리 ML은 처음이었고 GDSC 21명이 동아리 활동 시작하고 난 뒤 처음으로 다 모인 날이었다. 물론 21명 다 같은 장소에 있었던 건 아니고 강의실 4개로.. 21명이 한 장소에 다 모이지는 않았습니다!!!!!! 방역수칙 잘 지켰습니다^^ 오프라인 하고 뭔가 기분이 좋다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 이렇게 좋은 곳에 속해 있다는 게 여러모로 긍정적인 영향을 주는 것 같다. 먼저 의정이 세미나 듣고 민찬, 건주의 커리큘럼.......

[Android] 안드로이드 프로그래밍 직접 풀어보기 10-3 [내부링크]

직접 풀어보기 10-3 두 수를 입력하고 더하기 빼기 곱하기 나누기 라디오버튼을 선택한 후 &#60;계산하기&#62;를 클릭하면 세컨드 액티비티에서 계산하고 값을 돌려받는 앱을 작성하라. 동영상 activity_main.xml 두 수를 입력 받는 EditText와 RadioButton, Button을 만들어준다. acitivy_second.xml Button 하나만 만들어준다. MainActivity.java startforActivity는 depreciate되기에 ActivityResultLauncher를 사용해준다. secondActivity.java

[Android] ListView [내부링크]

그리드 뷰, 리스트 뷰, 익스펜더블 리스트 뷰, 스피너, 갤러리 등을 묶어서 어댑터뷰라한다. 어댑터뷰는 그 자체로 사용하기보다는 하위 클래스로 사용한다. 실제로 어댑터뷰를 사용할 때는 어탭터뷰의 모양을 설정하고 데이터를 채워주는 ArrayAdapter&#60;T&#62; class를 사용한다. 동영상 ListView ListView는 데이터를 리스트 모양으로 주고 그중 하나를 선택하는 용도로 사용된다. XML을 이용해서 리스트뷰를 만들 때는 아래와 같은 형식을 따른다. 1. 리스트뷰에 나열할 내용을 미리 String 배열(원하는 데이터 타입)로 만들어놓는다. 2. 리스트뷰 변수를 생성하고 XML의 &#60;ListView&#62;에 대응시킨다. 3. ArrayAdaper&#60;String&#62;형 변.......

[Android] BottomSheetDialog에 Spinner 연결 [내부링크]

매우 감격스럽다. 며칠 동안 오류 났었는데 오늘 해결했다. 이런 건 블로그에 적어줘야 된다. array.xml 먼저 spinner에 넣을 메뉴들을 만들어준다. BottomSheet.xml Spinner를 위와 같이 만들어준다. 그럼 두 번째 칸의 화살표가 저렇게 뜬다. Java bottomSheet를 연결할 JAVA 파일로 간다. 먼저 위의 구문을 통해서 bottomSheetDialog을 화면에 띄운다. 그다음 spinner와 array.xml을 연결해 준다. 여기서 제일 중요한 게 spinner를 초기화할 때 위에 있는 view를 이용해서 view.findViewByid를 이용해야 한다. 별생각 없이 (Spinner) findViewById를 이용해서 계속 안됐다. view를 이용해야지 BottomSheet.xml에 있는 spinner를 찾을 수 있는.......

요즘 [내부링크]

블로그 투데이가 많이 높네.. 감사합니다.. 글도 계속 써야되는데,, 시험 끝나면 다시 열심히 써야겠다

[Android] BottomNavigationView 앱 실행 시 처음 선택되는 버튼 [내부링크]

음 제목을 어떻게 해야 될지 모르겠네 BottomNavigationView를 구현하면 아래의 사진처럼 가장 왼쪽에 있는 버튼이 선택되는 모양으로 나온다. 화면은 세 번째 화면인데 버튼은 첫 번째 버튼인 상황이 만들어진다. 실행했을 때 세 번째 화면이 나오면 버튼도 세 번째로 나오게 만들어줘야 한다. 요건 한 줄로 구현하면 된다. java 파일의 onCreate 부분에 아래처럼 setSelectedItemId을 해주고 버튼의 id를 넣어주면 된다. 그럼 이렇게 나오게 된다. 출처 : 갓ㅇㅈ..

MBTI를 다시 해봤다. [내부링크]

원래 나의 MBTI는 ISFJ이다. 최근에 생각보다 많은 사람들이 내가 ISFJ라고 하면 엥 너가 I라고? E인데라고 말해서 오늘 심심해서 다시 해봤다. 역시 결과는 I다. 그래 난 I다.ㅋㅋㅋㅋ E 성향이 있긴 하나 그래도 I다 나는. 내향적인 쪽에 더 가깝다. 이번에는 전혀 예상하지 못 한 INTJ가 나왔다. 누가 나한테 그랬다. mbti는 읽으면 다 맞는 것 같다고ㅋㅋㅋㅋㅋㅋㅋㅋ 이것도 읽으면 어느 정도 맞는 것 같긴 하다. 하지만 내 생각에는 ISFJ가 더 맞는 것 같다. 어느 정도 맞는 것 같기도 한데 아닌 것도 있다. 3번은 지금 필요하긴 하다 협업 경험해 봐야 되는데!! 음.. 시험 끝나고 다시 해봐야지 사실 예전에는 좀 약간 그렇다 약간 아니다.......

[Android] fragment에서 activity 이동 [내부링크]

fragment에서 버튼을 눌렀을 때 activity로 이동하는 방법 일단 초기화를 해줄 때 view.findViewByid를 해줘야 id를 찾아줄 수 있다. fragment에서는 this가 사용이 불가하기에 getActivity를 이용한다. 두 번째 매개변수에 이동할 activity를 넣어주면 된다.

[1년 전 오늘] 내일이면 시험 끝이다 [내부링크]

부럽다 난 모레 시험 끝나는데!!

달달하다 [내부링크]

4주 달달하다... 따상 가자!!

기념 [내부링크]

토탈이 89000 될 때 투데이가 89였다. 정말 엄청난 확률로 만들어진 투데이와 토탈.. 딱 1000배!!

중간고사 끝 [내부링크]

10월 29일 11시에 중간고사 끝! 6과목 중 한 개는 중간고사 없어서 5과목만 봤다. 오늘 본 한 개 빼고는 다 어느 정도 본 것 같은데 오늘 본 게 좀 그렇네.. 오늘이 마지막 시험이라 어제 밤 샐까 고민하다가 밤 10시부터 졸려서 그냥 딱 2시간만 자고 일어나서 했다. 정말 시간 빨리 가네,, 순삭이다. 휴,, 오늘은 좀 푹 쉬고 다시 내일부터 해야지,, 앞으로 해야할 것 - 깃허브 블로그 만들기 - GDSC 활동기 적기 - 국제학생회 활동 - GDSC 게더 스터디룸 바꾸기 - 모프 팀플 - 기계학습 팀플 - 경영과학 팀플 - 11월 android devfest

GDSC Seoultech 9월 활동기 [내부링크]

GDSC SeoulTech 활동했던 걸 블로그로 남기면 좋을 것 같아서 글을 써본다. 나중에 2기, 3기,, 등을 지원하려는 사람들이 참고할 때 도움이 되지 않을까? 그리고 시간이 지나서 다시 보면 나도 좋을 것 같아서 ㅎ 8월 지원 먼저 정확히 어디 있었는지는 기억 안 나는데 아마 연구실이었나 8월 초반쯤에 연구실 동생이 갑자기 카톡 보라고 해서 봤는데 에브리타임에 올라온 GDSC 공고였다. 그래서 딱 보자마자.. 아 이건 진짜 신이 나에게 주는 마지막 기회라고 생각해서 바로 GDSC 알아보러 갔다. 구글링 계속하면서 GDSC 공식 홈페이지 가보고 다른 학교에서 뭐 하는지 다 찾아봤다. 찾아보면 볼수록 진짜 너무 마음에 들어서 무조건 하고 싶다.......

9만이다 [내부링크]

어느새 9만을 넘겨버렸다! 이번 연도안에 10만 가는게 목표인데 과연 갈 수 있을까.. 두 달 남았으니 하루에 될 것 같기도하고 아슬아슬하게 안될 것 같기도 하고ㅋㅋㅋㅠ

[Android] BottomNaviagationView [내부링크]

Fragment와 BottomNavigation을 이용해서 하단바를 만들어본다. ** 유튜브를 보고 적은 것이기에 설명이 부족합니다 ** 결과화면 menu 먼저 app -&#62; res -&#62; new -&#62; android resource directory file로 가서 menu를 만든다. ok를 누르고 menu에 menu resource file을 만든다. xml에 파일에 메뉴에 들어갈 item들을 추가해준다. 참고로 그림은 drawable에 넣으면 되고 android에서는 기본적으로 new -&#62; vector asset에서 사진을 제공해준다. 여기서 마음에 드는걸로 하면 된다. activity_main.xml activity_main.xml로 가서 bottomnavigation을 추가해준다. id를 꼭 넣어주고 IconTint와 textColor를 바꿔줘야 보인다. 여기에 꼭 menu를.......

[Android] startActivityForResult [내부링크]

startActivity는 새로운 액티비티를 열어주기만 하고 startActivityForResult는 새로운 액티비티를 열어주고 결괏값도 전달해준다. startActivityForResult에서는 resultCode를 보내서 원하는 기능을 만들 수 있습니다. 동영상 activity_main.xml 먼저 textView와 Button을 간단하게 만들어준다. activity_sub_activity.xml subActivity.java xml을 만들고 subActivity에서 edittext에 적은 값을 담아주고 main으로 값을 넘길 수 있게 만들어준다. editText와 Button을 초기화해주고 버튼에 setOnClickListener를 만들어준다. 여기서 intent을 만들어주고 putExtra를 통해서 에딧텍스트에 적은 값을 담아준다. setResult를 통해서 RESULT_OK를 넣.......

[Android] EditText 엔터키 이벤트 [내부링크]

EditText에 enter 키를 입력했을 때 버튼을 클릭하는 방법이다. XML 먼저 XML을 구성해 준다. editText를 만들어주고 줄 바꿈이 일어나지 않게 singleLine &#x3D; True도 해준다. JAVA editText를 만들어주고 초기화 한 다음에 setOnKeyListener를 해주면 된다. switch 문을 만들어서 case가 enter 면 btn_close를 클릭하게 만들면 된다. callOnClick()을 이용하면 된다. 그럼 enter를 누르면 btn_close가 눌러지게 된다.

컴퓨터 시스템 구조 [내부링크]

성능의 측정 elpsed time : 한 작업을 끝내는데 필요한 전체 시간을 뜻함 프로세서 하나가 여러 프로그램을 동시에 실행하는 경우가 많이 있음 이런 경우 경과 시간(elapsed time)을 최소화하는 것보다 처리량을 최적화하는 것이 중요함. 프로세서가 순수하게 이 프로그램을 실행하기 위해 소비한 시간 CPU 실행시간, CPU 시간(CPU time) 하지만 사용자가 느끼는 응답시간은 CPU 시간이 아니라 경과 시간 CPU 시간은 - user CPU time : 실제로 사용자 프로그램 실행에 소요된 시간 - system CPU time : 운영체제가 이 프로그램을 위한 작업을 수행하기 위해 소비한 시간. 시스템에서의 경과시간으로 계산한 것을 시스템 성능, 사용자 CPU 시간으.......

Github reame 꾸미는 법 [내부링크]

https://gdsc-seoultech.github.io/posts/2021-09-28-markdown_github_profile/ GDSC에서 세션으로 git profile 꾸미기를 했다. 음 나름 열심히 만들었다고 생각ㅋㅋㅋㅋㅋ 이거 보고 참고해서 꾸미면 됩니다~

[Android] Service 백그라운드 음악 [내부링크]

Service background이다. 멜론이나 지니뮤직처럼 앱에서 나가도 노래가 들릴 수 있게 만드는 기능이다. 먼저 무료 음악은 YouTube studio에서 다운 받는다. 노래 소리가 굉장히 작게 들리네.. 잘 들으면 들림 XML 먼저 음악을 시작하는 버튼과 종료하는 버튼 2개를 만들어준다. MusicService.java 새로운 java 파일을 만들어준다. 그 후 Service를 extends 한다. Service를 뜨면 빨간 줄이 뜨는데 alt+enter를 눌러서 import 한 번하고 한 번 더 눌러서 implements까지 해준다. IBinder가 만들어진다. 이건 사용하지 않는다. ctrl + o를 눌러서 onCreate와 onStartCommand onDestroy를 만들어준다. onCreate 부분에는 mediapay를 만들어준다. 이.......

[Android] 안드로이드 프로그래밍 직접 풀어보기 7-1 [내부링크]

1. 레이아웃은 RelativeLayout을 사용하고 텍스트 뷰, 에디트텍스트,이미지뷰를 적절히 배치한다. 2. 에디트텍스트에 각도를 입력하고 옵션 메뉴의 그림 회전을 선택하면 해당 각도만큼 이미지뷰가 회전한다. 3. 한라산 추자도 범섬 옵션 메뉴는 라디오 버튼과 같이 3개 중 하나만 체크되고, 메뉴를 선택하면 이미지뷰가 해당 이미지로 바뀐다. 결과 영상 activity_main.xml TextView, EditText, imageView를 만들어준다. RelativeLayout이기에 각각 기준들을 잡고 위치를 정해준다. menu1.xml 그림 회전 아이템은 따로 만들어주고 한라산 백두산 설악산은 한 개만 선택돼야 하기에 group으로 묶어준다. MainActivity.java editText와 imageView,.......

회계 정리 4 [내부링크]

Straight Line Depreciation formula Periodic depreciation expense &#x3D; (Original Cost - Salvage Value) / (Number of periods) 매기간마다 생각 (초기비용(자산구입비용) - 유효수명이되면 가치가 없어 질수도 있지만 자동차 같은 경우 고철로 팔면 수익이 되니 잔존차기가 있다.) / 유효수명(세무당국이 규칙을 정함) A car habing a five year life expectancy was acquired on January 1 for $12000. Estimated salvage value is zero after five years. annual depreciation &#x3D; 12000 / 5 &#x3D; 2400 &#x3D;&#x3D; (12000 - 0) / 5 6 month depreciation &#x3D; 2400 / 2 분기 별로 하니 2400 / 2(6개월씩 이므로) Journal Entry.......

[Android] Spinner [내부링크]

Spinner를 클릭하면 드롭다운 메뉴가 표시되고 여기서 새 값을 선택할 수 있다. array.xml 먼저 res -&#62; values로 가서 spinner를 위한 xml을 만들어준다. array.xml에 위와 같이 작성한다. spinner를 사용하기 위해서 string- array를 선언해 주고 원하는 이름을 넣어준다. item은 spinner의 드롭아웃에 표시되는 메뉴들이다. activity_main.xml main.xml로 가서 Spinner를 선언해 준다. 여기서 중요한 게 entries을 하고 array.xml에 있는 test를 불러와줘야 된다. Spinner에서 클릭한 메뉴를 textView에 표시되도록 만들어본다. JAVA spinner와 textView를 선언해 준다. spinner에서 setOnItemSelectedListener 메서드를 호출한다. 그럼 두.......

실전영어 [내부링크]

BTW &#x3D; by the way imao &#x3D; in my arrogant opinion 건방지게 한 마디 하자면 진짜ㅋㅋㅋㅋㅋ btw 랑 imgo를 이렇게 배웁니다!! 요즘 국제학생회 너무 재밌다~

[Android] Github 이용 로딩 화면 만들기 [내부링크]

Github의 오픈소스들을 이용해서 안드로이드 로딩 화면을 만들 수 있다. 위의 링크로 들어가면 설명이 자세히 나와있다. 간단하게 보면 Gradle Scripts -&#62; bulid.gradle(Module: app)으로 가서 아래 구문을 추가해 준다. sync까지 해주면 된다. xml로 가서 이 코드를 추가해 준다. 참고로 이 코드를 추가하면 @color/colorAccent에 빨간 줄이 그어지는데 color로 가서 색깔 추가해 주면 된다. 아니면 다른 RGB 코드 이용해서 다른 색깔 써도 된다. 그리고 약간의 코드를 추가해서 꾸며(?) 주면 이렇게 나오게 된다. 자바 코드도 추가할 수 있다. XML에 ProgressBar를 추가하고 위의 코드를 Java에 써주면 아래 동영상처럼 나온다.

[Android] 뒤로 가기 두 번 눌러 앱 종료 finishAffinity, System.exit [내부링크]

뒤로 가기 버튼을 두 번 눌렀을 때 앱을 종료하는 방법이다. JAVA java 부분만 건드려주면 된다. 먼저 전역변수로 BackBtnTime을 선언해 준다. 이 값을 가지고 뒤로 가기를 결정해 준다. ctrl + o을 눌러서 BackPressed method를 만들어준다. curtime은 현재 시간을 밀리 초로 받아주고 gapTime은 현재 시간과 백 버튼을 누른 시간의 차이를 저장한다. 먼저 첫 번째 if 문을 보면 gapTime이 0~2초사이면 super.onBackPressed()를 이용해서 종료해 준다. 만일 그게 아니라면 backBtnTime을 현재 시간으로 저장하고 toast 메시지를 출력한다. else에서 backBtnTime에 현재 시간이 저장됐기에 한 번 더 누르면 gapTime을 정상적으로 계산할 수 있게.......

[Android] webView [내부링크]

WebView는 사용자가 웹브라우저 기능을 앱 안에 직접 포함할 수 있는 위젯이다. 코드 기록용입니다. activity_main.xml MainActivity.java

회계 정리 [내부링크]

자산은 부채와 자본의 합 이익은 수익에서 비용을 뺀 값 차변 비용, 자산의 증가 대변 부채, 자본, 수익의 증가 비용과 자신이 감소하면 대변에 수익, 자본, 부채가 감소하면 차변에 asset(자산) Revenues(수익) - 활동으로 얻는 수익 Expenses(비용) - 활동을 하기 위한 비용 Liabilities(부채) 과거로부터 앞으로 갚아야될 의무 Equity(자본) 자산 - 부채 수익과 비용은 손익계산서 자산, 부채, 자본 재무상태표 asset(자산) &#x3D; Liabilities(부채) + Equity(자본) 자본은 투자와 수익에 의해서 증가한다. expenses &#38; withdrawals로 감소 Accounts payable (외상매입금) 800원짜리 사무용품을 사면 돈을 냈기에 cash는 감소하고 사무용.......

회계 정리 2 [내부링크]

FINANCIAL STATEMENTS 재무제표 요약된 회계정보를 제공해줌 income statement 손익계산서 : 경영상태를 알려줌, 영업활동의 성과 the statement of financial position(재무상태표) : 회계 기말의 재무 상태표 the statement of changes in owner&#x27;s equity (자본변동표) : 회계기간동안 자본을 투자한 회사의 자본이 어떻게 변환이 되는 지 the statement of cash flows : 현재 회계기간동안 실제 현금이 얼마나 반환되나. Net Income(or loss) 손익 계산서 : ending balance of owners; equity( 이번 기말의 자본 총액_ - Beginning balance of owner&#x27;s equity(전기자본 총액) - investment by owners during the period + Distribut.......

회계 기록 3 [내부링크]

T Account Debit (차변) Dr. Credit(대변) Cr. debit은 항상 왼쪽에 쓰고 credit은 항상 오른쪽에 쓴다. 모든 거래에서 적어도 한 개의 debit(차변)과 한 개의 credit(대변)이 존재 해야한다. debits(차변)은 항상 credit(대변)과 같아야 된다. Journal(분개장) 회계기록을 연대기순으로 한다. Ledger(원장) Book of accounts 정보는 분개장에서 원장으로 기록된다. 제일 중요 ASSET,자산은 증가하면 Dr. Debit 차변에 기록 감소하면 Cr. Credit 대변에 기록 EXPENSE 비용이 증가하면 dr Debit 차변에 기록 증가하면 cr Credit 대변에 기록 REVENUES 수익, 감소하면 Dr Debit 차변에 기록 증가하면 Cr. Credit 대변에 기록 LIABILITIES 부채 감소.......

[Android] Diglog 팝업창 [내부링크]

팝업창을 사용하려면 Dialog 기능을 이용하면 된다. XML XML에서는 간단하게 Button과 TextView만 만들어준다. JAVA java 파일이 중요하다. 버튼 부분에 setOn을 구현해 주고 밑에 구문을 적어준다. AlerDialog을 이용해서 dialog 객체를 만들어준다. setIcon은 팝업창의 이미지를 setTitle은 팝업창의 제목을 setMessage는 팝업창의 내용을 정해준다. editText 객체를 만들어준 후 setView를 이용해서 editText를 dialog에 추가해 준다. 이제 팝업창에서 선택을 해야 되니 버튼을 만들어준다. setPositiveButtond을 이용해서 확인과 같은 버튼을 만들 수 있고 setNegative을 이용해서 취소와 같은 버튼을 만들어줄 수 있다. 여기서는 확인을 누.......

상 받았습니다. [내부링크]

호호호호호 대학 생활하면서 처음 상 받아봅니다. 호호호호호호호 호호호호호호호호호호호호호호 은상 감사합니다 호호호호호호호호호호호호호호 너무 기분 좋네요~~~ 역시 ㄱㅇㅇ!!!!!!!

[Android] ViewFlipper [내부링크]

ViewFlipper는 안에 여러 개의 위젯을 배치하고 필요에 따라 화면을 왼쪽이나 오른쪽으로 밀어서 위젯을 하나씩 화면에 보여주는 view 컨테이너이다. 보통 LinearLayout을 가장 큰 layout으로 만들고 버튼을 넣어주기 위해서 LinearLayout을 만들어주고 viewFlipper를 만들어준다. XML 다음과 같이 XML을 만든다. JAVA viewFlipper를 이전 화면이나 다음 화면으로 넘겨주기 위해서는 버튼에 setOnClickListener을 만들어주고 그 안에 showPrevious()와 showNext()를 이용하면 된다.

[Android] 안드로이드 프로그래밍 직접 풀어보기 6-2 [내부링크]

안드로이드 스튜디오를 활용한 안드로이드 프로그래밍 직접 풀어보기 6-2 뷰플리퍼를 이용하여 자동 사진 보기 앱을 작성하라. 적절한 이미지 여러 장이 자동으로 넘어가는 앱이다. &#60;사진보기 시작&#62;과 &#60;사진보기 정지&#62;를 만들고, &#60;사진보기 시작&#62;을 클릭하면 1초 단위로 화면이 자동으로 넘어가게한다. 뷰플리퍼 안에 리니어레이아웃을 배치할 필요는 직접 이미지뷰가 나오면 된다. XML ViewFlipper 안에 LinearLayout 없이 imageView만 넣으면 된다. JAVA start 버튼에 viewFlipper.startFlipping(); 을 넣어주고 1초 간격으로 해야되니 setFlipInterval에 1000을 넣어준다. 단위가 ms 이다. end에는 viewFlipper.stopFlippin.......

[Android] 안드로이드 프로그래밍 직접 풀어보기 6-3 [내부링크]

- 탭호스트를 이용하여 동물 선택 앱을 작성하라. - 탭위젯을 아래쪽에 배치하고 탭 4개가 나오게 한다. - 프레임레이아웃 안의 리니어레이아웃 3개를 제거하고 4개의 이미지뷰를 배치한다. XML imageView로 넣고 FrameLayout의 weight &#x3D; 1로 한 후 &#60;TabWidget&#62;을 맨 밑으로 내린다. JAVA 참고로 tabhost는 API 10까지는 잘 지원되지만 API 14 이후부터는 약한 경고가 나온다. 사용을 권장하지는 않지만 앱 개발에 상당히 많이 사용되었기에 알아두면 좋긴 하다.

국군의 날 [내부링크]

당신들이 있기에 내가 걱정없이 코딩합니다!!! 고생하십쇼!! 필123승!

[Android] Recyclerview [내부링크]

코드 기록용 입니다. 내용은 없습니다!!!!!!! activity_main_xml item_list 이걸 추가함 MainData.java alt + insert 누르면 생성자, getter, setter 다 사용 가능 MainAdapter.java MainActivity.java

[Android] Fragment [내부링크]

위와 같이 frament 개수만큼 java 파일과 fragment 파일을 만들어줘야 된다. 1. 프래그먼트를 사용하면 재사용할 수 있는 레이아웃을 분리해서 관리할 수 있고, 액티비티의 복잡도를 줄여주며, 크기가 고정이라도 부분적인 UI 변환에서 유용하게 사용됨 2. 프래그먼트는 여러 화면에서 재사용이 가능하다. 3. 생명주기를 가지고 있다. 4. fragment는 동적으로 추가, 삭제, 교체가 용이하다. MainActiviy.xml FrameLayout을 만들고 framelayout을 옮길 수 있게 button 들도 만들어준다. MainActivity.java 프래그먼트의 추가, 제거, 교체를 동적으로 수행하려면 FragmentManager 객체가 필요하고 이 객체를 얻으려면 getFragmentManager() or getS.......

[Android] SlidingDrawer [내부링크]

SlidingDrawer는 위젯을 서랍처럼 열어서 보여주거나 닫아서 감춘다. SlidingDrawer에는 규칙이 있다. 일단 SlidingDrawer의 handle 속성에 저장된 이름과 SlidingDrawer의 손잡이 역할을 하는 버튼의 id가 동일해야한다. 또한 SlidingDrawer의 content 속성에 지정된 이름과 LinearLayout의 id도 동일 해야한다. 출처 : 안드로이드 스튜디오를 활용한 안드로이드 프로그래밍

[Android] ScrollView [내부링크]

위젯이나 레이아웃이 화면에 넘칠 때 ScrollView를 넣으면 스크롤 효과를 낼 수 있다. scrollView에서 중요한 점은 scrollView에는 단 하나의 위젯만 넣을 수 있다는 것이다. 그래서 주로 scrollview 안에 LinearLayout 1개를 넣고 LinearLayout 안에 필요한 것을 여러 개 넣는 방법을 사용한다. 버튼을 화면을 초과할 때까지 만들어준다. 위젯 고정 후 scrollview 보통 앱 보면 스크롤 뷰를 내릴 때 위 아래에 있는 버튼들은 고정되어 있는 경우가 많다. weight 이용해서 구현할 수 있다. 5000글자 초과다. 먼저 LinearLayout를 만들고 TextView로 상단을 써주고 scrollView를 만들어준다. scrollView안에 위젯을 넣어주고 scrollView 바깥에 다.......

[Android] 안드로이드 프로그래밍 실습 6 - 1 [내부링크]

실습 6 - 1 날짜/시간 예약 앱 만들기 XML JAVA

[Android] 안드로이드 프로그래밍 직접 풀어보기 6-1 [내부링크]

실습 6 - 1을 다음과 같이 수정하라. 1. 캘린더뷰 대신에 데이트피커를 사용하여 날짜를 설정한다. 2. 예약 시작과 예약 완료를 없앤다. 대신 예약 시작 기능은 크로노미터를 클릭하면 동작하게 하고, 예약 완료 기능은 화면 하단의 연도(0000년)를 롱클릭하면 동작하게 한다. 3. 크로노미터를 클릭하기 전에는 라디오버튼, 데이트피커, 타임피커가 안 보이도록 설정하고, 크로노미터를 클릭하면 라디오버튼이 나타나게 한다. 그리고 화면 하단의 연도(0000년)를 롱클릭하면 라디오버튼, 데이트피커, 타임피커가 사라지게 한다. XML XML에서 버튼과 캘린더뷰를 없애고 데이트피커를 추가 해준다 (1번) JAVA 2번,3번 부터 구현 위의 코드로 chrono.......

[Android] AutoCompleteTextView, MultiAutoCompleteTextView 자동완성 [내부링크]

안드로이드에서는 자동완성으로 AutoCompleteTextView, MultiAutoCompleteTextView 두 가지를 제공한다. AutoCompleteTextView는 단어 1개가 자동완성 되고 MultiAutoCompleteTextView는 여러 개의 단어가 자동 완성된다. 또한 자동 완성 단어는 Java 코드에서 배열로 설정하고 setAdapter() 메소드를 사용한다. 코드는 위와 같다. completionHint는 자동완성 글자가 뜰 때 같이 나오는 글자이다 cimpltetionThreshold는 몇 글자를 입력했을 때 목록으로 보여줄지를 결정한다. java 코드이다. auto와 multi를에 각각 자동완성들을 할당해준다. items에는 자동완성 단어들을 만들어준다. 여기서 ArrayAdapter는 View와 데이터를 연결해준다. 자동.......

[Android] ProgressBar, SeekBar, RatingBar [내부링크]

ProgressBar, SeekBar, RatingBar는 진행 상태를 표시하는 기능을 한다. ProgressBar 작업의 진행 상태를 bar 또는 원 형태로 제공한다. bar 형태는 어느 정도 진행되었는지를 확인할 수 있고 원 형태는 현재 진행 중이라는 상태만 보여준다. XML에서는 주로 범위를 지정하는 max, 시작 지점을 지정하는 progress, 두 번째 progressbar를 지정하는 secondaryProgress 등이 있다. SeekBar Progressbar의 하위 클래스이기에 progressbar와 대부분 비슷하고 사용자가 터치로 임의 조절이 가능하다. 음량을 조절하거나 동영상 재생 시 사용자가 재생 위치를 지정하는 용도로 사용할 수 있다. RatingBar 진행 상태를 별 모양으로 표시한다. progressba.......

불편한 상황 [내부링크]

허허.. https://blog.naver.com/fbfbf1/222248805580 이거 저번에도 비슷한 질문했는데,, 블로그 씨 이러면 안 되지!! 아무튼 어색한 자리를 가지 않습니다!!

[Android] 안드로이드 프로그래밍 직접 풀어보기 5-4 [내부링크]

직접 풀어보기 5 - 4 다음 화면의 XML 코드를 중복 리니어레이아웃과 렐러티브레이아웃으로 각각 작성하라. 텍스트뷰 1개, 에디트텍스트 1개, 버튼 2개로 구성한다. 리니어레이아웃 이용 렐러티브레이아웃이용 EditText는 전화번호 글씨를 기준으로 했다. 먼저 취소 버튼을 만들고 EditText 기준으로 아래와 오른쪽에 했다. 입력 버튼은 취소 버튼을 기준으로 만들었다.

[Android] 안드로이드 프로그래밍 실습 5-2 [내부링크]

안드로이드 프로그래밍 실습 5 - 2 테이블레이아웃 계산기 앱 만들기 XML JAVA 버튼이 10개 필요하니 일일이 만들어주지 말고 배열을 이용해서 만들어준다. button을 초기화할 때도 for 문 사용 final int index 변수를 만들고 index &#x3D; i를 하는 방식은 배열로 리스너를 정의할 때 표준적으로 사용하는 방식이다. i 변수를 익명 클래스 안에서 직접 사용하면 실행 오류가 발생한다. setOnClickListener를 만들고 isFocused를 이용해서 EditText에 커서가 올라가있는지 확인한다. True 이면 올라가 있는 거다 올라가 있으면 0 ~ 9까지 눌러서 누른 값이 editText에 들어가게 해준다. numButtons[]에 있는 값의 text를 가져와서 넣어준다.

[Android] 안드로이드 프로그래밍 직접 풀어보기 5-5 [내부링크]

실습 5 -2를 그리드 레이아웃으로 변경하여 실행해라. XML 원하는 결과가 아니긴 한데 숫자들의 크기가 일정하게 나눠지면 좋겠는데 자꾸 일정하게 하려고 하면 화면을 넘어가 버리네

[Android] 시계, 크로노미터, 타임피커, 데이트피커, 캘린터뷰 [내부링크]

아날로그 시계 디지털 시계 크로노미터 크로노미터는 타이머 형식의 위젯이며 일반적으로 시간을 측정할 때 많이 사용된다. 메소드로는 start(), stop(), reset() 등이 있다. 타임피커 Timpicker 타임피커는 시간을 조절하는 기능을가 가진다. 참고로 롤리팝 Android 5.0 API 2.1 이후로 모양이 많이 바뀌었다. 이전 버전을 사용하고 싶으면 datePickerMode &#x3D; &#x27;spinner&#x27;를 사용하면된다. 먼저 이전 버전 최신 버전 데이트피커 이전 버전 최신 버전

[Android] Tablayout [내부링크]

인스타 클론 코딩을 해보고 있다. 인스타 회원가입을 들어가면 저렇게 이메일, 핸드폰으로 할지 골라야 된다. 처음에는 또 XML 만들어서 그 화면으로 가면 되는 줄 알았는데 역시 king ㅇㅇ!!에게 물어보니 Tabview 있다고 해서 찾아봤다. 딱 내가 원하는 거여서 바로 적용시켜봤다. 먼저 TabWidget 외에 Tabhost가 관리하는 페이지 화면은 반드시 FrameLayout을 사용하여 구성해야 한다. 이는 TabWidget의 탭 선택에 따라 표시될 페이지 화면이 이전 페이지를 완벽히 덮는 형태로 표시되어야 하는 이유 때문이다. Tabhost를 구성하는 레이아웃 리소스 XML의 기본 구조는 아래와 같다. 위에서 보다시피 Tabhost에 TabWidget과 FrameLayout을 추가.......

[Android] 안드로이드 프로그래밍 직접 풀어보기 5 - 1 [내부링크]

layout_gravity 을 이용해서 레이아웃 상에서 위젯의 위치를 정해주고 gravity를 사용해서 글자의 위치를 정해준다.

[Android] 안드로이드 프로그래밍 직접 풀어보기 5-2 [내부링크]

LinearLayout을 활용한 직접 풀어보기 먼저 가장 큰 레이아웃에 1 대 1로 레이아웃을 나눠줄 수 있게 리니어 레이아웃을 두 개 만든다. 그다음 위에 있는 레이아웃을 1 대 1로 나눌 수 있게 그 안에 리니어 레이아웃을 2개 만든다. 그다음 오른쪽 레이아웃을 1 대 1로 나눌 수 있게 리니어 레이아웃을 2개 만든다. weight 값을 잘 설정해야 하고 layout_width랑 layout_height에 대해서 잘 생각해야 풀 수 있다.

[Android] 안드로이드 프로그래밍 직접 풀어보기 5-3 [내부링크]

직접 풀어보기 5 - 3 1. 레이아웃에 에디트텍스트 1개, 버튼 1개, 텍스트뷰 1개를 생성한다. 2. 버튼을 클릭하면 에디트텍스트에 쓰인 문자열이 텍스트뷰에 나타나게 한다. 기본적으로 LinearLayout를 만들어준다. witdth와 height를 MATCH_PARENT로 설정한다. LinearLayout를 만들고 orientation을 VERTICAL로 설정하고 setContentView를 이용해서 화면에 띄어준다. editText와 button, TextView를 만들어준 뒤 addView를 이용해서 baseLayout에 추가해 준다. 버튼은 setGravity를 이용해서 Gravity.CENTER로 중앙에 위치하게 해준다. 이제 버튼을 누르면 edittext에 있는 문자가 textView로 갈 수 있게 해준다. editText.getText()를 하면 edit.......

[Android] WebView [내부링크]

간단한 WebView를 해보자. webView 안드로이드 앱 내에서 사용할 수 있는 인터넷 브라우저이다. webview를 하기 전에 manifest.xml 가서 두 가지 설정을 해줘야한다. 인터넷에 들어갈 수 있게 허용을 해줘야한다. 이것도 넣어줘야 webView가 정상적으로 된다. 먼저 XML에 WebView를 추가해준다. 먼저 WebView를 선언해주고 webview를 틀 때 사용할 인터넷 주소를 선언해준다. 웹뷰를 아이디를 찾아주고 webview을 할 때 js를 허용 해줘야 하기에 setJavaScriptEnabled를 사용한다. webview를 이용해서 특정 url을 열어야 하기에 loadUrl를 사용하고 크롬세팅과 기본적인 webView 세팅을 해줘야한다. WebViewClientClass()를 하게 되면 오류가 나.......

[Android] SharedPreferences [내부링크]

안드로이드에서 기본적으로 제공하는 SharedPreferences를 사용해서 데이터의 저장 관리를 할 수 있다. 즉 뒤로 가기 해도 데이터가 저장된 상태로 남아있게 된다. 먼저 간단하게 EditText를 만든다. 여기에 글을 쓰고 뒤로 가기 해도 저장되게 만들 것이다. EditText를 만들어주고 shared string을 만들어준다. 먼저 onDestrory()를 만들어준다. 앱을 종료했을 때 즉 액티비티를 벗어났을 때 실행이 되는 코드이다. 액티비티를 벗어났을 때 값을 저장해 주는 역할을 한다. shared를 사용해 주기 위해서는 editor를 만들어줘야 한다. value는 edittext에 있는 값을 가져온다. 이제 editor.putString()을 이용해서 저장해 준다. 첫 번째 매개변수.......

[Android] Textview [내부링크]

1. Text 속성 - TextView에 나타나는 문자열을 표현, 문자열을 직접 입력하거나 &#34;@string/변수명&#34; 형식으로 설정한 후 strings.xml 파일에 지정할 수 있다. 2. textColor 속성 - 글자의 색상 지정 ,#RRGGBB, #AARRGGBB 형식이다. 3. textSize 속성 - 글자의 크기를 dp, px, in, mm, sp 단위로 지정 - dp(Density-independent Pixel)는 화면 밀도에 독립적으로 사용되는 단위, 이를 사용하면 실행되는 안드로이드 폰의 해상도가 다르더라도 결과는 같은 비율로 출력되는 효과를 얻을 수 있다. 해상도와 관계없이 잘 동작하는 화면을 만들 때 dp 단위를 많이 사용. 폰트를 지정할 때는 sp 단위를 많이 사용 4. typeface 속성 - 글자의 글.......

[Android] Intent 애니메이션 삭제 [내부링크]

화면을 이동할 때 intent를 사용하는데 애니메이션이 기본값으로 있어서 삭제하고 싶어서 알아보았다. 코드는 간단하다. 이걸 사용하면 애니메이션이 삭제된다.

[Android] Button 테두리 삭제 [내부링크]

배경을 흰색으로 해도 테두리는 남아있어서 알아보니 투명도를 설정해 주면 된다. 아래 코드 쓰면 테두리 삭제된다.

[Android] layout 테두리, 모서리 설정 [내부링크]

기본적인 EditText는 테두리 없고 밑줄이 쳐진 형태로 나오게 된다. 인스타 클론 코딩을 하고 있는데 인스타는 밑에 두 개처럼 생겨서 어떻게 꾸미는지 알아보았다. drawable -&#62; new -&#62; Drwable Resource File을 누른다. 누르면 이런 화면이 나오는데 원하는 이름으로 지정해 주면 된다. xml 파일이 생성되는데 위의 코드를 넣어주면 테두리가 둥글고 밑 줄을 없애주고 배경 색깔까지 넣어준다. 테두리를 설정해 준다 padding 10dp, 모양을 직사각형으로 테두리 색깔을 지정해 준다. layout의 배경 색깔을 지정해 준다. 테두리를 둥글게 만들어주기 위해서 Radius를 넣어준다. 마지막으로 위젯에 backgroud를 이용해서 사용해 주면 된다.

[Android] 안드로이드 프로그래밍 직접 풀어보기 4 - 4 [내부링크]

XML Java 초기화해서 INVISIBLE로 바꿔주고 체크했던 것들도 다시 다 false로 해줬는데 이미지가 자꾸 안 없어진다. 구글링에서 해봐도 안되네

[Android] Button 만들기 [내부링크]

이번 학기 Android Java 마스터 버튼 만들기 1. 위젯 변수 선언 2. 변수에 activity_main.xml 파일의 위젯 id 대입 3. 이벤트 발생 시 동작하는 클래스를 위젯에 정의 출처 : Android Studio를 활용한 안드로이드 프로그래밍 6판

[Android] 위젯 정렬 gravity/ layout_gravity / imageView [내부링크]

위에 있는 사진에서의 안드로이드 사진과 같이 위젯을 정렬하고 싶다면 gravity를 사용하면 된다. default는 left이고 center, right 사용하면 된다. gravity는 자신에게 포함된 자식(주로 위젯)을 어디에 위치시킬지를 결정하고 layout_gravity 속성은 자신의 위치를 부모(주로 레이아웃)의 어디에 위치시킬지를 결정한다. 그렇기에 gravity는 주로 레이아웃에, layout_gravity는 위젯에 주로 지정한다. 사진을 넣고 싶을 때는 ImageView를 이용하면 된다.

백신 2차 [내부링크]

나도 드디어 백신 2차 12시 30분에 병원와서 2시 10분에 맞았다,, 기다리느라 좀 힘들었다. 이제 2주만 지나면 무적이다!!! 부작용 없기를..!

백신 화이자 2차 후기 [내부링크]

2021년 9월 18일에 2차 맞았다. 아프면 어쩌나 싶었는데 웬걸 1차보다 멀쩡했다. 사실 좀 아프면 아픈 거 핑계로 하루 푹 쉬면서 넷플릭스 보고 쉬려고 했는데 너무나도 멀쩡해서 음,, 게임만 했다.ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 원래 기숙사 사는데 기숙사에서 하루 종일 있긴 그래서 가까운 곳에 사촌동생 집 있어서 거기로 갔다. 마침 연휴라 동생도 시골로 내려가서,, 나 혼자 있었다. 뭐에 홀린 듯 게임만 했다. 총 35판 했다. 승률은 ㅋㅋㅋㅋㅋㅋㅋㅋ 17승 18패; 50%가 안된다니.. 원딜이랑 AP 국밥 챔 하면 이기는 것 같다. 징크스가 제일 잘 맞는다. 진짜 일요일에도 동생 집에 있을까 하다가 할 게 너무 많아서 바로 공릉으로 왔다. 다시 열심히.......

넷플릭스 [내부링크]

요즘 넷플릭스에 재밌는 게 많이 나왔네.. 일단 핫 한 DP.. 사실 DP 처음 들었을 때 오잉? 다이나믹 프로그래밍? 이랬다. ㅎ DP도 맨날 봐야지라고 생각하는데 아직도 안 보고 있다. 오징어 게임도 최근에 나왔는데 이것도 봐야 되고ㅠ 종이의 집도 시즌 5가 나왔다.. 이거 세 개는 꼭 봐야겠다. 뭐부터 봐야 될까~~

[Android] ListView [내부링크]

ListVeiew는 사용자가 정의한 데이터 목록을 item 단위로 구성해서 화면에 출력하는 ViewGroup의 한 종류이다. 먼저 XML 파일에서 ListView를 정의한다. ListView를 이용하면 ListView를 만들 수 있다. 기본적으로 만들게 되면 아래와 같이 만들어진다. 이제 MainActivity로 가서 코드를 작성한다. ListView를 사용해 주기 위해서 아래와 같이 작성한다. findViewById를 이용해서 아이디 값을 찾아준다. 이제 데이터를 저장할 string 배열을 만든다. ListView랑 list를 연결을 해야 화면에 출력을 할 수 있다. 이때 연결을 해주는 게 어댑터이다. adapter를 이용해서 현재 activity(this)에 있는 data와 연결을 해준다. simple_list_item_1은 안.......

[ML] 엘라스틱넷(Elastic Net) 회귀 [내부링크]

엘라스틱넷 회귀는 L2 규제와 L1 규제를 결합한 회귀이다. 엘라스틱넷 회귀 비용함수의 목표는 아래 식을 최소화하는 W를 찾는 것이다. 엘라스틱넷은 Lasso 회귀가 서로 상관관계가 높은 feature들의 경우에 이들 중에서 중요 feature만을 선택하고 다른 feature들은 회귀 계수를 0으로 만드는 성향이 강하다. 이러한 이유로 alpha 값에 따라 회귀 계수의 값이 급격히 변동할 수도 있기에 엘라스틱넷은 이를 완화하기 위해 L2 규제를 Lasso 회귀에 추가한 것이다. 엘라스틱넷은 L1과 L2 규제가 결합된 규제로 인해 수행 시간이 상대적으로 오래 걸린다. Sklearn에서 ElasiticNet 클래스를 통해서 엘라스틱넷 회귀를 구현할 수 있다. ElasticNet 클.......

8만이다 [내부링크]

토탈이 8만 넘었다 빨리 10만 갔으면 좋겠네ㅎ

[ML] matplotlib 한글 깨짐 현상 해결 [내부링크]

matplotlib를 사용할 때 변수명으로 한글을 사용하면 깨지는 경우가 발생한다. 그럼 이 아래의 코드를 복사 붙여넣기 하면 된다! 출처 : https://www.kaggle.com/fulrose/how-to-apply-new-font-to-matplotlib-easily

[2년 전 오늘] [일상] 류리의 자취일기 (2) [내부링크]

와 소름이다 이거 벌써 2년전ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 시간 진짜 빠르다,, 2년 전에 나와 비교하면 나는 더 나은 사람이 되어있을까? 음,, 그러겠지! 하,, 개강 4일 남았다

[ML] 언더 샘플링, 오버 샘플링 [내부링크]

label이 불균형한 분포를 가진 데이터세트는 이상 레이블을 가지는 데이터 수가 정상 레이블을 가진 데이터 수에 비해 너무 적기 때문에 예측 성능의 문제가 발생할 수 있다. 왜냐 이상 레이블 데이터 수는 적기에 다양한 유형을 학습하지 못하고 정상 레이블 데이터 수는 많기에 정상 레이블로 치우친 학습을 수행해 제대로 된 이상 데이터 검출이 어렵기 때문이다. 지도학습에서 불균형한 레이블 값 분포로 인한 문제점을 해결하기 위해서는 적절한 학습 데이터를 확보하는 방안이 필요한데 대표적인 것인 oversampling(오버 샘플링)과 언더 샘플링(Undersampling) 방법이 있다. 보통 오버 샘플링 방식이 예측 성능상 더 유리한 경우가 많아서.......

[ML] IQR를 이용한 이상치 데이터 제거 [내부링크]

이상치 데이터(Outlier)는 전체 데이터의 패턴에서 벗어난 이상 값을 가진 데이터이다. outlier로 인해 머신러닝 모델의 성능에 영향을 받는 경우가 발생하기 쉽다. 이상치를 찾는 방법에는 IQR(Inter Quantile Range) 방식을 적용해서 찾을 수 있다. IQR은 사분위 값의 편차를 이용하는 기법으로 Box Plit으로 시각화할 수 있다. 일단 먼저 사분위란 전체 데이터를 값이 높은 순으로 정렬하고 이를 1/4(25%) 씩으로 구간을 분할하는 것을 지칭한다. 1/4구간은 Q1, Q2, Q3, Q4로 나눈다. 여기서 25% 구간이 Q1 ~ 75 % 구간인 Q3의 범위를 IQR이라 한다. IQR를 이용해 이상치 데이터를 검출하는 방식은 보통 IQR에 1.5를 곱해서 생성된 범위를 이.......

루프탑에서 코딩 [내부링크]

동아리에서 게더 타운을 만들고 있는데 study room 따로 있으면 좋을 것 같아서 루프탑에 한 번 만들어봤다. 갬성좀 느껴진다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 일단은 루프탑으로 하고 해변으로 다시 만들까 생각중

[ML] 스태킹(Stacking) [내부링크]

스태킹은 개별적인 여러 알고리즘을 서로 결합해 예측 결과를 도출한 뒤에 예측한 데이터를 기반으로 다시 예측을 수행하는 것이다. 즉 개별 알고리즘의 예측 결과 데이터 세트를 최종적인 메타 데이터 세트로 만들어 별도의 ML 알고리즘으로 최종 학습을 수행하고 테스트 데이터를 기반으로 다시 최종 예측을 수행하는 방식이다. 스태킹에는 두 종류의 모델이 필요하다. 첫 번째는 개별적인 기반 모델, 즉 여러 개의 모델 두 번째는 이 개별적인 모델의 예측 데이터를 학습 데이터로 만들어서 학습하는 모델이다. 스태킹 모델의 핵심은 여러 개별 모델의 예측 데이터를 각각 스태킹 형태로 결합해 최종 메타 모델의 학습용 피처 데이터 세트와 테.......

[ML] 하드 보팅(Hard voting), 소프트 보팅(Soft voting) [내부링크]

앙상블 학습은 보팅(voting), 배깅(Bagging) 부스팅(Boosting) 세 가지로 나눌 수 있다. 보팅과 배깅 보팅과 배깅은 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식이다. 이때 보팅은 서로 다른 알고리즘을 가진 분류기를 결합하는 방식이고 배깅은 각각의 분류기가 모두 같은 유형의 알고리즘 기반이고 데이터 샘플링을 서로 다르게 가져가면서 학습을 수행해서 보팅을 수행한다. 배깅의 대표적인 방식이 랜덤 포레스트이다. 보팅 방식을 그림으로 표현하면 위와 같다. 모두 같은 데이터 셋을 사용하면서 서로 다른 분류기를 사용한다. 배깅 방식을 그림으로 표현하면 위와 같다. 데이터 샘플링을 다르게 가져가되 서로 같은 모.......

[PyTorch] with torch.no_grad() [내부링크]

이름 그대로 torch.no_grad() gradient 연산을 옵션을 그만할 때 사용하는 함수이다. 그전에는 requires_grad &#x3D; True로 된 Tensor에 대해 연산을 기록한다. with torch.no.grad()를 사용하면 이제 requires_grad &#x3D; False로 해서 그 Tensor에 연산을 기록하는 걸 그만한다. 즉 autograd 엔진을 꺼버린다. autograd 엔진을 껐기에 Backpropagation에 필요한 메모리 등을 절약할 수 있기에 with torch.no_grad()가 적용된 Tensor를 사용하면 계산 시 연산 속도가 빨라진다. 하지만 backpropagation을 할 수 없기에 학습은 불가능하다. 쉽게 생각해서 더이상 학습 안하고 학습된 모델로 결과볼 때 사용하는거라고 이해해도 된다.

나만 알고 싶은 곳 [내부링크]

나만 알고 싶기에.. 앞으로도 나만 알겠습니다..

[ML] Gradient Boost Machine [내부링크]

Gradient Boost Machine(GBM) GBM은 부스팅 알고리즘이기에 여러 개의 약한 학습기(weak learner)를 순차적으로 학습- 예측하면서 잘못 예측한 데이터 가중치를 부여를 통해 오류를 개선해 나가면서 학습하는 방식이다. 대표적으로 AdaBoost와 Gradient boost가 있다. AdaBoost의 학습 과정을 그림으로 나타내면 아래와 같다. 먼저 feature data set이 있다. 5개의 +와 4개의 -로 이루어져있다. Step 1이다. 첫 번째 약한 학습기가 분류 기준 1로 +와 -를 분류한다. 동그라미로 표시된 + 데이터는 + 데이터가 잘못 분류된 오류 데이터이다. Step 2는 Step 1에서 찾은 오류 데이터에 대해서 가중치 값을 부여한다. 가중치가 부여된 오류 + 데이터.......

[1년 전 오늘] 대화의 기술 [내부링크]

다행이네 그래도 1년전 보다는 친구가 더 생겼다

[Pandas] 열 이름 변경 rename [내부링크]

Pandas에서 열 이름을 변경하는 방법으로는 columns, rename이 있다. 보통 columns는 전체 열의 이름을 한 번에 바꿀 때 사용하고 rename은 원하는 열만 바꿀 때 사용한다. rename 사용하는 방법은 간단하다. 이런 데이터가 있다고 했을 때 age만 바꾼다고 하면 이렇게 바뀌게 된다.

[ML] 균형 트리 분할, 리프 중심 트리 분할 [내부링크]

균형 트리 분할 일반적인 GBM 계열의 트리 분할은 균형 트리 분할 방법(Level Wise)을 사용한다. 균형 트리 분할은 트리의 깊이를 효과적으로 줄일 수 있다. 즉 최대한 균형 잡힌 트리를 유지하면서 분할하기 때문에 트리의 깊이가 최소화될 수 있다. 균형 잡힌 트리를 생성하는 이유는 overfitting에 보다 더 강한 구조를 가질 수 있다고 알려져 있기 때문이다. 하지만 균형을 맞추기 위한 시간이 필요하다는 단점이 있다. 균형 트리 분할을 그림으로 나타내면 위와 같다. 리프 중심 트리 분할(Leaf Wise) 일반적인 트리 계열 알고리즘과 다르게 LightGBM은 리프 중심 트리 분할을 사용한다. 리프 중심 트리 분할 방식은 트리의 균형을 맞추지 않.......

[ML] LabelEncoder [내부링크]

사이킷런의 머신러닝 알고리즘은 문자열 값을 입력 값으로 허용하지 않기에 모든 문자열 값을 인코딩해서 숫자 형을 반환해야 한다. 레이블 인코딩 레이블 인코딩은 카테고리 feature를 코드형 숫자 값으로 변환하는 것이다. preprocessing에서 LabelEncoder를 import 하면 된다. items 배열이 있을 때 encode를 만들고 item을 encoder에 fit 시키면 label이 만들어진다. 문자열 값이 어떤 숫자로 인코딩 됐는지 보기 위해서는 classes_를 이용하면 된다. inverse_transform()을 통해서 인코딩된 값을 다시 디코딩 할 수 있다. transform에 들어갈 숫자의 순서, 길이는 상관없다 문제점 레이블 인코딩은 문자열 값을 숫자형 카테고리 값으로 변환.......

[ML] 학습 데이터와 테스트 데이터 스케일링 변환 [내부링크]

StandardScaler, MinMaxScaler와 같은 Scaler 객체를 이용해서 데이터의 스케일링 변환 시에는 fit(), transform(), fit_transform()을 이용한다. fit()은 데이터 변환을 위한 기준 정보를 설정을 적용하고 transform()은 이렇게 설정된 정보를 이용해서 데이터를 변환한다. fit_transform()은 fit()과 transform()을 한 번에 적용하는 기능을 수행한다. 주의점 * scaler 객체를 이용해 학습 데이터 세트로 fit()과 transform()을 적용하면 테스트 데이터 세트로는 다시 fit()을 수행하지 않고 학습 데이터 세트로 fit()을 수행한 결과를 이용해서 transform() 변환을 적용해야 한다. 즉 학습 데이터로 fit()이 적용된 스케일링 기준 정보를 그대.......

[PyTorch] nn.Linear [내부링크]

pytorch에서 선형회귀 모델은 nn.Linear() 함수에 구현되어 있다. 입력되는 x의 차원과 출력되는 y의 차원을 입력해 주면 된다. 단순 선형회귀는 하나의 입력 x에 대해 하나의 입력 y가 나오니 로 하면 된다. PyTorch 공식 문서 내용을 보면 으로 나와있다. Parameter를 보면 in_features는 input sample의 size out_features는 output sample의 size bias는 만일 False로 설정되어 있으면 layer는 bias를 학습하지 않는다. 기본값은 True이다. device는 CPU, GPU 중 고르는 거고 dtype은 자료형의 타입을 정하는 것 같다. Shape input에서 *은 어떤 additional dimension을 의미하고 H(in)은 in_features를 의미한다. Ouput 마지막 차원을 제외.......

[PyTorch] optim [내부링크]

torch.optim은 다양한 최적화 알고리즘을 구현하는 패키지이다. optimizer는 최적화 함수라고도 하고 경사하강법을 적용해서 오차를 줄이고 최적의 가중치와 편차를 근사하게 하는 역할을 한다. 그중 가장 기본적인 것이 Stochastic gradient descent, SGD이다. SGD는 한 번에 들어오는 데이터의 수대로 경사하강법 알고리즘을 적용하는 최적화 함수이다. Parameter - params : 파라미터 그룹을 정의하거나 최적화하기 위한 파라미터의 반복 기능, 즉 모델의 파라미터를 넣어주면 된다. - Ir : learning rate의 약자이다. - momentum : 기본 값이 0인 momentum factor이다. - weight_decay : 가중치 감소로 기본 값이 0이다. - dampening : momen.......

[1년 전 오늘] 처서 [내부링크]

그렇게 아직까지 하고 있습니다.. 심지어 작년보다 더 하고 있네

[PyTorch] nn.Sequential [내부링크]

nn.Sequential 클래스는 nn.Linear, nn.ReLU(활성화 함수) 같은 모듈들을 인수로 받아서 순서대로 정렬해놓고 입력값이 들어모면 순서대로 모듈을 실행해서 결과값을 리턴한다. 신경망의 깊이가 깊어질수록 묶어서 연산하는 것이 더 편리하기에 nn.Sequential 클래스를 사용하는 것이 좋다

[PyTorch] torch.nn.init [내부링크]

torch.nn.init에는 tensor에 초깃값을 주기 위해 필요한 함수들이 저장되어 있다. torch.nn.init.uniform_(tensor) x 변수에 [10,1] 모양의 tensor을 생성하고 이 텐서의 값들을 init.uniform_() 함수를 통해서 -10부터 10까지 uniform(균등) 하게 초기화한다. 그럼 -10 ~ 10까지의 숫자들이 무작위로 들어가게 된다. PyTorch 공식 문서를 보면 uniform distribution U(a, b)에서 가져온 값으로 input Tensor를 채운다. 매개변수 - tensor : n 차원의 tensor를 넣어주면 된다. - a는 균일 분포의 하한 - b는 균일 분포의 상한 torch.nn.init.normal_(tensor) init.uniform_과 유사하다. N(mean, std^2)을 따르는 정규 분포에서의 값을 input tens.......

[PyTorch] torch.utils.data, torchvision [내부링크]

모델을 학습하기 위해서는 데이터를 모델에 지속적으로 전달해야 한다. 데이터를 하나씩 전달하지 않고 원하는 batch size로 묶어서 전달하거나 더 효율적인 학습을 위해 데이터를 규칙에 따라 정렬하거나 섞어야 할 때 사용하는 모듈이 DataLoader이다. 형태로 쓴다. 매개변수가 굉장히 많은데 중요한 것만 보면 - data : 다룰 데이터를 넣어주면 된다. - batch_size : 데이터를 batch_size 개수만큼 묶는다는 의미이다. - shuffle : 데이터를 매 epoch에서 다시 섞을지를 결정한다. default &#x3D; False이다. - num_workers : 데이터를 묶을 때 사용할 프로세스의 수 - drop_last : 데이터세트 크기가 배치 크기로 나눌 수 없는 경우에 나누고.......

[ML] 정보 이득, 지니 계수 [내부링크]

결정 트리 알고리즘에서는 어떤 기준으로 해서 가장 효율적인 분류가 될 것인지가 알고리즘 성능을 좌우한다. 이를 위해서는 어떻게 트리를 분할할 것인가가 중요한데 최대한 균일한 데이터 세트를 구성할 수 있도록 분할하는 것이 필요하다. 데이터 세트의 균일도는 데이터를 구분하는 데 필요한 정보의 양에 영향을 미친다. 결정 트리의 결정 노드는 정보 균일도가 높은 데이터 세트를 먼저 선택할 수 있도록 규칙 조건을 만든다. 이런 정보의 균일도를 측정하는 방법은 엔트로피를 이용한 정보 이득 지수와 지니 계수가 있다. 정보 이득 정보 이득은 엔트로피 개념을 기반으로 한다. 엔트로피는 주어진 데이터 집합의 혼잡도를 의미하는데 서.......

UCPC 이벤트 책 당첨 [내부링크]

아 요즘 계속 좋은 일만 일어나네 ㅎㅎ 앞으로도 이랬으면 좋겠다. 저번에 UCPC 나갔는데 나가기전에 이벤트로 받고 싶은 책 선택하라고 해서 책 선택 했는데 딱 당첨됐다. 심지어 심지어~~~~~~~ 내가 요즘 계속 살까 말까 고민 했던 책이 당첨됐다. 바로 나동빈님의 이것이 취업을 위한 코딩테스트다 with python 기분 좋다. 감사합니다 UCPC ^^! 잘 쓰겠습니다.

블로그를 분석해봤다. [내부링크]

여기서 블로그 분석할 수 있다길래 한 번 해봤다. 네이버 블로그 1%라고 한다.. 전체 87613위 교육/학원/학교 부분에서는 5874위이다. 음.. 주제를 이걸로 통일할걸 그랬나 맨날 IT랑 이거랑 두개로 했는데 ㅋㅋㅋ 오른쪽 하늘색은 랭킹 그래프이다. 보니까 며칠 전에는 7만 등까지 갔었다 이런 것도 보여준다ㅋㅋㅋ 최고 랭킹 34,377위다. 지금보다 거의 5만 등 더 높았네 유효 키워드 수이면 좀 잘 먹히는 키워드라는 건가 키워드 변동 추이이다. 공부하기 싫어서 한 번 해봤는데 재밌네,,

[백준] 1520번 내리막길 c++ [내부링크]

처음에 보고 경로의 개수를 구하는 문제이니 dp 인가라고 생각했다가 일단 DFS로만 풀어보자고 생각해서 DFS만 풀었다가 시간 초과 당했다. DP를 사용하지 않으면 500 x 500 일 때 4^(500 * 500)의 시간 복잡도가 나와서 당연히 시간 초과다. 일단 이 문제를 풀 때 속지 말아야 할 점이 4방향으로 이동 가능하다는 거다. 나는 문제 예시만 보고 2방향 또는 3방향만 생각하고 있었다. 값이 작은 값으로만 가면 되기에 위로 가든 아래로 가든 상관이 없다. 그리고 DP를 사용할 때 나는 마지막 x좌표 y좌표 값을 넣어주고 거꾸로 가는 방식으로 했다. 여기서 DP를 사용할 때 다 0으로 초기화해주고 dp !&#x3D; 0 일 때 return dp[x][y]를 해줬는데 이.......

[백준] 14503번 로봇 청소기 c++ [내부링크]

내 네이버 챌린지 100번째 문제이다. 감격 구현 문제이다. 도대체 왜 안될까라고 몇 시간 고민했다가 자세히 보니 dy에 접근해야 되는데 dx에 접근하고 있어서 계속 틀렸다,, 문제에 있는 그대로 구현을 하면 된다. 문제에서 좀 어려웠던 게 도대체 방향을 어떻게 다뤄야 할까였다. 처음에는 if 문 하나씩 써서 방향 다뤄줄까 하다가 아무리 봐도 그건 아닌 것 같아서 고민해 보니 규칙이 있어서 규칙대로 했다. d &#x3D; 0 일 때는 d &#x3D; 3을 보면 되고 d &#x3D; 1 일 때는 d &#x3D; 0을 보고 d &#x3D; 2 일 때는 d &#x3D; 3을 보고 d &#x3D; 3 일 때는 d &#x3D; 2를 본다. 이건 수식으로 아래와 같이 할 수 있다. 일단 코드를 하나씩 보면 1.......

네이버 챌린지 100일 마스터 달성 [내부링크]

드디어 네이버 챌린지 100일 달성했다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 처음 시작일을 찾아보니 2020년 9월 15일이다. 100일 챌린지를 딱 11개월 걸렸다,, 그래도 완료한 게 어디야~~~ 맨날 며칠 꾸준히 올리고 하기 싫어서 안 올리고 시험 기간이어서 안 올리고 나중에 돼서는 딱히 내가 풀 수 있는 문제가 없는 것 같아서 안 올리고 그러다가 프로그래머스로 좀 채우고 근데 아무리 생각해도 마지막은 백준으로 채우는 게 좋을 것 같아서 최근에는 백준 좀 풀고 있다. 앞으로 골드 위주로 열심히 풀어봐야겠다. 정말 알고리즘은 손 놓으면 안 될 것 같다. 근데 도대체 어떻게 하면 알고리즘을 잘할 수 있을까,,, 너무 어렵다! 아무튼 100일 완료!

[백준] 16236번 아기 상어 c++ [내부링크]

요즘 옛날에는 못 풀었던 문제들을 풀고 있어서 기분이 좀 좋다. 심지어 원트! 아기 상어 문제이다. 구현 + 탐색 문제 질문 게시판으로 가면 일반적인 BFS로는 안 풀린다는데 풀린다. 그냥 BFS 돌려도 상관없다. 돌리고 처리만 해주면 된다. 먼저 물고기를 입력받을 board와 물고기로부터 얼마나 떨어져 있는지를 기록하기 위한 check 배열 4방향 탐색을 위한 dx, dy 최종 결괏값이 second, 아기 상어의 사이즈인 babysize, 입력값 N, 아기 상어의 위치인 x, y이다. eatfish는 아기 상어가 얼마만큼의 물고기를 먹었는지이다. 단순히 문제를 입력받는 곳이다. 이때 아기 상어 (9)일 때 좌표를 기록해줘야 된다. 처음 이중 for 문은 check 배열을.......

백신 맞으러 가야지 [내부링크]

잔여백신 신청 성공해서 오늘 화이자 맞으러 간다 연구실에서 공부하다가 바로 가는 중

[2년 전 오늘] [유럽] 2019.05.21 이탈리아 로마 여행 (1) [내부링크]

와 이 글 쓴 지가 2년전이네..ㅠ 해외여행 다시 가고싶다 언제 코로나 풀리지

요즘 다이어트 중 [내부링크]

7월 말쯤에 가족여행 가려고 오산 갔다가 저녁 먹고 몸무게 재 봤는데 거의 74kg 나와서 아 이건 진짜 심하다고 생각해서 여행 갔다 오고 나서부터 다이어트 시작 보통 아침에 일어나서 오렌지 주스 한 잔 마시고 공복 웨이트 하고 한 11시부터 밥 먹는다 이렇게 운동 갔다 오고 난 뒤에는 바나나 요거트 견과류 기본 베이스에 닭 가슴살도 같이 먹고 고구마도 먹기도 하고 가끔 두유도 먹는다. 오리고기도 먹어보고 김치도 먹고 보통 아침은 여기에다가 고구마 추가해서 먹는 듯 저녁에는 닭가슴살이랑 샐러드 위주로 먹는다 요즘은 고구마도 먹고 있고 이렇게 현미밥도 먹어보기도 하고 샐러드를 깜빡하고 못 샀으면 밖에 나가서 사 오기도 한.......

[프로그래머스] 소수 찾기 c++ [내부링크]

일단 소수를 찾아야 되니 에라토스테네스의 체를 만들어준다. 길이가 7까지이니 1e8까지 만들어줬다. 9999999가 있으니 이것보다 1 큰 1e8 백준에 있는 리모컨 문제에서 푼 아이디어 이용해서 풀었다. 일단 numbers에 있는 숫자의 개수들을 다 세준다. 그다음 numbers을 정렬해서 가장 큰 수를 구해준다. for 문을 0부터 가장 큰 수까지 돌리면서 하나하나 조건을 만족하는지 확인해 준다. 여기서 조건은 numbers에 있는 숫자의 개수로 num을 만들 수 있냐와 소수이냐이다. 첫 번째 조건은 ischeck 함수에서 똑같이 num에 있는 숫자의 개수들을 다 세주고 numbers에 있는 숫자의 개수들과 비교해 준다. num에 있는 숫자 중 단 하나라도 numbers에.......

[ML] 불확실성 고려 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 오차 행렬과 분류 리포트가 예측 결과를 자세히 분석할 수 있도록 도와주지만 예측값은 모델에 담긴 많은 정보가 손실된 상태이다. 대부분 분류기는 예측의 확신을 가늠하기 위한 decision_function이나 predict_proba 메서드를 제공한다. 예측을 만들어내는 건 두 메서드의 출력의 임곗값을 검증하는 것이다. 이진 탐색에서 decision은 임곗값을 0, predict_proba는 0.5를 임곗값으로 사용 음성 클래스 데이터 포인트 400개와 양성 클래스 데이터 포인트 50개로 이뤄진 불균형한 이진 분류 문제이다. 데이터를 SVM으로 학습시키고 결정 함숫값을 히트맵으로 나타냈다. 검은 원.......

[ML] 정밀도 재현율 곡선, ROC 곡선 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 정밀도 재현율 곡선 분류기의 필요조건을 지정하는 것을 operation point(운영 포인트)라고 한다. 새로운 모델을 만들 때 운영 포인트가 명확하지 않은 경우가 많다. 이런 경우 문제를 더 잘 이해하기 위해 모든 임계값을 조사하거나, 한 번에 정밀도나 재현율의 모든 장단점을 살펴보는 것이 좋다. 이를 위해 precision-recall curve(정밀도 재현율 곡선)를 사용한다. sklearn.metrics 모듈에서 정밀도-재현율 곡선을 만드는 함수를 제공 정밀도와 재현율 값을 곡선 그래프로 그린 것이다. 곡선의 각 포인트는 decision_function의 가능한 모든 임계값에 대응한다. 검은 원은.......

[ML] 다중 분류의 평가 지표 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 다중 분류의 평가 지표 다중 분류를 위한 지표는 이진 분류 평가 지표에서 유도되었고 모든 클래스에 대해 평균을 낸 것이다. 다중 분류의 정확도는 정확히 분류된 샘플의 비율로 정의한다. 그렇기에 클래스가 불균형할 때는 정확도는 좋은 평가 방법이 되 지 못한다. 다중 분류의 평가에는 정확도 외에 오차 행렬과 분류 리포트 등을 일반적으로 사용한다. 모델의 정확도는 95.3%로 꽤 좋다. 오차 행렬에서 각 행은 정답 레이블이고 열은 예측 레이블이다. 첫 번째 행만 보면 0이 37이고 나머지 다 0이다. 즉 맞힌 개수가 37개로 다 맞췄다는 것이다. 또한 오차 행렬의 첫 번.......

[프로그래머스] 카카오프렌즈 컬러링북 [내부링크]

2017 카카오 코드 페스티벌 예선 문제 기초 BFS/DFS 탐색 문제이다. 별 거 없다. 이중 for 문으로 picture 탐색하면서 0이 아니고 아직 둘러보지 않았으면 여기서부터 탐색을 시작한다. 탐색 시작 지점에서 구역의 개수를 ++ 해준다. while 문에서 모든 조건을 만족하면 check를 true로 바꿔주고 q에 넣어주고 sum의 값도 ++해준다. 처음에 sum &#x3D; 1로 해줘야 한다. 자기 자신도 포함되어야 하니. while 문이 끝나면 최댓값을 갱신해 준다. 문제에 전역 변수 정의에 대해서 나와있는데 꼭 똑같이 해야 한다. 안 그러면 틀렸다고 나온다.

[ML] 알고리즘 체인과 파이프라인 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 대부분 머신러닝 애플리케이션은 하나의 알고리즘을 이뤄져있지 않고, 여러 단계의 처리 과정과 머신러닝 모델이 연결되어 있다. 이번에는 데이터 변환 과정과 머신러닝 모델을 쉽게 연결해주는 PipeLine 파이썬 클래스를 알아본다. 아래는 모델 체인의 좋은 예이다. 데이터셋을 MinMaxScaler로 전처리를 해서 커널 SVM 성능을 크게 향상 시킬 수 있다. 아래처럼 하면 SV(C&#x3D;100) 모델의 정확도를 63%에서 97%로 개선할 수 있다. 데이터 전처리와 매개변수 선택 GridSearchCV를 사용해서 더 좋은 SVC 매개변수를 찾을 수 있다. 허나 이 코드는 잘못된 코드이다. 데이터의.......

[ML] 전처리와 모델의 매개변수를 위한 그리드 서치 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 매개변수 조정 파이프라인을 사용하면 머신러닝 워크플로에 필요한 모든 처리 단계를 하나의 scikit-learn 추정기로 캡슐화할 수 있다. 또한 회귀와 분류 같은 지도 학습의 출력을 이용해서 전처리 매개변수를 조정할 수 있다. 파이프라인을 이용해서 boston 데이터셋에 Ridge를 적용해본다. 파이프라인은 데이터 스케일 조정, 다항식 특성 선택, 리지 회귀의 세 단계로 구성된다. 파이프라인을 사용하면 Ridge의 alpah 매개변수와 degree 매개변수를 탐색할 수 있다. 교차 검증의 결과를 히트맵을 나타낸다. 2차항이 효과가 좋다는 걸 알 수 있다. 최적의 매개변수도 확인할.......

sns.factorplot와 sns.pointplot [내부링크]

캐글 필사를 의문이 생겨서 구글링 해보다가 원하는 답변이 안 나와서 캐글 오픈톡방에 한 번 올려봤다. 나의 궁금증은 위의 코드처럼 작성했을 때 왜 빈 그래프가 만들어지고 factorplot은 왜 아래에 있게 되는 지가 의문이었다. subplots(1,2)로 만들고 factorplot에 ax &#x3D; ax[1]을 넣어줬기에 그래프가 barplot, factorplot 딱 2개만 만들어져야 된다고 생각했는데 위의 사진처럼 생겨서 궁금증이 생겼다. 참으로 신기한 게 꼭 질문을 올리면 구글링에서 원하는 답변을 찾는다 ㅋㅋㅋ stackoverflow에 내가 원하는 답변이 딱 있었다. catplot or factorplot are figure level functions. This means that they are supposed to work on th.......

[ML] cross validation 사용 그리드 서치 , GridSearchCV [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 교차 검증 사용 그리드 서치 데이터를 훈련 세트 검증 세트 테스트 세트로 나누는 방법은 잘 작동하지만 데이터를 나누는 방법에 굉장히 민감하다. 일반화 성능을 더 잘 평가하려면 훈련 세트와 검증 세트를 한 번만 나누지 않고 교차 검증을 사용해서 각 매개변수의 조합의 성능을 평가할 수 있다. 위의 코드에서 5 - fold를 이용해서 교차 검증을 사용해서 정확도를 구했다. 매개변수 6 * 6으로 36개 5 - fold이기에 총 36 *5 &#x3D; 180개의 모델을 만들어야 한다. 위의 그림은 앞에서 작성한 코드에서 최적의 매개변수를 선택하는 방법을 보여준다. 그림에서도 알 수 있듯.......

[ML] 그리드 서치 교차 검증 결과 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 교차 검증 결과 분석 교차 검증의 결과를 시각화하면 검색 대상 매개변수가 모델의 일반화에 얼마나 영향을 주는지 이해하는 데 도움이 된다. 그리드 서치는 연산 비용이 매우 크기에 간격을 넓게 해서 적은 수의 그리드로 시작하는 것이 좋다. 그다음 교차 검증된 그리드 서치의 결과를 분석해서 검색을 확장할 수 있다. 그리드 서치의 결과는 cv_results_ 속성에 담겨 있다. results 행 하나는 매개변수 설정에 대응한다. 각 설정에 대해 교차 검증의 모든 분할의 평균값, 표준편차를 포함한 결과가 기록되어 있다. 검색 대상 매개변수 그리드가 2차원이기에 히트맵으로 시.......

[ML] 평가 지표, 오차 행렬, 불균형 데이터셋, 정확도, 정밀도, 재현율, f-점수 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 이진 분류의 평가 지표 이진 분류에는 양성, 음성 클래스가 있고 양성 클래스를 주목해야 한다. 잘못 분류한 샘플의 수가 원하는 정보의 전부가 아니기에 정확도만으로 예측 성능을 측정하기에는 부족하다. 암을 조기 발견하는 상황을 예시로 들어보자. 양성이면 추가 검사 음성이면 건강하다는 의미이다. 건강한 사람에게 양성으로 분류하면 잘못된 판단이다. 이를 거짓 양성 False Positive , 타입 1 에러, 여기서 False는 내가 이 사람을 건강하다고 판단한 거고 positive는 판단한 결과가 양성이다는 의미이다. 암에 걸린 사람 사람을 음성으로 분류하면 치명적인 상황이.......

[프로그래머스] 더 맵게 c++ [내부링크]

문제에 보면 가장 맵지 않은 음식과 두 번째로 맵지 않은 음식을 사용한다고 하니 우선순위 큐를 이용해서 풀어줬다. 우선순위 큐를 만들 때 가장 작은 수가 top에 있게 만들어줘야 된다. 그럼 top이랑 그다음에 있는 수만 가지고 공식을 적용해서 계속 넣어주면 된다. 우선순위 큐의 가장 작은 수가 k 이상이면 조건을 만족하기에 멈춰주고 아니면 새로운 음식을 만든다. 이때 큐의 사이즈가 1이 될 수 있는데 여기서 한 개의 지수가 k보다 크면 만족한 거기에 break 해줘서 answer return 해주고 작으면 만족하지 못 한 거기에 -1을 return 한다.

논문 사이트 paperswithcode [내부링크]

딥러닝 머신러닝 관련된 논문들이 있고 구현 코드까지 제공해 주는 사이트이다. 어느 정도까지 코드를 제공하는지는 잘 모르겠는데 일단 github까지 다 있다. 우연히 오픈카톡방에서 알게 된 사이트인데 좋아 보여서 ㅋㅋㅋㅋ 글로 써본다 확실히 대부분 pytorch 쓰네 pytorch로 시작하길 잘했다

[ML] K-fold cross-validation, LOOCV [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 교차 검증 교차 검증 cross-validation은 데이터를 여러 번 반복해서 나누고 여러 모델을 학습한다. 가장 많이 사용되는 교차 검증 방법은 k-fold-cross-validation이다. k는 fold의 수를 나타내고 보통 5 또는 10을 사용한다. 예를 들어 5 - fold cross validation 이면 데이터를 폴드라는 거의 비슷한 크기의 부분 집합 다섯 개로 나눈다. 그다음 모델들을 만든다. 첫 번째 모델은 첫 번째 폴드를 테스트 세트로 하고 나머지 2~5 폴드를 훈련 세트로 사용한다. 즉 첫 번째 모델은 2~5 폴드까지의 데이터를 사용해서 만들어지고 1번 폴드를 이용해서 정확도를 평가한다. 위의.......

7월 끝 [내부링크]

지금 내가 무엇을 해야 할지 잘 모르겠어가지고 정리할 겸 글 좀 써본다. 일단 종강하고 다 놀고 6월 말부터 7월까지 한 것들부터 정리하면 1. 모두의 딥러닝 시즌 1 2. 모두의 딥러닝 시즌 2 pytorch 3. wikidocs pytorch 4. codeup 기초 100제 python 5. 밑바닥부터 시작하는 딥러닝 1 2회독 6. 파이썬라이브러리를 활용한 머신러닝 1회독 4장 마무리, 5장 보는 중 7. 허민석 판다스 기초 강의 8. 3blue1brown 딥러닝 강의 9. 허민석 캐글 강의 10. 이유한 캐글 강의 11. 프로그래머스 1단계 12. Do it 데이터분석을 위한 pandas 입문 13. SAMSUNG VRAN white paper 1,2 14. 타이타닉 필사 3회독 15. 꾸준한 운동 16. 해리포터와 비밀의방, 아.......

[ML] 그리드 서치 Grid Search [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 매개변수를 튜닝해서 일반화 성능을 개선하는 방법을 알아본다. 모델에서 일반화 성능을 최대로 높여주는 중요한 매개변수의 값을 찾는 일은 어렵지만 모든 모델과 데이터셋에서 해야 할 필수적인 일이다. 가장 많이 사용하는 방법은 그리드 서치(Grid search)로 관심 있는 매개변수들을 대상으로 가능한 모든 조합을 시도해보는 것이다. 그리드 서치(Grid Search) RBF(radial basis function) 커널 SVM을 사용해서 그리드 서치를 해본다. SVM의 매개 변수에는 커널의 폭에 해당하는 gamma와 규제 매개변수 C가 중요하다. 매개변수 C와 gamma에 0.001, 0.01, 0.1, 1, 10, 100을.......

[ML] 모델 기반, 반복적 특성 선택 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 모델 기반 특성 선택 모델 기반 특성 선택은 지도 학습 머신러닝 모델을 사용해서 특성의 중요도를 평가한 뒤 가장 중요한 특성들만 선택한다. 특성 선택에 사용하는 지도 학습 모델은 최종적으로 사용할 지도 학습 모델과 같을 필요가 없다. 특성 선택을 위한 모델은 각 특성의 주용도가 담겨 있는 feature_importances_ 속성을 제공한다. 모델 기반 특성 선택은 한 번에 모든 특성을 고려하므로 상호작용 부분을 반영할 수 있다. SelectFromModel은 지도 학습 모델로 계산된 중요도가 지정한 임계치보다 큰 모든 특성을 선택 일변량 분석으로 선택한 특성과 결과를 비교하기.......

[프로그래머스] 2016년 c++ [내부링크]

2016년 문제 갠적으로 이런 문제는 자칫하면 코드가 엄청 길어질 수 있는 어려운 문제라고 생각한다. 얼마나 간단한 게 생각하는지가 중요한 듯 나는 2016년 1월 1일을 기준으로 해서 며칠이 떨어져 있는지 구했다. month에 1~12월의 일 수를 저장하고 day에 FRIday부터 저장해 줬다. 왜냐 문제의 기준인 1월 1일이 금요일이기 때문 a 월이 들어오면 1월부터 a-1 월까지의 일 수를 다 더해준다. 예를 들어 5월이면 1월에서 2월 2월에서 3월 3월에서 4월까지만 더 해주고 그다음은 1일부터 b 일까지의 일 수를 더 해준다. 그다음 그 합을 7로 나눈 나머지를 통해서 요일을 구해준다. 어차피 요일은 7번 반복하기에 7로 나눈 나머지를 사용하면 된.......

종이의 집 파트 5 [내부링크]

이거 근데 유튜브 링크 걸어도 되나? 암튼 오늘 갑자기 생각나서 찾아봤는데 9월에 1부 나오네,, 12월에 2부 나오고 너무 기대된다~~ 빨리 나왔으면 좋겠다. 내 넷플릭스 인생작 벨라차오 벨라차오 벨라 차오 차오 차오~

머리 식히는 중 [내부링크]

연구실에만 있다가 바깥으로 나오니 좋네^^ 강원도의 맑은 날씨 젊은 달 와이파크를 갔다 들어가면 반기는 곳 처음 봤을 때 신기했다 바로 사진 한 컷^^ 등 운동을 너무 열심히 했다 꽃도 있고 향기가 좋았다. 조금 보고 쭉 가보니 야외 이어져서 야외도 구경했다. 접어지지 않는 등 핸드폰 잠시 하는데 엄마가 찍어줬다. 아니 근데 너무 탔다 사진 보고 좀 깜짝 놀람 여기서도 접어지지 않고.. 마리오네트관도 있는데 쭉 보니 친구들이 춤추고 있어서 찍어봤다 ㅋㅋ 용을 표현한 거라고 한다 색감이 이쁘다. 술을 모아놓은 거란다 김삿갓씨가 있길래 찰칵! 술 한잔 따라줬다 다 보고 입구에서 한 컷 듬직하게 나왔네 어디더라 해발 1300m 어디선.......

[ML] 특성 자동 선택 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 특성이 추가되면 모델은 더 복잡해지고 과대적합될 가능성도 높아진다. 새로운 특성을 추가할 때나 고차원 데이터셋을 사용할 때 가장 유용한 특성만 선택하고 나머지는 무시해서 특성의 수를 줄이는 것이 좋다. 특성이 좋은지 확인하는 방법은 일변량 통계, 모델 기반 선택, 반복적 선택이 있다. 이 방법들은 모두 지도 학습 방법이기에 최적값을 찾으려면 타깃 값이 필요하고 데이터를 훈련 세트와 테스트 세트로 나눈 다음 훈련 데이터만 특성 선택에 사용한다. 일변량 통계 일변량 통계에서는 개개의 특성과 타깃 사이에 중요한 통계적 관계가 있는지를 계산한다. 그다음.......

[ML] 상호작용과 다항식 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 상호작용과 다항식 특성을 풍부하게 나타내는 방법은 원본 데이터에 상호작용(interaction)과 다항식(polynomial)을 추가하는 것이다. 선형 모델은 데이터셋의 각 구간에 대해 상숫값을 학습할 수 있다. 이런 선형 모델은 절편 외에도 기울기도 학습할 수 있다. 기울기를 추가하는 방법은 구간으로 분할된 데이터에 원래 특성(x축)을 다시 추가하는 것이다. 이렇게 하면 11차원 데이터셋이 만들어진다. 이 예에서 모델은 각 구간의 절편과 기울기를 학습한다. x축 특성이 하나이기에 기울기도 하나이다. 하지만 모든 구간에서 기울기가 같으니 별로 좋아 보이지 않는다. 오히.......

[ML] 일변량 비선형 변환 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 선형 회귀 모델에 제곱 항이나 세제곱 항을 추가하면 모델에 도움이 된다. 또한 log, exp, sin 같은 수학 함수를 적용하는 방법도 특성 변환에 유용하다. 트리 기본 모델은 특성의 순서에만 영향을 받지만 선형 모델과 신경망은 각 특성의 스케일과 분포에 밀접하게 연관되어 있다. 그리고 특성과 타깃 값 사이에 비선형성이 있다면 선형 회귀에서는 모델을 만들기가 어렵다. log와 exp 함수는 데이터의 스케일을 변경해 선형 모델과 신경망의 성능을 올리는 데 도움을 준다. 대부분의 모델은 각 특성이 히스토그램 종 모양과 비슷할 때 최고의 성능이 낸다. log나 exp는 이런.......

[프로그래머스] 다트 게임 c++ [내부링크]

다트 게임 문제 문제에 나와 있는 그대로 구현을 해주면 된다. 문자열을 이용해서 구현했다. 0~9 사이의 숫자면 num에 계속 더해줘서 숫자를 만들어준다. 이렇게 한 이유는 10까지 가능해서 10을 처리해 주려고 했다. S, D, T인 경우는 그때까지의 num을 처리해 줬다. 처리하면 다시 공백으로 바꿔줬다. idx가 있는데 이건 result에서의 index를 의미한다. result에서의 위치를 보기 위해서 넣어줬다. 암튼 넣어주면 idx++ 해준다. 다음 *, #일 때를 보면 *는 처음에 나오는 경우와 그다음에 나오는 경우가 있다 처음에 나오는 경우는 바로 앞에 있는 것만 두 배 해주면 되기에 idx -1을 2배 해준다. idx - 1인 이유는 앞에서 idx++를 해줘서 인.......

[Pandas] groupby, agg, fillter, transform, get_group, reset_index, as_index [내부링크]

groupby를 이용하면 데이터를 그룹 지을 수 있다. groupby year로 그룹을 짓고 거기서 lifeExp만 뽑아서 평균을 구하는 것이다. groupby 과정 살펴보기 groupby를 한 결과를 직접 살펴볼 수는 없기에 비슷한 메서드를 사용해서 살펴본다. 먼저 groupby에 year을 전달하면 위와 같이 데이터가 분할이 된다. 각 연도별로 데이터를 추출하는 것이다. 일단 1952년의 데이터만 추출한다. 거기서 lifeExp만 뽑아내고 평균을 구하면 된다. 위와 같은 과정이 반복된다고 생각하면 된다. 집계 메서드 agg 메서드 라이브러리에서 제공하는 메서드로 원하는 값을 계산할 수 없는 경우에는 직접 함수로 만들어서 사용해한다. 사용자 함수와 groupby 메서드를.......

[Pandas] 시계열 데이터, datetime, to_datetime, dt, strftime, parse_dates [내부링크]

일정 시간 간격으로 어떤 값을 기록한 데이터가 시계열 데이터이다. datatime 라이브러리는 날짜와 시간을 처리하는 다양한 기능을 제공하는 파이썬 라이브러리다. 날짜를 처리하는 date 오브젝트, 시간을 처리하는 time 오브젝트, 날짜와 시간을 모두 처리하는 date 오브젝트, 시간을 처리하는 time 오브젝트, 날짜와 시간을 모두 처리하는 datetime 오브젝트가 포함되어 있다. datetime 오브젝트 datetime에서 datetime을 import 하면 쓸 수 있다. now와 today를 사용하면 현재 시간을 출력할 수 있다. datetime 오브젝트를 생성할 때 시간을 직접 입력해서 인자로 전달할 수 있다. datetime 오브젝트는 시간 계산을 할 수 있다. to_datetime t.......

Kaggle 필사 [내부링크]

캐글 코리아 티스토리에 있는 캐글 커널 커리큘럼을 옮긴 글입니다. 다 세 번씩 필사해야지! Binary classification : Tabular data 1st level. Titanic: Machine Learning from Disaster 타이타닉 튜토리얼 1 - Exploratory data analysis, visualization, machine learning (2021.07.22 / 2021.07.23 / 2021.07.29) EDA To Prediction(DieTanic) (2021.08.06 Titanic Top 4% with ensemble modeling Introduction to Ensembling/Stacking in Python 2nd level. Porto Seguro’s Safe Driver Prediction Data Preparation &#38; Exploration Interactive Porto Insights - A Plot.ly Tutorial XGBoost CV (LB .284) Porto Seguro Exploratory An.......

[프로그래머스] 실패율 c++ [내부링크]

2019 KAKAO BLIND RECRUITMENT 문제 일단 당연히 stages가 20만까지라서 이중 for 문 안되는 줄 알았는데 생각해 보니 스테이지의 개수가 500까지고 stage 배열의 길이가 20만까지라서 이중 for 문도 된다. 나는 처음에 stage 배열을 이중 for 문 돌리는 걸로 잘못 생각했다. 일단 실패율을 구하기 위해서는 자기 자신의 숫자의 수 개수와 자기 보다 큰 번호의 개수가 필요하다. arr에 stages 벡터를 넣어준 다음에 이진 탐색으로 개수를 찾아주기 위해서 일단 정렬해 준다. 자기 보다 큰 숫자의 개수는 end() - upper_bound() 해주면 되고 자기 자신의 개수는 upper_bound() - lower_bound() 해주면 된다. 그리고 이 두 값의 나눗셈 값을 넣어주.......

너구리야 [내부링크]

고양이인가? 싶어서 갔는데 뭔가 이상해서 따라고보니 이미 꼬리부터가 오잉? 뭐해 너구리야 학교에 너구리 있는 건 알고 있었는데 처음보네 당신은 누구시죠? 요즘 자주 보네요^^

Do it! 데이터 분석을 위한 판다스 입문 끝 [내부링크]

마지막 시계열 데이터 부분은 실습이라서 딱히 블로그에 안 적었다. 7월 19일부터 보기 시작한 책 책 제목에 적혀 있는 것처럼 딱 일주일 정도 투자하면 좋은 것 같다. 더 빨리 하라면 할 수도 있겠지만 그럼 좀 지루하다랄까ㅋㅋㅋㅋ 일주일 잡고 하는 게 제일 좋은 것 같다. 머신러닝과 딥러닝을 공부하기 위해서는 그전에 해야 될 공부가 너무 많다. 기초 통계, 선대, 미적 python 등등 통계, 선대, python은 다 할 줄 알아서 바로 공부 시작했는데 하다 보니 머신러닝 딥러닝만 공부해서 되는 게 아니라 데이터를 다루지 못하면 인공지능 공부를 할 수가 없다는 걸 느껴서 pandas를 공부하기 시작했다. 처음에는 허민석 유튜브에서 강의를 다.......

[ML] 데이터 표현과 특성 공학, 범주형 변수 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 특성 공학 데이터 포인트가 실수형 배열이면 연속형 특성이라고 한다. 허나 일반적인 데이터 포인트의 형태는 categorical feature(범주형 특성) 또는 discrete feature(이산형 특성)이다. 이 특성은 보통 숫자 값이 아니다. 범주형 특성은 브랜드, 색상, 판매 분류 등이 있다. 상품을 묘사하는 속성이지만 연속된 값이 아니다. 중요한 건 옷에 속하거나 책에 속한다는 것이다. 데이터가 어떤 형태의 특성으로 구성되어 있는가 보다 데이터를 어떻게 표현하는가가 머신러닝 모델의 성능에 주는 영향이 더 크다. 특정 애플리케이션에 가장 적합한 데이터 표현을 찾는 것을 특성.......

[ML] OneHotEncoder(원핫인코딩), ColumnTransformer, make_column_transformer [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. OneHotEncoder scikit-learn에서도 원-핫-인코딩을 수행할 수 있다. 사이킷 런에서는 훈련 세트와 테스트 세트를 같은 방식으로 다루기 쉬운 것이 장점이다. 원핫인코딩은 OneHotEncoder 클래스에 구현되어 있고 모든 열에 인코딩을 수행한다. sparse를 False로 설정하면 넘파이 배열을 반환하고 True로 설정하면 희소 행렬로 반환한다. 문자열 특성과 정수 특성이 모두 반환되었다. scikit-learn의 출력은 DataFrame이 아니기에 열 이름이 없다. 변환된 특성에 해당하는 원본 범주형 변수의 이름을 얻으려면 get_feature_names 메서드 사용하면 된다. 처음 세 개의 열은 첫 번.......

[ML] 구간 분할, 이산화, 선형 모델, 트리 모델 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 데이터를 잘 표현하는 방법은 데이터가 가진 의미뿐 아니라 어떤 모델을 사용하는지에 따라 다르다. 선형 모델과 트리 기반 모델은 특성의 표현 방식으로 인해 미치는 영향이 매우 다르다. 2장에서 사용한 wave 데이터셋을 이용해서 선형 회귀 모델과 결정 트리 회귀를 비교한 결과이다. 선형 모델은 선형 관계로만 모델링 하므로 특성이 하나일 땐 직선으로 나타난다. 결정 트리는 이 데이터로 훨씬 복잡한 모델을 만들 수 있다. 하지만 데이터의 표현 형태에 따라 굉장히 달라진다. 연속형 데이터에 강력한 선형 모델을 만드는 방법 중 하나는 한 특성을 여러 특성으로 나누.......

[Pandas] 자료형 변환, astype, to_numeric, downcast, 카테고리형 [내부링크]

판다스에서 자료형 변환 방법을 알아본다. astype astype을 이용해서 sex 열의 데이터를 문자열로 반환한다. 데이터프레임의 데이터들의 타입을 확인하려면 dtypes 하면 된다. object는 pandas에서 문자열이다. to_numeric 잘못 입력한 데이터를 변환할 때 사용하는 to_numeric 메서드이다. 1, 3, 5, 7행을 뽑고 total_bill 값을 missing으로 바꾼다. total_bill의 자료형이 object이다. total_biil 열의 데이터를 실수로 변환하려면 to_numeric 메서드에 인자를 넣어서 사용하면 된다. astype과 인자를 넣지 않은 to_numeric은 오류가 발생한다. to_numerice 메서드는 error 인자에 raise, coerce, ignore를 지정해서 오류를 제어 가능하다. 오.......

[Pandas] 파이썬 정규식 [내부링크]

기본 정규식 문법 정규식 특수 문자 정규식 메서드 test &#x3D; &#x27;l like apple, l like to make application&#x27; span에는 찾은 패턴의 인덱스가 match에는 찾은 패턴의 문자열이 있는 것을 확인할 수 있다. start와 end 메서드는 첫 번째와 마지막 인덱스를 반환, span 메서드는 찾은 패턴의 첫 번째와 마지막 인덱스를 한 번에 반환 group 메서드는 찾아낸 패턴을 반환 전화번호를 입력하는 방법은 1234567890이 아니라 123-456-7890이나 123 456 7890과 같은 방법이 있다. 전화번호가 달라지면 앞에서 사용한 방법은 제대로 검사를 하지 못한다. pattern을 바꾸면 잘 찾을 수 있다. 지역 변호에 괄호가 되어있으면 아래와 같이 하면 된.......

[프로그래머스] 비밀지도 c++ [내부링크]

카카오 블라인드 채용 1차문제 문제에 큰 힌트가 있다. 어느 하나라도 벽인 부분은 전체 지도에서 벽이고 둘 다 공백인 부분은 전체 지도에서도 공백이다라는 말에서 OR 연산자라는 걸 알 수 있다. arr1과 arr2에 있는 값을 OR 연산해서 출력값으로 바꿔주는 함수를 넣어주면 된다. 참고로 이문제 2번째 예제 출력값 좀 잘못 나왔다. 6자리로 나와야되는데 몇 개가 5자리로 나왔다. 아무튼 문제에서 주어진 n 자리만큼 출력을 해야된다. 일단 OR 연산자를 한 수를 two 함수에 넣어줘서 이진수로 바꿔주고 길이를 본다음에 n 을 만족하지 못 하면 n 자리가 될 수 있게 0을 추가해준다. 그 다음 1이면 # 0이면 &#34; &#34;으로 바꿔주면 된다.

[Pandas] apply 메서드 [내부링크]

데이터프레임에 함수를 적용시킬 수 있는 apply 메서드이다. 제곱을 해주는 exp 함수를 df[&#x27;a&#x27;] , df[&#x27;b&#x27;]에 적용시키려면 apply을 해주면 된다. 함수의 매개변수가 여러 개 일 수 있다. 이러면 값을 같이 넘겨주면 된다. 꼭 n &#x3D; 5 이렇게 써줘야 된다. 숫자만 쓰면 오류 뜬다. apply 함수에 aixs 인잣값도 넘겨줄 수 있다. axis 값을 넘겨주지 않으면 기본적으로 열 방향(0)으로 함수를 적용한다. 위와 같이 매개변수가 3개인 함수를 적용시키려고 하면 열 단위 데이터를 한 개의 인자로 생각하기에 오류가 발생한다. 따라서 avg 함수가 열 단위로 데이터를 처리할 수 있게 바꿔줘야 한다. 데이터프레임 누락값 apply .......

완벽한 일요일 [내부링크]

완벽한 일요일이다. 최근에 연구실에서 제안서 쓰느라 번아웃이 왔다. 번아웃을 해결하고자 일요일은 좀 쉬어봤다. 아침에는 아침 먹고 핸드폰 하면서 뒹굴거리면서 놀았다. 점심 먹고는 수어사이드 스쿼드 2 보러 갔다. 호불호가 갈린다는데 나는 재밌게 봤다. 마고로비의 할리퀸 진짜 너무~~~~~~~~~이쁘다. 진짜 수어사이드 스쿼드는 할리퀀 없었으면 망했다. 영화 보고 난 뒤에는 집 와서 오랜만에 초밥 먹으면서 롤 봤다. 초밥도 칼로리 때문에 먹을까 말까 고민하다가 밥을 덜어서 먹으면 괜찮을 것 같아서 그냥 먹었다. 오늘 나의 최애팀인 T1 경기가 있어서 먹으면서 봤는데 아쉽게 2 대 0 패배 하지만 괜찮다 어차피 플레이오프 진출했으.......

[ML] 병합 군집 agglomerative clustering 알고리즘, 덴드로그램 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. clustering 알고리즘의 단점을 개선한 병합 군집 알고리즘이다. 병합 군집 알고리즘 병합 군집 알고리즘은 시작할 때 각 포인트를 하나의 클러스터로 지정하고 조건을 만족할 때까지 가장 비슷한 두 클러스터를 합쳐나간다. 종료 조건은 클러스터의 개수로 지정된 개수의 클러스터가 남을 때까지 비슷한 클러스터를 합친다. scikit-learn에서는 4가지 옵션으로 클러스터를 합칠 수 있다. ward - 모든 클러스터 내의 분산을 가장 작게 증가시키는 두 클러스터를 합친다. 크기가 비교적 비슷한 클러스터가 만들어진다. average - average 연결은 클러스터 포인트 사이의 평균 거.......

[ML] DBSCAN 알고리즘 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. DBSCAN DBSCAN(density-based clustering of application with noise)도 군집 알고리즘이다. DBSCAN는 클러스터의 개수를 미리 지정할 필요가 없다. 이 알고리즘은 복잡한 형상도 찾을 수 있고 어떤 클래스에도 속하지 않는 포인트를 구분할 수 있다. 병합 군집이나 k-means보다는 느리지만 큰 데이터셋에도 적용 가능하다. DBSCAN은 특성 공간에 가까이 있는 데이터가 많아 붐비는 지역의 포인트를 찾는다. 이런 지역을 특성 공간의 밀집 지역(dense region)이라 한다. DBSCAN의 아이디어는 데이터의 밀집 지역이 한 클러스터를 구성하고 비교적 비어있는 지역을 경계로 다른.......

[프로그래머스] 체육복 c++ [내부링크]

check 배열은 체육복을 잃어버린 사람을 표시하는 배열 true 이면 잃어버렸고 false면 안 잃어버림 res 배열은 여분의 체육복이 있는 사람을 표시하는 배열 true 이면 여분이 있고 false 면 여분이 없음 문제에서 놓쳤던 조건이 아래 조건이다. 여분의 체육복이 있는 학생도 도난당할 수 있다. 나는 여분의 체육복이 있는 사람을 기준으로 문제를 풀었다. for 문을 돌면서 여분이 있고 도둑맞지 않는 사람인 지를 체크해 준다. 조건을 만족하면 인덱스를 봐주는데 맨 앞에 있는 사람은 내 뒤에 있는 사람이 여분이 없고 도둑 맞은 사람이면 무조건 빌려주는 게 이득이기에 빌려준다. 받은 사람은 check 배열을 false로 해준다. 맨 뒤에 있는 사람.......

[Pandas] 열 데이터 처리, melt, str.split(), get, pivot_table, reset_index [내부링크]

melt melt 메서드는 지정한 열의 데이터를 모두 행으로 정리해 준다. id_vars 인잣값으로 지정한 religion을 제외한 나머지 소득정보가 variable 열로 정리되고 열의 값들이 행으로 내려갔다. 소득 정보 열의 행 데이터도 value 열로 정리되었다. 위와 비교해보면 variable이 income으로 value가 count로 바뀌었다. 2개 이상의 열을 고정하고 나머지 열을 행으로 바꿀 수가 있다. 열 이름 관리 어떤 열은 여러 가지 의미를 지닐 수 있다. 먼저 Date와 Day를 고정하고 나머지를 행으로 피벗 variable을 보면 Cases_Guinea처럼 &#x27;_&#x27;을 기준으로 2개의 의미를 가질 수 있다. 이런 열 이름을 분해하려면 split 메서드를 사용하면 된다. 위에.......

[Pandas] 중복 데이터 처리, drop_duplicates [내부링크]

판다스에서 중복 데이터를 처리하는 법을 알아본다. 중복 데이터 처리 melt를 통해서 데이터를 먼저 정리해준다. 노래 제목인 Loser인 데이터만 따로 모아서 보면 중복 데이터가 꽤 많다 . 중복 데이터 열을 따로 관리 해준다. drop_duplicates를 이용해서 중복 데이터를 제거해준다.

[ML] K-means clustering 알고리즘 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 군집(clustering)은 데이터셋을 클러스터(cluster)라는 그룹으로 나누는 작업이다. 한 클러스터 안의 데이터들 끼리는 매우 비슷하고 다른 클러스터의 데이터 포인트와는 구분되도록 데이터를 나누는 것이다. 군집 알고리즘은 각 데이터 포인트가 어느 클래스에 속하는지 할당(또는 예측) 한다. K-means k-means 알고리즘은 데이터 k 개의 클러스터로 군집화하는 알고리즘이다. 이 알고리즘은 영역을 대표하는 클러스터 중심을 찾는다. 알고리즘은 크게 두 단계를 반복한다. 데이터 포인트를 가장 가까운 클러스터 중심에 할당하고, 그런 다음 클러스터에 할당된 데이터 포인.......

[Pandas] seaborn, subplots, distplot, countplot, 산점도, jointplot, 육각 그래프 [내부링크]

seaborn을 이용해서도 그래프를 그릴 수 있다. matplotlib보다 더 화려한 그래프가 가능하다. subplots, distplot subplot를 통해서 기본 틀을 만들고 distplot 메서드에 열 데이터를 전달하면 히스토그램을 그릴 수 있다. 이때 distplot 메서드를 사용하면 히스토그램과 밀집도 그래프를 같이 그린다. *밀집도 그래프는 데이터를 정규화시켜 넓이가 1이 되도록 그린 그래프이다. 밀집도 그래프를 제외하고 싶으면 kde 값을 false로 설정하면 된다. kde는 kernel density estimation 약자이다. 밀집도 그래프만 나타내려면 hist 인자를 false로 하면 된다. distplot 메서드에 rug 인자를 추가하면 rug 그래프까지 그릴 수 있다. rug 그래프는 그.......

[Pandas] seaborn 이차원 밀집도, 바, 박스, 관계 그래프, violin, lmplot, facetGrid,hue 그래프 색깔 추가 [내부링크]

먼저 데이터를 불러온다. 이차원 밀집도 이차원 밀집도는 kdeplot 메서드로 만들 수 있다. total_bill, tip 열 데이터를 전달하여 이차원 밀집도를 그린 것이다. shade &#x3D; True로 지정하면 그래프에 음영 효과를 줄 수 있다. shade &#x3D; False로 하면 아래처럼 된다. 바 그래프 바 그래프는 지정한 변수의 평균을 계산해서 그린다. 박스 그래프 박스 그래프는 최솟값, 1분위수, 중간값, 3분위수, 최댓값, 이상치 등 다양한 통계량을 한 번에 표현하는 그래프이다. 바이올린 그래프 박스 그래프는 다양한 통계 수치를 확인하기 할 수 있지만 데이터 분산이 모호하게 표현된다. 이런 경우 박스 그래프에 커널 밀도를 추정한 바이올린 그래프.......

[ML] manifold(매니폴드 알고리즘) t-SNE [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. t-SNE를 이용한 매니폴드 학습 데이터를 산점도로 시각화할 수 있다는 이점 때문에 PCA가 데이터 변환에 가장 먼저 시도해볼 만하지만 알고리즘의(회전하고 방향을 제거하는) 태생상 유용성이 떨어진다. 매니폴드 학습 알고리즘이라는 시각화 알고리즘들은 훨씬 복잡한 매핑을 만들어서 더 나은 시각화를 제공한다. 그 중 t-SNE 알고리즘을 많이 사용한다. t-SNE &#x3D; t - Distributed Stochastic Neighbor Embedding 매니폴드 학습 알고리즘은 목적이 시각화라 3개 이상의 특성을 뽑는 경우는 거의 없다. t - SNE 포함 일부 매니폴드 알고리즘들은 훈련 데이터를 새로운 표.......

[Pandas] 데이터프레임, 시리즈 그래프 그리기 [내부링크]

데이터프레임과 시리즈로도 그래프를 그릴 수 있다. 간편하게 그리고 싶은 경우 바로 데이터프레임과 시리즈를 사용해서 그래프를 그리면 된다. 먼저 plot 속성에 정의된 hist 메서드를 사용해서 히스토그램을 그린다. 투명도를 조절하려면 hist 메서드의 alpha, bin, ax 인자를 사용하면 된다. 여러 개의 그래프를 그리려면 plt.subplots(행, 열)을 사용한다. plt.subplots()는 2개의 변수를 반환하는데 하나는 전체 액자 fig에 대한 변수 하나는 액자 내 여러 개의 액자에 대한 리스트 axs다 alpha는 투명도, bins는 x축 간격이다. 밀집도 그래프는 kde 메서드를 사용해서 그릴 수 있다. 산점도 그래프는 scatter를 이용하면 된다. 육각 그래프.......

[Pandas] 데이터연결 concat, append, merge [내부링크]

concat concat 메서드를 사용하면 데이터를 연결할 수 있다. concat 메서드에 연결하려는 데이터프레임을 리스트에 담아서 전달하면 연결한 데이터프레임을 반환한다. 인덱스도 그대로 이어진다. 인덱스를 순서대로 하고 싶으면 ignore_index &#x3D; True로 하면 된다. 데이터프레임에 시리즈를 연결할 수 있다. 행으로 추가되는 게 아니라 열로 추가된다. NaN은 누락값이다. 시리즈에는 열 이름이 없기 때문에 새로운 열로 간주해서 0이라는 이름의 열로 추가된 것이다. 시리즈를 행으로 추가하고 싶으면 데이터프레임 형태로 만들면 된다. append concat은 2개 이상의 데이터프레임을 연결할 수 있고 append는 1개의 데이터프레임을 연결할 수.......

[Pandas] NaN, count, count_nonzero, isna, isnull, value_counts, fillna, skipna [내부링크]

누락값을 파이썬에서 사용하려면 numpy가 필요하다. NaN은 데이터 자체가 없기에 0, &#x27; &#x27;와는 다른 개념이다. Nan은 true, false, 0, &#x27;&#x27;이랑 비교해도 다 false가 나오고 자기 자신과 비교해도 값이 없기에 false가 나온다. 누락 값을 확인하려면 pandas의 isna(), isnull 메서드를 사용하면 된다. 누락값이 아닌 걸 검사하려면 notnull 메서드를 사용하면 된다. 누락값의 개수, count count 메서드를 이용하면 누락값이 아닌 값의 개수를 구할 수 있다. count를 이용해서 누락값의 개수를 구할 수 있다. shape[0]에 전체 행의 데이터 개수가 저장되어 있기에 이 값에서 count의 개수를 빼면 된다. count_nonzero, isnull, va.......

[Pandas] groupby, mean, nunique [내부링크]

데이터는 아래와 같다. 먼저 연도별 lifeExp의 평균을 계산한다고 하자. 먼저 데이터 year 열로 그룹화하고 lifeExp 열의 평균을 구하면 된다. groupby 메서드에 year 열을 전달해서 연도별로 그룹화하고 lifeExp 열을 지정해서 mea 메서드를 사용하면 된다. groupby 메서드에 year 열 이름을 전달하면 연도별로 그룹화한 country, continent,... 열을 모은 데이터프레임을 얻을 수 있다. 여기서 lifeExp 열을 추출하면 그룹화한 시리즈를 얻을 수 있다. 즉 연도별로 그룹화한 lifeExp 열을 얻을 수 있다. 여러 개의 열로도 그룹화해서 계산을 할 수 있다. year와 continent로 그룹을 짓고 lifeExp와 gdpPercap의 평균을 구하는 것이다. 그룹화한.......

[Pandas] series, index, values, keys, mean, min, max, std [내부링크]

시리즈를 직접 만들 수 있다. Series를 이용하면 된다. series 인덱스 또한 직접 리스트에 담아서 전달할 수 있다. 데이터프레임을 만들 때는 딕셔너리를 DataFrame 클래스에 전달해야 된다. 시리즈와 마찬가지로 데이터프레임도 인덱스를 따로 지정하지 않으면 인덱스를 0부터 자동 생성 따로 지정하려면 index 인자에 리스트를 전달하면 된다. columns 인자를 사용하면 데이터프레임의 열 순서를 지정할 수 있다. columns 인자에 name, job, age 순서로 열 이름을 전달하면 생성된 데이터프레임의 열 순서는 columns에 전달한 값을 따라간다. 데이터프레임을 만들 때 딕셔너리를 전달하지만 딕셔너리는 데이터의 순서를 보장하지 않는다. 그렇.......

[프로그래머스] 숫자 문자열과 영단어 c++ [내부링크]

2021 카카오 채용연계형 인턴십 1번 문제 이건 실제 코테 볼 때도 딱히 어려움 없이 풀었던 문제 여러 가지 풀이가 있는데 난 map을 이용해서 zero ~ nine을 0~9로 변환할 수 있게 저장했다. 그리고 for 문을 돌면서 숫자면 바로 answer에 더해주고 영어면 쭉 nums 더하면서 계속 map에 있는지 확인해서 있다면 변환해 줘서 더 하는 식으로 했다. 그리고 있다면 다시 nums &#x3D; &#34;&#34;로 해줘서 처음부터 더 할 수 있게 해줬다. 다 더하고는 int를 return 해줘야 되니 stoi 이용해서 변환해 줬다.

[Pandas] boolean 추출, 브로드캐스팅, sort_index, to_datetime, shuffle, drop, to_csv, xlwt, openpyxl [내부링크]

불린 추출 데이터를 추출할 때는 보통 특정 인덱스를 지정해서 추출한다. 하지만 데이터의 정확한 인덱스를 모르는 경우가 더 많기에 이런 경우 사용하는 방법이 boolean 추출이다. 평균보다 나이가 많은 사람의 데이터를 추출하려면 불린 추출을 이용하면 된다. 아래와 같이 작성하면 평균보다 나이가 많은 사람이 추출된다. 이걸 좀 더 분해해서 살펴보면 평균보다 큰 나이는 True로 되고 아니면 False로 나온다. 여기서 True인 것만 추출이 되는 것이다. 브로드캐스팅(broadcasting) ages &#62; ages.mean()의 결괏값의 개수가 여러 개 나오는 이유는 브로드캐스팅 때문이다. 브로드캐스팅은 시리즈나 데이터프레임에 있는 모든 데이터에 대해.......

[Pandas] matplotlib, plot, add_subplot, set_title, suptitle, tight_layout [내부링크]

seaborn 라이브러리에 있는 앤스콤 데이터 집합을 먼저 불러온다. anscombe 데이터 데이터 값이 I인 것만 먼저 추출한다. plot 메서드 plot 메서드를 이용하면 선 그래프를 그릴 수 있다. plot은 기본적으로 선 그래프이고 점으로 그리고 싶으면 세 번째 인자에 &#x27;o&#x27;를 전달하면 된다. matplotlib matplotlib 라이브러리로 그래프를 그리는 방법은 아래와 같다. 1. 전체 그래프가 위치할 기본 틀을 만든다. 2. 그래프르 그려 넣을 그래프 격자를 만든다. 3. 격자에 그래프를 하나씩 추가한다. 격자에 그래프가 추가되는 순서는 왼쪽에서 오른쪽 방향이다. 4. 격자의 첫 번째 행이 꽉 차면 두 번째 행에 그래프를 그려 넣는다. 먼저 데이.......

[Pandas] matplotlib, hist, scatter, box_plot, 다변량 그래프 [내부링크]

seaborn에 있는 tips 데이터를 불러온다. 먼저 기본 틀을 만들어주고 그래프 격자를 구성해 준다. hist hist 메서드를 이용하면 히스토그램을 그릴 수 있다. x축 간격은 bins 인잣값으로 조정 가능하다. bins &#x3D; 10으로 해서 x축 간격을 10으로 했다. set_title을 이용해서 제목을 넣고 set_xlabel과 set_ylabel을 이용해서 scatter 산점도 그래프는 변수 2개를 사용해서 만든다. scatter를 이용하면 만들 수 있다. 박스 그래프 박스 그래프는 이산형 변수와 연속형 변수를 함께 사용하는 그래프이다. boxplot의 첫 번째 인자는 tips 데이터프레임에서 성별이 Female, male 데이터에서 tip 열 데이터만 추출해서 리스트로 전달한 것이다. lab.......

[Pandas] Unique, value_counts [내부링크]

먼저 데이터를 만든다. 직업들이 중복된 것들이 있는데 중복되는 모든 직업이 아닌 딱 unique 하게 보고 싶으면 unique() 함수를 사용하면 된다. 위의 데이터에서 각각의 직업이 몇 명인지를 세고 싶으면 value_counts를 사용하면 된다.

[Pandas] Concat, append 데이터프레임 합치기 [내부링크]

먼저 데이터를 만든다. df1 df2 데이터프레임을 합치는 방법은 2가지가 있다. concat과 append 먼저 concat를 이용해서 행을 합친다고 하면 그대로 합쳐지게 된다. index를 순서대로 하고 싶으면 ignore_index &#x3D; True를 해주면된다. append도 합칠 수 있다. 행으로 합치는 거다 이번에는 열로 합치다고 하자 axis &#x3D; 1을 써줘서 열이라는걸 알려주면된다. 참고로 새로운 변수에 할당해줘야 합쳐진 데이터프레임을 사용할 수 있다. 위의 코드에도 ignore_index를 사용할 수 있으나 사용하면 원하는 결과는 나오지 않는다. 리스트를 합칠 때도 DataFrame을 사용하면 유용하다.

[프로그래머스] 크레인 인형 뽑기 게임 C++ [내부링크]

2019 카카오 개발자 겨울 인턴십 문제 오랜만에 알고리즘 글 올린다. 알고리즘을 아예 안 하는 건 나중에 손해 볼 것 같아서 조금씩만이라도 풀려고 한다. 탐색 문제라고 생각했다. 그렇다고 BFS, DFS 같은 건 아니고 일단 for 문 첫 번째 기준을 moves 배열로 잡았다. moves 배열에 있는 것만큼 움직여야 되니까 하나씩 뽑아서 그 위치를 탐색해 주면 되는데 보니까 카카오톡 문제들은 인덱스를 1부터 시작하는 경우가 많아서 인덱스를 0부터 시작할 거면 꼭 1을 빼줘야 된다. moves에서 한 개를 뽑았으면 이제 그 &#x27;열&#x27;을 탐색하면 된다. num을 열 번호로 잡고 두 번째 for 문 이용해서 쭉 내려가면 된다. 즉 행을 보면 된다. 이미 뽑.......

[프로그래머스] 소수 만들기 C++ [내부링크]

먼저 에라토스테네스의 체 이용해서 3000까지의 소수를 다 만들어준다. 최댓값이 1000이니 1000 3개 더하면 3000이니까 3000으로 잡아줬다. 그다음 조합 알고리즘 이용해서 3개 뽑은 다음에 3개 다 더해서 소수이면 +1 해줬다. 풀이 보니 3중 for 문도 가능한 것 같다.

[프로그래머스] 키패드 누르기 c++ [내부링크]

2020 카카오 인턴십 문제 구현 문제이다. 문제에서 중요한 게 numbers에는 숫자만 들어온다와 손가락은 상하좌우만 움직일 수 있다는 것이다. 일단 1, 4, 7이면 왼손으로 누르니 answer에 +&#x3D; &#x27;L&#x27;을 해주고 왼손이 1, 4, 7중 하나에 있다고 표시를 해준다. 처음에는 left &#x3D; 1 이렇게 해줬는데 left의 변수형이 char여서 1을 넣어주면 원하는 값이 나오지 않게 된다. 그래서 left &#x3D; 1 +&#x27;0&#x27;으로 해줘야 원하는 대로 1이 저장이 된다. 오른손 3,6,9면 똑같이 answer에 +&#x27; R&#x27; 해주고 right &#x3D; 1 + &#x27;0&#x27; 해준다. 그다음 거리가 같을 때인데 거리를 구해주기 위해서 map에 숫자들과 *,#의 좌.......

[ML] 비지도 학습 unsupervised learning,데이터 전처리, 스케일 조정 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 비지도 학습 비지도 학습이란 알고 있는 출력값이나 정보 없이 학습 알고리즘을 가르쳐야 하는 머신러닝이다. 비지도 학습에서 학습 알고리즘은 입력 데이터만으로 데이터에서 정보를 추출해야 한다. 비지도 변환과 군집 비지도 학습에는 비지도 변환(unsupervised transformation)과 군집(clustering)이 있다. 비지도 변환은 데이터를 새롭게 표현해서 사람이나 다른 머신러닝 알고리즘이 원래 데이터보다 쉽게 해석할 수 있도록 만든 알고리즘이다. 비지도 변환은 특성이 많은 고차원 데이터를 특성의 수를 줄이면서 꼭 필요한 특징을 포함한 데이터로 표현하는 방법인 차원.......

[ML] 주성분 분석 PCA(principal component analysis) [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 주성분 분석 PCA 주성분 분석은 특성들이 통계적으로 상관관계가 없도록 데이터셋을 회전시키는 기술이다. 회전한 뒤에 데이터를 설명하는 데 얼마나 중요하냐에 따라 새로운 특성 중 일부만 선택된다. 아래는 2차원 데이터셋을 사용해서 PCA 효과를 나타낸 것이다. 첫 번째 그래프를 보면 PCA 알고리즘은 성분 1이라고 쓰여 있는 분산이 가장 큰 방향을 찾는다. 이 방향이 데이터에서 가장 많은 정보를 담고 있는 방향이다. 즉 특성들의 상관관계가 가장 큰 방향이다. 그다음으로 알고리즘은 첫 번째 방향과 직각인 방향 중에서 가장 많은 정보를 담은 방향을 찾는다. 이런 과.......

[Pandas] 데이터 추출, loc, iloc, tail, slicing, range [내부링크]

아래와 같은 데이터가 있을 때 열 단위로 데이터를 추출할 때는 df[&#x27;열이름&#x27;]을 사용하면 된다. 이렇게 하면 type이 series이고 로 하면 type이 dataframe 된다. 여러 개를 추출할 때는 [&#x27;열이름1&#x27;,&#x27;열이름2&#x27;,....] 식으로 하면 된다. 행 단위로 데이터를 추출할 때는 loc, iloc 속성을 사용하면 된다. loc는 인덱스를 기준으로 행 데이터를 추출하고 iloc은 행 번호를 기준으로 행 데이터를 추출한다. 위와 같은 데이터가 있을 때 왼쪽의 번호가 인덱스이다. 인덱스는 보통 0부터 시작하고 데이터가 추가, 삭제되면 변하고 인덱스는 숫자뿐 아니라 문자열을 사용할 수도 있다. 그렇기에 loc은 레이블을 사용해서.......

[Pandas] Nan(None) 값 찾기 및 변경 [내부링크]

먼저 데이터를 만든다. NaN 값을 보려면 isna() 나 isnull()을 사용하면 된다. True로 변한건 NaN 값이라는 뜻이다. 데이터를 다룰 때 Nan 값이 있으면 좋지 않기에 다른 값으로 변경해 주는 게 좋다. na 값을 다른 값으로 채우려면 fillna을 사용하면 된다. age에 있는 Nan 값을 바꾼다고 하면 0값 말고 job이 teacher 면 teacher의 age의 중간 값 student 면 student의 age의 중간 값으로 채운다고 하면 groupby를 이용해서 job을 teacher와 student로 나누고 age에 관심 있으니 [&#x27;age&#x27;]를 넣어준다. 그다음 transform을 이용해서 median 값으로 바꿔준다.

[Pandas] apply 함수 [내부링크]

먼저 데이터를 만든다. yyyy-mm-dd에서 year만 추출하고 싶을 때는 함수를 만들어서 apply 함수를 적용시켜주면 된다. 함수를 보면 year(row)로 되어있어서 매개변수를 넘겨줘야 하는데 apply(year)만 해줬다. 매개변수 또한 넘겨줄 수 있다. year에다가 임의의 수를 더한다고 해보자. 매개변수를 여러 개 넘겨 줄 수도 있다. 현재 연도를 말한다고 해보자 매개변수를 여러 개 만들어서 넘겨주면 된다. 열의 값들을 넘겨줘서 새롭게 만들어줄 수 있다.

[Pandas] map, applymap [내부링크]

map과 applymap을 알아본다. map은 apply와 유사하나 문자열을 숫자로 바꿀 때 유용하다. map date에서 year를 추출한다고 할 때 apply를 함수를 사용한 것처럼 map도 똑같이 사용할 수 있다. 이번에는 map을 이용해서 문자열을 숫자로 바꿔본다. python에서도 map은 적용시켜준다는 의미로 사용되는 것 같은데 여기서도 마찬가지인 것 같다. 먼저 데이터를 만든다. police &#x3D; 1, professor &#x3D; 2, president &#x3D; 3으로 바꿔본다. applymap 모든 행과 열에 일괄적을 적용시키려면 applymap을 사용하면 된다. 반올림을 모든 데이터에 적용한다고 하자 이때 numpy가 필요하다.

[Pandas] pandas 데이터 불러오기, 데이터프레임 생성 [내부링크]

pandas를 사용하기 전에는 pandas를 import 해줘야 된다. 파일을 불러올 때는 pd.read_csv(&#34;파일 위치/파일명&#34;) 을 이용한다. 이때 파일은 ,로 구별되어있을 때는 위와 같이 하면되고 만일 파일이 ,가 아닌 tab이나 다른 걸로 구별이 되어있을 경우에는 delimiter를 넣어줘야 한다. tab으로 구별되면 위와 같이 delimiter &#x3D; &#x27;\t&#x27;를 넣어주면된다. 헤더 정보가 없는 파일을 불러올 때는 헤더 정보가 없다고 알려주면 된다. header &#x3D; None을 쓰면 된다. 헤더 정보를 넣고 싶으면 columns를 이용하면 된다. 을 해주면 헤더가 추가된다. 헤더가 없는 파일을 헤더를 추가해서 한 줄로 넣고 싶다면 아래처럼 하면 된다. .......

[Pandas] 데이터 프레임 csv 파일로 저장, 데이터 프레임 행,열 선택 및 필터 [내부링크]

먼저 리스트와 딕셔너리를 이용해서 데이터를 만들어 준다. 데이터프레임으로 변환해 준다. 위의 데이터프레임을 csv 파일로 변환해 주기 위해서는 to_csv를 이용하면 된다. 를 이용하면 된다. index는 위의 사진에서 0,1,2를 나타내는 값을 의미하고 True를 하면 저장이 되고 False를 하면 저장이 안 된다. header는 name, age, job을 의미하고 True가 기본 값이고 False를 하면 저장이 되지 않는다. na_rep은 데이터에 None 값이 있을 때 이 값을 csv로 저장할 때 지정한 값으로 저장할 수 있게 한다. 지금은 na_rep &#x3D; &#x27;-&#x27;로 해서 None 값을 -로 저장하게 한다. 먼저 리스트를 이용해서 데이터를 만들어준다. dict와 from_dict를.......

[Pandas] 데이터프레임 행, 열 삭제 [내부링크]

먼저 간단한 데이터를 만든다. 먼저 행부터 삭제해보면 drop을 이용하면 된다. 물론 다시 재할당 해줘야 삭제된 걸로 df가 만들어진다. 재할당 하지 않고 삭제해도 바로 적용되게 하려면 inplace를 이용해 준다. 이렇게 하면 따로 assign 해줄 필요가 없다. 인덱스를 이용해서도 삭제할 수 있다. 이것 또한 재할당해 줘야지만 적용된다. 조건을 이용해서도 삭제가 가능하다. 나이가 20보다 작은 걸 제거하고 싶으면 이건 20보다 큰 사람들만 뽑는 거기에 반대로 생각하면 20보다 작은 걸 제거하는 거다. 데이터를 새로 만든다. 이번엔 name, age, job까지도 다 넣어준다. age 열을 없앤다고 하면 age를 없애고 axis &#x3D; 1은 column을 의미한다.......

[Pandas] 데이터프레임 행, 열 생성 및 수정하기 [내부링크]

먼저 데이터를 만들어준다. 행렬을 추가할 때는 아래와 같이 하면 된다. &#x3D; 0으로 하면 모든 행에 열이 들어간다. 값을 각각 해주려면 배열을 사용한다. 이번에는 student는 연봉이 없으니 NO로 바꾸고 나머지는 연봉이 있기에 YES로 바꿔본다 numpy의 wherer 함수를 이용한다. df[&#x27;job&#x27;]에서 student 가 아니면 즉 true 이면 yes student 이면 False면 No로 바꾼다. 이번에는 숫자 연산을 해본다. weight와 height의 합을 새로운 열로 넣어주려고 하면 아래와 같이 하면 된다. 평균을 넣어주고 싶으면 / 2를 해주면 된다. 이번에는 평균 값에 점수를 매겨줘서 새로운 열을 추가해본다. apply 함수를 이용해서도 가능하다. apply는.......

[Pandas] 데이터 그룹 만들기 group by [내부링크]

먼저 데이터를 만들어준다. 학과 별로 그룹을 만들고 싶을 때는 groupby를 이용하면 된다. groups를 이용하면 어떻게 나눠졌는지 볼 수 있다. 성별로 나누면 아래와 같다. 좀 더 이쁘게 보려면 for 문을 이용하면 된다. name을 통해서 학과 명 len(group)을 통해서 학과의 수 group을 통해서 그 그룹에 속한 정보가 나온다. 학과의 이름과 학과의 수를 데이터 프레임에 넣고 싶으면 아래처럼 하면 된다. 인덱스 번호도 넣고 major와 count를 헤더로 하려면 reset_index()를 하면 된다.

[Pandas] 데이터프레임 중복 제거 [내부링크]

먼저 데이터를 만든다. 중복을 확인하려면 duplicated()를 사용하면 된다 중복된 건 True로 뜨고 아닌 건 False로 뜬다. 처음에 위치한 건 False로 뜬다 모든 중복된 거에 대해서 True로 뜨지 않는다. 1번과 13번은 중복이지만 1번은 False 13번은 True이다. 중복을 제거하는 건 drop_duplicates()를 사용하면 된다. 왼쪽이 원래 데이터 오른쪽이 중복제거한 데이터이다. 중복인 것들은 삭제되고 다 유일한 데이터들만 남았다. 지금까지 중복을 제거한 건 한 행 자체가 다 똑같을 때를 말했다. 하지만 데이터들 중에서 꼭 다 같지 않고 몇 개만 같을 수도 있다. 예를 들어 6번 8번 데이터를 보면 전공과 성별이 같다. 이런 느낌이다. 먼저 이름이.......

[ML] Bagging(배깅), Extra_Trees(엑스트라 트리), AdaBoost(에이다부스트) [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 앙상블 알고리즘에는 배깅(Bagging), 에이다부스트(AdaBoost), Extra-Trees(엑스트라 트리)도 있다. 데이터셋은 two_moons 데이터셋과 cancer 데이터셋을 사용한다. 참고로 preamble은 파이썬 라이브러리를 활용한 머신러닝 github(https://github.com/rickiepark/introduction_to_ml_with_python/blob/1st_edition/preamble.py) 들어가서 다운 받아야 된다. 배깅 Bagging Bagging은 Bootstrap aggregating의 줄임말이다. 배깅은 중복을 허용한 랜덤 샘플링으로 만든 훈련 세트를 사용해서 분류기를 각각 다르게 학습시킨다. 분류기가 predict_proba() 메서드를 지원하는 경우.......

[ML] 커널 서포트 벡터 머신 (Kernerlized support vector machines) [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 서포트 벡터 머신 지도 학습 모델 중 하나인 커널 서포트 벡터 머신(SVM)이다. 커널 서포트 벡터 머신은 입력 데이터에서 초평면(hyper plane)으로 정의되지 않는 더 복잡한 모델을 만들 수 있도록 확장한 것이다. SVM은 분류와 회귀 모두 사용이 가능하다. 선형 모델과 비선형 특성 선형 모델을 유연하게 만드는 한 가지 방법은 특성끼리 곱하거나 특성을 거듭제곱하는 식으로 새로운 특성을 추가하는 것이다. 아래의 사진은 선형적으로 구분되지 않는 클래스를 가진 이진 분류 데이터셋이다. 분류를 위한 선형 모델은 직선으로만 데이터를 나눌 수 있어서 위와 같은 데이터.......

[ML] Machine Learning, Numpy, Scipy, matplotlib, mglearn, knn [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 머신러닝 Machine Learning은 데이터에서 지식을 추출하는 작업이다. 가장 많이 사용되는 머신러닝 알고리즘은 이미 알려진 사례를 바탕으로 일반화된 모델을 만들어 의사 결정 프로세스를 자동화하는 것이다. 이 방식을 supervised learning 지도학습이다. 이는 사용자는 알고리즘에 입력과 기대되는 출력을 제공하고 알고리즘은 주어진 입력에서 원하는 출력을 만드는 방법을 찾는다. 다른 알고리즘으로는 unsupervised learning 비지도 학습이다. 비지도 학습에서는 알고리즘에 입력은 주어지지만 출력은 제공되지 않는다. 머신러닝에서는 하나의 개체 혹은 행을 sample(샘.......

[ML] KNN 알고리즘 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. KNN 알고리즘은 가장 간단한 머신러닝 알고리즘이다. 훈련 데이터 셋을 저장하는 것이 모델을 만드는 과정의 전부이다. 새로운 데이터 포인트(행)에 대해 예측할 땐 알고리즘이 훈련 데이터 셋에 가장 가까운 데이터 포인트, 즉 최근접 이웃을 찾는다. KNN 알고리즘 KNN 알고리즘은 가장 가까운 훈련 데이터 포인트를 하나를 최근접 이웃으로 찾아 예측에 사용한다. 아래의 사진은 forge 데이터셋을 분류한 것이다. KNN을 기준으로 아래의 그림에는 데이터 포인트를 3개 추가했다.(별 모양) 그리고 추가한 각 데이터의 포인트에서 가장 가까운 훈련 데이터 포인트를 연결했다.......

[ML] 선형 회귀 Linear regression, Ridge, Rasso, SVM, LogisticRegression [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 선형 모델 선형 모델은 입력 특성에 대한 선형 함수를 만들어서 예측을 수행 의 형태를 가지고 있다. w와 b는 모델이 학습할 parameter이다. w는 가중치 또는 계수 b는 편향 또는 절편이다. wave 데이터셋으로 파라미터 w와 b를 직선처럼 학습 시켜본다. 코드는 아래와 같다. 기울기는 대략 0.4이고 y 절편은 -0.03 정도이다. 회귀를 위한 선형 모델은 특성이 하나일 때는 직선, 두 개일 땐 평면이 되고 더 높은 차원에서는 hyperplane(초평면)이 되는 회귀 모델의 특징을 가지고 있다. 선형 회귀(최소제곱법) 모델 파라미터 w와 b를 학습하는 방법에는 여러 가지가 있는 데 그.......

[ML] 나이브 베이즈 Naive bayes [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. Naive bayes Naive bayes는 베이즈 정리에 기반한 통계적 분류 기법이다. Naive bayes 분류기는 선형 모델과 매우 유사하다. LogisticRegression이나 LinearSVC 같은 선형 분류기보다 훈련 속도는 빠르지만, 대신 일반화 성능이 조금 떨어진다. 나이브 베이즈가 효과적인 이유는 각 특성을 개별로 취급해 파라미터를 학습하고 각 특성에서 클래스별 통계를 단순하게 취합하기 때문이다. scikit-learn에 구현된 나이브 베이즈 분류기는 GaussianNB, BernoulliNB, MultinomialNB 세 가지이다. Gaussian은 연속적인 데이터에 적용 가능하고 Bernoulli는 이진 데이터, Multinomial.......

[BackEnd] flask routing [내부링크]

먼저 flask의 기본 템플릿(?) flask를 import 하고 app을 통해서 flask 객체를 만든다. flask에서도 routing을 여러 종류로 지정할 수 있다. module이 아닐 때 app을 실행한다. route에 인자를 넣어주면 그 경로로 갈 수 있다. 일단 home은 &#34;/&#34; 인자를 넣어준다. /pizza 경로로 가고 싶으면 route에 넣어주면된다. route 인자에 데이터도 전달할 수 있다. &#60;pizzaname&#62;이 전달해줄 데이터이다. 위와 같이 작성해주면 아래와 같은 결과가 나온다. 데이터형도 설정해줄 수 있다. 데이터 형을 설정하지 않으면 기본형인 문자열로 설정된다.

이럴때 화나요 [내부링크]

코로나 확진자 수가 왜 안 줄어드는 거지? 오늘만 해도 1400명이 넘었네,, 줄어들 기미가 보여야 되는데 보이지를 않네 어쩌다 이렇게 된 걸까

[ML] decision tree 결정 트리 알고리즘 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 결정 트리 decision tree 결정 트리는 분류와 회귀 문제에 사용되는 모델이다. 결정 트리는 결정에 다다르기 위해 예/아니오 질문을 하면서 학습을 진행한다. 머신러닝 식으로 말하면 세 개의 특성(날개, 비행, 지느러미)을 사용해 네 개의 클래스(매, 펭귄, 돌고래, 곰)를 구분하는 모델을 만드는 것이다. 이런 모델을 직접 만드는 대신 지도 학습 방식으로 데이터로부터 학습할 수 있다. 결정 트리 만들기 아래의 데이터셋을 분류하는 결정 트리를 만든다. 결정 트리를 학습한다는 것은 정답에 가장 빨리 도달하는 예/아니오 질문 목록을 학습한다는 의미이다. 머신러닝에서.......

[ML] 결정 트리 앙상블(ensemble), random forest [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 앙상블(ensemble)은 여러 머신러닝 모델을 연결해서 더 강력한 모델을 만드는 기법이다. 여러 종류의 머신 러닝 모델이 많지만 그중 두 앙상블 모델이 분류와 회귀 문제의 다양한 데이터셋에서 효과적이라고 입증되었다. random forest(랜덤 포레스트)와 gradient boosting(그레이디언트 부스팅) 결정 트리는 둘 다 모델을 구성하는 기본 요소로 결정 트리를 사용한다. Random Forest Random Forest는 다른 여러 결정 트리의 묶음이다. 랜덤 포레스트 아이디어는 각 트리는 비교적 예측을 잘 할 수 있지만 데이터의 일부에 과대적합하는 경향을 가지는 것에 기초한다. 즉 잘 작.......

[ML] 결정 트리 앙상블(ensemble), gradientBoosting(그레이디언트 부스팅) 회귀 트리 [내부링크]

파이썬 라이브러리를 활용한 머신러닝 책을 보고 정리한 내용입니다. 앙상블(ensemble)은 여러 머신러닝 모델을 연결해서 더 강력한 모델을 만드는 기법이다. 그레이디언트 부스팅 회귀 트리는 여러 개의 결정 트리를 묶어 강력한 모델을 만드는 또 다른 앙상블 방법이다. 이전에 만든 트리의 예측과 타깃 값 사이의 오차를 줄이는 방향으로 새로운 트리를 추가하는 알고리즘 방법이다. 이를 위해 손실 함수를 정의하고 경사 하강법을 사용하여 다음에 추가될 트리가 예측해야 할 값을 보정해간다. GradientBoosting 회귀 트리 이름은 회귀지만 회귀와 분류 모두에 사용할 수 있다. 그레이디언트 부스팅은 이전 트리의 오차를 보완하는 방식으로.......

[DNN] 가중치의 초깃값 Xavier,He 초기화 [내부링크]

밑바닥부터 시작하는 딥러닝 책을 보고 정리한 내용입니다. 가중치의 초깃값 신경망 학습에서 중요한 것이 가중치의 초깃값이다. 가중치의 초깃값을 무엇으로 설정하느냐가 신경망 학습의 성패가 가르는 일이 실제로 자주 발생한다. 이번 파트는 권장 초깃값에 대해서 책에서 설명한다. 초깃값을 0으로 하면? 오버피팅을 억제해 범용 성능을 높이는 기술인 Weight Decay(가중치 감소) 기법이다. 가중치 감소는 가중치 매개변수의 값이 작아지도록 학습하는 방법이다. 가중치 값을 작게 하여 오버피팅이 일어나지 않게 하는 것이다. 가중치를 작게 만들고 싶으면 초깃값도 최대한 작은 값에서 시작하는 것이 정공법 지금까지 가중치 초깃값은 0.01.......

[DNN] 배치 정규화 Batch Normalization [내부링크]

밑바닥부터 시작하는 딥러닝 책을 보고 혼자 정리한 내용입니다. 가중치의 초깃값을 적절히 설정하면 각 층의 활성화 값 분포가 적당히 퍼지면서 학습이 원활하게 수행된다. 그럼 각 층이 활성화를 적당히 퍼뜨리도록 강제해보면 어떨까? 배치 정규화가 이런 아이디에서 출발했다. 배치 정규화 배치 정규화의 장점은 1. 학습을 빨리 진행할 수 있다.(학습 속도 개선) 2. 초깃값에 크게 의존하지 않는다.(초깃값 선택 부담감 감소) 3. 오버피팅을 억제한다.(드롭아웃 등의 필요성 감소) 배치 정규화의 기본 아이디어는 각 층에서의 활성화값이 적당히 분포되도록 조정하는 것이다. 아래 그림과 같이 데이터 분포를 정규화하는 배치 정규화(Batch N.......

[DNN] 오버피팅(overfitting), 가중치 감소(weight decay), 드롭아웃(Dropout), 하이퍼파라미터 [내부링크]

밑바닥부터 시작하는 딥러닝 책을 보고 혼자 정리한 내용입니다. 기계학습에서는 오버피팅이 문제가 되는 일이 많다. 오버피팅이란 신경망이 훈련 데이터에만 지나치게 적응되어 그 외의 데이터에는 제대로 대응하지 못하는 상태이다. 오버피팅(overfitting) 오버피팅은 주로 매개변수가 많고 표현력이 높은 모델, 훈련 데이터가 적은 경우에서 발생한다. 훈련 데이터를 사용하여 측정한 정확도는 100 에폭을 지나는 무렵부터 거의 100%이다. 하지만 시험 데이터에는 그렇지 않은 결과를 보인다. 이처럼 정확도가 크게 벌어지는 것은 훈련 데이터에만 적응해 버린 결과이다. 훈련 때 사용하지 않은 범용 데이터(시험 데이터)에는 제대로 대응하지.......

[DNN] 합성곱 신경망(CNN, Convolutional neural network) [내부링크]

밑바닥부터 시작하는 딥러닝 책을 보고 혼자 정리한 내용입니다. 합성곱 신경망 CNN은 이미지 인식과 음성 인식 등 다양한 곳에서 사용되고 보통 이미지 인식 분야에서 딥러닝을 활용한 기법은 거의 CNN으로 한다. 전체 구조 CNN도 신경망과 같이 레고 블록처럼 계층을 조합해서 만들 수 있다. CNN에서는 합성곱 계층(Convolutional layer)과 풀링계층(Pooling layer)가 있다. 지금까지의 신경망은 인접하는 계층의 모든 뉴런과 결합되어 있다. 이를 완전연결(fully Connected, 전결합)이라고 하고 완전히 연결된 계층을 Affine 계층이라고 한다. 이 Affine 계층을 사용해서 층이 5개인 완전연결 신경망은 아래와 같다. 위와 같이 완전연결 신경.......

[DNN] 합성곱, 풀링, CNN 구현 및 LeNet, AlexNet [내부링크]

밑바닥부터 시작하는 딥러닝 책을 보고 정리한 내용입니다. 합성곱 계층 구현 im2col 함수의 인터페이스는 아래와 같다. input_data - (데이터 수, 채널 수, 높이, 너비)의 4차원 배열로 이루어진 입력 데이터 filter_h - 필터의 높이 filter_w - 필터의 너비 stride - 스트라이드 pad - 패딩 im2col은 필터 크기, 스트라이드, 패딩을 고려해서 입력 데이터를 2차원 배열로 전개한다. 첫 번째는 배치 크기가 1 (데이터 1개) 채널은 3개, 높이 * 너비가 7 * 7 인 데이터이고 두 번째는 배치크 크기만 10이고 나머지는 첫 번째와 같다. im2col 함수를 적용한 두 경우 모두 2번째 차원의 원소가 75개이다. 이 값은 필터의 원소 수와 같다(채널 3개, .......

[DNN] 딥러닝, VGG, ResNet, GoogLeNet, R-CNN, FCN [내부링크]

이번에는 딥러닝의 특징과 과제 가능성을 살펴본다. 데이터 확장(data augmentation) 데이터 확장은 입력 이미지(훈련 이미지)를 알고리즘을 동원해서 인위적으로 확장한다. 입력 이미지를 회전하거나 세로로 이동하는 등 미세한 변화를 주어 이미지의 개수를 늘린다. 이미지 일부를 잘라내는 crop이나 좌우를 뒤집는 flip 등이 있다. 일반적인 이미지에는 밝기 등의 외형 변화나 확대, 축소 등의 스케일 변화도 효과적이다. 층을 깊게 하는 이유 이번에는 층을 깊게 하는 것에 대해서 알아본다. 층을 깊게 할 때의 이점은 신경망의 매개변수 수가 줄어든다는 것이다. 층을 깊게 한 신경망은 깊지 않은 경우보다 적은 매개변수로 같은 (혹은 그 이.......

밑바닥부터 시작하는 딥러닝 끝 [내부링크]

7월 4일부터 보기 시작한 밑바닥부터 시작하는 딥러닝 책 한 8일 걸렸네 사실 더 빨리 볼 수도 있었으나 블로그에 다 정리하면서 그림도 다 직접 그려가면서 하니까 오래 걸렸다. 가끔 그림 그리거나 만들면서 이거 왜 하고 있지 이런 생각도 많이 했는데 결국 직접 손으로 그리다 보면 더 이해가 잘 된다. 이런 전공 책을 사서 다 읽은 건 학교 다니면서 처음인 것 같기도 하네 아무튼 종강하고 나서 갑자기 인공지능 쪽에 빠져버렸다. 1학년으로 거슬러 올라가서 1학년 때 python을 처음 배우고 python 전공 수업 마지막쯤에 교수님이 python 통해서 인공지능 할 수 있다고 하시고 홍콩 과기대 김성훈 교수님의 모두의 딥러닝 강의를 알려주셔.......

[DNN] 오차역전파법 backpropagation [내부링크]

밑바닥부터 시작하는 딥러닝 책을 보고 정리한 내용입니다. 오차역전파법 신경망의 가중치 매개변수 기울기(가중치 매개변수에 대한 손실 함수의 기울기)는 수치 미분을 사용했다. 수치 미분은 단순하고 구현이 쉽지만 시간이 오래 걸린다는 단점이 있다. 이번에는 가중치 매개변수의 기울기를 효율적으로 계산하는 오차역전파법(backpropagation)을 배운다. 오차역전파법은 오차를 역(반대 방향으로) 전파하는 방법이다. 계산 그래프 계산 그래프는 계산 과정을 그래프로 나타낸 것이다. 계산 그래프에 익숙해져야 오차역전파를 공부하는데 편하다. 문제 1: 슈퍼에서 1개에 100원인 사과 2개를 샀을 때의 지불 금액을 구해라, 이때 소비세 10% 부.......

[DNN] Affine, softmax, backpropagation [내부링크]

밑바닥부터 시작하는 딥러닝 책을 보고 정리한 내용입니다. Affine 계층 구현 신경망의 순전파 때 수행하는 행렬의 곱은 기하학에서는 어파인 변환(affine transformation)이라고 한다. 신경망의 순전파에서는 가중치 신호의 총합을 계산하기 위해 행렬의 곱을 사용했다. Y &#x3D; np.dot(X, W) + B를 계산 그래프로 나타내면 아래와 같다. 이 계산 그래프에서는 변수가 행렬이고 각 변수의 형상을 변수명 위에 표기했다. 역전파를 생각해 보면 행렬을 사용한 역전파도 행렬의 원소마다 전개해보면 스칼라 값을 사용한 계산 그래프와 같은 순서로 생각할 수 있다. 위의 식을 바탕으로 역전파를 계산 그래프로 나타내면 아래와 같다. 각 변수의 형.......

[BackEnd] flask 시작하기 [내부링크]

를 통해서 flask를 다운 받아준다. 이게 실행을 위한 기본 코드이다. Flask(__name__)을 이용해서 현재 위치를 flask 객체에 알려주고 flask 객체를 만든다. 여기서 __name__에는 모듈의 이름이 저장이 된다. 실행하는 코드에서는 __main__ 값이 들어간다. route를 해주는 부분이다. https://blog.naver.com/fbfbf1/postwrite?categoryNo&#x3D;49 쉽게 얘기해서 네이버 블로그 들어가서 fbfbf1로 갈 수 있게 해주는 것이다. 위의 코드가 의미하는 건 /hello로 들어가면 helloWorld() 함수가 실행된다는 의미이다. flask에서는 테스트를 쉽게 해주기 위해서 자체적으로 웹서버 기능을 제공한다. 간단한 명령으로 웹 서버를 띄울 수 있다. run을 통.......

신문 읽어보기 18 [내부링크]

거의 2달 만에 신문 글 올리네 신문은 꾸준히 읽고 있는데 글 올리기 귀찮아서 안 올리고 있었다. 방금 기사를 보니 수도권 4단계로 격상되고 1316명 확진자 나왔다고 한다. 음,, 이게 왜 2030 탓일까 할 말은 많지만 말을 아껴야겠다. 배터리 산업이 핫하다. 아마 나도 이쪽과 관련된 전공이었다면 배터리 쪽으로 가지 않았을까 싶다. 정말 세상에는 똑똑한 사람들이 많은 것 같다. 사진이 잘 안 보이기는 하지만 첫 번째 비행기는 기존 비행기보다 5배 정도 빠른 속도를 가진 비행기다. 이런 걸 만들고 있다고 하는데 빨리 만들어졌으면 좋겠다. 유럽 갈 때 12시간 정도 타야 되는 거 너무 힘들다

[DNN] 매개변수 최적화, SGD, Momentum, AdaGrad, Adam [내부링크]

밑바닥부터 시작하는 딥러닝 책을 보고 혼자 정리 한 내용입니다. 6장에서는 신경망 학습의 핵심 개념들을 본다. 가중치 매개변수의 최적값을 탐색하는 최적화 방법, 가중치 매개변수 초깃값, 하이퍼파라미터 설정, 오버피팅 대응책인 가중치 감소와 드롭아웃도 본다. 매개변수 갱신 신경망 학습의 목적은 손실 함수의 값을 최소로 하는 매개변수를 찾는 것이다. 이는 곧 매개변수 최적값을 찾는 문제이고 이러한 문제를 푸는 것이 최적화(optimization)이다. 지금까지 최적의 매개변수 값을 찾는 단서로 매개변수의 기울기를 이용했다. 매개변수의 기울기를 구해서 기울어진 방향으로 매개변수 값을 갱신하는 일을 반복해서 최적의 값에 다가갔.......

[DNN] 신경망 학습 [내부링크]

밑바닥부터 시작하는 딥러닝을 보고 혼자 정리한 글입니다. 이번에는 신경망 학습이다. 학습은 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것을 의미한다. 여기서는 신경망이 학습할 수 있도록 해주는 지표인 손실 함수를 공부한다. 손실 함수의 결괏값을 가장 작게 만드는 가중치 매개변수를 찾는 것이 학습의 목표이다. 데이터 학습 신경망의 특징은 데이터를 보고 학습할 수 있다는 점이다. 데이터에서 학습한다는 것은 가중치 매개변수의 값을 데이터를 보고 자동으로 결정한다는 의미이다. 데이터 주도 학습 기계학습 중심에는 데이터가 존재한다. 기계학습에서는 사람의 개입을 최소화하고 수집한 데이터로부터 패턴.......

90 [내부링크]

방금 블랙 쇼맨과 이름 없는 마을의 살인 다 읽어서 히가시노 게이고 책 90권 읽었다. 10권만 더 읽으면 100권인데 국내에 더 읽을 책이 있나,,

[DNN] 퍼셉트론 [내부링크]

퍼셉트론 퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력 다만 퍼셉트론 신호는 흐른다/ 안 흐른다(1 or 0)의 두 가지 값을 가짐 딥러닝 분야에서 퍼셉트론은 인공 뉴런, 단순 퍼셉트론을 의미 원은 뉴런 or 노드 부르고 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다. 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력 아니면 0을 출력 - 뉴런이 활성화한다고 표현 - 한계를 임계값이라고 한다. 퍼셉트론은 다수의 입력 신호 각각에 고유한 가중치를 부여, 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용. 즉 가중치가 클수록 해당 신호가 그만큼 더 중요하다. y에 미치는 영.......

[DNN] 신경망 [내부링크]

밑바닥부터 시작하는 딥러닝 책을 보고 혼자 정리한 내용입니다. 신경망 퍼셉트론을 이용해서 복잡한 함수도 표현이 가능하다. 하지만 가중치를 설정하는 작업은 여전히 사람이 수동적으로 해야 된다. 신경망은 가중치를 수동으로 설정하는 작업을 해결해 준다. 즉 가중치의 매개변수의 적절한 값을 데이터로부터 자동으로 학습하는 능력이 신경망의 중요 성질 먼저 신경망의 구조는 위와 같다. 가장 왼쪽에 있는 층을 입력층 맨 오른쪽에 있는 층을 출력층 중간에 있는 층을 은닉층이라고 한다. 은닉층은 입력층, 출력층과 달리 사람 눈에 보이지 않는다. 위의 신경망 구조는 총 3개의 층으로 구성되지만 가중치를 갖는 층이 2개이기에 2층 신경.......

[DNN] MNIST [내부링크]

밑바닥부터 시작하는 딥러닝 책을 보고 혼자 정리한 내용입니다. 손글씨 숫자 인식 신경망의 구조를 이용해서 손글씨 숫자 분류를 해본다. 여기서는 이미 학습된 매개변수를 사용해서 학습 과정은 생략하고 추론 과정만 본다. 이러한 추론 과정을 신경망의 순전파(forward propagation)라고 한다. MNIST 데이터 셋 MNIST 이미지 데이터는 28 x 28 크기의 회색조 이미지(1채널) 각 픽셀은 0에서 255까지의 값을 가진다. 각 이미지에는 9,5,3과 같이 그 이미지가 실제 의미하는 숫자가 레이블로 붙어 있다. load_mnist 함수는 MNIST 데이터를 (훈련 이미지, 훈련 레이블), (시험 이미지, 시험 레이블) 형식으로 반환 인수로는 normalize, flattne, .......

[DNN] CNN 이용 MNIST [내부링크]

합성곱 방식을 이용하는 CNN(Convolutional Neural Network) convolution layer와 pooling layer로 구성이 되며 이미지 처리에 특화된다. 다층 퍼셉트론 방식은 공간적인 구조 정보를 보존하지 못했기에 이미지의 공간적인 구조 정보를 보존하면서 학습할 수 있는 방법으로 CNN이 만들어짐 이미지는 (높이, 너비, 채널)이라는 3차원 텐서 채널은 깊이(depth)라고도 함 합성곱층은 합성곱 연산을 통해서 이미지의 특징을 추출하는 역할 합성곱은 kernel 또는 filter라는 n x m 크기의 행렬로 이미지를 처음부터 끝까지 겹치며 흝으면서 n * m 크기의 겹쳐지는 부분의 각 이미지와 커널의 원소의 값을 곱해서 모두 더한 값을 출력으로 하는 것 입력.......

[1년 전 오늘] [일상] 1학기 종강이다 [내부링크]

뭐지 21년도에는 6월 11일에 시험 다 끝나고 6월 16일 과제 제출 했는데 20년도에는 6월 30일에 시험 끝나고 7월 3일에 과제 제출 했네 왜 이렇게 많이 차이난거지?

방학동안 할 것 [내부링크]

1. 네트워크 - samsum vran white paper 읽어보기 - network slicing paper &#38; samsum white paper 읽어보기 - 세미나 하기 2. AI - 모두의 딥러닝 시즌 1, 모두의 딥러닝(?) - pytorch로 시작하는 딥러닝 입문 - 단단한 강화학습 - 심층 강화학습 인 액션 - 간단한 게임 프로젝트 해보기 3. 그외 - 게임이론 - 영어공부 원래 목표는 크게 잡아야 할 수 있는 것도 많다 여기 있는 것만 다 해도 전 세계 상위 0.01% 방학일 듯 다 못 해도 되니 어차피 다 할 생각도 아니고 너무 욕심 부리지 말고 하나하나씩 격파해야겠다.

지갑 [내부링크]

제발 제 지갑 돌려주세요 제발요 진짜 제발 연락 오게 해주세요 제발요 비싼 지갑이에요 제발요 안에 너무 많은 게 있어요 제발요

최근 본 영화 [내부링크]

혼자 영화관 가서 공포/스릴러 영화 보는 걸 좋아해서 이번에도 콰이어트 플레이스 2 보고 왔는데 나름 쫄깃쫄깃해서 재밌게 봤다. 스트레스 풀리는 듯 콰이어트 플레이스 1과 바로 이어진다는데 시간 나면 1도 봐야겠다.

[DNN] XOR_gate [내부링크]

간단한 다층 퍼셉트론을 이용해서 구현한 XOR_gate

[DNN] BackPropagation [내부링크]

1. 출력층에서 입력층 방향으로 계산하면서 가중치를 업데이트 해가는 방법 미분을 이용한다. 2. 먼저 w5, w6, w7 ,w8 출력층 바로 이전의 은닉층에서 출력층으로 향하는 가중치를 업데이트 해줘야됨 3. w1,w2,w3,w4 업데이트 입력층에서 은닉층으로 향하는 가중치 업데이트 4. 업데이트된 가중치를 가지고 다시 순전파를 한 후에 오차를 확인

[DNN] 다층퍼셉트론 XOR 구현 [내부링크]

출처 : https://wikidocs.net/61010

[DNN] Overfitting 방지 방법 [내부링크]

1. 데이터양 늘리기 - 모델은 데이터양이 적을 경우, 해당 데이터의 특정 패턴이나 노이즈까지 쉽게 기억하므로 overfitting 발생 확률이 늘어난다. 그렇기에 데이터양의 많아질수록 모델은 데이터의 일반적인 패턴을 학습하여 과적합을 방지 2. 모델의 복잡도 줄이기 - 인공 신경망의 복잡도는 hidden layer의 수나 매개변수의 수 등으로 결정이 되기에 과적합 현상이 발견되었을 시에 인공 신경망의 복잡도를 줄여준다. 3. 가중치 규제(Regularization) 적용 - 복잡한 모델이 간단한 모델보다 overfitting될 가능성이 높다. - 복잡한 모델을 간단하게 하는 방법으로 regularization이 있다. - L1 regularization : 가중치 w들의 절댓값 합계를.......

[DNN] Gradient Vanishing, Exploding [내부링크]

Gradient Vanishing(기울기 소실) - 깊은 인공 신경망을 학습하다 보면 backpropagation 과정에서 입력층으로 갈수록 gradient가 점차적으로 작아지는 현상이 발생, 입력층에 가까운 층들에서 가중치들이 업데이트가 제대로 되지 않으면 결국 최적의 모델을 찾을 수 없게 되는데 이런 현상을 기울기 소실이라고 한다. Gradient Exploding(기울기 폭주) - 기울기 소실과 반대의 경우로 기울기가 점점 커져서 가중치들이 비정상적으로 큰 값이 되면서 발산된다. 기울기 소실과 기울기 폭주 완화 방법 1. ReLU - 기울기 소실을 완화하는 간단한 방법으로 은닉층의 활성화 함수로 시그모이드나 하이퍼볼릭 탄젠트 함수 대신 ReLU, Leacky ReLU를 사용.......

[DNN] Xavier 이용 MNIST [내부링크]

기존에는 weight를 무작위로 초기화 했는데 무작위가 아닌 방법으로 weight를 초기화해서 성능을 높인다. 그 방법 중 하나인 Xavier

7만 [내부링크]

토탈 7만 넘었다 오호호호 7만때 딱 찍을려고 했는데 오늘 넘을 줄은 몰랐네 하 금요일만 되라 빨리 시험 끝나라

종강 후의 삶 [내부링크]

6월 11일에 모든 시험이 다 끝났다. 좀 만족스럽지 못 한 학기이기는 하다. 더 많이 할 수 있었으나 하지 못했던 학기. 종강하자마자 친구 만나서 건대에 양 꼬치 먹으러 갔다. 살면서 처음 먹어보는 양꼬치었다. 호불호가 많이 갈린다는데 나는 호였다. 사실 엄청 맛있는 맛은 아닌 것 같다. 꿔바로우도 같이 먹었다. 양꼬치 먹고 건대 구경하러 갔다. 건대 호수가 크다는 건 알고 있었으나 이렇게 클 줄이야.. 건대도 보고 한강도 보러 갔다. 정말 오랜만에 오는 한강이다. 맨날 7호선 타고 가면서 아 한강 한 번 가야 되는데라는 생각을 정말 많이 했는데 이번에 갔다. 사람이 너무 많아서 사람 없는 곳으로 피신 왔다. 그다음 날에는 우리 소.......

치킨 vs 피자 [내부링크]

둘 다 먹으면 되지 굳이 고르자면 치킨 먹음 브랜드 피자는 너무 비쌈 피자스쿨이 제일 맛있음ㅋㅋㅋ

6월 3일 [내부링크]

#블챌 #오늘일기 마지막 블챌이다. 까먹고 안 할 뻔 오늘 기숙사 점심 나 같은 돼지에게는 너무 적은 양이다. 학교에서 주관하는 공모전 동아리에 채택됐다. 매달 10만 원씩 받으면서 공모전 준비해야 된다. 후,, 열심히 해야징~

[공유] 노력하면 뇌는 달라집니다! [내부링크]

열심히 하자‘성인이 되면 머리가 굳는다’라는 편견, 한 번쯤 들어보셨을 텐데요, 학습에 출중했던 유년 ...

[공유] 새롭게 시작하는 #오늘일기 챌린지 사전안내 [내부링크]

블챌 ㅋㅋㅋ 안녕하세요. 네이버 블로그팀입니다. 지난 번 #오늘일기 챌린지를 진행하고 종료하는 과정에서...

5월 31일 [내부링크]

#블챌 #오늘일기 어제는 비가 이렇게 많이 오더니만 오늘은 또 날씨가 괜찮네 다음 주부터 시험이다 벌써 종강이라니...:(

6월 1일 [내부링크]

#블챌 #오늘일기 오늘 기숙사 점심 푸짐하게 먹었다 저녁은 쪼매가서 분식 먹었다 이제 내년부터 2월 개강에 여름방학 3개월.. 진짜 누군가에게는 독이 될 수도 있고 기회가 될 수도 있겠네 3개월은 진짜 길다ㄱㅋㅋ

6월 2일 [내부링크]

#블챌 #오늘일기 점심에는 연구실 회식으로 중국집 갔다. 탕수육도 먹고 군만두도 먹고 짬뽕도 먹고 맛있었다 종강하고 일정이 있어서 비행기 예약했다ㅎ 호텔도 예약하고 ㅎ 빨리 종강하고 가고 싶다~~~

5월 27일 [내부링크]

#블챌 #오늘일기 구씨가 보내준 일론 머스크 짤 형만 믿을게요! 아침에 도서관 가서 데이터분석 SVM을 들었다 오늘도 여전히 뉴스 7월부터 노마스크 하는건가!!!!!!!!!!!!!!!!!!! 2학기 대면 되는 건가.. 빨리 맞아야겠다. 한미 정상회담에서 미사일 제한이 해제되었는데 해제로 인해서 우주개발에 박차를 가할 수 있게 되나 보다, 요즘 위성이 좀 핫한 분야 이긴 한데 이 제한 해제로 더 핫 해졌다. 사실 이름값할 거면 위성 공부하는 게 맞긴 한데 근데 또 김정은 씨는 뭘 못 참았을까 비트코인이 휘청거린다. 기관들은 금을 많이 사다고 하는데 사실 보이지도 않는 가상화폐 쪼가리나 걍 번쩍번쩍 빛나는 돌덩이나 뭐 이리 비싼 거지, 알 수가.......

5월 28일 [내부링크]

오늘은 점심으로 감자탕을 먹었다 여기 꿀맛이다 자주 이용해야지 후식으로 볶음밥까지 토스에서 계좌개설하면 2주 준다고 해서 바로 개설했다 총합 2.3만원 아쉽다! Lg화학주지 저녁으로는 오랜만에 한솥 먹었다 역시 치킨마요가 최고다! #블챌 #오늘일기

5월 29일 [내부링크]

재입대 하는 꿈 꿨다. 그것도 꿈에서 일상생활하다가 병사로 재입대하는 꿈이다. 와 진짜 처음에 내가 왜 재입대하지라고 생각했다가 그래도 적응하자 해서 2주 차 정도 훈련받다가 2주 차에 빨간 명찰 주는 거 보고 현타와서 탈주하려다가 꿈에서 깼다 군대 꿈은 정말 꾸고 나면 멍해진다. 오늘 저녁은 피자스쿨이다.ㅋㅋㅋ 비주얼 보소 진짜 화랑대역점 피자스쿨이 최고다 이 비주얼을 보소 우리 집 앞 반성하자 치즈바이트 시킨 적 없는데 치즈바이트까지 왔다! 아,, 공부할게 참 많네

5월 30일 [내부링크]

#블챌 #오늘일기 오늘은 날씨가 정말 좋다 또 열심히 공부 해야지 경영과학 마스터!

[백준] 2631번 줄 세우기 c++ [내부링크]

LIS 문제이다. 문제에서 중요한 게 이미 정렬되어 있는 학생들을 바꿀 필요가 없다는 거다. 즉 가장 긴 증가하는 부분 수열의 길이를 구해서 전체 학생 수에서 빼주면 된다. 문제의 예시를 보면 3 7 5 2 6 1 4 3 5 6이 가장 긴 증가하는 수열이다. 얘네 3명은 이미 정렬되어 있는 거니 건드릴 필요 없이 나머지 4명만 건드리면 된다.

[백준] 1890번 점프 c++ [내부링크]

DP를 이용해서 풀 수 있는 문제 여러 가지 경로의 수가 존재할 수 있으므로 dp를 이용해서 지금까지 가능한 경로의 수를 저장해 주고 그 값들을 계속 더 해주는 식으로 한다. 일단 처음에 0,0에서 시작하므로 0,0 도 1로 초기화 준다 이중 for 문을 돌면서 board[i][j] &#x3D;&#x3D; 0 이면 끝이므로 넘어가 주고 그게 아니라면 좌표 값에 board[i][j]를 더 하나 값이 N보다 작으면 갈 수 있다는 의미이므로 현재 dp[i][j]의 값을 i와 j에 board[i][j]를 더한 좌표 값들에 더 해준다.

[백준] 11060번 점프점프 c++ [내부링크]

점프와 굉장히 유사한 문제 1차원 DP를 이용한다. 일단 최솟값을 구해야 되니 배열을 INF로 초기화 시켜준다. INF로 하는 이유는 dp[i] &#x3D;&#x3D; INF일 때는 경로가 한 개도 없다는 의미이고 답을 갱신할 때 최솟값을 적용시켜줄 수 있기 때문이다. i &#x3D; 1부터 시작해서 N까지 돈다 이때 board[i]의 값을 보면서 i에다가 1 ~ board[i]까지 더한 인덱스를 탐색하면서 기존에 있는 값과 현재 i에서 + 1을 더한 값을 비교해 줘서 최솟값을 구한다. 문제에서 board[i] 이하 값들로 움직일 수 있다고 했으니 이 구문을 이용했다.

[CP] AtCoder Beginner Contest 202 [내부링크]

2021년 5월 22일에 열린 AtCoder Beginner Contest 202 3솔 했다 B 번까지 했을 때 270등이어서 아 C 번까지 빨리 풀면 대박이겠구나고 생각했지만 역시나 C 번에서 시간을 좀 소모해버렸다. 심지어 런타임 에러로 한 번 틀려버렸다 자꾸 문제에서 n이 10^5일 때 배열을 10002로 선언해서 틀린다 ㅋㅋㅋㅋㅋㅋㅋ 별생각 없이 5자릿수로 선언해버린다.. A 번 밑 바닥이 7이니 전체 21에서 abc 다 더한 값 빼주면 된다. B 번 문자열 for 문 돌면서 6,9일 때만 거꾸로 돌려주면 된다. C 번 저번 코포 C 번에서 본 테크닉(?)을 써먹었다랄까 이것도 쉬운데 참 아쉽다. 코드 다 짜놓고 계속 답이 0으로 나오길래 뭐지 싶었는데 인덱스를 잘못 써서 한.......

5월 24일 [내부링크]

기숙사 아침이 9시까지인데 9시에 일어나버렸다 바로 준비해서 나간 다음에 스캔할 거 스캔하고 등기 보냈다 빵이라 음료 산 다음에 먹으려고 하는 순간 교수님이 같이 밥 먹자고 해서 초밥 먹으러 갔다. ㅋ 저번에 갔던 로지스시다 우리가 저번에 먹었을 때 쫌 짜다고 말씀드렸더니 이번엔 덜 짜게 해주셨다. 훨씬 맛있었다 주방장님이 12년 동안 초밥집 하면서 딱 3명한테 짜다는 소리를 들었다고 하신다. 나랑 교수님한테 듣고 자신의 삶을 돌아보셨다고 했다. 이제는 좀 덜 짜게 만들어본다고 하셨다. 괜히 진상이 된 건가라는 느낌이 들었다. 오늘은 교수님이랑 희재랑 많은 이야기를 나눴다 아 뭐하고 살지 ㅋㄷㅋㄷ 오늘 커피 1잔 공차 1잔.......

5월 25일 [내부링크]

#블챌 #오늘일기 오늘은 오랜만에 아침에 도서관을 갔다. 역시 전자기기와 멀어져야 공부가 잘된다. 도서관에서 신문을 읽었다. 역시 HMM을 샀어야 됐다. 한미 정상회담 내용을 보는데 잘 된 것 같다. 음,, 역시 AI가 정말 핫하다,, 국세청 들어가서 소득공제(?) 받으려고 신청했다. 쥐꼬리만하게 돌려받는다 점심에 친구랑 학교 앞에 있는 기린 라멘 가서 라멘 먹었다. 교수님한테 점심에 기린라멘 먹었다고 하니 교수님도 라멘 먹고 싶다고 하셔서 저녁에 또 갔다. 나는 이번엔 사케동 먹었다. 교수님과 희재는 돈코츠 라멘을 시켰는데 역시 기본이 제일 좋은 것 같다. 아 점심에 돈코츠 라멘으로 먹을걸 치킨 가라아케도 먹었다. 재수가 생각.......

5월 26일 [내부링크]

#블챌 #오늘일기 오늘도 아침에 도서관을 갔다. 바로 연구실 가는 것 보다 5억 배 더 좋다. 집중력 차이가 21억 배 수준 없는 게 없는 삼성이다. 방학 때 공부할 분야들 white paper 찾아보니 삼성에도 있어서 바로 프린트 했다. 갓삼성이기에 무조건 읽어야된다! 삼성리서치 보내주세요 오늘도 신문을 읽었다. 메타버스가 핫하다. 이제 몇 년 뒤면 레디 플레이어 원처럼 가상공간에서 살고 있는건가? 가상공간도 공부해보고 싶다.! 새로운 서울 도시계획에 관한 글이다. 미국의 공룡들도 메타버스에 많이 투자하나보다.. 메타버스가 답인가? 요즘 체력이 약해진 것 같아서 다시 조깅을 시작하고 바로 비타민과 오메가 3를 시켰다. 오메가 3는 빨.......

카드 뉴스가 제작되었다. [내부링크]

학생회에서 컴공 복수 전공에 대해서 궁금한 질문을 재학생들한테 받고 컴공 복수전공하는 사람들한테 질문지를 줘서 답변해 줬는데 보니까 나한테만 물어본 것 같아서 내 답변으로 카드 뉴스가 제작됐다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 뭔가 굉장히 웅장해지네

[백준] 19583번 싸이버개강총회 c++ [내부링크]

분명히 처음 코드 맞는 것 같은데 56%에서 틀려서 코드를 다시 짰다. 어디서 틀린 건지 아직도 모르겠다. 원래는 시간과 분을 따로따로 비교했는데 다시 생각해 보니 시간에 백을 곱하고 분을 더해주면 시간 그대로를 이용할 수 있어서 다 그렇게 만들어줬다. num은 내가 입력한 시간이고 snum은 개강 총회 시작하는 시간 Enum은 개강 총회 끝나는 시간 Qnum은 스트리밍 끝나는 시간이다. 처음에 num &#60;&#x3D; snum 이면 출석한 거니 5로 바꿔준다. 5는 별 의미 없다. 그냥 숫자 아무거나 써도 된다. 그다음에는 개강 총회 끝나는 시간과 스트리밍 끝나는 시간 사이이면서 값이 5이면 7로 바꿔준다. 7도 별 의미 없다. 마지막에 for 문 돌면서.......

[CP] Codeforces Round #722 (Div. 2) [내부링크]

2021년 5월 20일 11시 35분에 열린 Codeforces Round 722 1솔 했다. 문제 풀다가 쪽지 왔길래 공지사항인가 싶어서 봤는데 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 푼 거 알려달라고 쪽지 왔다. 답장은 안 했다. A 번 웬일로 문제 보자마자 풀이 떠올라서 오 빨리 풀겠구나 했는데 자꾸 구현에서 시간 잡아먹고 심지어 2번이나 틀려버려서 풀이 떠오른 게 의미가 없어졌다. 문제가 요구하는 해답은 숫자 n이 주어졌을 때 n보다 작거나 같은 2의 제곱수를 찾아서 -1을 한 수를 출력하면 된다. 2의 제곱수이면 가장 큰 비트만 1이고 나머지가 여기여서 &#38;의 연산을 해주면 맨 앞만 1이 되고 나머지 0이 된다 여기서 2의 제곱수 - 1의 수는 맨 앞만 0이고 나머지 1.......

Please send a [내부링크]

코드포스 풀다가 쪽지로 A번 알려달라고 쪽지 왔다. ㅋㅋㅋㅋㅋㅋㅋㅋ 귀엽네 우리 러시아친구 이러면 안돼요~

[백준] 1660번 캡틴 이다솜 c++ [내부링크]

처음에 문제를 N이 주어지면 몇 번째 사면체까지 만들 수 있냐로 잘못 이해해서 틀렸다. dp 문제이다 동전 dp 문제들과 유사한 문제다. 문제는 해석하면 N 개가 주어졌을 때 사면체를 이용해서 N이 되도록 만드는데 이때 사면체의 개수를 최소로 해서 구하는 문제이다. dp[i] &#x3D; 개수가 i일 때 만들 수 있는 최소 사면체의 수 일단 30만이 넘지 않는 개수를 v 벡터에 다 넣어준다. 인덱스 값이 사면체의 개수와 똑같다면 최소 1개를 만들 수 있으므로 dp[v[i]] &#x3D; 1로 만들어준다. 이중 for 문을 보면 v[i]을 다 돌아보면서 을 해준다 두 번째 for 문에서 이렇게 해주는 이유는 j - v[i] &#62;&#x3D; 0을 항상 만족해야 되기에 이걸 바꾸.......

999등 [내부링크]

646문제가 1000등이네 그걸 몰랐네,, 999등 이제야 1000등 진입

[백준] 1965번 상자넣기 c++ [내부링크]

LIS 기본 문제 문제에 힌트가 있다 1 2 3 7을 선택하면 된다는 건 결국 가장 긴 증가하는 부분 수열을 구하면 된다는 의미이므로 구해주면 된다. i 번째를 기준으로 삼아서 이중 for 문으로 작은 인덱스를 탐색하면서 1. 자신보다 작은 지 2. 원래 있는 값과 dp[j] + 1을 비교해서 dp[j] + 1이 더 크면 더 긴 부분 수열을 만족하므로 갱신해 준다. 다 구하고는 + 1을 해줘야 정답 처리가 된다. 1 62만 보면 dp를 구했을 때 0 1 1로 되는데 1과 6을 보면 6안에 1이 있으므로 2개가 된다. 그래서 1을 더 해줘야 된다.

신문 읽어보기 17 [내부링크]

1. 변호사 3만 명 시대에도 민사 70% 나 홀로 소송 - 민사소송 1심 10건 중 7건이 변호사를 선임하지 않는 나 홀로 소송으로 나타남 - 인터넷을 통해 손쉽게 법률 정보에 접근할 수 있어서 변호사 선임을 주저하는 사람이 많아짐 - 변호사 최소 수임료는 330만 원부터 시작하고, 변호사 상담료는 별도. 상담료는 시간당 10만 원 수준을 요구하는 경우가 많다. - 재판할 때 반드시 변호사 선임해야 되는 줄 알았는데 아니었네, 변호사 선임 비용 비싸긴 하다. 2. 가상화폐 검은 수요일 - 중국이 가상화폐 시장 과열을 경고하며 가상화폐 관련 서비스를 단속하기 시작 - 가상화폐로 결제하거나 금융상품을 만들어 투자하는 행위, 가상화폐를 예금처.......

신문 읽어보기 16 [내부링크]

1. 불합격 이유 고지 의무를 만들겠다는 여당 - 채용 불합격 통보를 받은 후에 불합격 고지 의무를 알 수 있는 법안을 개정하려고 시도 중 - 만일 이 법이 시행되면 취준생 입장에서는 자신의 탈락 이유를 알 수 있기에 약점을 보완할 수 있지만 대기업 입장에서는 행정 업무의 부담이 증가하여서 채용 횟수 자체를 줄일 수가 있다. 2. 미국과 한국의 보유세 차이 - 미국 캘리포니아 기준으로 합리적인 세제를 가짐, 55세 이상 고령자가 상급지로 이사할 경우 파격적인 재산세 혜택을 준다. 또한 다주택자에 대한 보유세 중과가 전혀 없다. 우리나라는 종부세 최고세율 최대 3%, 다주택자의 경우는 종부세 공제를 전혀 받지 못한다. - 대한미국의.......

[백준] 12865번 평범한 배낭 [내부링크]

왜 이렇게 나와 knapsack 문제의 가장 기본이 되는 문제 3개월 전에도 풀긴 했으나 제대로 이해하고 푼 것도 아니어서 공부 다시 하고 다시 풀었다. 지금도 좀 이해가 덜 되기는 하네 이중 for 문 재귀 DP

[백준] 14728번 벼락치기 c++ [내부링크]

평범한 배낭 문제와 완전히 똑같은 문제 설명 생략

[백준] 18222번 투에-모스 문자열 c++ [내부링크]

MAX 값을 잘못 생각해서 계속 틀린 문제 10의 18승이면 최대 19자리인데 18승이니까 18자리겠지라고 생각해서 MAX를 대충 50 몇으로 했다가 틀려버림 1. dp 배열 이용해서 n 번째 문자열의 길이를 다 구해준다. 2. 예를 들어 k &#x3D; 6이면 01101001에서 1001에서 0이다. 그럼 1001은 0110을 뒤집은 것이기에 0110의 두 번째 1로 간다. 이걸 계속 반복하고 n &#x3D;&#x3D; 1 즉 한자리 수 될 때 처음 수가 0이기에 return 0; 중요한 게 뒤집은 것이기에! return 을 해줘야 된다.

[CP] Educational Codeforces Round 109 (Rated for Div. 2) [내부링크]

2021년 5월 16일 5시에 열린 edu round 109 2솔 A번 최대공약수 이용 B번 아 A번 좀 빨리 풀어서 오늘 잘되겠구나 했는데 자꾸 B번에서 잘못 생각해서 시간 엄청 날려버렸다ㅋㅋㅋㅋ 페널티도 많이 받고,, 하 정말 빠르게 한 번에 푸는게 정말 중요하다 글고 역시 코드포스는 그리디다 B번은 가장 작은 수인 1과 가장 큰 수인 5의 위치를 보면 된다. D번 이걸 보고 어떻게 DP를 떠올릴까 전혀 생각 안나던데 2차원 DP 문제라고 한다. 먼저 초기화 부분들 n개를 입력 받으면서 1(이미 사람이 있는 자리)이면 one vector에 넣어주고 0(사람이 없는 자리)이면 zero vector에 넣어준다. dp 부분은 쉽게 생각해서 2차원 배열을 -1로 초기화 해주는거다.......

신문 읽어보기 15 [내부링크]

읽다보니 아무 것도 안 적었네

[백준] 1535번 안녕 c++ [내부링크]

5가지 풀이법이 존재하는 좋은(?) 문제 재귀 n 번째 사람을 사용하냐 안 사용하냐로 재귀 가능 비트마스킹 재귀랑 아이디어는 똑같다 1이면 그 사람한테 인사를 한다. 재귀 DP 재귀랑 거의 비슷하나 DP 이용해서 풀었다. 얘도 재귀랑 아이디어는 똑같다. 인사하냐 안 하냐 이중 for 문 DP 안녕 문제가 냅색 문제다. 재귀로 짜는 건 이해가 되는데 예전에도 그렇고 지금도 for 문 이용해서 짜는 건 잘 이해가 안 되네 dp[i][j] &#x3D; i번째 사람의 체력이 j일때의 행복 최댓값 for 문 DP 추후 작성

[백준] 16455번 K번째 수 찾는 함수 c++ [내부링크]

당연히 sort로 하면 O(NlogN)이기에 약 3천만 정도 나와서 시간 초과인데 혹시 c++은 빠르니까 되지 않을까 싶어서 몇 번 제출해봤는데 시간 초과,, 뭔지 몰라서 좀 찾아보니 c++에서 제공하는 기능 중 nth_element가 있는데 모든 배열을 다 정렬하지 않고 내가 원하는 몇 번째 수가 정렬이 될 때까지만 정렬을 한다 시간 복잡도는 O(N)이라고 한다. 그렇기에 5백만이어도 통과 가능

[백준] 2448번 별 찍기 - 11 c++ [내부링크]

재귀가 익숙해졌다고 생각했는데 이거 풀면서 역시 안일한 생각이라는 걸 깨달음 재귀문에서 2,3번째 재귀문은 계속 생각했는데 1번째 재귀문을 놓쳐버렸다. 그 점에서 찍는 걸 생각했는데 그걸 코드로 옮길 생각을 못 했네 재귀 돌리면서 n &#x3D;&#x3D; 3 최소 삼각형이 되면 그때 삼각형을 그 부분부터 그려주면 된다.

[백준] 20164번 홀수 홀릭 호석 c++ [내부링크]

이 문제 풀다가 다시 알고리즘 접을 뻔했다. 분명히 쉬운 문제인데 자꾸 못 풀어서 분노가 차올랐다. 처음 푼 방식도 분명히 맞는 것 같은데 도저히 왜 답이 안 나오는지 모르겠어가지고 다른 방식으로 풀었다. 문제 자체는 어렵지 않다. 재귀를 이용해서 계속 세주면 된다. 1자릿수와 2자릿수는 문제 나와있는 그대로 구현하면 되고 3자릿수 이상부터 이제 잘라줘야 되는데 substr 이용해서 잘라주면 된다. 자르고 더한 다음에 재귀 돌리면 된다. 이 문제를 풀고 느낀게 재귀 사용할 때는 매개변수로 사용하자! 전역변수로 하니 생각하기가 넘 힘들었따.

[백준] 10830번 행렬 제곱 c++ [내부링크]

1629번 제곱, 13171번 A랑 똑같은 문제 다만 행렬이라는 게 좀 더 까다롭다. 이 문제를 풀고 느꼈던 것 중 하나가 아 C++ 문법이 중요하구나! 이차원 배열을 넘겨주는 걸 생각을 못 했다ㅋㅋㅋㅋㅋㅋ 벡터로 해버렸다. 단순히 N 번 제곱해서 구하는 건 시간 초과이기에 분할 정복 이용해서 logN으로 구해야 된다!

신문 읽어보기 12 [내부링크]

연구실 생긴 뒤로 도서관을 잘 안 가니 신문 읽기가 힘드네 - 알트코인 : 비트코인 등 대형 코인을 제외한 나머지 군소 가상화폐 코인들을 말함 rock the boat - 문제를 일으키다, 평지풍파를 일으키다. leaflet - 전단 summit - 정상,정점 dampen - 꺽다, 약화시키다 defiance - 공개적으로 하는 반항 defector - 탈북자 enact - 제정하다 provocation - 도발 recalcitrant - 반항하는 salvage - 구조, 지키다, 인양하다

[백준] 8979번 올림픽 c++ [내부링크]

쉬운 문제인데 코드를 짤 때 실수를 너무 많이 했다. 1. cmp 함수 짤 때 true인데 false로 하고, false인데 true로 한 부분도 있었다. 2. 이중 for 문에서 비교해 줄 때 j와 i를 비교해야 되는데 j와 j+1를 비교해 줬다. 3. 코드를 갈아엎었는데 그전에는 i + 1인데 i라고 쓴 것도 있고 bronze인데 sliver라고 쓴 것도 있었다. 코딩 실수를 줄이도록 노력해야겠다. 문제는 cmp 함수를 문제 조건 그대로 구현하면 된다. 등수를 매기는 방식을 처리해 줄 때는 이중 for 문 사용해 줬다. 같다면 등수 그대로 가고 아니면 등수 계속 증가하는 방식으로

신문 읽어보기 13 [내부링크]

- monument : 기념비적인 - unveil : 공개하다 - indispensable : 없어서는 안 될, 필수적인 앞으로는 단어만 정리하는게 아니라 읽으면서 인상 깊었던 내용들 정리해야겠다.

[백준] 2246번 콘도 선정 c++ [내부링크]

문제가 조금 이해 안 되긴 했는데 문제 그대로 구현하면 되는 문제 정렬을 써서 for 문 한 개로 하는 법도 있던데 공부해봐야겠다.

신문 읽어보기 14 [내부링크]

1. K반도체 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ - 반도체 관련 대기업은 최대 40% 중소기업은 최대 50%까지 세금을 깎아줌 - 메모리 반도체가 세계 1위이고 시스템반도체는 2030년 내로 최고가 되기를 목표로 - 세액공제도 대폭 강화, 인재풀도 대폭 강화, 대학 학과 신설 및 인원 확대 반도체 주식 사면 될 듯 2. 이재용 사면 - 응답자 67% 이재용 사면 찬성, 이명박 박근혜 전직 대통령 사면 찬성은 39% - 이재용은 사면 찬성 여론은 전 연령대에서 과반으로 나타나 고른 지지 - 반도체 패권 전쟁과 고 이건희 회장의 3조 원 미술품, 문화재 기증으로 인한 찬성 여론이 높아짐 3. 머스크 비트코인으로 테슬라 구입 불가 - 비트코인 채굴로 인한.......

[백준] 2910번 빈도 정렬 c++ [내부링크]

이렇게 푸는 게 맞나? struct three에 숫자, 몇 번, 우선순위를 넣을 수 있게 해준다. 처음 배열 입력해서 숫자 받아주고 map 이용해서 우선순위를 기록한다. 첫 번째 우선순위를 1로 해야 된다. 처음에 0으로 해서 0값이 들어가서 틀렸다. 아무튼 v2 배열에 v 배열 값을 넣어주고 중복 값을 제거해 주고 이 값들을 이용해서 이분 탐색을 해서 v 배열에 어디 있는지 찾아주고 그 값들을 v3 배열에 넣어준다. 이때 우선순위는 0으로 일단 다 넣어준다 그다음 v3 배열을 돌면서 map에 접근해서 우선순위를 업데이트해주고 결괏값을 출력해 준다.

[백준] 15661번 링크와 스타트 c++ [내부링크]

문제의 키포인트는 그룹을 나누는 것 1. 비트 마스킹 두 그룹으로만 나누면 되니 0과 1로 생각해서 비트 마스킹을 이용했다. 1이면 team1으로 0이면 team2로 넣어주고 문제 조건에서 한 명 이상 있어야 됐으니 이 조건을 만족할 때만 최솟값을 구해줬다. 2. 재귀(백트래킹) 아이디어는 비트 마스킹과 똑같다 단순히 그룹을 나누는 걸 재귀를 이용해서 구현했다. team1에 넣어주고 team2에 넣어주는 방식으로 똑같이 한 명 이상이어야 되니 조건 걸어주고 만족하면 최솟값 구해주면 된다.

ICPC 준비 [내부링크]

5월 5월 7일 코드포스 라운드 720 Div2 - 0솔 5월 8일 Atcoder beginner Contest 200 - 3솔 5월 9일 Atcoder Regular Contest - 1솔 1주차(브루트포스, 재귀, 정렬) 5월 10일 5904번 Moo 게임, 15661번 링크와 스타트, 13171번 A 5월 11일 20165번 홀수 홀릭 호석 5월 12일 2456번 나는 학급회장이다 8979번 올림픽 5월 13일 5648번 역원소정렬, 15975번, 15970번 화살표 그리기, 2246번 콘도 선정 5월 14일 2910번 빈도 정렬 5월 15일 16455번 K 번째 수 찾는 함수, 1015번 수열 정렬, 별 찍기 - 11, Atcode beginner Contest 201 - 3솔 5월 16일 18222번 투에모스 문자열, 20186번 수 고르기, edu codeforces 2솔, Atcoder Regular Contest 1솔.......

[백준] 1744번 수 묶기 c++ [내부링크]

오랜만에 백준 문제 다시 시작해야지 수를 최대 2개씩 묶을 수 있는 문제 문제를 보자마자 그럼 양수 내림차순 정렬 음수 오름차순 정렬하고 양수는 무조건 다 묶고 1개 남으면 더 하고 음수도 일단은 다 묶고 1개 남았을 때 0이 있는 지보고 0이 있다면 음수와 곱해서 0으로 만든 다음에 더하고 0이 없으면 그대로 음수를 더하면 되겠다고 생각해서 코드를 작성해보니 자꾸 틀려서 왜인가 싶었는데 처음에 음수를 내림차순 정렬해서 조금 잘못된 방식으로 풀었고 반례를 찾다 보니 무조건 묶는 게 좋은 게 아니라는 걸 발견했다 양수 1이 있다면 이거는 묶는 것보다 그냥 더하는 게 더 숫자가 크게 나온다. 그래서 곱하는 것과 더하는 걸 비교해.......

[백준] 13171번 A c++ [내부링크]

1. 재귀 이용 큰 수에서부터 작은 수로 가는 방법 작은 수를 구해버린다 8제곱이면 4제곱 * 4제곱 4제곱 &#x3D; 2제곱 * 2제곱 이런 식으로 구해주는 방법 이때 y가 짝수 면 그냥 곱하면 되고 홀수 면 A까지 한 번 더 구해준다. dp를 쓸까 하다가 배열의 크기가 너무 커서 할 수 없다고 판단했다. res(A % MOD, X)로 결괏값을 해주는 이유는 결국 A도 곱해야 되기에 이것도 곱하는 거니 % MOD 해준다. 2. dp + for 문 이용 dp는 문제에서 64번 반복하면 된다고 하니 dp[i]는 A^(2^i)의 값이라고 생각해서 구해줬다. 홀짝 나눠줄 필요가 없는 게 1 2 4 8 16.. 이므로 무조건 짝수만 구하면 되니까 나눌 필요 없다. 문제에서 11 &#x3D; 1 + 2 + 8이.......

블챌 조기종료 [내부링크]

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 아 나름 재밌었는데 아쉽네.. 공식 블로그 가서 댓글보니 살벌하네..

신문 읽어보기 10 [내부링크]

1. 공매도 -특정 종목의 주가가 하락할 것으로 예상되면 해당 주식을 보유하고 있지 않은 상태에서 주식을 빌려 매도 주문을 내는 투자 전략. 주로 초단기 매매차익을 노리는 데 사용되는 기법. 향후 주가가 떨어지면 해당 주식을 싼값에 사 결제일 안에 주식대여자(보유자)에게 돌려주는 방법으로 시세차익을 챙김 예를 들어 A 종목 주가가 1만 원이고 주가 하락이 예상되는 경우, 이때 A 종목 주식을 갖고 있지 않더라도 일단 1만 원에 공매도 주문을 낸다. 그리고 실제 주가가 8,000원으로 하락했을 때 A 종목을 다시 사서 2,000원의 시세차익을 챙기는 것이다. [네이버 지식백과] 공매도 (시사상식사전, pmg 지식엔진연구소) 2. 제청 - 안건.......

신문 읽어보기 11 [내부링크]

한글 신문은 읽었으나 모르는 단어가 안 나왔음 Top S. Korea, Japan envoys hold talks after yearlong standoff envoy - 사절, 특사 yearlong - 1년이 된, 1년 계속된 standoff - 교착상태 feud - 불화의 Their meeting, which was held on the sidelines of the Group of Seven foreign ministers&#x27; gathering in LonDon, came after months of no contach between the top diplomats, due to the continued conflict and frayed ties between Seoul and Tokyo after months of no contact - 몇 달 동안 연락도 없이 frayed - 신경들이 날카로워지다, morph - 형체를 이루다, 만들다, 형성하다 bilateral - 쌍방의 thaw - 녹다, 해동시키.......

5월 2일 [내부링크]

오늘은 12시에 일어났다 오늘이 시험 끝난 주의 마지막이니 오늘까지만 늦잠 잘 거다 내일부터는 다시 8시에 일어나야겠다 점심 먹고 연구실 왔다 연구실 와서 웹 프로그래밍 8주 차 강의를 듣고 과제를 했다. 이번 학기 처음으로 수업 듣자마자 과제를 했다 대견하다 날씨가 너무너무너무 좋다. 어디 놀러 가고 싶으나 갈 사람이 없다 웹 프로그래밍 9주 차 강의 듣고 과제하고 공모전 알아보고 논문 읽다가 가야겠다

NFV(Network Function Virtualization) [내부링크]

SDN SDN은 네트워크 장치의 제어부(control Plane)과 전송부 (Data Plane)를 분리 이렇게 하면 하나의 제어부가 여러 개의 네트워크 장치를 제어 가능 NFV NFV는 방화벽, 로드밸런서와 같은 네트워크 장비를 가상화 그럼 가상화란? IT에서는 물리적 리소스의 &#x27;가상화&#x27;를 뜻함. 여러 사용자가 하나의 물리적인 리소스를 나누어서 사용하지만 사용자 개개인은 마치 혼자 모든 리소스를 사용하는 것처럼 생각하게 됨 즉 NFV는 네트워크 기능을 추상화하여, 하나의 물리적인 네트워크 기능을 여러 사용자 또는 장치와 나누어 사용할 수 있게 해준다. VNF(Virtual Network Function) - 가상 머신 상에서 네트워크 기능을 구현한 것 이 VNF를.......

5월 3일 [내부링크]

어젯밤에 갑자기 겟아웃이 보고 싶어서 기숙사에서 겟아웃 봤다 엄청 재밌게 봤다. 강추! 겟아웃 보고 있는데 KMOOC 폐기물 시험 점수가 나왔다 80점 만점에 72점이다 이번에도 무난히 PASS 하겠다 이번 주부터는 다시 열심히 살 거다 그런 의미에서 오랜만에 등산을 갔다. 오랜만에 가니 좀 힘들기 했는데 그래도 운동하니 기분이 좋았다. 미세먼지가 좀 많나 보다 하산하고 있는데 교수님한테 점심 먹자고 전화 왔다. 샤워하고 미래관으로 갔다. 반갑다 연어야를 가려다가 다른 컴공과 교수님이 로지스시를 추천해 주셨다고 해서 여기로 가봤다. 여기는 특이하게 초밥을 한 개씩만 준다. 좀 아쉬웠던 게 나는 간장에 찍어 먹는 걸 좋아하는데 자.......

Survey on Network Slicing for Internet of Things Realization in 5G Networks 논문 읽어보기 [내부링크]

network slicing 배경지식 Abstract 1. 네트워크 슬라이싱은 physical network를 다른 네트워크 특징을 가지는 multiple logical networks로 나누는 기능을 가지는 5G 아키텍처에서의 주요한 기술 중 하나이다. 2. 네트워크 슬라이싱은 5G에서 IoT 현실화를 가능하게 하는 중요한 기술 3. 이 논문에서는 IoT realization에서의 네트워크 슬라이싱의 이용 분야에 대한 전반적인 분석을 알려줌 4. 다양한 IoT application 시나리오에서의 네트워크 슬라이싱의 활용에 대해서 논의함 5. 또한 네트워크 슬라이싱을 통해서 해결할 수 있는 기술적 문제들에 대해서도 언급 6. IoT realisation에서의 네트워크 슬라이싱과 관련된 integration challenges.......

신문 읽어보기 9 [내부링크]

1. DSR는 주택담보대출, 신용대출 등 돈 빌린 사람이 보유한 모든 대출의 연간 원리금상환액을 연 소득으로 나눈 값. 2. 테이퍼링 - 테이퍼링(tapering)은 정부가 경제 위기에 대처하기 위해 취했던 양적 완화의 규모를 점진적으로 축소해 나가는 것을 말한다. 출구 전략의 일종이다. 3. 순환출자 - 순환출자란 한 그룹 내에서 A기업이 B기업에, B기업이 C기업에, C기업은 A기업에 다시 출자하는 식으로 그룹 계열사들끼리 돌려가며 자본을 늘리는 것을 말한다 1. health officials say they have no plans to reinstate harsher mitigation measures or pause reopenings reinstate - 복귀,회복 시키다 harsher - 가혹한 mitigation - 완화,경감.......

5월 1일 [내부링크]

오늘은 9시에 일어났다가 11시 20분에 다시 일어났다. 승현이랑 철우랑 할 일이 있어서 12시 넘어서 승현이네로 간 다음에 다 밥을 안 먹어서 사나이 뚝배기에서 밥을 시켜서 먹었다. 할 일을 다 마치고 연구실로 갔다. 연구실에서 컴퓨터네트워크 9주차 강의를 듣고 교환학생을 알아보다가 정말 우연히도 내 분야와 딱 맞는 공모전을 발견했다 이건 유레카다 나가라는 신의 계시이다 5월에 할 게 생겼다. 난생처음 공모전 도전해봐야겠다. 물론 이러고 안 할 수도 있음 기숙사에서 저녁을 먹으려다가 희재랑 같이 밥을 먹으러 갔다. 뭐 먹을지 하다가 크앙분식 가봤다. 양도 괜찮고 맛있었다. 다만 셀프 배식과 다 먹고 내가 치워야 된다는 게 좀.......

나 자신 칭찬해~ [내부링크]

주어진 음식을 다 먹은 나 칭찬합니다

신문 읽어보기 8 [내부링크]

유족들은 이달 말까지 상속세 가운데 약 2조 원을 납부하고, 나머지는 연부연납 제도를 활용해 향후 5년간 6차례에 걸쳐 나눠 내기로 했다. - 연부연납 : 조세의 일부를 법정신고기한을 경과해서 납부할 수 있도록 그 기간을 연장해 주는 연납의 한 종류로 조세를 장기간에 걸쳐 나누어 납부할 수 있다. - 재원 : 재정수입의 원천 또는 재정수입의 항목. 기업이 문화예술을 후원하는 한국 메세나 역사에도 새 이정표를 세웠다. - 메세나 : Mecenat 기업들이 문화예술에 적극 지원함으로써 사회 공헌과 국가 경쟁력에 이바지하는 활동을 총칭한다. - 물납제 : 조세를 물품으로 바치는 제도. - coffin 관 - cardinal : 추기경 - archdiocese : 대주.......

논문 읽는 법 [내부링크]

중간고사 끝나고부터 논문을 읽기로 했다. 막무가내로 읽는 것보다는 먼저 이 길을 걸었던 사람들이 어떤 방식으로 읽었는지 알면 좋을 것 같아서 글 좀 몇 개 찾아봤다.

1권 남았다. [내부링크]

이제 1권 남았다. 때마침 몇 주 전에 꿈은 토리노를 달리고를 신청했는데 오늘 왔다,, ㅋㅋㅋㅋㅋㅋㅋㅋ 딱 알맞은 타이밍이다. 저 글에 적은 거 말고도 신간 몇 권 더 있긴 한데 저기 있는 것부터 빨리 해결하고 신간도 읽어야겠다,, 드디어 끝이 보이기 시작하네 히가시노꺼 다 읽으면 이제 무슨 재미로 사나,,

연구실 세팅 중 [내부링크]

어제 모니터 키보드 마우스 책꽂이 쓰레기통 여러 필기구까지 다 와서 어느정도 세팅 했다 학교에 나만의 공간이 생기니 너무 좋다ㅋㅋㅋ 도서관 자리 걱정 안 해도 되고 원래는 도서관도 9시까지 밖에 안 열어서 그 이후에 갈 곳이 없었는데 갈 곳이 생겨서 좋다 모니터가 생기니 너무 편하다. 확실히 LG라 그런지 화질도 좋고 화면도 크고 화면을 2개 사용하는게 진짜 좋다ㅋㅋㅋ 여러모로 많이 유용한 듯 빨리 모니터 거치대도 오고 공용책장만 오면 얼추 완성이다 데스크탑 본체는 비트코인 때문에 그래픽카드가 너무 비싸져서 일단 나중에^^ 난 지금도 굉장히 만족스럽다!

시험 [내부링크]

시험공부 너무 하기 싫다 뭔가 이번 학기는 해도 해도 끝이 없는 느낌이네 원래 이랬나,, 그리고 왜 과제가 없다가 다 시험 전 주에 내주시는 거지? 왜지? 도대체 왜지? 아 3학년 너무 만만하게 봤나 ㅋㅋㅋ 2학년까지는 다 아는 과목들이어서 괜찮았는데 3학년 때부터는 진짜 전공 배우니까 좀 다르긴 하네,, 아아아 공부를 안 할 수도 없고 2달 뒤면 종강인데 이 2달만 참으면 되는데 아아아아아앙아 다음 주에 시험 시작이네 근데 제대로 한 게 없네 슈ㅍㅍㅍㅋㅋㅊㅌㅋㅌㅊㅌㅊ 공부는 왜 이리 하기 싫냐&#x60;~~~

신문 읽어보기 6 [내부링크]

1. 민주당 입장에서는 21대 총선에서 180석을 획득하는 압승을 거둔 지 불과 1년 만에 대권 교두보로 불리는 이번 서울 부산시장 선거를 모두 야권에 내주는 역대급 참패를 경험하게 됐다. - 교두보 : 큰 하천을 사이에 둔 공방전에서, 교량이나 도하장을 확보하기 위하여 교량의 전단부(前端部)나 대안(對岸)의 도하 지점에 구축하는 강력한 진지.,, 세력확장을 위하여 경쟁 상대의 세력권 내에 만든 발판이라는 뜻으로 사용되기도 한다. 2. &#34;저희가 잘해서 지지한 것이라기보다 잘 하라는 채찍으로 생각한다&#34;고 소회를 밝혔다. 소회 : 마음에 품고 있는 생각. 회포(懷抱)와 같은 말이다. 오랫동안 마음속에 간직하고 있던 소망ㆍ미련.......

신문 읽어보기 7 [내부링크]

1. 골자 - 말이나 일의 내용에서 중심이 되는 것 2. 어깃장 - 짐짓 어기되는 행동, 널문을 짤 때 널쪽을 맞추어서 띳장을 대고 못을 박은 뒤, 그 문짝이 일그러지지 아니하게 대각선으로 붙인 띳장., 짐짓 고분고분 따르지 않고 뻗대다 3. 전초전 - 본격적인 전투를 벌이기 전에 하는 작은 규모의 전투. 대개 적의 전력을 파악하기 위한 목적으로 벌인다. 큰일이 본격적으로 벌어지기 전에 그 흐름을 가늠할 수 있는 작은 일을 비유적으로 이르는 말 4. 쇄신 - 그릇된 것이나 묵은 것을 버리고 새롭게 함. nurture - 양육, 육성하다 foster - 조성하다, 발전시키다 entail - 수반하다 grooming - 차림새, 몸단장 demographics - 인구통계학의 vow.......

문화생활 [내부링크]

문화생활도 좀 해야 되는데 음 그냥 영화관 가는 거 말고 없네 전시회 같은 것도 참 좋아하는데 가기 귀찮고 딱히 마음에 드는 것도 없고 책 읽는 것도 문화생활 아닌가!?!?!? 책이나 읽어야지!

신문 읽어보기 5 [내부링크]

수세 : 적의 공격을 맞아 지키는 형세나 세력 - 재보선은 여당인 민주당 입장에서는 처음부터 수세였다. 피상적 : 본질적인 현상은 추구하지 아니하고 겉으로 드러나 보이는 현상에만 관계하는 것. - 그렇지만 이것만으로 설명하는 건 피상적이다. 아시타비 : 내로남불을 한자어로 만든 신조어 나는 옳고 너는 틀렸어 ㅋ - 내로남불 모습, 정책을 내놓으면 내놓을수록 꼬여만 가는데도 나만이 옳다(아시타비) 식의 태도에 대한 분노와 절망이 쌓여있다. 퇴적 : 많이 덮쳐져 쌓임 - 최근의 악재는 이 퇴적에 조금 더 무게를 더했으며 선거를 앞두고 도드라져 보였을 뿐이다. 읍소 : 눈물을 흘리며 하소연함 - 여당에서는 염치없지만 한 번 더 기회.......

Visual Studio 어셈블리어 사용 환경 세팅 [내부링크]

1. 새 프로젝트 만들기 2. 빈 프로젝트 3. 이름 설정 원하는 걸로 4. 소스파일 - 추가 - 새 항목 5. 맨 위 cpp 클릭 후 확장자명을 ASM으로 바꿈 6. 솔루션 탐색기 - 프로젝트 우 클릭 - 빌드 종속성 - 사용자 지정 빌드 7. 4번째 masm 체크 후 확인 8. 소스파일 - assembl.ASM 우클릭 - 속성 9. 항목 형식을 Microsoft Macro Assembler로 바꾼 후 확인 10. 다시 프로젝트 우클릭 - 속성 11. 구성 속성 - 링커 - 고급 - 이미지에 안전한 예외 처리기 포함을 아니요로 바꾼 뒤 적용 후 확인 12. 완료

연구실 생겼다 [내부링크]

이제야 연구실 생겼다 아직 책상밖에 없고ㅋㅋㅋㅋㅋ 다른 교수님들 연구생분들이랑도 같이 쓰는 방이긴 하지만 그래도 좋다 사진 보니 텅 비어있네,, 빨리 필요한거 구매해야겠다 설렌다 이제 도서관말고 공부할 곳이 생겼다

[1년 전 오늘] 안 쓰게 되는 물건 [내부링크]

결국 기숙사 오기 전에 2월에 아빠랑 누나랑 맞추다가 다 못 맞춤 퍼즐 한 개는 없고 남은 건 너무 머리 아파서 걍 안 함 ㅋㅋㅋㅋㅋㅋ

벚꽃 [내부링크]

벚꽃의 꽃말은 중간고사라는데 벌써 2주밖에 안 남았다.

고양이 11 [내부링크]

얼마만에 찍는 고양이 사진이냐 불금이어서 그런가 용마산에 외사촌 집좀 가려고 하계역 가는 길에 발견한 개냥이ㅋㅋㅋ 뭐가 있어서 봤는데 딱 고양이 그냥 지나갈 수 없어서 바로 사진 찍음 사람들이 길에 좀 있어서 그냥 갈까 하다가 왠지 느낌 좋아서 사람들 신경 안 쓰고 가까이 가봄ㅋㅋㅋ 귀엽네 가까이 가도 안 도망가는 것 같아서 좀 더 가까이 가봤는데 안 도망간다 우리 학교 고양이들도 이랬으면 옆모습 윗(?) 모습 설마 만지는 것도 가능한가 싶어서 만져봤는데 되긴 됐다ㅋㅋㅋㅋㅋ 물릴 뻔한 것 같기도 하고 머리 내가 귀찮았나 다른 곳으로 가려는 고양이 또 만져보고 동영상 찍고 가야돼서 난 갔다 오랜만에 만난 고양이라서 기.......

[1년 전 오늘] 1년 후 [내부링크]

와 이 글을 1년 전에 썼네 후회가 없도록 살려고 했으나 여전히 후회 속에서 살고 있네.. 반성하자 코로나는 아직도 안 끝났네 1년 전에 무사히 종식 되기를 원한다고 썼는데.. 오히려 1년 전보다 더 한 느낌이다.. 언제 끝나냐 1년 뒤에는 어떨까?? 4학년이네 .. 코로나는 풀릴려나

신문 읽어보기 3 [내부링크]

주말이라 종이신문을 못 읽어서 인터넷 신문으로 - Former Prosecutor General Yoon Seok-youl on Friday cast his ballot in the by-election for Seoul mayor, fanning speculations that he may enter politics himself. &#x3D; fanning : 부채질하다, speculations 추측, 짐작, 투기, 그가 정치에 참여할 것이라는 추측을 부채질한다. - rampant : 맹렬한 - ruling party : 여당 플리트 판매 : 관공서 또는 중고차 업체, 렌터카 업체 등의 기업들을 대상으로 자동차를 한 번에 대량으로 판매하는 일. 야권 : 야당권 - 대통령을 배출하지 않는 정당 잠룡 : 물속에 숨어 있어, 아직 하늘에 오르지 않은 용, 왕위를 잠시 피하여 있는 임금, 기회.......

신문 읽어보기 4 [내부링크]

- 험로 : 험한 길, 험난한 삶을 비유적으로 표현 새 조합 집행부 험로 예고 - 내홍 : 내부에서 저희끼리 일으키는 분쟁 서울 재건축 최대어로 꼽히는 둔촌주공 재건축 사업이 본궤도 진입을 앞두고 또다시 새로운 &#x27;내홍&#x27;에 직면했다 - 단일대오 : 서로 다른 정치집단이 공동의 목표를 향해 임시적으로 단결하여 합치는 것 &#34;원하는 분양가를 책정받으려면 &#x27;단일대오&#x27;를 형성해 밀고 나가야 하는데 상황이 녹록지 않아 보인다&#34;라고 말했다. - 파일럿 테스트 : 가상환경 및 실제 환경에서 제한된 참가자로 CBDC 작동 여부 검증하는 테스트 CBDC 디지털 화폐 - by - elections : 보궐 선거 Early voting for next week.......

JavaScript 이벤트 모델, 글자 입력 양식, 이메일, 드롭다운 [내부링크]

1. Event Model addEventListener() 메소드가 표준 이벤트 모델 2. 키보드 이벤트 - keydown : 키가 눌릴 때 실행 - keypress : 키가 입력되었을 때 실행 - keyup : 키보드에서 키가 떨어질 때 실행 보통 keydown과 keypress는 아시아권의 문자를 제대로 처리하지 못하는 문제가 있어서 일반적으로 keyup 이벤트 사용 keyup을 사용해야지만 정상적으로 구현가능 물론 keyup은 키보드에서 떨어질 때 발생하기에 꾹 누르고 있으면 글자수를 못 센다. 아니다 세긴 센다. 한 방에 글자수가 올라간다. 3. 키보드 키 코드 사용하기 4. 이벤트 발생 객체 listner 함수 내부에서 textarea 변수에 접근할 수 없어 오류가 발생한다. 코드의 규모가 커지면 이.......

JavaScript 체크박스, 라디오버튼, 기본 이벤트 막기, localStorage [내부링크]

1. 체크박스 - checked 속성 사용 2. 라디오 버튼 - 한 개만 선택할 수 있게 함 3. 기본 이벤트 막기 오른쪽 클릭으로 이미지 저장하는거 막을 수 있다. 4. localStorage 객체 - 새로고침 해도 내용이 남아 있음 - 웹 API

신문 읽어보기 [내부링크]

he became the latest elected official to face allegations of a major social distancing hypocrisy - allegation 혐의, hypocrisy 위선 there is no guarantee it will be lifted as infection rates rise to early winter wave levels the party leader is hardly the first politician to get caught failing to follow social distancing rules While breaching the rule of four is subject to criminal prosecution and a fine of up to 3 won, neither faced any consequences - breach 위반, prosecution 수행, 실행 - 레임덕 : 임기 말 권력 누수현상 한국판 뉴딜 추진 TF 등 현 정부 주요 정책을 주관하는 조직도 공전하기 시작했다.......

신문 읽어보기 2 [내부링크]

- 쌍용차 P 플랜에는 마힌드라가 감자를 통해 지분을 낮추고 ~ 감자 : 주식회사가 주식 금액이나 주식 수의 감면 등을 통해 자본금을 줄이는 것으로, 증자(增資)에 대비되는 개념이다. 일반적으로 기업의 누적 결손으로 인해 자본금이 잠식되었을 경우 이 잠식분을 반영하기 위해 감자가 이뤄지며, 이 밖에 회사 분할이나 합병, 신규 투자 자금 유치 등을 위해서도 실시된다. 출처 - [네이버 지식백과] 감자 (시사상식사전, pmg 지식엔진연구소) - 유상증자 : https://terms.naver.com/entry.naver?docId&#x3D;3571616&#38;cid&#x3D;58781&#38;categoryId&#x3D;58781 - 기업공개(IPO) : 일정 규모의 기업이 상장 절차 등을 밟기 위해 행하는 외부.......

[백준] 1043번 거짓말 c++ [내부링크]

유니온 파인드를 활용하는 문제 일단 거짓말 한 사람들을 truth 배열을 만들어서 true로 만들어주고 이 사람들과 같이 있던 사람들을 모두 true로 바꿔준다. 이때 같이 있던 사람들을 다 구해주기 위해서 유니온 파인드를 활용했다. 그리고 항상 거짓말을 친 사람을 root 노드로 만들어주기 위해서 truth 배열을 true로 바꿀 때 rank에 100을 더 해줬다. 최대 50명이니 최적화 안 한다고 하면 높이가 50까지 될 수 있으니 안전하게 100으로 해줬다. 사람들을 입력받고 merge 시킨 다음에 자신의 truth 배열을 자신이 가리키고 있는 root 노드의 truth 값으로 바꿔준다. 그다음 입력했던 모든 파티와 사람들에 대해서 한 명이라도 truth가 있다면.......

애드포스트 곧 5만 원 [내부링크]

곧 5만 원이다 돈을 주는 기준이 뭘까? 왜 29일에는 1135원이지 ㅋㅋㅋ 누가 클릭 한 번 했는데 1100원 주네 정말 기준을 모르겠네 많이 좀 눌러줬으면 작년 4월 30일에 애드 포스트 달았으니 거의 11개월 만에 44000원이네ㅋㅋㅋㅋㅋㅋㅋ 글 쓰고 싶은 거 쓰면서 치킨 2마리라.. 나쁘지 않네 ㅋㅋㅋ

JavaScript DomContentLoaded, querySelector(), querySelectorAll(), textContent(), innerHTML() [내부링크]

1. HTML의 html, head, body, title, h1, span 등을 JS에서는 document object라고 부름 문서 객체 모델 DOM, Document Objects Model 2. DOMContentLoaded 이벤트 - 문서 객체 조작할 때 사용하는 이벤트 JavaScript도 위에서부터 한 줄씩 컴파일 하므로 body 태그가 생성되기 전에 body 태그에 접근하려고 하면 접근 할 수가 없다. 생성이 안된다. DOMContentLoaded 이벤트는 웹 브라우저가 문서 객체를 모두 읽고 나서 실행하는 이벤트 문서 객체를 모두 읽어들이면 콜백함수가 실행 boay 태그 전에 script에서 body 태그를 건들이는 코드를 작성해도 문서 객체를 모두 읽고 난 뒤에 실행하기에 정상적으로 실행된다. document라는 문서 객체.......

[백준] 14502번 연구소 c++ [내부링크]

옛날에는 못 풀었는데 이제는 푸네 진짜 조합알고리즘 알고만 있어도 꽤나 많은 문제를 푼다. 어떤 경우를 선택할 때 잘 모르겠으면 브루트포스 + 조합하면 된다. 이 문제도 보면 벽을 설치할 곳을 선택해야되는데 딱 정해서 벽을 선택하는 건 코드를 짤 수 있나? 암튼 그것보다 컴퓨터의 성능을 이용해서 모든 경우의 수를 다 보면 된다. 0인 곳을 vector에 다 넣고 조합 이용해서 3개만 뽑은 다음에 BFS 돌린 뒤에 안전 구역의 갯수를 세주면 된다. 초기화가 굉장히 중요하다. 계속 3개가 될 때마다 BFS를 해야되니 check 배열, board 배열, 큐까지도 초기화를 해줘야된다.

[백준] 17141번 연구소 2 c++ [내부링크]

나의 600번째 문제 연구소 문제를 풀었으면 이 문제도 풀 수 있긴 하다 확실히 연구소 문제보단 생각할게 더 많이 있다. 일단 조합 + BFS를 이용해서 구현해 줬다. 조합으로 바이러스 뽑고 BFS를 돌리는 식으로 근데 여기서 애먹었던 게 뭐냐면 모든 경우를 했을 때도 전파 시키지 못하는 경우를 어떻게 처리 해줘야 될까였다. 나 같은 경우는 모든 조합의 경우의 수와 0 이 나오는 경우를 세줘서 모든 조합의 경우의 수와 0이 나오는 경우의 수를 비교해 줘서 같으면 전파할 수 없다는 의미이니 -1을 출력하고 아니면 최솟값을 출력했다. 근데 이렇게 하니 50,60,70,80.. 90%까지 잘 올라가다가 97%에서 틀리길래 왜 그러나 싶어서 게시판 좀 찾.......

백준 600문제 [내부링크]

백준 500문제를 1월 31일에 달성했으니 100문제 푸는 데 거의 2달 걸렸다. 하루에 1~2문제 푼 거네 590문제 후반대에 계속 있다가 그래도 3월 되기 전에는 600문제 찍어야지라는 생각을 가지고 있었는데 오늘 찍어서 기분이 좋다. 나의 600번째 문제는 연구소2다. 연구소 문제를 풀고 연구소 2를 바로 도전했다. 풀이는 백준 게시판에! 그래도 이번엔 400 -&#62; 500 되는 것보다 오래 걸리기는 했는데 딱히 랭작 같은 것도 거의 안 하고 실버 ~ 골드 위주로만 100문제 채워서(플래도 한 2문제? ㅋㅋㅋ) 좀 뿌듯하다. 저번에 글을 쓰긴 했지만 결국 내가 알고 있는 알고리즘을 내 걸로 만드는 게 진짜 중요한 것 같다. 문제를 풀면서 계속 느끼는.......

두근두근 [내부링크]

승현이랑 고추바사삭 + 피자스쿨 포테이토 피자 먹을 때 승현이랑 BBQ + 햄버거 + 피자 먹을 때 연구실 회식으로 고기 먹을 때 먹기 전이 제일 설레

JavaScript 객체, 속성, 메소드, this, 객체 추가/제거, prototype, tofixed(), isNaN(), isFinite() [내부링크]

1. 객체 생성 배열과 같이 {}를 사용하되 key : value 형식으로 만들어준다. 여러 개 만들 때는, 이용해서 구분해 준다. 출력 방식은 대괄호를 사용하는 obj[&#x27;a&#x27;] 방식이나 obj.a 온점을 사용하는 방식이 있다. 2. 속성과 메소드 - 속성 : 객체 내부에 있는 값 - 메소드 : 객체의 속성 중 함수인 것 - 객체에서의 메소드는 화살표 함수를 쓰지 않는다. 3. this 메소드에서 object가 가진 속성을 출력하고 싶을 때는 this 키워드를 사용해야 된다. 4. 객체 속성 추가/ 제거 - 생성 후 속성을 지정하고 값을 입력하면 됨 stringfy() 메소드는 객체를 콘솔에서 볼 수 있는 방법 객체를 삭제할 때는 delete 객체. 속성 5. 메소드 선언 다른.......

JavaScript trim(), split(), Math, JSON [내부링크]

1. trim() - python에도 있는 기능이네 문자열 앞뒤 공백 제거 2. split() 문자로 구분된 문자열을 읽어서 분해할 때 사용 3. JSON 객체 JSON &#x3D; JavaScript Object Notation - 자바스크립트 배열과 객체를 활용해 자료를 표현한 형식 - 값 표현할 때는 문자열, 숫자, 불 자료형만 사용 - 문자열은 큰따옴표로 - key에도 따옴표를 붙여야함 JSON.stringify(date,null,2) null - 객체에서 어떤 속성만 선택해서 추출하고 싶을 때 사용하나 거의 사용 x 2 - 들여쓰기 2칸 설정 4. JSON.parse() - JSON 문자열을 자바스크립트 객체로 변환할 때 사용 5. Math Math.random() 0 &#60;&#x3D; x &#60; 1 값 랜덤 생성 6. 외부 script 파일 읽기 보통 H.......

JavaScript 속성 존재, 짧은 조건문, 다중 할당, 얕은 복사, 깊은 복사, 전개 연산자 [내부링크]

1. 속성 존재 여부 확인 - 객체에 없는 속성에 접근하면 undeifned 자료형이 나온다. 절대로 false로 변환될 수 없다는 전제가 있다면 더 짧게도 가능 존재하지 않으면 출력한다. 삼항 연산자도 가능 false로 변환될 수 있는 값이 들어오지 않는다는 전제가 있다면 짧은 조건문도 가능. 2. 배열 이용 다중 할당 배열을 이용해서 한다. 선언된 변수보다 더 많은 값들을 가진 배열을 할당하면 개수만큼만 할당된다. 3. 객체 기반 다중 할당 객체를 이용해서도 다중 할당 가능 이때 const {} 중괄호 이용하고 속성 이름 그대로 가져온다. 4. 얕은 복사, 깊은 복사 - 얕은 복사 값만 복사하고 주소는 같음 결국 똑같은 배열임 이름만 다르다. - 깊은.......

[백준] 1918번 후위 표기식 c++ [내부링크]

진짜 시발 개 ㅈ같은 문제ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 아니 시발 뭐 자꾸 런타임 에러가 뜨냐 도대체 어디가 문제인 건데 백준이랑 디시갤러리에 올려도 한 명도 답을 안 해주냐 아 백준 문제 풀다 보면 성격 너무 안 좋아진다 정답률도 2%나 떨어져 버렸네 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 51%에서 바로 49%로 떨어져 버리네 아니 시발 왜 안되는 거지 진짜로 너무 궁금하다 진짜 걍 ㅈ같아서 남의 풀이 참고해서 풀었다. 이게 계속 안되는 코드인데 왜 안되는 지 찾아주시면 커피 기프티콘 드림

Javascript 자료형 [내부링크]

1. var는 사용하지 않는다. 몰랐네 - 변수 사용할 때는 let - 상수 사용할 때는 const - 변수도 상수도 아니면 undefined 2. 문자열 입력 prompt() //HTML에서 사용 메시지 창에 message라 뜨고 기본 내용으로 _default가 뜸 숫자 입력 받을 때는 python처럼 int(input()) 가능 3. bool 입력 confirm() 4. 숫자 자료형으로 변환 0을 빼는걸로도 숫자 변환 가능 이건 c++이랑 똑같네 5. 문자열 자료형으로 변환 + &#34;&#34;을 해도 문자열로 변환 가능 6. 불 자료형으로 변환 Boolean() 0, NaN, ... ,&#34;&#34;,null,undefined 5개는 false로 나머지는 true !!을 붙이는 걸로도 boolean으로 변경 가능

Javascript 배열 [내부링크]

if,switch는 c++이랑 똑같 1. 배열 만드는 방법도 똑같 2. 배열 뒷부분에 요소 추가 PUSH() 이용 3. 인덱스 사용해서 배열에 추가하기 js는 배열 길이가 고정이 아니기에 현재 길이보다 큰 인덱스에도 추가 할 수 있다. 그럼 그 사이는 empty로 4. 인덱스로 배열 요소 제거하기 splice()사용 arr.splice(index,제거할 요소의 개수); index부터 시작해서 개수만큼 제거한다. 5. 값으로 요소 제거하기 indexOf() 메소드 사용해서 특정 값의 위치를 찾고 splice() 메소드를 사용해서 제거 6. 특정 위치에 요소 추가하기 splice() 사용한다. 인덱스, 0 , 추가할 요소 0 쓰면 추가함

JavaScript 반복문 for in, for of, for, while [내부링크]

1. for in i에는 인덱스가 들어옴 python처럼 생각했는데 아니네 기본 형식은 아래와 같다. 이것보다 for of나 for 반복문 사용하는 게 좋다. 2. for of 반복 변수에 요소의 값이 들어감 3. for 반복문 우리가 아는 기본 형태 4. while 5. break; 내가 아는 break랑 똑같

JavaScript 함수, 매개변수, 가변 매개변수, 나머지 매개변수, return, 전개 연산자 [내부링크]

1. 익명 함수 기본 형태 함수에 이름이 없음 2. 선언적 함수 3. 매개변수 , return 4. 가변 매개변수, 나머지 매개변수 함수를 호출할 때 매개변수의 개수가 고정적이지 않은걸 가변 매개변수 이걸 구현할 때 나머지 매개변수 사용 배열인지 확인하려면 Array.isArray() 5. 전개 연산자 위에랑 비슷하게 배열을 매개변수로 넣을 때 사용함 6. 기본 매개변수 c++에 있는 기본 매개변수와 똑같다.

JavaScript 콜백 함수, for each, map, filter, arrow 함수, strict mode, 익명 함수, 선언적 함수 [내부링크]

1. 콜백함수 - 매개변수로 전달하는 함수 - 이런건 처음보네 함수 포인터까지는 본 것 같은데 익명 함수 사용 2. forEach() - forEach 메소드는 배열이 갖고 있는 함수로써 배열 내부의 요소를 사용해서 콜백 함수를 호출 function(value,index,array){} - value,index,array 다 쓸 필요 없음 순서 맞춰서 필요한 것만 쓰면 됨 3. map map()도 배열이 갖고 있는 함수. map() 메소드는 콜백 함수에서 리턴한 값들을 기반으로 새로운 배열을 만드는 함수. python map이랑 똑같은 듯 4. filter() filter 메소드도 배열이 가지고 있는 함수. - filter 메소드는 콜백 함수에서 return 하는 값이 true인 것들만 모아서 새로운 배열을 만드는 함수 5. ar.......

react state [내부링크]

아래와 같이 this.state.count &#x3D; 1를 하면 react는 render function을 refresh 하지 않는다. 매번 state의 상태를 변경할 때 react가 render function을 호출해서 바꿔줘야한다. 그렇게 바꾸기 위해서는 setState를 이용한다. 일단 state는 object이기에 setState는 새로운 state를 받아야한다. this.setState({count : 1}); 클릭을 할 때 마다 +- 1이 되고 하고 싶다면 this.setState({count : this.state.count + 1}); 하지만 위와 같은 방법은 별로 좋은 방법이 아니다 state를 set 할 때는 react에서 외부의 상태에 의존하지 않는 것이 가장 좋은 방법이다. this.setState(current &#x3D;&#62; ({count : current.count +1}); - 출처 : 노.......

react component life Cycle [내부링크]

https://reactjs.org/docs/react-component.html constructor() component가 mount될 때 component가 screen에 표시될 때, component가 Website에 갈 때, constructor를 호출 그리고 나서 render 호출 componentDidmonunt가 알려줌 update는 add 혹은 minus를 클릭해서 state를 변경할 때 업데이트 setstate를 호출하면 component를 호출하고 먼저 render를 호출한 다음 업데이트가 완료되었다고 말하면 componentDidupdate가 실행

[백준] 1167번 트리의 지름 c++ [내부링크]

트리의 지름은 한 정점에서 가장 거리가 먼 정점을 구하고 그 정점에서 다시 가장 거리가 먼 정점까지의 거리가 트리의 지름이다. BFS를 2번 돌려주면 된다.

React axios [내부링크]

1. javascript에서 data를 fetch하는 방법은 fetch를 사용 더 좋은 방법은 Axois Axios는 fecth위에 있는 작은 layer npm install axios를 통해서 다운 받는다. 위 깃허브에서 ytx 주소 이용하면 됨 componentDidMount()에 axios를 사용하는건 시간이 걸리기 때문에 시간이 걸린다는 걸 알려줘야됨 getmovies 함수를 만들고 const moive &#x3D; ~ axios.get를 만들어준다. 이때 비동기 async()로 선언해야지만 await를 사용할 수 있다. 출처 - 노마드코더 reactjs

react rendering the movies [내부링크]

아래와 같은 방법으로 movies.data.data.movies로 20개의 movies를 가져올 수 있지만 더 좋은 코드가 있다. 아래와 같이 바꾸면 된다. 이제 movies를 state에 넣을 차례이다. 아 어렵다 귀찮다 ㅋㅋ

[백준] 2146번 다리 만들기 c++ [내부링크]

일단 이걸 푸니 기분이 좋다 20년도 7월쯤에 BFS 한창 공부할 때 이 문제 풀려다가 결국 못 풀었는데 어제 생각나서 한 번 풀어봤는데 한 방에 맞아서 기분이 참 좋았다~~~~~~ 옛날에 풀 때 다리를 설치할 수 있는 부분들을 어떻게 알 수 있을까를 고민했다가 결국 이걸 못 해서 못 풀었다. 다시 생각해 보니 결국 바다와 인접한 부분이 하나라도 있으면 그 부분에 설치를 해주면 된다. 나는 BFS를 돌면서 0을 만나면 vector에 넣어주는 식으로 했다. 하지만 만일 10 00 이런 경우라면 1이 대한 좌표가 2번 들어가기에 마지막에 좌표 압축을 적용해 줬다. 암튼 먼저 BFS를 돌면서 각 나라들을 구별할 수 있게 해줬다. 처음 나라는 1 그다음은 2 ,.......

React Dynamic Component Generation [내부링크]

앞에서 한 방식 &#60;Food fav &#x3D; &#34;kimchi&#34;&#62; 이렇게 하는 건 이 방식은 새로운 음식을 추가할 때마다 복사 붙여넣기를 해야 되니 효율적이지 않다. 동적 데이터 추가하는 방법 동적 데이터를 이용하기 위해서는 map을 이용한다 map은 array의 각 item(원소) dp function을 적용하고 array를 반환해 준다. 즉 array의 원소들을 다 돌면서 함수를 적용시켜준다. object의 list를 가져오는 법 function component, food component를 동적으로 renderinf 이제 이 긴 걸 어떻게 Array로 가져오고 자동적으로 내가 좋아하는 food를 이름과 함께 렌더링 할까? javascript map은 array의 각 item에서 function을 실행하는 array를 가지는.......

React Recap [내부링크]

함수를 만들어서 map을 적용 시킬 수 있다. //react의 element들은 유일해야하고 //list 안으로 집어넣을때, 유일성을 잃어버린다. 유일성을 적용 시키기 위해 foodlike에 id를 추가해준다.

React Protection with PropTypes [내부링크]

father componet(APP())로부터 전달받은 props가 우리가 예상한 props 인지를 확인해야 된다. npm i prop-types를 통해서 prop type을 다운로드한다. 이건 내가 전달받은 props가 원하는 props 인지를 확인해 준다. Food에 대해서 prototype을 작성하면 name은 string으로 오는지 picture도 string 인지 rating도 number 인지 확인한다. isRequired는 필수가 아니다. -출처 : 노마드 코더 react

[백준] 2250번 트리의 높이와 너비 [내부링크]

굉장히 많은 배열이 필요한 문제다. 일단 inorder를 이용해서 각 노드들의 level과 depth를 정해준다. 문제를 읽어보면 inorder다 가운데 꺼 먼저 번호 매기고 그다음 왼쪽 오른쪽이므로 여기서 중요한 게 루트 노드가 1이 아닐 수도 있고 입력이 예제처럼 순서대로 안 들어올 수가 있다. 그렇기에 for 문을 돌면서 부모 노드가 없는걸 root로 만들어준다. maxlevel를 찾아주고 for 문을 돌면서 깊이별로 가장 왼쪽과 오른쪽을 찾아준다. 마지막에 이중 for 문 돌면서 가장 큰 너비와 가장 작은 level을 찾아준다.

React Class Components and State [내부링크]

기존에 있던 function 말고도 class를 활용할 수 있다. class를 이용하면 react가 자동적으로 실행 class APP은 react component다 component를 만들 때마다 모든 것을 구현하고 싶지 않기에 extend from을 한다. function이 아니이게 return은 없고 render method를 가진다. react component는 render method를 가지고 있지만 extend from을 했기에 render methode가 있다. function component는 function이고 return 하고 screen에 표시됨, class comp react는 자동적으로 모든 class component의 render method를 실행한다. 자동적으로! 자동적으로!! state는 object이고 component의 data를 넣을 공간이 있고 이 데이터는 변한다. 바꿀 데이.......

[일상] 내가 이렇게까지 약속이 많았나 싶은 3월. 1년 약속 다 끝냈다! [내부링크]

정말 오랜만에 일상 글을 올린다.12월에 종강하고 처음이네그동안은 딱히 올릴 게 없었는데기숙사 간 뒤로 약속이 많아서 이번 기회에 올린다ㅋㅋㅋㅋㅋㅋ*스압주의*기숙사 가기 전에 싸놓은 짐들생각보다 많아져서 당황그렇게 27일에 기숙사 와서 책상 정리하고 옷장도 정리하고침대까지 다 정리했다.침대 좀 이쁘게 정리하고 찍을걸 그랬나그리고 야경까지..원래는 달이 이뻐서 찍은 건데잘 안 보이네기숙사 오기 전에 생각한 것 중 하나가이번 기회에 등산 열심히 해보자여서기숙사 오고 그 다음날에 바로 불암산으로 가봤다.진짜 두꺼운 양말도 안 신고 폴대도 안 챙기고나 낡아빠진 운동화 신고 갔다.기숙사에서 입구까지 한 20분ㅋㅋㅋ이.......

[백준] 2589번 보물섬 c++ [내부링크]

브루트포스랑 최단거리를 구해야 되니 BFS를 이용하면 된다.처음에 어떻게 풀까 하다가아무리 봐도 임의의 두 점을 잡는 건 힘들어 보여서브루트포스해도 시간 복잡도 충분할 것 같아서한번 해봤다.L로 시작하는 모든 점에서 BFS를 돌려서최대 거리를 구하면 된다.꼭 초기화를 해줘야 된다.처음에 dist를 초기화 해줘야되는데ㅋㅋㅋㅋ자꾸 board를 -1로 초기화해서 답이 안 나왔다.

React 설치 [내부링크]

소프트웨어공학 팀플에 정말 많은 기술들이 필요하다.React도 필요하다고 해서 공부 중.nodejs도 잘 모르겠는데,,아 정말 소공 열심히 해서 기술 하나 정도는 가져야겠다.react가 프런트엔드에서 정말 많이 쓴다고 하니react만이라도 열심히 챙겨 봐야겠다.혹시 모르지 이런 걸로 어디 인턴 할 수도~~1. Nodejs가 필요하다.들어가서 아무 버전이나 다운 받으면 된다.다 다운 받으면잘 설치됐는지 확인하기 위해서cmd 창 들어가서node -v랑 npm 쳐보면 된다.nove -v치면 버전 나오면 되고npm 쳤을 때는 긴 무언가가 나오면 된다.그다음 npm install npx -g를 쳐서 npx도 다운 받고git도 필요하기에 git도 다운 받는다.과거에는.......

React github에 올리기 [내부링크]

일단 깃허브 들어가서 Repositories 부터 먼저 생성URL 복사한 뒤 자신이 사용하는 편집기로 이동터미널 창에서 자신이 프로젝트에 사용할 폴더에git init 입력 - git으로 사용한다? 이런 느낌 아닐 수도 있음그다음git remote add origin https://github.com/s-ryuri/movie_app_2021git remote add oriing URL 주소입력git add . 입력해서 commit 할 수 있게 만듦git commit -m &#34;https://github.com/s-ryuri/movie_app_2021&#34;commit 한 뒤에git push origin master입력해서 push 하면 git에 react 파일들이 올라가 있음.

React 작동 원리 [내부링크]

react의 app.js 파일에서내용만 바꾸면 알아서 적용이 된다.왼쪽에 있는 index.html 파일의 root 밑에는 아무것도 없었지만사이트 들어가서 검사 누르면 div root 밑에 hello가 적용돼있다.react는 내가 쓰는 모든 요소를 생성한다.react가 div 사이에 react application을 넣는다.getelementbyid(&#x27;root&#x27;)를 통해서 넣는다.react는 소스코드에 처음부터 HTML을 넣지 않고 HTML에서 HTML을 추가하거나제거하는 법을 알고 있다.-출처 : 노마드코더

React Component, jsx [내부링크]

src 폴더에서 component를 생성한다.내가 원하는 대로 함수를 일단 만든다.component를 사용하기 위해서항상 반드시 위에를 쓰고마지막에를 쓴다.이걸 이제 index.js에서 사용할 수 있게index.js에 위에를 해준다.허나 이렇게 &#60;App/&#62;과 &#60;ryool /&#62;을 같이 쓰면 오류 발생하나의 component만 rendering 해야 됨//react application의 하나의 component만을 rendering 해야 하기에 그 componet가 APp이다.App.js가서를 해주고App() 함수에를 추가해 준다.사이트 들어가면 Hello와 hello i&#x27;m ryool이 같이 뜬다.//&#60;App /&#62; component라 불리고 react는 componet와 함께 동작, 모든 것은 component//compon.......

React Components, jsx 2 [내부링크]

//jsx 두번째로 이해 ; component에 정보를 보낼 수 있다는 점//react는 재사용 가능한 component를 만들 수 있따. component를 계속해서 반복해서 사용 가능하다.//component에서 component로 children component를 보내는 법//이 application에서 food component로 정보를 보내고 그런 다음에 food component에서 그 정보를 어떻게//사용하는지에 대해서 배운다./꼭 import 하지 않아도App.js에서 바로 function을 만들면 가능하다./food component에 fav라는 이름의 property를 kimchi라는 value로 줬다.//react masic에서 react는 우리가 전달한 props를 가져가는 일을 한다.//food component로 정보를 보내려고 하면 react는 이 모.......

nodejs [내부링크]

not found 구현홈페이지 구현반복문배열배열과 반복문파일목록 알아내기함수 기본함수 이용동기적 비동기적 구현비동기적으로 구현해야 성능이 더 좋아짐callbackpackage manager꺼지면 다시 켜주고파일이 수정되면 자동으로 저장되게 함pm2 start main-js --watch 자동으로 바뀌게pm2 log - 로그를 보여주면서 바뀐걸 다 보여줌pm2 monitpm2 listpm2 start글 생성 UIpost로 받은 정보를 받아옴파일 생성과 리다이렉션43 제작 글수정 수정링크 생성44 제작 글 수정 수정할 정보 전송hidden아 어렵다 ㅋㅋ삭제 기능 구현

[백준] 1342번 행운의 문자열 c++ [내부링크]

정렬한 뒤에 next_permutation이용해서인접한 것끼리 같은 지 아닌지를 확인하면 쉽게 풀 수 있는 문제이다.정렬을 해야지만 첫 번째부터 마지막까지 모든 경우의 수를 다 볼 수 있기에꼭 정렬해야된다.

SNS [내부링크]

장점이 있나..뭐 하고 사는 지 알 수 있다와음 심심할 때 재밌는 걸 볼 수 있다.단점한 번 보면 계속 봐서 시간낭비가 심하다.인스타에는 좋고 재밌는 일만 올리니내 삶과 비교하면 현타올 때가 많음최근엔 그냥 인스타도 비활 해버림시간 낭비가 넘 심한 것 같아서ㅋㅋㅋ

고양이 10 [내부링크]

아침부터 고양이를 보다니 운수가 좋은 날이다.불암산 입구 지나서 가고 있는데옆에 쓱 보니 고양이 있어서 바로 찰칵밥을 먹고 있는 고양이열심히 먹고 있구나내가 좀 더 가까이 가니 먹다 말고 살짝 도망갔다.미안해 친구야빨리 가라는 눈빛이 느껴진다밥 먹을 때는 개도 안 건드린다는데미안해 많이 화가 나 보이네입맛까지 다시고 있네..불암산 올라가고내려오는 길에 한 번 찍어주고혹시나 싶어서 또 봤는데 없다.흑흑 감동적인 글귀다..집도 귀엽네저번에 고양이 8에 올린 애랑 똑같은 애인가 싶어서글을 다시 봤는데 비슷하게는 생겼는데다른 고양이이다. 발의 무늬 색깔이 다르네,,

[백준] 1248번 맞춰봐 c++ [내부링크]

시간 초과 난 코드도 답은 맞는 것 같은데 왜 시간 초과가 나는 지 모르겠네잘 한 것 같은데,,백트래킹을 활용하는 문제일단 문제 그대로 표를 그려보면 i &#x3D;&#x3D; j일 때가 그 수의 부호이므로20^10에서 10^10으로 줄일 수 있다.하지만 이것도 시간 초과이므로백트래킹을 활용해서 안되면 바로 포기하고 다음으로 넘어가는 방법으로 풀어줬다.okay 함수가 조건을 만족하는지 판별하는 함수이다.

[백준] 4195번 친구 네트워크 c++ [내부링크]

종만북으로 유니온 파인드 공부한 다음에 잘 이해했나 보기 위해서 풀어본 문제옛날에도 유니온 파인드 공부한 뒤에 풀려고 했다가 입력이 string 이어서 못 풀었던 문제일단 unordered_map 이용해서 string을 int에 대응시켜줬다.이미 string이 map 있다면 넘어가고 없으면 cnt로 대응해 줬다.문제를 읽어보면 유니온 파인드이기에 유니온 파인드 구현하고그다음 집합 안에 몇 개가 있는지 어떻게 구현해야 될까를 생각했다.num 배열을 만들어줘서 집합에 몇 개가 들어있는지를 넣어줬다.더 작은 크기를 가진 집합을 더 큰 크기를 가진 집합의 num에 더 해줬다.이렇게 하면 집합의 크기를 구할 수 있다.처음에 런타임 에러가 난 이유는 F가.......

[백준] 6198번 옥상 정원 꾸미기 c++ [내부링크]

10달전에는 단순히 이중 for문으로 해서 틀린 문제 그때는 딱히 시간복잡도 개념이 없었다.N &#x3D; 80000까지이므로 O(N^2)은 안된다.탑이랑 굉장히 유사한 문제로stack을 이용하면 된다.왼쪽부터 하나씩 보면서 이 건물을 볼 수 있는 건물의 개수를 구하면 된다.stack을 보면서 자기 보다 작은 값이 있으면 pop을 해주고큰 값이 있으면 이 큰 값은 자기를 볼 수 있기에 break; 된다.그 다음 stack에 넣어주고 자기는 자신을 볼 수 없으므로 -1을 해준 뒤 더해준다.문제 풀고 빠른 입출력 적용 해봤는데 1등이다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ아니 0ms 나올 줄을 몰랐는데ㅋㅋㅋㅋㅋㅋㅋㅋ

[백준] 2493번 탑 c++ [내부링크]

10달 전에는 못 풀었네지금이나 그때나 딱히 실력 차이가 없는 것 같네ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ옥상 정원 꾸미기와 같이 stack을 이용하는 문제인덱스를 출력해 줘야 되니 pair도 써줬다.스택을 이용하면 풀 수 있는 문제이다.먼저 왼쪽부터 차례대로 입력을 받는다.이때 stack이 비어있지 않으면while 문으로 들어가서 stack에 있는 것과 비교를 한다.stack에 top에 있는 값이 입력받은 num보다 크면레이저를 받을 수 있는 것이므로 출력하고 break 해준다.만일 더 작다면 pop()을 해준다. 어차피 필요가 없으니까.while 문을 빠져나왔는데 만일 stack이 비어있다면수신 받을 탑이 없다는 의미이기에 0을 출력해 주고stack에 num과 인덱스를.......

이런 답장 싫어 [내부링크]

이런 내용이 나오네나는 뭐 싫은 답장 같은 건 없는데답장 느린 게 너무너무너무너무너무너무너무너무너무 싫다 진짜로물론 난 빠름원래 알던 애들이 그러면 그런갑다 하는데 꼭 대학 와서 만난 몇몇 사람들이 그렇네그전까지는 이런 걸로 스트레스 안 받았는데대학 복학하고 난 뒤부터 스트레스 받기 시작함아니 지들이 필요해서 연락할 때는 답장 엄청 빠르고내가 필요해서 연락하면 답장 엄청 엄청 엄청 느리고 답장이 안 오는 경우도 다반사;아니 쓸데없는 얘기해서 뭐 답장이 느리거나 읽씹하면 뭐 나도 그러는 경우 있으니 그런갑다 하는데서로 좀 필요한 상황에서 연락하는데 답장이 느린 건 무슨 경우일까심지어 자기가 먼저 연락했는.......

고양이 9 [내부링크]

까먹고 안 올렸네언제였더라 도서관에서 기숙사 가는 길에 찍은 고양이쓰레기장 뒤에 있어서 약간 고민했으나그래도 고양이는 못 지나치지!식빵 굽는 자세인가천천히 다가가니 점점 가까워짐표정이 좀 화난 것 같은데 미안해 친구야ㅋㅋㅋㅋ더 다가가고 싶지만딱 여기까지 밖에 안돼서,,고양이와의 거리를 좁히는 연습을 해야겠다!

인터넷 프로토콜(IP): IPv4, 주소 지정, IPv6 [내부링크]

IPv4 데이터그램 형식- 버전 번호 : 4bits로 데이터그램의 IP 프로토콜 버전을 명시- 헤더 길이 : IPv4 데이터그램은 헤더에 가변 길이의 옵션을 포함하므로 이 네 비트로 IP 데이터그램에서 실제 페이로드(데이터그램에 캡슐화된 전송 계층 세그먼트)가 시작하는 곳을 결정한다.- 서비스 타입 : IPv4 헤더에 포함된 서비스 타입 비트는 서로 다른 유형의 IP 데이터그램을 구별- 데이터그램 길이 : 바이트로 계산한 IP 데이터그램(header와 data)의 전체 길이- 식별자, 플래그, 단편화 오프셋 : IP 단편화와 관계- TTL(Time - To - Live) : 이 필드는 네트워크에서 데이터그램이 무한히 순환하지 않도록 함. 이 필드 값은 라우터가 데.......

[백준] 14391번 종이 조각 c++ [내부링크]

비트마스킹을 이용해서 모든 경우의 수를 살펴보는 문제0을 가로 1을 세로로 생각해서 이어져 있는 것들을 다 더해본다.원래 cin, cout 쓰는데 입력받을 때 scanf가 더 편할 것 같아서scanf로 썼다.

믿어요 [내부링크]

1. 어린아이들 앞에서는 무단횡단을 하지 않는다.- 따라 할까 봐 못 하겠음- 물론 없으면 함 ㅋㅋㅋㅋㅋㅋㅋㅋ- 가끔 얘들이 먼저 할 때도 있음 그럼 그냥 머쓱하고 나도 같이 함2. 양심에 찔리는 짓은 하지 않는다- 대충 하는 거, 치팅, 거짓말, 당연히 범죄, 떳떳하지 못 한 행동 잘 못하겠음 누구나 그렇겠지만- 어차피 거짓말도 잘 못 쳐가지고 하면 다 티 남- 가끔씩 꿈에서 범죄 저지르는 꿈 꾸면 어우.. 너무 끔찍..

유니온 파인드(Union Find) c++ [내부링크]

유니온 파인드 정의- 공통 원소가 없는 상호 배타적인 부분 집합들로 나눠진 원소들에 대한 정보를 저장하고 조작하는 자료구조가 Union - Find- 예시 : 파티에 n 명의 사람들이 있다고 할 때 주최자가 생일이 같은 사람들끼리 모이라고 하면 처음에는 혼자 돌아다니다가 생일이 같은 사람을 찾으면 두 명은 한 팀을 이루고 다른 팀과 생일이 같다는 걸 확인하면 두 팀은 합쳐진다.유니온 파인드 세 가지 연산1. 초기화 : n 개의 원소가 각각의 집합에 포함되어 있도록 초기화2. 합치기(Union) 연산 : 두 원소 a, b가 주어질 때 이들이 속한 두 집합을 하나로 합친다.3. 찾기 (find) 연산 : 어떤 원소 a가 주어질 때 이 원소가 속한 집합을.......

패션 포인트 [내부링크]

돈이 최고의 팁

[백준] 1759번 암호 만들기 c++ [내부링크]

다시 푼 문제재귀를 이용해서 풀었다.알파벳을 사용하냐 안 하냐 즉 시간 복잡도 O(2^N) 방식으로 풀었다.알파벳을 사용하면 go(password + v[i],i+1)사용하니 v[i]를 더해주고 그다음 인덱스로 넘어간다.사용하지 않으면 password 그대로 넘기고 그다음 인덱스로 넘어간다.sort를 해줘야 오름차순을 만족할 수 있다.

[백준] 1941번 소문난 칠공주 c++ [내부링크]

감격스럽다 드디어 드디어 풀었다.이 문제는 몇 개월에 한 번씩 꼭 생각나서 도전해봤던 문제매번 실패했다가 드디어 성공했다.테트로미노 풀려다가 이 문제 생각나서 한 번 해봤는데풀었다 호호일단 일반적인 BFS나 DFS로는 안 풀린다.이걸 중간에 활용해야 된다.1. 25명 중 7명을 뽑는다 - 조합 이용2. 7명이 인접했는지 확인한다. - BFS 이용3. 인접했다면 이다솜파가 4명 이상인지 확인한다.문제의 아이디어는 위와 같다.사실 저번에 구글링 해서 풀이 봤는데 도대체 이해가 안 됐는데뭔가 갑자기 이해가 된 느낌일단 조합부터 잘 몰랐는데 저번에 공부해가지고 암튼 잘 됐다.조합 알고리즘을 이용해서 7명을 먼저 뽑는다.7명.......

네트워크 계층 데이터 평면 [내부링크]

포워딩과 라우팅 : 데이터 평면과 제어 평면forwarding(전달) : 패킷이 라우터의 입력 링크에 도달했을 때 라우터는 패킷을 적절한 출력 링크로 이동시켜야 함forwarding은 데이터 평면에 구현된 하나의 기능, 패킷이 라우터에서 나갈 때 막힐 수도 있고 또는 복제되어 여러 링크로 전송될 수 있다. 매우 짧은 시간 단위를 갖기에 하드웨어에서 실행Routing : 송신자가 수신자에게 패킷을 전송할 때 네트워크 계층은 패킷 경로를 결정해야 함.경로 계산 알고리즘을 routing algorithm. 라우팅은 네트워크 전반에 걸쳐 출발지에서 목적지까지 데이터그램의 종단 간 경로를 결정, 보통 더 긴 시간(초) 단위를 갖기에 소프트웨어에서 실행ex : 공.......

[백준] 1748번 수 이어 쓰기 1 c++ [내부링크]

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ내가 9달 전에 무슨 짓을 한 거지9달 전 코드를 보면 1 ~ N까지 다 돌면서 이 수가 어디에 속하는지를 찾아서값을 더 해주는 식으로 했다. 당연히 안되지!어차피 1 ~ 9는 1자리 10~ 99는 2자리이므로내 숫자가 몇 자리인지 살펴보고바로 전 자리 까지는 계속 더해주고마지막에는 예를 들면 123이면 100~123의 개수에다가 길이를 곱해줘서 더한다

N과 M [내부링크]

예전에 푼 문제들인데 다시 풀어보고 있다.N과 M(2)번 코드이다.1. O(2^N) 방법예를 들어 5개의 수중 3개를 뽑아서 오름차순이라고 하면1 4 7를 뽑든 7 4 1을 뽑든 결국 1 4 7 하나로 생각할 수 있다.즉 어떤 수가 들어가냐 들어가지 않느냐로 생각해서뽑아주기만 하면된다.이걸 작성하는 이유는 이렇게 2^N 풀이를 이용해서 푸는 문제들을풀 때 어떻게 코드를 짜야될지를 잘 모르겠어 가지고 적는다!2. 오름차순3. 오름차순이니 그 전에 있는 것보다 큰 것들을 넣어주면 됨

[백준] 1476번 날짜 계산 c++ [내부링크]

카잉 달력과 거의 비슷한 문제이다풀이는 두 가지 방법1번지금 나와있는 그대로 구현하면 된다1씩 증가시키면서 범위를 넘으면 1로 바꿔주면 된다.어차피 최대 7980번밖에 안 하니 충분하다.2번1로 바뀐다는 건 결국 주기가 있다는 것이니주기를 이용해서 푼다.E의 경우만 예를 보면 15개가 반복이 되니15로 나눠준 나머지를 보면 된다.하지만 여기서 15일 때 나머지가 0이 나오니이 0을 예외 처리해 주기 위해서 (E-1) % 15 + 1을 해준다.위의 표를 보면 알 수 있다.

컴퓨터 네트워크와 인터넷 3 [내부링크]

프로토콜 계층과 서비스 모델계층의 서비스 모델1. 그 계층 내부에서 어떤 동작을 수행2. 직접 하위 계층의 서비스를 이용인터넷 프로토콜 스택은 5개 계층으로 구성 애플리케이션 계층애플리케이션 계층은 네트워크 애플리케이션과 애플리케이션 계층 프로토콜이 있는 곳HTTP(웹 문서 요청과 전송을 위해 제공), SMTP(전자메일 전송 제공), FTP(두 종단 시스템 간의 파일 전송 제공)애플리케이션 계층 프로토콜은 여러 종단 시스템에 분산되어 있어서, 한 종단 시스템에 있는 애플리케이션이 다른 종단 시스템에 있는 애플리케이션과 정보 패킷을 교환하는 데 이 프로토콜을 사용애플리케이션 계층에서의 이 정보 패킷을 Message(메시지)라.......

[백준] 3085번 사탕 게임 c++ [내부링크]

전형적인 브루트 포스 문제먼저 인접한 두 개를 바꾸는데 필요한 시간 N^2행과 열을 보면서 최대 개수 찾는데 필요한 시간 N^2총 N^4이다.다행히 N &#60;&#x3D;50이어서 충분한 시간이다.코드 길이도 3601에서 1209로 줄였다.문제 풀 때 함수를 잘 안 쓰는데 고치려고 해야겠다.똑같은 건 함수를 처리하면 되는데계속 넣어주니 코드 보기가 너무 어려워진다.check 함수는 행 N 개와 열 N 개를 보면서 최대 개수를 찾아주는 함수이다.main 문에서는 범위를 나눠서 check() 해줬다.일단 기본 아이디어는 인접한 걸 바꾼다고 할 때 오른쪽과 아래와 바꿔준다고 생각한다즉 2방향만 생각만일 행의 끝에 있으면 오른쪽만 바꿀 수 있고열의 끝에.......

[백준] 10994번 별 찍기 - 19 [내부링크]

별 찍기 시리즈 중 19번째 문제재귀를 활용해서 풀었다.예제를 보면 정사각형이 계속 반복되는 모양이다나는 큰 정사각형에서 작은 정사각형으로 가는 방법으로 했다.일단 N &#x3D; k일 때 변의 길이는 4 * k - 3이다.이걸로 board을 초기화할 때나 출력할 때 4 * k - 3을 이용해야 된다.재귀식에 int num &#x3D; 4 * N - 3 + x로 했는데예제를 보고 처음에 0,0에서 시작하면 그다음 정사각형은0 + 2, 0 + 2에서 시작을 하기에 num에 x를 더해줘서길이가 x ~ 4 * N - 3 + x로 4N - 3을 만족하게 해줬다.그다음 이중 for 문에서는 별표를 그려야 하는 곳에는 별표를 그리고빈칸인 곳은 넘어가 주게 해줬다.다 그렸으면 재귀 함수를 또 호.......

컴퓨터 네트워크와 인터넷 2 [내부링크]

큐잉 지연과 패킷 손실큐잉 지연은 패킷마다 다를 수 있다. ex) 10개의 패킷이 동시에 비어 있는 큐에 도착한다면, 첫 패킷은 큐잉 지연을 겪지 않지만 마지막 패킷은 많은 큐잉 지연을 겪는다.큐잉 지연 : 트래픽이 큐에 도착하는 비율, 링크의 전송률, 도착하는 트래픽의 특성, 즉 그 트래픽이 주기에 맞춰서 또는 burst 하게 도착하느냐에 의해 주로 결정a : 패킷이 큐에 도착하는 평균율(패킷 / 초)L : 모든 패킷은 L 비트이때 비트가 큐에 도착하는 평균율은 La 비트/초이다.트래픽 강도, La/R는 큐잉 지연의 정도를 측정하는 데 매우 중요La/R &#62; 1이면, 비트가 큐에 도착하는 평균율이 비트가 큐에서 전송되는 비율을 초과, 이.......

물리학, 화학, 생리/의학, 경제학 2020 노벨상 강의 [내부링크]

맨날 히가시노 게이고 책만 읽다가 상식 좀 키우고 싶어서 도서관에서 괜찮은 책 없나 싶어서 찾아보고 있었는데제목보고 오 딱 이 정도면 괜찮다고 생각해서 읽어본 책,,오늘 다 읽었는데 굉장히 마음에 든다.책의 내용은 책 제목 그대로 2020년 노벨상 4개 분야에 대해서 설명해 주고 노벨의 생애와 노벨상 역사에 대해서 설명해 준다.책 초반에는 노벨의 생애에 대해서 알려주고 노벨상 역사에 대해서 나온다.노벨 경제학상은 원래 노벨상 초반에는 없었는데스웨덴 중앙은행이 설립 300주년을 기념해서 노벨을 기념하기 위해경제학상을 만들었다는 것도 알게 되었다. 이후로 새로운 분야는 만들지 않는다고 한다.초반 이후부터는 노벨.......

고양이 8 [내부링크]

불암산 올라가는 길에 먹이통이 있길래고양이가 있나라고 생각 했는데오호 내려오는 길에 고양이 봤다잘 보면 있다!바로 도망 가려는 고양이계속 울고뭔가 배쪽이 볼록 하길래설마 임신 했나 싶어가지고괜히 내가 계속 사진 찍고 있으면스트레스 받을까봐한 번만 찍고 바로 갔다!

컴퓨터 네트워크와 인터넷 [내부링크]

Protocol- 프로토콜은 둘 이상의 통신 개체 간에 교환되는 메시지 포맷과 순서뿐 아니라, 메시지의 송수신과 다른 이벤트에 따른 행동들을 정의- 통신하는 둘 이상의 원격 개체가 포함된 인터넷에서의 모든 활동은 프로토콜이 제어- 종단 시스템(end system) : 인터넷에 연결되는 컴퓨터와 다른 장치들, host라고도 함호스트는 클라이언트(client : 컴퓨터, 모바일 pc, 스마트폰)와 서버(server : 웹페이지 저장 분배, 비디오 스트리밍, 전자메일 전달)로 구분- ISP(Internet Service Provider) : 이걸 통해서 인터넷에 접속접속 네트워크(Access Network) - Access Network : 종단 시스템을 그 종단 시스템으로부터 다른 먼 거리의 종단 시.......

[백준] 9205번 맥주 마시면서 걸어가기 c++ [내부링크]

옛날에는 정답률 떨어지는 거 무서워서 신중하게 제출했는데요즘은 그냥 막 제출하고 있다.일단 이 문제는 지문에 논란이 좀 있는 것 같다.게시판 가보니 잘 정리된 글 있다. 사실 그거 읽어도 뭐 별 차이를 못 느끼겠다.이 문제는 그래프로 푸는 문제다.참 신기하다 어떻게 그래프로 풀 생각을 하지이렇게 또 하나를 배운다.일단 정점은 나와있는데 간선이 안 나와있다.이 간선은 직접 만들어야 된다.맨해튼 거리를 계산해서 두 점 사이의 거리가 1000 이하이면맥주를 마시면서 이동할 수 있으니 둘이 연결해 주고아니면 연결 시키지 않는다.이렇게 간선을 다 만들어주고 최종 목적지에 도달할 수 있는지 판별하면 된다.dfs, bfs다 상관.......

OSI 7계층과 TCP/IP [내부링크]

2학년 여름방학, 2학기 데이터통신 수업에서도 네트워크를 공부했는데머릿속에 남아있는 게 없네,,네트워크 연구실이니 컴퓨터네트워크 수업은 열심히 정리해야겠다.분산 컴퓨팅process : 실행 중인 프로그램program : 실행 가능한 파일컴퓨터 A의 process와 컴퓨터 B의 process가 통신이 필요할 때process 간의 메시지를 전달하는 것이 protocol이고컴퓨터 A와 컴퓨터 B를 연결해 주는 네트워크를 통해서 protocol끼리연결이 되어있다.OSI 7 계층protocol의 OSI 7 계층이다.프로토콜 사이의 거리가 멀 경우 중개장치를 사용하는데이 중개장치는 1,2,3 계층에만 존재한다.리피터는 1계층의 기능브리지는 1, 2계층 기능라우터는 1,2,3 계층의.......

고양이 7 [내부링크]

기숙사 처음 온 날에엄청 귀여우면서 사람을 피하지 않는고양이를 봤는데 못 찍었네ㅠ아쉬운 대로 자주 보던 고양이 찍었다이 고양이 집이 여긴가보다볼 때마다 저기 있다!옆모습ㅋㅋㅋㅋㅋㅋㅋ앞모습 화난 찐빵처럼 나왔네 (\ _ /) 이런 느낌이네

[CP] Educational Codeforces Round 105 (Rated for Div. 2) [내부링크]

2020년 3월 2일에 열린 코드포스 edu round 1051솔 했다.난이도가 꽤 있었나 1솔만 했는데도등수가 꽤나 높게 나왔고 점수도 많이 올랐다.조금만 더 빨리 풀었으면 더 많이 올랐을텐데 아쉽A번문제를 보고 백준에서 푼 괄호 문제가 생각이 났다.최종 풀이가 이거랑 똑같다고 생각해서ABC를 &#x27;(&#x27;,&#x27;)&#x27;로 바꿔줘야 된다고 생각했다.문제를 계속 고민해 보니결국 처음 시작하는 건 무조건 &#x27;(&#x27;가 나와야 되고마지막에 있는 건 &#x27;)&#x27; 나와야 한다는 걸 알았다.그다음 중간에 있는 건 &#x27;(&#x27;,&#x27;)&#x27; 둘 다 되기에둘 다 구해줘서 괄호 문제랑 똑같이 풀었다.처음 if 문에는 맨 앞과 맨 뒤.......

[백준] 1107번 리모컨 c++ [내부링크]

백준 접으려다가 말았네;음 문제는 브루트포스이긴한데나의 풀이는 굉장히 좋지 못 한 방법이다ㅋㅋㅋㅋㅋㅋㅋㅋ시간 보니 거의 마지막 페이지에 있었다.일단 문제를 풀면서 중요한 게1. 다른 채널로 옮겨서 움직이는 것과 100번에서 움직이는 것 중 어느 게 더 빠른지를 선택해야 되고2. 채널을 옮긴다고 했을 때 N과 같은 자리수 또는 한 자릿수가 더 크거나 작은 걸로 옮길 수도 있다.이걸 종합해서 나는 그냥 중복조합 이용해서 만들 수 있는 모든 수를 다 구해서이 수들 중에서 N 번과의 차이가 가장 작은 수를 구해서 이 수로 옮겨서 이동하는 것과100번에서 옮기는 것 중 어느 게 더 작은지를 구해줬다.다른 사람들 풀이 봐도 어떻.......

[백준] 6064번 카잉 달력 c++ [내부링크]

실버 1에 정답률 20%짜리 문제난 좀 어렵다고 생각한다.문제를 보고 가장 먼저 떠오르는 풀이는 1씩 더해서만족하는 걸 찾는 건데 이렇게 할 경우 O(NM)이 돼서 16억이니 당연히 시간 초과가 난다.그래서 일단 예제에 있는 것만 1씩 증가시키는 방법으로 해서 다 찍어봤다.찍어보면 몇 개 알 수 있게 된다.일단 1. 최대 N과 M의 최소공배수까지만 가능하다. 당연히 문제를 보자마자 이걸 알 수는 없을 거라고 생각한다,,아니면 말고,, 아무튼 찍어보면 최소공배수까지(개수)가 가능하다는 걸 알 수 있다.2. 규칙이 있다. x를 고정시키거나 y를 고정시켜서 보게 되면 알 수 있다.x를 고정시키는 방법으로 해서 풀면 x에 M을 더하고 그 값에.......

플래티넘 [내부링크]

3월 1일부로 solved 시스템이 바뀌어서갑자기 플래티넘으로 바뀌었다ᄏᄏᄏᄏ오예!플래 찍으니 기분 좋네.. 플래 4도 얼마 안 남았다.2020년 4월 23일에 실버 찍고2020년 10월 3일에 골드 찍고2021년 3월 1일에 플래티넘 찍었다.티어 오를 때마다 5~6개월씩 걸리네..너무 공부 안 했네 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ.어려운 문제도 좀 풀고 해야 되는데 흑흑점점하기 귀찮다.!플래티넘 달면 난이도 투표할 수 있어서나도 한 번 해봤다.ㅋㅋㅋㅋㅋㅋ뭔가 우쭐한 느낌이네더 높은 곳으로 가야지!다이아는 언제 찍을까?한 9월!?

정월대보름 [내부링크]

코로나 어서 끝나고제 주변 모두 코로나 안 걸리게 해주세요이번 학기도 열심히 할테니성적 잘 받게 해주세요좋은 사람들 만나게 해주세요제발 기숙사 룸메 잘 걸리게 해주세요

고양이 6 [내부링크]

엄마랑 연어 먹고대학사람한테 택배 보내주고 오는 길에 본 고양이혹시 도망갈까봐 확대해서 미리 찍었다나를 본다저기 앉아서 뭐 하나 했더니벌 구경하고 있는 것 같았다띠용!?내가 가까이가도 안 피하는 것 같아서좀만 더 가까이 가봤는데 뒤로 가버렸다ㅋㅋ옆모습한 번 씻어야 되겠다야옹흰고양이보고 횡단보도 기다리다가고양이 한 마리 반대편에 보이길래가보니까 저번에 봤던 고양이가 또 있었다ㅎㅇ더 다가가니 도망갔다길 건너는 고양이길고양이가 안 도망가게 하는 법을찾아야겠다!

주말 일기 [내부링크]

금요일에 기숙사 갈 준비 마쳤다.27일 토요일에 와서 책상 정리하고!침대도 정리하고!옷장도 정리하고!무사히 기숙사 입주 마무리!3학년 시작!

3월 [내부링크]

당연히 개강이지!방학때 쌓아놓은 후회를 연료 삼아학기 중에 열심히 살 생각 하니벌써 설레네

[백준] 1021번 회전하는 큐 c++ [내부링크]

옛날에도 한 번 풀어보려다가 안 했던 기억이 있는 문제인데단계별로 풀어보기에서 큐, 덱 보니 이것만 풀면 완료돼서 풀어봤다.느낌이 코드포스 A 번에 나올법한 문제이다.나는 문제 그대로 구현했다.최솟값을 구하는 기준은 pop() 하려는 원소의위치를 보고 2번을 하는 것과 3번을 하는 것 중에서어느 것이 최소인지를 구한 다음에그 최솟값만큼 2번 또는 3번을 해주고횟수를 더해주는 방법으로 구했다.문제를 풀면서 계속 런타임 에러가 나고디버깅했을 때 내가 원하는 결괏값이 안 나와서도대체 왜 그런가 했더니처음에 문제 풀 때deque의 사이즈를 for 문 들어가기 전에따로 변수에 할당해 줬는데이게 문제가 됐다.for 문을 들어가.......

[백준] 15686번 치킨 배달 c++ [내부링크]

처음에 시간 초과 난 건 next_permutation 쓴 풀이 당연히 시간 초과 날건 알았는데혹시 몰라서 해봤다.치킨 집이 몇 개 있을 때 M 개를 골라서 최소 거리를 구하는 문제이니모든 M 개를 고르는 경우를 다 해봐야 되니 조합이다. 순열인가.,, 아무튼 이거다.이 문제의 핵심 부분이라고 생각한다. 바로 조합을 구하는 방법을 알아야 이 문제를 풀 수 있다.M 개의 조합을 구했을 때는 각 집마다 치킨집에 대한 최소 거리를 구해야 되기에첫 번째 for 문에 집을 넣어주고 두 번째 for 문에 치킨집을 넣어줘서 비교를 한 다음에다 더해주고 합의 최솟값을 갱신해 준다.

고양이 5 [내부링크]

필봉산 갔다가 먼지 털러 간 곳에서본 고양이며칠 전에 본 적 있는데 그때는 못 찍었는데이번엔 찍었다.먼지 터는 곳 들어갔다가 고양이 있어서 깜짝 놀랐다.바로 핸드폰 꺼냄ㅋㅋㅋㅋ나를 보는 중머리 터는 순간을 찍어버렸다.나 보고 이제 도망갈 준비하는 고양이바깥 보는 중나가는 중뭔가 사람을 막 피하진 않는데 피함계속 따라가봤는데 가면서 내가 뒤에 따라오니쳐다봄가는 중가다가 나 뒤에 있으면 더 빨리 감그렇게 쭉 따라가다가며칠 전에 흰검 고양이 찍은 곳으로 올라가버림자세 잡길래 또 찍어줌화났나..위에서 사람 내려오길래 민망해서 잠깐 핸드폰 하는 척했는데그 사이에 도망가 버림,,고양이 갔길래 집 가려고 하는데갑자기.......

조합 알고리즘 c++ [내부링크]

조합 알고리즘이 생각보다 많이 사용돼서다시 한 번 공부 해보았다.5개중 3개를 뽑는 조합 알고리즘startidx는 조합을 시작하려는 index이다.3개 뽑으니 최대 3까지만 간다 3 4 5가 마지막cnt는 3개가 되는 지를 확인하는 매개변수.check는 숫자를 사용했는지 확인하는 배열이다.사용했으면 넘어가고 사용하지 않았으면 사용해서dfs를 돌려준다.다 사용했으면 check 배열을 false로 바꿔준다.만일 vector를 사용해서 조합을 표현하려고 하면vector에 넣어주고 vector에서 pop해주는 것도 포함해야된다.

순열 알고리즘 c++ [내부링크]

순서가 중요한 순열 알고리즘조합에서는 1 2 3과 1 3 2는 똑같은데순열에서는 다르다.이제야 외웠네 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ중학생 때 배운 것 같은데 맨날 헷갈렸네5개중 3개를 뽑는 순열 알고리즘조합과 다르게 dfs에 cnt만 이용이 된다.조합을 vector로 구현한 거에서 dfs에 있는 for 문을 시작할 때 0부터 시작한다는 거다.조합에서는 이전에 사용했던걸 볼 필요가 없기에 startidx가 필요했는데순열에서는 이전에 사용했던 것도 봐야 되기에 0부터 시작한다.이거 말고는 별 차이 없다.

세그먼트 트리, lazy propagation c++ [내부링크]

세그먼트 트리 개념이 코포에도 자주 나오는 것 같기도 하고빨리 골드에서 플래로 올라가야 되니 경험치 작도 하기 위해서다시 공부한다.segment 트리를 이용해서 구간 합 구하는 방법Lazy propagation구간합을 구할 때 O(logN)으로 업데이트할 수 있는 방법

[백준] 10999번 구간 합 구하기 2 c++ [내부링크]

구간 합 구하기 2 세그먼트트리와 lazy propagation을 사용해야시간 초과에 걸리지 않는다.

[백준] 14567번 선수과목 (Prerequisite) c++ [내부링크]

선수 과목이니 순서가 정해져있고 A &#60; B인 입력만 들어오니위상 정렬을 이용하면 간단하게 풀 수 있는 문제이다.빠른 입출력 적용하니 16ms 나왔다. 별 의미 없긴 한데 2등이다.위상 정렬을 그대로 구현하면 되는데약간 생각해 줘야 될 게 있다.그 수업이 듣게 되는 학기의 최댓값으로학기의 수를 구해줘야 된다.두 번째 예제를 보면만약 4를 듣고 5를 듣는다고 하면 2학기에 들을 수 있다고 생각할 수 있으나5 앞에 1과 2를 들어야 하니 3학기에 들을 수 있다.그래서 이렇게 max 값을 넣어준다.

[백준] 5525번 IOIOI c++ [내부링크]

딱 보고 KMP 같아서 1월에 공부한 KMP 코드 보고 푼 문제확실히 내가 공부하면서 작성한 코드라서 보기가 편하네KMP 적용하면 바로 풀린다.다른 사람들 코드 보니 KMP 말고 O(N) 방법 이용해서 풀기도 하던데나는 KMP로 풀었다.

[백준] 7662번 이중 우선순위 큐 c++ [내부링크]

문제 제목이 이중 우선순위 큐라고 나와있길래13일 전에 풀 때는 우선순위 큐 사용해서 풀었다가모르겠어가지고 포기했는데class 3에 이 문제가 있어서 다시 보니 꼭 우선순위 큐 아니어도알아서 정렬되고 최댓값하고 최솟값만 쉽게 찾을 수 있는 자료구조 사용하면 풀 수 있을 것 같아서다른 자료구조 생각해 보니 multiset이 괜찮을 것 같아서multiset 이용해서 풀었다.set을 할까 하다가 중복된 값이 들어올 수도 있어서 중복된 값을 허용하는 multiset을 사용했다.다른 사람들 풀이 보니 priority_queue나 map 이용해서 풀더라. multiset 이용하면 문제 그대로 구현해 주면 된다.I 일 때는 insert 해주고 D 일 때는 비어있지 않다면 eras.......

[백준] 1992번 쿼드트리 c++ [내부링크]

종이의 개수, 색종이 만들기랑 똑같은 문제이다.똑같이 분할 정복을 이용해서 푼다.일단 처음에 문제가 이해가 안 됐는데왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래로나눈다는 게 무슨 말일까 했는데예제 보면서 살펴보니 4등분 한다는 의미다.십자가 모양으로 나눈다고 생각하면 될 것 같다.먼저 하나라도 다른게 있는지 살펴보기 위해서check 함수를 이용한다.x, y는 탐색을 시작하려는 인덱스이고 n은 탐색을 할 길이(?)이다.이때 하나라도 다르면 false 다 같다면 true이다.solve도 x, y는 탐색을 시작하려는 인덱스 n은 탐색을 할 길이이다.만일 check가 트루이면 다 같다는 의미이기에 그대로 board[x][y]를 출력해 주면 된다.또한.......

[백준] 1389번 케빈 베이컨의 6단계 법칙 c++ [내부링크]

9일 만에 백준 카테고리에 글을 올리네,,코포나 엣코더만 조금 하고 백준은 거의 안 풀었네..아 공부해야 되는데 또 후회만 쌓이는 중클래스를 밀어야겠다는 생각이 들어서 풀어본 문제케빈 베이컨의 6단계 법칙어렸을 때 많이 들어본 얘기인데알고리즘 문제로 풀어볼 줄이야문제가 요구하는 게 가장 작은 케빈 베이컨의 수를 구해야 되는데처음 보면 생각나는 풀이는 사람 한 명당 다 케빈 베이컨의 수를 구해서가장 작은 값을 구하는 거다맞다 이게 정답이다플로이드 알고리즘 돌리면 끝나는 문제이다.이때 정점까지의 거리들을 다 1로 맞추고플로이드 돌리면 된다.여러 명이 나올 경우 가장 작은 사람을 출력하면 되는데어차피 마.......

[백준] 1541번 잃어버린 괄호 c++ [내부링크]

맨날 풀려다가 말았던 문제문제의 아이디어 자체는 어렵지 않다.-를 만나면 다음 -를 만날 때까지 괄호를 쳐주면 된다.그럼 이제 이 괄호를 어떻게 쳐주는가음,, 그니까 수를 어떻게 나누는 가만 구현하면 풀릴 수 있는 문제인데이 구현이 좀 어려운 것 같다.나는 진짜 말 그대로 다 나눠줬다.딱히 좋은 풀이는 아닌 것 같다.다른 사람들 풀이 보니간단하게 몇 줄로 풀던데나는 string 사용해서 다 나눠줬다.간단하게 설명하면istringstream 사용해서 처음에 -로 나눠준다예를 들어10-20+30-40이면 10 ,20+30,40으로 나누게 된다여기서 어차피 두 번째와 세 번째는 마이너스로 시작한다는 걸 알 수 있는데첫 번째는 마이너스로 시작하는지 플.......

[백준] 1780번 종이의 개수 c++ [내부링크]

84ms 나온 건 입출력 빠르게 하는 거 써봤는데 나왔다. 7등 나오던데 당황;ios::syny_with_stdio 없애니 80ms까지 나오네 6등;문제 읽어보면 아 재귀를 써서 분할 정복을 해야 되겠다는 느낌이 드는 문제문제를 풀 때 중요한 포인트1. 하나라도 다른게 있는지는 어떻게 확인할까 &#x3D; 다 같은지 어떻게 확인할까2. 개수를 어떻게 세줘야 할까.먼저 1번에 대해서는 가장 간단한 건 다 확인해 주면 된다.사실 이 방법밖에 없는 것 같다. 자꾸 사람의 시선에서 문제를 풀려고 하니어렵게 생각하는 것 같다. 컴퓨터는 멍청해서 진짜 하나씩 봐줘야 한다.이렇게 하나씩 봐주면 된다.n은 시작하려는 행 m은 시작하려는 열이다, num은 개수이고.......

고양이 3 [내부링크]

필봉산 갔다가 내려오는 길에 본 고양이집 앞에 아스달 연대기랑 더 킹 영원의 군주 촬영장이 있는데거기 옆으로 가다가 발견한 고양이어디 높이 있길래 확대해서 찍었다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ열심히 도망간 고양이어디로 갔나 했더니더킹 세트장에 있었다.아 확대해서 별로 안 이쁘게 나왔네세트장과 고양이 조합 괜찮았는데저 고양이 보고 집 가는 길에먼지털이기 쪽에서 발견한 고양이높은 곳으로 가길래 아 사라졌구나 해서집으로 가고 있는데쓱 옆에 보니 저기 있었네또 위로 올라가길래아 제대로 못 찍겠구나 했는데고양이 울음소리 들리길래다른 고양이인가 싶어서 그쪽으로 가보니저 고양.......

고양이 4 [내부링크]

아빠 친구가 구름산 밑에서추어탕집하는데 식당 앞 쪽 쉼터에 있는고양이 만세기지개 피는 중머리 ㅋㅋㅋ동영상셀카 찍는 중잘 나왔네옆모습셀프 동영상ㅋㅋㅋ뒷모습찐빵처럼 나왔다표정좀 펴줘 ㅋㅋㅋㅋ바보 같네난로 앞에서 자는 중갈게~~

어색 타파 [내부링크]

어색한 자리를 가지 않습니다!

Atcoder brown [내부링크]

아 드디어 나도 gray에서 brown으로 바뀌었다이번 라운드에서 57점 올라서 드디어 색깔 바뀌었다gray는 백준에 걸기 싫고brown은 좀 이뻐서 이거라도 먼저 걸어보자고 생각했는데드디어 걸었네마음에 드네..알고리즘 공부 열심히 해야겠다.!

힘이 되는 말 [내부링크]

하나은행인건비 입금 610000원 잔액 610000원2/21 22:00 ***-******-*****돈이 최고지!

python 오버라이딩 , 패스 [내부링크]

2. passpass 일단은 완성된 것처럼 보이게 만듬아무것도 안하고 넘어감

Python super [내부링크]

1. super처음에는 자식 클래스에서 초기화를 할 때부모 클래스의 이름을 쓰고 __init__을 쓰고 self까지 쓴 다음에 멤버 변수들을 넣어줬는데super를 이용해서도 쓸 수 있다. 부모 클래스 이름을 쓰는 것과의 차이는super는 self를 쓰지 않는다는 거다.다중 상속을 할 때는 super를 조심히 써야 된다.여러 개를 다중 상속받을 때 super를 쓰면맨 앞에 적은 부모 클래스만 사용이 된다.여러 개를 다중 상속받을 때는부모 클래스 이름 쓰는 생성자 초기화 방법을 이용해야 된다.

[CP] Educational Codeforces Round 104 (Rated for Div. 2) [내부링크]

2021년 2월 15일에 열린 코드포스 에듀 1041솔 했다.B번은 맞는 것 같은데 왜 틀렸는지 모르겠다A 번푼 지 꽤 돼서 기억이 잘 안 나나정렬한 다음에 가장 작은 원소보다큰 값들의 개수를 구해주면 된다..B 번이거는 틀린 코드다.10번 시도했는데도 틀렸다ㅋㅋㅋㅋㅋㅋㅋㅋㅋ코포 끝나고 사람들 어떻게 풀었나 글 보면아이디어는 똑같은데 구현을 잘못한 것 같다.짝수이면 만나지 않고홀수이면 주기가 발생해서 그 주기를 찾은 다음에하면 되는데..음 나는 뭐가 틀렸을까틀린 테스트케이스를 보니 딱 한 개 틀렸던데아 뭐지 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ업솔빙 해봐야겠다 다시C번

[CP] Codeforces Round #702 (Div. 3) [내부링크]

2021년 2월 16일에 열린 코드포스 라운드 702 Div 3음 2솔했다나도 다른 사람들처럼 3,4,5,6 올솔좀 해보고 싶네.,,공부를 해야 되나,, 아 귀찮다.그래도 이번 라운드는 제출할 때마다 맞아서 다행이었다.A번일단 문제에서 요구하는 2보다 작은 게 없다면 0을 출력하고2보다 큰 게 있다면 여기서 추가를 해준다.처음에는 이분탐색 개념 이용해서 두 수의 평균을 계속 넣어주는 식으로 했는데이러면 반례가 발생해서 이걸 조금 다르게 생각해 보니작은 수의 2배 값을 계속해서 넣어주면 최솟값을 만들 수 있다는 걸 발견해서2배를 넣어주는 방식으로 코드를 짰다.C번Hack 보니 사람들이 이것만 노렸다.나도 처음에 문제에 조건을 보니 x가 10의.......

[백준] 16400번 소수 화폐 c++ [내부링크]

소수만 담은 배열을 먼저 만들고동전 dp 문제로 풀면된다.동전 1 이런 문제와 똑같은 문제

고양이 1 [내부링크]

그냥 고양이 카테고리를 만들어버림내가 본 고양이들 올려야지

수강신청 성공했다. [내부링크]

8시에 일어나서 pc방 갔는데안 열어서 집에서 했다.저번에 집에서 했는데 실패해서 굉장히 긴장했는데다행히 바로 성공ㅠㅠ8시 59분 59.x에 누르니까 바로 성공했다고 떠서 너무 기뻤다.보니까 수강신청하고 바로 서버터지던데만약 실패했으면 멘탈 터졌을 듯..에브리타임도 사람들 난리나고..원래 인스타에 스토리 올리는데주변에 다 망해버려서 올리기가 좀 그렇네그렇게 24학점 8개 과목 성공했고데이터마이닝은 친구 주고 7개로 해야지정말 성공해서 다행ㅠㅠ얏호!~3학년 기대된다.

고양이 2 [내부링크]

필봉산 갔다가 내려오는 길에우연히 발견한 고양이 2마리

python lambda 식, filter, reduce [내부링크]

1. 람다 표현식2. 람다 표현식 인수로 사용3. 람다 표현식 + 조건부 표현식4. map에 객체를 여러 개 넣기5. filter 사용하기6. reduce 사용하기

python 클로저 [내부링크]

1. global2. nonlocal3. 클로저

python class 클래스 [내부링크]

음 어차피 객체지향은 다 비슷비슷하니사용법만 알면 될 것 같다.생성자를 __init__으로 하고 멤버 함수 만들 때 self를 무조건 붙이는 게 좀 신기하네

Python 상속 다중 상속 [내부링크]

1. 상속c++랑 똑같이 생각하면 됨부모 클래스가 있고 자식 클래스가 있을 때자식 클래스와 부모 클래스에 공통적인 부분은부모 클래스에 다 만들고 자식 클래스에는자식 클래스가 가지는 것만 만들면 된다.상속을 받을 땐class AttackUnit(Unit)처럼 클래스 이름 옆에 () 친 다음에상속받을 클래스 이름 넣으면 된다.이때 자식 클래스의 생성자에서멤버 변수들을 초기화해야 되니부모 클래스의 생성자를 이용해서 초기화한다.이때는 부모 클래스.__init__()를 이용한다.2. 다중 상속c++에 다중 상속 있나 없는 것 같은데python에는 다중 상속이 있다.말 그대로 부모 클래스 여러 개를 다중 상속받을 수 있고상속받은 부모 클래스에 있는.......

백준 링크 [내부링크]

모두 안녕하세요!

[자격증] 컴활 2급 컴퓨터활용능력 2급 실기 독학 합격 및 후기! (+공부 방법) [내부링크]

안녕하세요! 오늘은 컴활2급 실기에 대해서 써보려고 합니다~!저는 3월 12일 날 컴활 2급 실기 시험을 봤...

[자격증] 2019 정보처리기능사 필기 독학 합격 및 후기! (+하반기 시험일정) [내부링크]

안녕하세요 ! 오늘은 국가기술자격증인 정보처리기능사 필기에 대해서 포스팅 해볼게요!!1.시험접수정...

[유럽] 2019.05.25~26 야간페리타고 바리에서 크로아티아로! (1) 올드타운 성벽 카약 러브두브로브니크 [내부링크]

2019.05.21~2019.06.202019.05.24 #바리 에서 #크로아티아크로아티아는 원래 갈 생각 없었다가우리...

[일상] 류리의 자취일기 [내부링크]

2019.08.31 자취 시작!어제 가족들이랑 열심히 짐 풀고 다시 집 가서 오늘(1일)에 자취방 도착!와서 바...

[일상] 류리의 자취일기 (2) [내부링크]

2019.09.02 개강!월요일 1~2교시 스페인어..한 40분 OT 하고 끝남ㅋㅋㅋㅋ근데 문제는 그다음 수...

[일상] 류리의 자취일기 (3) [내부링크]

10일만에 블로그 글 쓰기..너무 오랜만~~~글을 쓰고 싶어도ㅋㅋㅋㅋ 뭔가 딱히 하는게 없으니까ㅠ야식...

[일상] 류리의 자취일기(4) [내부링크]

최근에 봤던 체르노빌 5화 이거 보려고 왓챠 무료 2주 신청함진짜 명작인 듯.. 다큐멘터리 느낌도 나고...

[일상] 류리의 자취일기(5) [내부링크]

총 6시간이 걸린 파이썬과제.. 쉬운거 였는데 자꾸 이상한 짓 해가지고 오래걸렸네 그래도 배운거는 엄청 ...

[일상] 류리의 자취일기(6) [내부링크]

채은이와 혜진이가 학교에 놀러왔다~~멀리서 오느라 수고 했어 친구들셋이서 1차로 학교 앞 지금 보고싶다....

[일상] 류리의 자취일기(7) [내부링크]

¡Hola!오랜만의 포스팅저번 연휴때 집에 가서 먹은거..집에 가면 몸에 좋은 것좀 먹을 줄 알았는데ㅋ...

[일상] 류리의 자취일기(8) [내부링크]

너무 너무 오랜만에 글을 쓰네마지막 글이 10월 10일..시험기간이라서 못 썼네ㅎㅎ근데도 투데이는 100가...

[일상] 류리의 자취일기 (9) [내부링크]

거의 한달만.. 아 진짜 자주해야되는데 계속 귀찮네..ㅋㅋㅋㅋ언제 먹었더라.. 맛있는 쪼매 양이 너무 많...

[일상] 류리의 자취일기(10) [내부링크]

벌써 10번째 자취일기2학기 자취일기는 이게 마지막!12월 5일재영쓰와 먹은 쪼매 남자 둘이 먹기에는 ...

[일상] 2020년 1월 [내부링크]

#include &lt;stdio.h&gt;int main(void){  printf(&quot;Hello!&quot;); return 0;} 오랜만에 블로그 ...

[일상] 류리의 설날일기 [내부링크]

설날 연휴!23일에 아침에 수영하고 바로 집으로오산으로 안가고 상갈역으로가서 아빠랑 누나 기다린다음에 ...

[일상] 너무 심심한 2월 [내부링크]

머리를 최대한 길러서 파마를 했다.. 저번에 가르마펌 했다가 망한 기억이 있어서 이번에도 그러면 어쩌나 ...

[일상] 코로나 빨리 사라졌으면.. [내부링크]

ㅋㅋㅋㅋ코로나야 물러가라.. 너무 무기력한 2월~3월..망할 중국 때문에 이게 무슨 고생이냐 진짜로..새 학...

연예인이라면 [내부링크]

정답은 정해져있죠배우죠

운수 나쁜 날 [내부링크]

오늘 눈뜨니 동아리 불합격 통지 받음아쉽구만..그래서 혼자 빡쳐서 html 공부 시작함

좋아하는 장르 [내부링크]

1. 범죄 영화2. 범죄자가 이기는 영화3. 천재가 나오는 영화(천재가 범죄자면 더 좋음)4. 총과 무기를 들고...

집콕 중 취미 [내부링크]

군대에서 읽은 책 목록 거의 다 소설책이네왜 98권이지 99권인가 100권 채우고 나왔는데..거의 절반정도가 ...

도움주기 [내부링크]

내가 직접적으로 도움을 줄 수 있는 건 umm.. 기부한 거? ㅋㅋㅋㅋ학교에서 학생들이 기부한다길래 나도 만...

[일상] 아산 지중해마을 [내부링크]

출발 하기전 집 앞에서 한 컷ㅋㅋㅋㅋㅋㅋㅋㅋ이건 보정이 너무 심하네;아빠가 며칠동안 가자고 가자고 ...

나만의 라면 [내부링크]

첫 번째 방법- 인터넷에서 본 피씨방라면 끓이는 법1. 물의 정량에서 10~20ml 정도 뺌2. 끓기 전에 스프를 ...

1년 후 [내부링크]

나에게 주어진 장애물들을 잘 극복해서 원하는 것을 이루고 있는 내가 되기를1년 뒤 이 글을 봤을 때 후회...

정주행 하고 싶은 [내부링크]

4월 3일 종이의 집 시즌 4가 나왔습니다.안 보신 분들 시즌 1부터 빨리 정주행하세요.

안 쓰게 되는 물건 [내부링크]

취미용으로 샀는데 비닐도 안 뜯었네..빨리 해야겠네..

추억의 장소 [내부링크]

하얀마을 6단지 주변마지막으로 간 게 2017년 5월 14일인 것 같은데 내 입대가 5월 15일이니하여튼 저 ...

[일상] 첫 자취방 인생 끝 [내부링크]

코로나로 한 학기 사강 되는 바람에 그냥 방 빼버림ㅋㅋㅋ나는 이 방 괜찮은데 부모님이 이참에 빼고 더 좋...

봄 코디 [내부링크]

코로나 때문에 사람 만날 일이 거의 없어서봄옷을 사지도 않았네아..개강했으면 많이 샀을텐데으악 코...

후회되는 일 [내부링크]

후회나의 가장 큰 단점 중 하나가 후회가 많다는 것.그냥 흘려보내면 되는데 계속 후회만 하다가 시간...

나의 단점 [내부링크]

보여주기 싫은걸여기다가 쓰는 것도;..................................단점나는 새로운 사람을...

최애 구독 채널 [내부링크]

나는 TV를 거의 보지 않는다..거의 몇 년 동안 유행하는 드라마 한 번도 본 적이 없음ㅋㅋㅋㅋㅋㅋ내 마...

사회적 거리두기 [내부링크]

아싸라서 그냥 저절로 사회적 거리두기를 하고 있네요.그냥 집에만 계속 있네..근데 완벽한 사회적 거리두...

육아일기 [내부링크]

육아 난이도 : 1 / 5착함 그 자체의 얼굴

새로운 도전 [내부링크]

자격증 나도 한때 많이 땄었지..블로그 시작한 것도 자격증 공부한 거 올리려고 시작한거니까ㅋㅋㅋㅋ공...

요즘 이 드라마 [내부링크]

드라마를 안 봄요즘 핫한 드라마들 하나도 안 봄드라마는 나와 맞지 않는 듯그것보다유미의 세포들 드라...

앱 개발자라면 [내부링크]

게임 만들어보고 싶다.이번 연도 안에 유니티나 언리얼 엔진 이용해서 게임 만들어봐야겠다.아니면코...

나 자신 칭찬해~ [내부링크]

칭찬할 만한 일이라..생활코딩에서 도움을 많이 받아서나도 도움 주고 싶어서 베타테스터 신청해봤는데선정...

실버 [내부링크]

롤에서도 못 찍어본 실버를 여기서..더 높은 곳으로 가야지많이 와주세여

보고 싶은 스포츠 [내부링크]

e-sports는 중단이 되지 않았지..T1 우승해라!

장기자랑 [내부링크]

인생 살아본 결과그냥 눈 딱 감고 춤추면 끝남군대에 있을 때는까마귀 성대모사랑 지코 성대모사했었는데...

오픈 튜토리얼스 회계야학 1일차 자산 부채 자본 수익 비용 손익계산 [내부링크]

뭔가를 배운다는 건 내가 모르는 세계에발을 디딜 수 있다는 것 같다.오늘은 &#x27;회계&#x27;라는 세계...

스트레스 해소 [내부링크]

나는 일상 생활할 때는 스트레스를 별로 안 받는 듯근데 혼자 문제 풀 때는 엄청나게 받기는 함&#x27;아 나...

교수님 [내부링크]

교수님 ppt 읽기만 하시면서과제는 왜이리 많은겁니까보고서 10번 넘게 써야되고발표 동영상도 만들어야되...

네이버 애드포스트 등록 [내부링크]

아싸 나도 애드포스트 했다.나는 지금까지 가만히 있으면 네이버에서 연락 오는 줄.그래서 맨날 다른 사람 ...

구매 자극 [내부링크]

복싱을 계속 다닐까 말까 고민하다가..5월 1일 어제 가서 결제함월요일부터 주 3회 시작!

기분 좋은 일 [내부링크]

이 말로 시작된 나의 1일 1깡좀 늦게 알긴 했는데요즘 내 삶의 활력소..난 진짜 이 댓글보고 웃겨 죽을 ...

백준 100문제 [내부링크]

15740번이 좀 찝찝하긴 하나그래도 백준 100문제졸업하기 전까지 1000문제 넘기가 목표!

헤어스타일 [내부링크]

요즘 고민하고 있는 건데딱 나오네머리를 짧게 할까 생각 중돌격머리를 좀 길게지금 앞머리가 길어서 너무 ...

책 한구절 [내부링크]

기회를 위기로나는 자부심의 어머니다.적에게는 양같이 민에게는 사자같이달면 뱉고 쓰면 삼킨다.배가 ...

스승의날 [내부링크]

고등학교 졸업한 지 5년이네 2015년에 2월에 졸업했으니시간 참 빠르다.점점 기억들이 사라져가고 있어근데...

사치 [내부링크]

나는 돈을 잘 안 쓰기는 함근데 유일하게 돈 잘 안 아끼는게 먹을거임사람이 다 먹고 사려고 하는건데..!!...

최애 간식 [내부링크]

사진이 별로 없네원래 초코 들어간거 잘 안 먹는데복학하고 공부 하다보니 진짜 당 떨어지는게느껴져서 마...

독립 [내부링크]

기숙사 자취 둘 다 해봤는데딱히 해보고 싶다 이런건 없었던 것 같네..나는 부모님한테 경제적으로 독립...

오래된 물건 [내부링크]

쓰레기나 다름 없는데버리기는아깝네ㅋㅋㅋㅋ

이제 진짜 공부한다. [내부링크]

진짜 집에 컴퓨터가 생기니까 피시방 가는 것보다 게임을 훨씬 더 많이 하는 듯하루에 롤 5판은 기본인 듯....

[일상] 오랜만에 [내부링크]

정말 오랜만에 일상 글을 쓰고정말 오랜만에 친구들.. 사람들을 만났다한 3시까지 오산 독서실에 있다가...

나만의 레시피 [내부링크]

자세히보기의 코드는 왜 뜨는거냐이렇게 되지 않을까

영화 명대사 [내부링크]

정말 인생 영화 아닌 이상 영화 여러 번 못 보겠음ㅋㅋㅋㅋ그래도 최근에 본 영화 중 가장 기억에 남는 ...

과거의 나 [내부링크]

공부하지 말고 제발좀 놀아라

공부하기 싫다. [내부링크]

아직 시험 1개 과제 2개 남았는데하기 싫다~~~~~~~~~30일 날 온라인 시험 봐야 되는데 흑이 과목은 뭘 공...

새로운 도전 [내부링크]

아니 1월 1일 날 새해 인사한 게 엊그제 같은데 벌써 반년.. 시간 너무 빠르다..헬스나 다시 해볼까 생...

[일상] 1학기 종강이다 [내부링크]

시험을 보기 위해 오산을 떠나 까치산역으로도저히 오산에서 공릉까지 통학을 할 수는 없기에..까치산에서 ...

[유럽] 체코 프라하 프라하성 마리오네트 팁투어 [내부링크]

여기 어디더라 #프라하성 내부인 것 같은데 #국제학생증 있으면 할인받을 수 있음유럽은 정말 성당천지 ...

[BOJ] 1926번 그림 C++ [내부링크]

방학때 알고리즘 공부 해야징백준 1926번 그림 BFS 이용바킹독 BFS에서 배움약간 이해가 좀 덜 되기...

[백준] 1697번 숨바꼭질 c++ [내부링크]

백준 1697번 숨바꼭질문제보통 BFS는 2차원배열 문제가 많은데이거는 1차원배열 문제2차원일 때...

[백준] 1012번 유기농 배추 c++ [내부링크]

백준 1012번 유기농 배추 문제1926번 그림 문제랑 거의 똑같은 문제그림은 그림의 개수랑 그림의 최대 ...

[백준] 2667번 단지번호붙이기 c++ [내부링크]

백준 2667번 단지 번호 붙이기 문제1926번 그림 문제랑 매우 비슷한 문제이것 또한 BFS로 풀며 BFS...

[백준] 7562번 나이트의 이동 c++ [내부링크]

백준 7562번 나이트의 이동 c++BFS를 이용해서 푸는 문제항상 dx[4] ,dy[4]만 이용하다가이 문제는 dx[8...

[백준] 10026번 적록색약 c++ [내부링크]

백준 10026번 적록색약 문제이 문제는 정답률이 58% 정도 되는 문제정답률 보고 쉽겠지 하고 풀었는데거듭...

[백준] 2468번 안전 영역 c++ [내부링크]

백준 2468번 안전 영역 문제계속 BFS로 푸는 중 DFS는 아직 안 배워서 BFS부터 확실히 하고 DF...

[백준] 13549번 숨바꼭질 3 c++ [내부링크]

백준 13549번 숨바꼭질 3 c++찾아보니 엄밀히 따지면 BFS 문제는 아님계속 BFS 문제만 풀다 보니 아...

[백준] 5014번 스타트링크 c++ [내부링크]

백준 5014번 스타트링크 c++이것 또한 BFS 문제1차원 배열에서의 BFS를 생각해 주면 됨그리고 U와 ...

[백준] 7569번 토마토 c++ [내부링크]

백준 7569번 토마토 c++ BFS 문제7576번 토마토 문제랑 유사한 문제7576번은 2차원 배열이고7569번은 ...

[백준] 2583번 영역 구하기 c++ [내부링크]

백준 2583번 영역 구하기 c++ BFS정답률이 50%가 넘는 어렵지 않은 문제.근데 잘못 생각하면 어려울 ...

[백준] 2573번 빙산 c++ [내부링크]

백준 2573번 빙산 c++ BFS 문제BFS 문제이기는 한데빙산이 녹는 것까지 생각해 줘야 돼서 쉽지 않았...

오늘도 [내부링크]

오늘도 열심히 알고리즘 문제를 풀었지만3개 도전해서 1개밖에 못 풀었네너무 어렵다~~~하루에 5개 정도...

[일상] 홍대 나들이 [내부링크]

이 시국에 맞지 않는 포스팅이지만;7월 8일에 홍대 가서 하룻밤 자고 9일 날 집에 옴마스크 열심히 끼...

[리뷰] 홍대 cozzzy 게스트 하우스 코지 게스트 하우스 [내부링크]

#홍대Cozzzy게스트하우스하루 밤 이용했던 코지게스트하우스 리뷰!홍대입구 1번 출구에서 도보로 10분 정...

재택근무 [내부링크]

재택근무는 아니지만 사이버 강의를 들어보니처음에는 공부도 잘 안되고 그랬는데적응하니 훨씬 더 나은 듯...

[일상] 순식간에 사라져 버린 7월 [내부링크]

저번에 블로그 포스팅에 헬스 할까 고민한 글 올린 적 있는데고민하다가 집 앞 단지에 있는 헬스장으로 감...

다시, 여행 [내부링크]

유럽 한 달 여행하면서 제일 많이 들은 소리 중 하나가스페인하고 포르투갈이 제일 좋았다는 소리였음.....

소개팅 [내부링크]

소개팅을 한 번도 안 해봤어요한 번은 해보고 싶네

밸런스 게임 [내부링크]

월 500 버는 직장인백수는 못 하겠더라앞으로 나아가는 느낌이 없음차라리 500 받으면서 일하고하루 이틀 ...

처서 [내부링크]

코로나 걱정좀 그만 했으면 좋겠네

액세서리 [내부링크]

최고의 액세서리..!

타임랩스 [내부링크]

이때 좀 길게 찍을껄또 가고 싶긴한데유럽인들 코로나 대응하는거 보면정 다 떨어짐;;

수강신청 [내부링크]

8월 19일에 우선수강신청으로 4과목 : 자료구조, 데이터통신, 디지털 논리, 프로그래밍입문(2) 성공사실 데...

대화의 기술 [내부링크]

대화를 할 친구가 없어요

너의 이름은 [내부링크]

나라를 위해서 일하는 성스러운 법관이 되라하지만 나는 이과다!이름값 못 하는구만법 률 대신 비율 률...

어렸을 때 기억 [내부링크]

나름 기억력에 대해서 자신감이 있는데점점 어렸을 때의 기억이 사라지네뭔가 딱히 임팩트가 없어서 그런...

집콕 챌린지! [내부링크]

기숙사에서 공부만 해야될 듯할 게 없다

듣고 싶은 말 [내부링크]

&quot;익명은 확실히 보장해드릴 테니 너무 걱정 안 하셔도 됩니다. 로또 1등에 당첨된 소감에 대해서 한 ...

초능력자 [내부링크]

후회와 아쉬움이 많은 과거이긴 하나그렇게 지나갔기 때문에시간 되돌리기는 별로 필요 없고시간 멈추기는 ...

작심삼일 [내부링크]

작심을 안 하면 되는 것 같음 &quot;아!! 오늘부터 꾸준히 이걸 정말 열~~~심~~~히~~~ 할 거야~~~~&quot;이...

[백준] 1158번 요세푸스 문제 C++ [내부링크]

오랜만에 백준연결리스트를 활용하는 대표적인 문제이다.다만 C++에서 제공하는 STL인 list는 양방향...

[백준] 2644번 촌수계산 c++ [내부링크]

BFS 이용해서 거리 구하는 문제그래프 개념을 알아야지만 풀 수 있는 문제이다.알고리즘 공부는 넘 어렵...

[백준] 4796번 캠핑 c++ [내부링크]

그리디 알고리즘을 이용하는 문제손으로 하나씩 써보면 쉽게 풀 수 있을 듯일단 문제 조건이 L &lt; ...

[백준] 11047번 동전 0 c++ [내부링크]

그리디 알고리즘을 대표하는 동전 문제별로 어려운 문제는 아닌데 실버1이네동전들이 다 배수 관계이기에...

여행 가고 싶다 [내부링크]

학과 이벤트에 옛날 여행 사진 공유 있길래참여하려고 사진 보는데 또 가고 싶네

[백준] 1931번 회의실배정 c++ [내부링크]

대표적인 그리디 알고리즘 문제회의 시간에 상관없이가장 빨리 끝나는 회의를 계속 선택하면 된다.그리디...

[백준] 11399번 ATM c++ [내부링크]

#그리디알고리즘그리디알고리즘 분류에 있길래 풀어봄정답률도 63%로 쉬운 문제이다.인출 시간이 작은 순...

[백준] 1920번 수 찾기 [내부링크]

이분탐색을 활용해서 푸는 문제그냥 이분탐색만 할 줄 알면 푸는 문제이다.

[백준] 15657번 N과 M(8) [내부링크]

백트래킹 문제원래 안 올리려다가 챌린지 하고 있어서 올림참고로 코드는 https://blog.encrypted.gg/945?c...

[백준] 6603번 로또 [내부링크]

백트래킹 문제N과 M을 풀었으면 쉽게 풀 수 있다.아니 그냥 똑같은 문제이다

[백준] 1463번 1로 만들기 [내부링크]

DP를 활용하는 문제코드는 kks227 블로그에서 배웠습니당

[백준] 17413번 단어 뒤집기 2 [내부링크]

스택을 활용 하는 문제단어 뒤집기에 조금만 코드 추가하면 된다.&#x27;&lt;&#x27;를 만났을 때도 문자열을...

[백준] 10799번 쇠막대기 [내부링크]

스택을 활용하는 문제.&#x27;)&#x27;가 주어졌을 때 레이저인지 막대기인지를 구별하면 됨스택의 사이즈를 ...

[백준] 1929번 소수 구하기 [내부링크]

에라토스테네스의 체를 이용해서 소수를 구하는 법이다.다른 방법으로 하면 시간초과가 나서 문제를 풀 수...

백준 200문제 [내부링크]

백준 200문제다나의 200번째 문제는에라토스테네스의 체를 이용해서 푸는 골드바흐 추측 문제5월 3일에 1...

[백준] 1935번 후위 표기식 2 c++ [내부링크]

스택을 활용하는 문제후위 표기식이란 연산자가 피연산자 뒤에 위치하는 방법이다.5번이나 틀려서 굉장히 ...

램프의 요정 [내부링크]

한 달마다 내가 원하는 능력을 가질 수 있게 해주세요

[백준] 9613번 GCD합 c++ [내부링크]

이중 for문을 이용해서 GCD를 계속 구해주면 된다.그리고 sum을 int로 해주면 범위가 초과 되기에long l...

[백준] 9095번 1,2,3 더하기 [내부링크]

정답률 60%인 쉬운 DP 문제인데문제를 잘못 이해해서 계속 틀렸다.책상에 샷건 너무 많이 쳤네진짜 이런 ...

히가시노 게이고 책 다 읽기 (+21년 1월 14일 추가) [내부링크]

히가시노 게이고 책 다 읽기가 목표2020년 9월 29일 기준으로 총 67개의 작품을 읽었네군대에서 작성한 거...

[백준] 11052번 카드 구매하기 c++ [내부링크]

다이나믹 프로그래밍 문제첫 번째 풀이는 내가 혼자 생각해서 푼 방식12ms가 걸리는 좀 비효율적인 방식모...

[백준] 10844번 쉬운 계단 수 [내부링크]

d[i][j] i는 길이가 i인 수 j는 마지막에 사용한 수j가 0이거나 9이면 j-1 , j+1이 되지 않으므로 예외 처...

개천절 [내부링크]

홍익인간하니 생각나는데어렸을 때는 나뿐만 아니라 친구들도얼굴 빨간 애들 보면 홍익인간이라고 했음왜 ...

골드 [내부링크]

골드다4월 23일에 실버5 찍었으니거의 6개월 걸렸네 ㅋㅋㅋ더 높은 곳으로 가야지!

[백준] 16481번 원 전문가 진우 c++ [내부링크]

백준을 둘러보다가 한 초등학생이 쓴 글을 보고 발견한 문제초등학생이 플레 문제를 풀길래 &#x27;와 이 초...

[백준] 11053번 : 가장 긴 증가하는 부분 수열 [내부링크]

arr은 숫자를 담을 배열d는 길이를 담을 배열시간 복잡도 O(N^2) 방법을 이용해서말 그대로 수열을 다 만...

딜레마 [내부링크]

선형대수학 시험이 20일로 갑자기 잡히고팀플 2개를 해야 되는 상황이어서어쩔 수 없이 알고리즘 공부를 ...

중수다 중수 [내부링크]

휴 20개 채택돼서 중수다 중수!

내일이면 시험 끝이다 [내부링크]

내일 저녁 7시에 시험 보면 드디어 끝이다.끝이다.~~~~~

[백준] 14002번 가장 긴 증가하는 부분 수열4 c++ [내부링크]

시험기간에 잠시 접어뒀던 알고리즘 다시 시작다이나믹 프로그래밍 공부 하던거 이어서이 문제는 가장 긴 ...

[백준] 2225번 합분해 c++ [내부링크]

DP를 이용한 문제 나머지 연산을 한 번 더 안 해줘서 계속 틀렸다.사실 확신을 가지고 푼 문제는 아니고....

[백준] 1309번 동물원 c++ [내부링크]

DP를 활용하는 문제첫 번째 우리에 사자를 놓았을 때 그다음에는 두 번째 우리에 놓던가, 놓지 않던가두 ...

[백준] 9465번 스티커 c++ [내부링크]

아아.. 풀다가 화병나서 죽을 뻔한 문제아무리 봐도 점화식이 맞는 것 같은데 자꾸 틀렸습니다라고 떠서너...

[일상] 시험이 끝났다 [내부링크]

휴 드디어는 아니고 28일 8시에 시험이 끝났다.열심히 놀고 오랜만에 일상 포스팅4개월만에 쓰는거네..그 ...

[백준] 2156번 포도주 시식 c++ [내부링크]

다이나믹 프로그래밍을 활용하는 문제점화식을 잘 세우면 쉽게 풀리고점화식을 잘 못 세우면 나처럼 계속 ...

[백준] 11441번 합 구하기 [내부링크]

부분합, 구간합 개념을 알아야지 풀 수 있는 문제이 문제는 구간합이다.구간합을 모르면 이중 for 문을 ...

[백준] 1932번 정수 삼각형 c++ [내부링크]

다이나믹 프로그래밍을 이용하는 문제점화식 세우는 게 많이 부족하다고 느낀 문제다d[i][j]는 (1,1)부터 (...

외로울 때 [내부링크]

정말 많이 느끼는 감정인데핸드폰으로 재밌는거 보면서맛있는거 먹는게 최고인 듯아니면 운동을 하거나

[백준] 10989번 수 정렬하기 3 c++ [내부링크]

정답률이 20%대로 굉장히 낮은 문제나도 6달 전에 푼 코드 보면 정렬하기 문제여서바로 STL sort 사용...

만 원의 행복 [내부링크]

어차피 요즘 돈을 거의 안 씀아침, 점심 기숙사에서 먹고저녁은 학교 뒤에 있는김밥친구라면 가서돈가스에 ...

[백준] 11725번 트리의 부모 찾기 [내부링크]

트리와 관련된 기본적인 문제트리의 특성상 부모의 자식노드만 큐에 넣고 BFS 돌리면 된다.

프로필 사진 [내부링크]

요즘 하고 있는 프로필 사진너무 귀엽다옆태가 진짜 정말 너무 완전 very 귀엽게 나옴ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ...

12월의 기적 [내부링크]

2020년 새해 인사한 게 엊그제 같은데벌써 12월이네.. 시간이 너무 빠르다.기적이라..시험 잘 보게 해주...

애드포스트 수익 기준이 뭘까? [내부링크]

도대체 어떤 기준으로 수익이 들어오는 건지 알 수가 없네12월 1일에는 왜 5806원이 들어왔을까11월 총 수...

최고의 조언 [내부링크]

이 또한 지나가리라.

13월 [내부링크]

오..12월까지 학기 딱하고13월에는 열심히 놀면 되겠네그리고 1월부터 다시 열심히 공부하고근데 사실 13월...

[2020 마이블로그 리포트] 한 눈에 보는 올해 내 블로그 데이터! [내부링크]

오호 15년도에 이 블로그를 만들었구나진짜 쿠팡이랑 지게차 글이 블로그 먹여 살리네 ㅋㅋㅋ글도 178개 썼...

데이트 코스 [내부링크]

? 선 쎄게 넘네

빨리 끝나라 [내부링크]

2시~2시 50분 프로그래밍입문(2) 마지막 시험 보고끝나자마자 1시간정도 자료구조 레포트 작성하면종강이다...

백준 300문제 [내부링크]

2020년 12월 18일 백준 300문제사실 더 빨리 찍을 수 있었는데시험기간 때문에 백준 안 하느라 이제야 ...

크리스마스 계획 [내부링크]

어제부터 선 계속 넘네없어요 없어집에서 그냥 핸드폰하고 TV 보고 가족들이랑 밥 먹고 놀 거예요!

[백준] 2108번 통계학 c++ [내부링크]

한 달 넘게 안 올렸네썩 좋은 코드는 아닌 것 같아서 별로 올리고 싶지 않았으나300번째 문제이고 챌린지 ...

코드 [내부링크]

c++ 부분수열 구하기 코드 백트래킹순열 생성 vector 이용순열 생성 배열 이용비트연산STL보통 정렬 &lt...

[백준] 11723번 집합 c++ [내부링크]

집합 문제여서 set으로 구현하면 되겠지 싶었으나메모리 제한이 8MB여서 나중에 풀어보자라고 생각했던 ...

[백준] 9375번 패션왕 신해빈 c++ [내부링크]

map 활용해서 푼 문제문제가 요구하는 아이디어만 바로 캐치할 수 있으면 쉽게 풀 수 있는 문제문제를 잘 ...

[백준] 4358번 생태학 c++ [내부링크]

map 활용해서 푼 문제처음에 제출해서 맞은 코드while(1)을 통해서 getline을 받고 if 문 써서 멈춰주고for...

[백준] 2075번 N번째 큰 수 c++ [내부링크]

메모리제한이 12MB인 문제첫 번째 코드는 1500*1500개면 12MB보다 작지 않을까 싶어서해봤다가 바로 메...

[일상] 2학기 종강 [내부링크]

12월 17일 2학기 종강나도 드디어 3학년이다.!시험기간에 많이 나왔던 테스트나는 거베라다.!심지어 티없이...

[백준] 10164번 격자상의 경로 c++ [내부링크]

썩 좋은 코드는 아니나배운 게 많아서 올려본다.정말 ps에서 수학의 중요성을 뼈저리게 느낀 문제이다.이...

기억 남는 하루 [내부링크]

음이번 연도는 딱히 임팩트 있던 하루가 없네재밌게 좀 살아야겠다

[백준] 2252번 줄 세우기 c++ [내부링크]

트리의 위상정렬 문제골드 2 문제이긴 하나위상정렬만 알면 쉽게 풀 수 있는 문제.사이클이 없는 단방...

[백준] 1005번 ACM Craft c++ [내부링크]

백준 1005번대의 초기 문제위상정렬과 DP 이용하는 문제건물을 짓는 순서가 나와있으니 위상정렬을 통...

소원을 말해봐 [내부링크]

지니내일이 성적 나오는 날인데성적 잘 나오게 해주세요!

[백준] 11404번 플로이드 c++ [내부링크]

모든 정점들 간의 최단거리를 구하는 플로이드 알고리즘삼중 for 문이 플로이드 알고리즘의 핵심이다.k 번 ...

[백준] 1753번 최단경로 c++ [내부링크]

다익스트라 알고리즘을 활용하는 문제first는 cost이고 second는 index를 vector에 담고거리를 저장하기 ...

[백준] 11779번 최소비용 구하기 2 c++ [내부링크]

최소비용 문제랑 거의 똑같으나경로를 복원하는 문제이전 경로가 어디인 지 저장하기 위해서 pre 배열을 ...

Thank you 블로그씨 [내부링크]

감사합니다 블로그씨^^제 소원 잘 들어 주셨어요

[유럽] 프랑스 파리 에펠탑 [내부링크]

첫 번째 날날씨가 좋았던 스위스에서 프랑스 파리로..기차 타고 이동했다.프랑스 갈 때도 날씨가 흐릿흐...

히가시노 게이고 하쿠바산장 살인사건 [내부링크]

몇 개월 동안 책 안 읽다가기숙사 들어와서 심심해서 다시 책을 읽고 있다.요즘 읽는 책은 유발 하라리의 ...

오픈 튜토리얼스 회계야학 2일차 복식부기 [내부링크]

살다 살다 내가 복식부기에 대해서 배울 줄이야물론 정말 정말 기초 수준의 복식부기이기는 한데그래도 아...

오픈 튜토리얼스 회계야학 3일차 원장, 시산표, 손익계산서, 재무상태표 [내부링크]

오픈 튜토리얼스 회계야학 3일차즉 마지막약 1시간 정도 투자해서 정말 정말 정말 정말 간단한 회계를 배웠...

[백준] 18111번 마인크래프트 c++ [내부링크]

문제를 풀면서 느낀 점모르겠으면 그냥 브루트 포스 갈기는 게 최고임어떤 높이를 기준으로 잡을지를 고민하는데그냥 모든 높이에 대해서 계산을 해보면 된다.3중 for 문을 이용해서처음 for 문에는 높이 0~256 해주고나머지 이중 for 문에서는 board를 탐색하면서처음 for 문에서 정한 높이로 만들 때 얼마나 걸리는지를찾아준다.curheight가 음수이면 더 높은 높이로 만들어야 되니inven에 추가를 해준다 이때 curhegiht가 음수이니 -&#x3D;를 해줘서 양수를 더해주게 만들고curheight가 양수이면 더 낮은 높이로 만들어야 되니제거를 해야 되니 remove에 개수를 추가해 준다.그다음 제거한 양에다가 원래 가지고 있던 블록 개수를 합한.......

블로그의 매력 [내부링크]

백준 문제로 1일 1포스팅 하려고 했지만 실패블로그의 매력은 사진을 많이 올리고 글 읽기가 편하다는 걸까인스타에 게시글을 잘 안 올리는 이유가 사진을 한 번에 10개밖에 못 올리고 글 읽기도 힘들어서인데 여긴 사진 많이 올릴 수도 있고 글도 읽기 편하고 많이 쓸 수 있어서 좋고이상한 허세충이 없어서 좋음인스타는 너무너무 많다..글고 시간 지나서 다시 보면 추억 되새길 수 있어서 좋음ㅋㅋㅋㅋ

[CP] AtCoder Regular Contest 112 [내부링크]

2021년 2월 13일 9시에 열린 Atcoder regular contest 112원래는 하기도 귀찮고 누나랑 아빠랑 퍼즐 맞추고 있어서참여 안 하려다가 그래도 한 문제만 풀어보자 하고 참여한 콘테스트다행히 결심한 대로 한 문제만 바로 풀고 탈주했다.A 번L~R 사이의 수들 중에서 두 개를 골라 뺀 수가 L ~ R 사이에 있는지 확인하는 문제문제 예제에서 힌트를 얻었다.일단 L과 R 사이에서 가장 작은 수는 L이다이 수를 가지고 뺀다고 했을 때 조건을 만족하는 가장 작은 수는2L이다 이것보다 작으면 조건을 만족할 수 없다.즉 A - B에서 A를 만족하는 가장 작은 수는 2L이고만족하는 가장 큰 수는 R이다즉 2L ~ R까지만 보면 된다.여기서 문제 예제를.......

[백준] 2565번 전깃줄 c++ [내부링크]

LIS를 활용하는 문제라고 한다.처음에는 왜 LIS인 줄 몰랐다. 왜 dp일까 싶기도 하고근데 결국 생각해 보니 LIS이다.전깃줄이 꼬이지 않으려면1. A의 번호가 증가할 때 B의 번호가 증가해야 된다.2. A의 번호가 증가할 때 B의 번호가 감소해야 된다.처음에 이렇게 생각을 해서1. 증가하는 부분 수열2. 감소하는 부분 수열두 개 구해서 둘 중의 최댓값을 N에서 빼줬다.근데 계속 틀려서 잘 생각해 보니2. A의 번호가 증가할 때 B의 번호가 감소해야 된다.이걸 잘못 생각했다.이건 그냥 조건에 위배된다.내가 생각한 건 A의 번호가 감소할수록 B의 번호가 감소한다였는데사실 1번이랑 똑같은 생각이다.2번처럼 생각했다.아무튼 그냥 A의.......

10년 뒤 [내부링크]

아 공부 안 한지 꽤 됐네10년 뒤..35살이나 36살이네..딱히 생각을 안 해보았네,,성공 하는 사람들은 뭐 10년 뒤까지 생각 한다는데음,, 역시 다르네ㅋㅋㅋㅋㅋㅋㅋ만약 박사까지 한다면 그때 박사가 끝나려나?그럼 너무 끔찍한데ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ그냥 살아있고가정만 이루었기를,,그때는 솔로가 아니고 아빠이길..

[백준] 1996번 프린터 큐 [내부링크]

통신 학회 갔다 온 뒤로 백준 귀찮아서 잘 안풀었다ㅋㅋㅋㅋㅋㅋㅋㅋㅋpython 연습하느라 몇 문제 풀긴 했는데 그런건 블로그에 안 올리고 싶어서..이 문제는 옛날부터 계속 풀려다가 모르겠어가지고 안 풀었는데오늘 class 2 보니 이거랑 마인크래프트 2개 남아서 한 번 풀어봤는데의외로 쉽게 풀려서 좀 당황했다.알고리즘 공부하기 너무 귀찮다!class나 밀어야지..자기보다 큰 우선순위가 있는지 없는지 곧이곧대로 구현해 줬다.

[백준] 14501번 퇴사 c++ [내부링크]

N이 작아서 꼭 dp는 아니여도 여러 방향으로 풀 수 있을 듯처음부터 생각한게 아니라 뒷부분에서 부터 생각을 해줬다.int nxt &#x3D; i + vp[i].first 를 한 다음에if문을 통해서 N + 1이 넘어가면 dp[i] &#x3D; dp[i+1]을 해준다.N이 아니라 N+1인 이유는 N일때도 하루가 걸리면 할 수 있기 때문이다.dp[i] &#x3D; dp[i+1]로 해서 그 전까지 값으로 최댓값을 만들어준다.만일 else문이면그날에 일을 해서 벌 수 있는 돈과 일을 하지 않고 그 전날까지의 번 돈의 최댓값을 비교해준다.

[CP] AtCoder Beginner Contest 190 [내부링크]

AtCoder Beginner Contest 1902021년 1월 30일에 열린 Atcoder Beginner Contest 190A, B, D 풀어서 3솔 했다.1800등대까지 됐는데 C를 못 풀어서떨어지고 떨어져서 3400등대로 떨어졌다ㅋㅋㅋD번등차수열의 합 이용해서 푸는 풀이이건 백준에 똑같은 문제 있다.a 시작하려는 구간의 숫자k개 구간의 개수k가 정수 이기에 마지막 식의 우변이 나누어 떨어져야한다.음수 구간까지 보기에 2배 해주면 된다.C번E번F번

python 문법 [내부링크]

3학년 과목들 보니 python 써야 되는 일이 많아서 다시 공부해야 된다.1학년 때 정말 열심히 python 했는데 하도 안 쓰니다 날아가 버렸네그래도 다른 언어 많이 공부해서편하긴 하다1일차https://dojang.io/mod/page/view.php?id&#x3D;21892일차3일차262728. 배열이용해서 2차원 리스트 만들기2차원 배열은 아니 배열 다루는건 c++이 훨씬 편한 것 같네29. 한 줄로 2차원 리스트 만들기30. 2차원 배열도 똑같이 copy 사용하면 됨31 . 문자열 바꾸기replace를 통해서 바꾸기 가능32. 문자 바꾸기 이런 것도 있네 진짜 신기ㅋㅋㅋstr.maketrans를 이용해서 a는 1로 e는 2 i는 3 o 는 4 u는 5로 바꿈33. 문자열 나누기34. join 이.......

[백준] 5430 AC c++ [내부링크]

옛날에 시도했다가 뭐가 안돼서 못 풀었던 문제인데오늘 다시 풀었다.이 글을 쓰는 이유는 문제를 보면 입력이[1,2,3,4,5] 이렇게 들어오는데처음에 한 자릿수만 들어오는 줄 알아서for 문 돌려서 1~9 사이면 넣어주는 식으로 했다가testcase 보니 두 자릿수도 들어오고 더 자리수 많은 것도 들어와서어떻게 나누지 할 까 하다가오늘 때마침 python 공부했어가지고python에서는 문자열을 split으로 나눠줄 수 있는데c++은 이게 없나 싶어서 찾아보니 있어서그걸로 풀었다.먼저 &#x27;,&#x27;로 나눠주기 위해서 [,] 빼고 다시 만들어준 다음에위에 있는 코드처럼 하면,를 기준으로 나눠진다.그다음은 R일 때 배열을 진짜 뒤집는 게 아니라반.......

[백준] 14889번 스타트와 링크 c++ [내부링크]

모든 경우의 수를 다 봐야되니백트래킹 활용하는 문제먼저 k &#x3D;&#x3D; N + 1일때가 처음 조건이다즉 N개를 다 사용했는지 보기 위해서다그다음 각각의 v1, v2 벡터에 (N/2)개씩 들어 갔는지 확인해준다.들어갔다면 두개씩 짝지어서 총합들을 구해준다.이때 이중 for문을 구해준다. 3명이 있다고 하면 1 2 3(1,2) (1,3) (2,3) 이렇게 해야되니 이중 for문만 써도 된다.값을 구했으면 min 값을 구해준다.백트래킹 할 때 가장 어려운게 넣었다가 빼는걸 어떻게 하는 지인 것 같다.v1 벡터에 먼저 넣고 그다음 수로돌리고 해서 k &#x3D;&#x3D; N + 1까지 한다.여기까지와서 size가 (N/2)가 안되면 pop을 해주고이걸 v2에 넣고 pop하면.......

[백준] 2188번 축사 배정 c++ [내부링크]

네트워크플로우 공부하면서 나온 문제인데이분매칭으로 푸는게 더 나을 것 같아서이분매칭으로 풀었다.뭐 네트워크플로우에서 용량이 1이면 이분매칭으로 풀 수 있으니문제가 요구하는 건 소를 축사에 배정하여 가장 많이 연결되는 경우를 찾는최대 매칭 문제이분매칭은 코드가 정말 간단하다.DFS를 활용한다.먼저 dfs를 통해서 연결된 모든 노드에 대해서 들어갈 수 있는지 시도한다.if(checkp[nxt]) continue;를 통해서 이미 처리한 노드는 건너뛴다.비어있거나 즉 탐색하지 않았거나 dfs(d[nxt]) 더 들어갈 공간이 있는 경우처리를 해준다. 원래 있던 정점이 다른 정점으로 연결될 수 있는 경우이다.정점의 개수만큼 dfs를 해주면 되.......

[백준] 11376번 열혈강호2 c++ [내부링크]

이분매칭 알면 바로 풀 수 있는 문제인데열혈강호1과 다른건 한 사람이 2개의 일을 할 수 있다는 것이다.한 사람당 두 번의 이분매칭을 돌려주면 된다.

백준 500문제 [내부링크]

백준 400문제를 1월 17일에 달성했으니100문제 푸는 데 딱 2주 걸렸다.원래는 별생각 없었는데오늘 날짜를 보니 1월 31일이어서1월 되기 전에 500문제는 찍는 게 나을 것 같다고 생각해서브론즈 조금 풀고 500번째 문제로는 실버 풀었다.나의 500번째 문제는 14501번 dp 문제인 퇴사이다.dp 이용해서 풀었다. 풀이는 백준 게시판에 적어야겠다.종강하고 난 뒤에 꾸준히 알고리즘 공부를 하려고 노력하고 있다.생각보다 쉽지 않다.일단 집에서 공부를 잘 안 하는 타입이기도 하고알고리즘 자체란 게 참.. 어렵다 보니 공부하기가 쉽지 않다.최근에는 머리에 한계(?)를 느껴서 더더욱 하기가 싫었다.원래는 방학 때 kks227 블로그나 여러.......

[백준] 1212번 8진수 2진수 c++ [내부링크]

이 문제는 쉽게 봤다가 큰코다친 문제내가 얼마나 부족한 지 제대로 깨우쳐준 문제이다ㅋㅋㅋㅋ일단 처음에 시간초과가 뜨길래 도대체 왜 뜰까?아무리 봐도 시간초과 뜰 게 없는 것 같아서 찾아보니평상시에도 문자열 문제 나오면 for 문안에 size() 넣어줘서이번에도 하던 대로 해줬는데 이거 때문에도 시간 초과가 날 수도 있다는 걸 처음 알았다.즉 매 반복마다 size()를 재줘서 시간초과가 날 수도 있다와저기는 strlen이긴 한데 size()도 똑같을 것 같다s &#x3D; &#x27;a&#x27; + s는 O(1)에 해주는 줄 알았는데 O(len(s))가 걸린다는 것도 알게 되었다.음.. 내가 모르는 게 참 많네,, 더 열심히 해야지

[백준] 14888번 연산자 끼워넣기 c++ [내부링크]

문제가 요구하는 건 백트래킹인데백트래킹이 약해서 다른 방법으로 풀었다.백트래킹으로 다시 한번 풀어봐야겠다.next_permutation이랑 deque 이용해서 풀었다.어차피 백트래킹도 모든 경우의 수를 다 탐색해서 푸는 방법이니next_permutation으로 해서 나올 수 있는 연산자의 경우의 수 다 찾아서그 경우마다 값을 다 찾아줬다.중요한 게 연산자의 모든 경우의 수가 다 나올 수 있도록정렬을 해줘야 된다.그다음 deque에서 앞에 2개 꺼내서연산자에 맞게 계산한 다음에다시 앞에다가 넣어준다.그럼 다 마치면 한 개만 남는데이거랑 결과를 비교해서 계속 갱신해 주면 된다.이때 문제에도 나와있는데 음수에서 양수로 나눌 때는음수를.......

[백준] 1373번 2진수 8진수 c++ [내부링크]

계속 시간 초과 당한 문제8진수와 2진수 풀었을 때 배운 거 이용해서size도 변수로 받아주고 뒤에 다가 더해서 O(1)로 해줬는데계속 시간 초과가 났다.아무리 봐도 시간 초과가 날 코드가 아닌데도저히 모르겠어가지고 백준에 질문 올렸지만..아무도 답을 안 해주고..구글에 검색해보니 뭔 느낌인 지 알 것 같은데내가 푼 방식으로 맞고 싶어서 계속 도전해봤다.처음에는 unordered_map도 이용해서 풀었다가 굳이 그럴 필요는 없을 것 같아서안 사용했다.아무튼 시간 초과 마지막에 사용한 코드가이거였다.number &#x3D; number + &#x27;4&#x27; 이렇게 해줬다.설마 이렇게 쓴 게 문제가 되나 싶어서이렇게 number +&#x3D; &#x27;4&#x2.......

코드포스 레이팅 예측 사이트 [내부링크]

들어가서 select contest 선택하고참여한 contest 고른 다음에자기 아이디 찾으면 레이팅 변화 예상량 볼 수 있다.들어가서 download extension에서 자주 사용하는 인터넷클릭해서 들어가면 스토어에서 다운로드할 수 있다.다운로드하면 맨 마지막 문제 옆에 예측량이 뜬다.

[CP] Codeforces Round #698 (Div. 2) [내부링크]

2021년 1월 28일에 열린 Div21솔 했다.A번솔직히 이거 문제 자체도 이해를 잘 못 했다.그냥 예제 보고 때려 맞쳤다.For any color, numbers on balls will form a strictly increasing sequence if he keeps balls with this chosen color and discards all other balls.문제에 이 말이 뭔 말인지 정확히 이해가 안됐다. 지금도 모르겠네문제 보고 같은 수가 연속으로 나오면 수가 증가하고아니면 원래 있는 수를 사용하는 걸로 이해했다.결국 배열에서 가장 많이 나오는 수의 개수가 몇 개 인지 세주면 된다.코드포스 에디토리얼내가 생각한게 맞긴 맞았다.B번 Nezzar and Lucky Number수가 주어졌을 때 럭키넘버가 포함된 수의 합.......

[CP] Educational Codeforces Round 103 (Rated for Div. 2) [내부링크]

2021년 1월 29일에 열린 Educational Codeforces이건 1솔 했다가Hack 당해서 0솔로 됐다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋA번 K-divisible Sum문제는 배열이 주어질 때 배열의 원소의 합을 k로 나누게 만들면서가장 큰 원소가 최소가 되게 만드는 거다testcase 보면1 5인데배열의 원소의 개수 1 k &#x3D; 5로 나눠지게 만들면서 가장 큰 원소가 최소가 되게근까 k &#x3D; 5 이니 원소는 5,10,15,20,... 다 되는데 가장 작은 원소이므로5가 답이다처음에 계속 틀렸던 코드이다.이게 문제가 돼서 틀렸다. 별 생각없이 k가 업데이트 된 값으로계속 더 한다는 생각을 못 했다.그래서 바꿔준 코드가 이거다위에 코드로 하면 처음에 통과.......

KMP 알고리즘 [내부링크]

문자열접두사(prefix) : 문자열 S의 0번 글자부터 a 번 글자까지로 구성된 부분 문자열S &#x3D; &quot;k...

[백준] 3184번 양 c++ [내부링크]

그래프 탐색 문제DFS나 BFS를 사용하면 된다.BFS를 이용해서 풀었다.먼저 이중 for 문 이용해서BFS 시작점이 될 수 있는 곳에서 시작한다.벽이 아니면서 가지 않는 곳이다.이때 양이나 늑대가 있는 곳에서도 시작이 가능하다.그렇기에 처음에 양이나 늑대가 있는 곳에서 시작을 하면양의 수 또는 늑대 수를 한 개 증가시키고BFS를 시작한다.BFS는 다른 문제랑 비슷하게벽이나 간 곳이면 갈 수 없고양이나 늑대면 수를 증가시켜준다.while 문이 끝나면 늑대와 양의 수를 비교해 줘서더 많은 쪽만 더해주는 식으로 했다.그냥 DFS나 BFS 할 줄 알면 쉬운 문제이다.맨날 BFS만 사용하는데 이제 DFS 사용해서도 풀어봐야겠다.

[백준] 2470번 두 용액 c++ [내부링크]

투 포인터를 활용하는 문제분명히 더 좋은 코드가 있을 것 같은데그냥 생각나는 대로 풀었다.일단 정렬을 해줘야지만 투 포인터를 사용할 수 있다.그리고 경우가 여러 가지면 한 가지만 출력해도 되니딱 0이 되는 순간 그냥 코드를 끝내게 만들었고0이 되는 경우가 없다면계속 업데이트해주는 형식으로 했다.

[백준] 4196번 도미노 c++ [내부링크]

SCC(Strongly Connected Component) 대표 문제SCC로 나눈 다음에그 SCC들을 기준으로indegree의 개수가 0인 SCC의 개수를 세어주면 맞을 수 있는 문제이다.indegree가 있는지 없는지 확인해 주기 위해서는 아래와 같이 하면 된다.정점이 1 ~ N까지 있으므로 첫 번째 for 문에서 1~N까지 돌고두 번째 for 문에서는 정점 i와 연결된 모든 점들을 찾을 수 있게 한다.그다음 sn 배열 즉 정점 i가 속한 SCC와 정점 j가 속한 SCC를 비교해 줘서만일 같다면 둘이 같은 SCC에 속한 거고다르면 다른 SCC에 속한다.i -&#62; j로 가기에 j의 SCC indegree를 한 개 증가시켜준다.

[CP] Codeforces Round #697 (Div 3) [내부링크]

Codeforces랑 Atcoder 있을 때마다 참여 하기는 하는데맨날 문제만 풀고 끝나서 딱히 공부가 안된다.이번 라운드부터는 업솔빙이란걸 해봐야겠다.이번 693은 div 3여서 좀 풀만 했는데처음에 30분 정도 지연되고 채점은 되지도 않아서많이 답답 했는데 결국 unrated..이 공지 뜨자마자 그냥 나왔다 ㅋㅋㅋ어차피 2솔 밖에 못 했다.A번이건 내가 푼 코드어차피 홀수면 당연히 YES 나오고짝수일 때가 문제인데 계속 2씩 나눠주는 방식으로 했다.2로 나눠서 홀수가 된다면 그 수는 홀수인 약수를 가지고 있기에만일 홀수가 있기만 하면 되니 홀수가 되는 순간 break 해준다.k &#x3D; true로 바꿔서 홀수가 있다고 하고a &#x3D;&#x3D; 1일때.......

[백준] 12015번 : 가장 긴 증가하는 부분 수열 2 c++ [내부링크]

가장 긴 증가하는 부분 수열 문제 시리즈N이 백만 개이기에 O(N^2)은 안되고이분탐색을 활용해서 푸는 문제이다.들어오려는 원소가벡터의 back보다 크다면 넣어주고작거나 같다면이분 탐색을 통해서 위치를 찾아주고그걸로 업데이트해준다.왜 이 방법이 될까?일단 들어오려는 원소가 dp.back()보다 크다면 당연히 증가하는 부분 수열이기에 넣는 게 맞다.그럼 작거나 같은 걸 생각해 보면먼저 수열이 10 20 30 25 27 50이라고 하면10 20 30까지는 증가하는 수열이니 집어넣으면 된다.그다음 25가 나오면 30보다 작으니lower_bound를 통해서 위치를 찾아준다. lower_bound는 찾으려는 값이 있으면 그 값을 반환하고 없으면크거나 같은 원소.......

인생 첫 논문 [내부링크]

인생 첫 논문을 써봤다.물론 말이 논문이지약간 잡지 느낌,, 그래도 좋은 경험이 된 것 같다.방학 때 이거라도 해서 다행논문을 쓴 이유는 한국통신학회 동계종합학술발표회에 참여하기 위해서(나는 네트워크, 통신 쪽 연구실에 있다)21일교수님한테 21일에 연락이 와서 이걸 참여하려면 논문을 26일까지 제출해야 된다고 하셨다.26일까지 제출이니 23일까지 다 만들어서 피드백 받고 다시 만들어야 했다.그러니 논문 작성하는데 2일 밖에 시간이 없었다.어려운 논문이 아니니 많이 써 본 사람은 2일이면 충분할 텐데한 번도 안 해보고 맨날 놀다가 갑자기 집중해야 되는 일 해야되니ㅋㅋㅋㅋ좀 어려웠다. 그래도 열의에 불타서 나름 열심히.......

[백준] 14442번 벽 부수고 이동하기 2 c++ [내부링크]

2206번 벽 부수고 이동하기를잘 이해하고 풀었으면바로 풀 수 있는 문제삼차원 배열이용해서그전까지 몇 개의 벽을 없앴는지를기록하면 된다.벽을 부순 개수가 K보다 작을 때만queue에 넣으면 된다.

[백준] 1761번 정점들의 거리 c++ [내부링크]

LCA 문제들 풀고 있는 중몇 개 더 풀었는데많이 올려봤자 챌린지 개수 한 개 밖에 안 올라가니이걸 대표로 올려야징LCA인데 BFS할 때 정점들 간의 거리까지 계산만 해주면 쉽게 풀 수 있는 문제이다d2 배열에 루트 노드인 1번으로부터 얼마나 떨어져 있는지를 넣어준다.그다음 while 문에서 d2[nxt] &#x3D; d2[cur] + v[cur][i].second로 거리를 더해준다.나머지는 LCA 그대로 사용하면 된다.두 정점들 사이의 거리는한 정점으로부터 공통 조상까지의 거리 구하고다른 한 정점도 공통 조상까지의 거리 구해서둘이 더해주면 된다.

[백준] 1707 이분 그래프 c++ [내부링크]

어려운 문제는 아닌데 자꾸 너무 어렵게 생각해서계속 틀렸다.문제에서 중요하다고 생각하는 건1. 색깔을 어떻게 칠한 건지2. 인접한 곳의 색깔이 같은 지 어떻게 확인하는지3. 문제를 읽고 당연히 모든 정점들이 다 이어져 있는 건 줄 알았는데 찾아보니 그건 아니었다.이것 때문에 좀 많이 틀렸다.코드 자체는 어렵지 않다.dfs를 돌릴 때 색깔이 칠해져 있지 않는 곳으로 시작하면 된다.왜냐 여러 개의 그래프가 있을 수 있기 때문이다.여기서 num은 색깔이다 0이면 안 칠해진 거 1, -1이면 칠해진 거for 문 돌면서 칠해지지 않은 것부터 시작하면 된다.색깔을 칠해주기 위해서 dfs나 bfs를 이용하면 된다.dfs에 익숙하지 않아서 dfs도 사용.......

[백준] 5427번 불 c++ [내부링크]

탈출이나 불! 이랑 똑같은 문제BFS를 두 번 돌리면 문제를 풀 수 있다.먼저 상근이가 불이 있는 곳으로 갈 수 없기 때문에불을 먼저 BFS 돌려준다.이건 일반적인 BFS랑 똑같다.그다음 상근이가 움직여야 되기에상근이를 BFS를 돌려줘야 된다.보통 BFS에서 이런 조건이면 갈 수 없다는 조건이어서 continue를 많이 쓰나여기서는 이 조건을 만족하면 탈출을 하는 것이기 때문에최단 거리를 출력한다이때 sangdist[nx][ny] &#x3D; sangdist[cur.first][cur.seond] + 1;로 해버리면 nx, ny에 음수 인덱스가 들어갈 수 있어서바로 출력한다.상근이 BFS의 if 문을 보면1. 벽과 불이면 갈 수 없고2. 이미 간 곳은 갈 수 없고3. 3번이 중요한데 불보다.......

[백준] 1484번 다이어트 c++ [내부링크]

투포인터를 활용하는 문제일단 vector에 제곱수들을 다 넣은 다음에투포인터를 활용해서가능한 몸무게 들을 다 찾아준다.e를 기준으로 해서 e가 vector의 끝에 도달했을 때 break 해주고v[e] - v[s] 즉 현재 몸무게의 제곱 - 기억 몸무게 제곱이 G 보다 크면 s를 한 칸 증가시켜준다왜냐 어차피 vector는 오름차순 정렬이기 때문에 v[e] - v[s]가 g보다 크니까 더 값을 빼줘야 된다는 의미니까s++를 증가시킨다v[e] - v[s] &#60; G 면 e++를 해줘서 더 큰 값이 나올 수 있게 한다.v[e] - v[s] &#x3D;&#x3D; G 면 vv에 루트 값을 넣어주고 s를 한 칸 증가시킨다e를 한 칸 증가시켜도 상관없다.어차피 어느 걸 증가시켜도 G보다 작거나 커지게 나오.......

[유럽] 프랑스 파리 몽마르트언덕, 사랑해벽, 개선문, 샹젤리제거리, 콩고르드광장, 루브르박물관 [내부링크]

두 번째 날아침에 일어났는데진짜 귀신이 내 기를 다 빨아간 느낌이 들었다.뭔 몸에 힘이 하나도 없었다.밥...

[백준] 11438번 LCA 2 c++ [내부링크]

11437번 LCA 문제랑 똑같은 문제첫 번째 시간 초과는그냥 11437번 코드 그대로 돌려봤다ㅋㅋㅋ두 번째는 높이의 최댓값을 넉넉히 20으로 잡았는데런타임에러 뜨길래 그냥 25로 잡았다20은 왜 안되지?먼저 BFS는 각 노드의 첫 번째 부모 노도와 해당 노드의 깊이를 구해준다.즉 그냥 바로 위에 있는 노드가 무엇인지 와 해당 노드의 깊이를 구해주는 코드getP 함수는 특정 노드의 2^j 번째 부모를 찾는 함수이다.먼저 i 번도 드의 2^j -1번째 부모 노드를 확인하고만약 0이 아니라면 i 번 노드의 2^j 번째 부모는, i 번 노드의 2 ^(j - 1) 번째 부모 노드의 2 j - 1 번째 부모 노드란 걸 이용해서 구한다.분할 정복 느낌그다음은 LCA를 구하는 코.......

백준 400문제 [내부링크]

백준 300문제를 12월 18일에 달성했으니100문제 푸는데 딱 한 달 걸렸네종강하고 난 뒤에 백준을 꾸준히 풀고 있기는 한데풀면서 고민했던 것 중 하나가흔히 말하는 랭작을 할까 말 까였다.고민하다가 일단은 하지 말고 내 공부 하면서공부 관련된 거 위주로 풀고 적당한 문제들 위주로 풀자라고 생각했다.그러다가 한 380 후반 정도 됐을 때빨리 400문제 찍고 싶어서오늘 브론즈5 몇 개 골라서 빨리 풀었다ㅋㅋㅋText로만으로도 충분한 문제들이나간단한 거 위주로 풀었다.브론즈 5 문제 풀면서 이 문제가 제일 재밌었다ㅋㅋㅋㅋ아무튼 항상 적어왔던 대로나의 400번째 문제는1987번 알파벳 문제이다.처음에는 BFS로 그냥 풀면 되겠.......

[백준] 2206번 벽 부수고 이동하기 c++ [내부링크]

문제 풀다가 문제 이름 그대로 따라 할 뻔했다.스트레스 너무 많이 받은 문제아직도 이해할 수 없다.간선의 가중치가 없으니BFS를 이용해서 푸는 문제 보통의 BFS 최단거리 문제와 다르게3차원 배열을 사용해서이전에 벽을 부쉈는지 안 부셨는지를 체크해 줘야 된다.벽이 아니면 그전에 벽을 부쉈는지 안 부셨는지 상관없기에그대로 거리를 1 더해준다.만약 가다가 벽을 만나면그전에 벽을 부쉈는지 안 부셨는지가 중요하기에전에 벽을 부수지 않았다면 앞으로 갈 수 있기에거리를 1 더해주고 벽을 부쉈다고 체크해 주고큐에 넣어준다.내가 이해가 안되는건처음에 auto &#38;cur &#x3D; q.front로 받은 다음에cur.x , cur.y , cur.z를 이용.......

[백준] 11437번 LCA c++ [내부링크]

제목 그대로 LCA 최소 공통 조상 문제LCA를 구현하는 방법 중가장 간단한 방법인 BFS를 이용해서 문제를 풀었다.먼저 BFS를 이용해서 트리의 깊이를 구해준다.그다음 첫 번째 while 문에서 트리의 높이를 계속 맞춰주고다음에 공통 조상이 될 때까지 while 문을 실행시킨다.

[백준] 1766 문제집 c++ [내부링크]

문제를 푸는 순서가 정해져 있으니 위상 정렬과 관련된 문제.이 문제에서 가장 중요한 조건이 가장 쉬운 문제부터 푼 다이다.이걸 어떻게 구현해야 될까 고민을 했다.보통 위상 정렬은 queue를 많이 사용해서이번에도 계속 queue를 사용했는데결국 가장 쉬운 문제부터 풀려면 번호가 낮은 것부터 풀어야 되니queue 대신에 priority_queue를 이용하면 된다.그럼 쉬운 것부터 풀 수 있고2번째 조건도 만족할 수 있다.

[백준] 1431번 시리얼 번호 c++ [내부링크]

이 문제는 까먹지 않기 위해서처음에 값들을 더 해줄 때이렇게 해줘서 틀렸다.&#x27;1&#x27;에 (int)로 하면 아스키코드로 바뀌는데 1로 그냥 바뀐다고 별생각 없이 풀어버렸다.char를 int형으로 바꾸려면 &#x27;0&#x27;을 빼주자.문제 자체는 문제에 있는 조건 그대로 구현하기만 하면 된다.사실 아직도 true false return 해주는 게 좀 헷갈리기는 하네.

[백준] 2512번 예산 c++ [내부링크]

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ이 문제는 실버 3이라서 딱히 안 적으려고 했는데9번이나 틀리는 바람에 스트레스를 너무 많이 받아서 쓴다아무리 봐도 틀린 게 없는데 자꾸 틀렸다고 나와서답도 찾아보고 게시판 가서 반례도 다 찾아봤는데도대체 뭐가 문제인지 계속 찾아보니알고 보니 sort를 하고 R에 v[N-1]을 줘야 하는데 Rd에 v[N-1]을 주고 sort를 해버렸다..sort 순서 때문에 9번이나 틀렸다..이분 탐색할 때는 꼭 sort부터 하자..아 분명히 먼저 했다고 생각했는데틀렸으면 소스코드 전체를 다 보자!

주니어다 [내부링크]

드디어 주니어 달성했다언제 100일까지 하지??9월 15일부터 시작했는데이제야 30일이면꽤 걸리겠네ㅋㅋㅋ

[백준] 11505 구간 곱 구하기 c++ [내부링크]

많은 시행착오를 거쳐서 푼 문제문제가 원하는 아이디어가 뭔지는 알겠는데구현을 못 하겠어가지고 계속 틀렸다세그먼트 트리를 제대로 이해하지 못해서 그런 것 같기는 한데좀 더 자세하게 공부해봐야겠다.모듈러 연산을 해줘야 되니 init, query, update, 최종 결과에다가 다 모듈러 연산을 해줘야 된다여기서 가장 중요하다고 생각한 부분은 update에서이 부분이다.내가 처음 공부할 때는 루트 노드부터 시작해서 update를 해주는 방향으로 했는데이럴 경우 구간 합 같은 건 문제가 발생하지 않는데곱 같은 경우는 문제가 발생할 수 있다.왜냐면 전 단계에서 0으로 update를 해버리는 순간그다음 단계에서는 루트 노드부터 update 해버.......

c++ 다운캐스팅 [내부링크]

c++ 다운캐스팅부모클래스를 자식클래스로 형변환 시키는 다운캐스팅main문에서이렇게 선언하면 오류가...

c++ 업캐스팅 [내부링크]

c++ 업캐스팅상속에서의 형변환이다.자식클래스가 부모클래스로 묵시적으로 형변환 되는 게 업캐스팅이다....

c++ 생성자, 소멸자 생성 순서 가상소멸자 [내부링크]

c++ 생성자, 소멸자 생성 순서 및 가상소멸자핫도그를 만드는 클래스를 만들자재료인 Bread class, Ham...

c++ 순수가상함수와 추상 클래스 [내부링크]

C++ 순수 가상함수와 추상 클래스먼저 Man, Woman 클래스를 생성하자둘은 공통의 멤버 변수를 가지고같...

c++ 오버라이딩, 정적 바인딩, 동적 바인딩, 가상 함수 [내부링크]

c++ 오버라이딩, 정적 바인딩, 동적 바인딩오버라이딩 : 부모 클래스가 가지고 있던 메서드를 자식 클래...

c++ 상속 [내부링크]

상속이 필요한 이유를 알아보자Dog과 Cat 클래스를 만들자Dog과 Cat은 공통적으로멤버변수로 age, sex,...

c++ 상속과 접근 제어자(public, protected, private) [내부링크]

객체 지향 언어의 가장 큰 특징 중 하나는 상속이다.부모 클래스에 있는 멤버 변수, 멤버 함수 등을 자식 ...

c++ 명시적 형변환과 묵시적 형변환 [내부링크]

C++에서의 형변환은 두 가지명시적 형변환(explicit conversion) 변환할 형을 명시적으로 언급해 줘서 형...

c++ 깊은 복사와 얕은 복사3 [내부링크]

깊은 복사는 객체를 복사할 때마다 새로 동적할당을 하게 되며strcpy를 이용해서 일일이 다 복사해야 된다....

c++ 깊은 복사와 얕은 복사 2 [내부링크]

깊은 복사와 얕은 복사에 있던 코드이다.이 코드도 언뜻 보면 잘 작동하는 것 같지만한 가지 문제점(?)이 ...

c++ 깊은 복사 얕은 복사 [내부링크]

깊은 복사와 얕은 복사동적할당을 이용해서 a와 b를 선언해 준다.단순하게 a가 가리키는 값이 b가 가리키는...

c++ 동적할당 [내부링크]

정적할당일반적인 변수의 선언이 정적할당이다.어떠한 함수에 속한 변수는 그 함수가 시작할 때 메모리에 ...

c++ 연산자 오버로딩 [내부링크]

연산자 오버로딩두 개의 좌표를 담는 Class가 있다고 하자.class 내에 있는 함수들의 선언과 정의를 분...

[백준] 2003번 수들의 합 2 c++ [내부링크]

N이 최대 만 개이고 시간이 0.5초이기에 O(N^2) 방법은 안된다.투포인터를 활용하면 O(N) 방법으로 활용이 가능하다.배열의 시작을 가리키는 s와 e를 선언한 다음에s &#x3D; start , e &#x3D; end부분합이 M보다 더 크면 s가 가리키는 곳을 빼준 다음에 s를 한 칸 증가end가 끝을 가리키면 break부분합이 M보다 더 작으면 e가 가리키는 곳을 더 해주고 e를 증가시켜준다마지막 if 문은 M이 되는 부분 합의 개수를 구해야 하기에sum &#x3D;&#x3D; M이 되면 result를 한 개 증가시켜준다.

[백준] 2042번 구간 합 구하기 c++ [내부링크]

세그먼트 트리의 대표적인 문제이다.참 세그먼트 트리 공부하는 데 오래 걸렸네kks227분 블로그로 공부했는데내용은 이해는 되나 소스코드를 모르겠어가지고좀 찾아보다가우리 학교에 구름 에듀에서 강의하시는 분 있어서그분 생각나서 그분 강의 보니딱 원하는 게 있어서 이 분 걸로 다시 공부해서소스코드도 이해하고 세그먼트 트리도 이해했다.처음에 맞고 주석 좀 지우고 자료형 좀 계속 바꾸느라몇 번 더 시도했다.근데 왜 c++에는 class가 있는데 struct를 쓰는 걸까?많은 사람들이 struct를 쓰는 것 같은데 왜일까뭐 별 차이는 없다만,,틀렸습니다를 3번 받은 이유는이 부분에서 se.seq[b] &#x3D; c를 계속 안 해줘서 틀렸다.저절로.......

[백준] 10868번 최솟값 c++ [내부링크]

세그먼트 트리를 이용하면 풀 수 있는 문제구간 합 구하기와 다른 건update를 하는 조건이 없다는 거다초기화를 할 때 min 값으로 tree[node] 값에 넣어주면 되고query를 진행할 때도만일 s와 e가 i, j에 포함되지 않는다면구간 합 구하기에서는 0으로 해줬지만여기서는 최솟값을 구해야 되니 최솟값을 구할 수 있게 가장 큰 수 1e9를 리턴하게 해준다포함이 되면 그대로 tree[node]를 return 하면 되고그 외에는 min 값을 return 하면 된다.

[유럽] 영국 세븐시스터즈, 영국에서 한국으로 [내부링크]

영국 마지막 날세 번째 날에는 뭐 한 거지?아무것도 안 했나너무 헷갈린다세븐시스터즈가 마지막인 건 확실한데ㅋㅋㅋㅠㅠ세븐시스터즈 거의 다 와서 마지막 버스 기다리는 중근데 런던에서 출발할 때 사진이 하나도 없네세븐시스터즈는 런던에 있는 건 아니고런던 근교에 있는 곳이기에 기차와 버스를 합쳐서 3~4시간 타고 가야 된다.런던에서 기차를 타고 도착한 곳에서 어디로 간 다음에ㅋㅋㅋ다시 버스를 타는 곳을 겨우 찾은 다음에버스를 타고 위에 사진 있는 곳까지 옴일단 4명이서 출발하면 할인받을 수 있기에 무조건 4명 맞추길나는 유랑 카페에 런던 알람 맞춰봤는데 뭔 글 뜨자마자 보니세븐시스터즈 가실 분 3명이에요~ 이래.......

[리뷰] 앱코 NCORE NC30, 노트북 거치대 받침대 후기 [내부링크]

앉아서 노트북 하는 시간이 많고..거북목도 고쳐야 될 것 같아서산 노트북 거치대네이버에 노트북 거치대 치니바로 나오길래 몇 개 보니 이게 제일 이쁘고 가격도 괜찮아서 이걸로 골랐다.나는 여기서 샀다.박스에 잘 포장돼서 배송 옵니다.노트북을 놓는 곳팬도 있고팬 세기 조절할 수 있는 버튼도 3개 있고일단 가장 중요한 높이이걸 사기전에 좀 찾아봤는데높이가 생각보다 높지 않아서 좀 고민했다가너무 높으면 키보드칠 때 불편할 것 같고팬을 포기하기는 아까워서 일단 질러봤다.물티슈 놓고 찍어보고갑 티슈 놓고 찍어봤다.리뷰 봤는데 대략적인 높이밖에 없어서확실하게 높이를 알 수 있게 갑 티슈 사용했다.참고로 높이 조절은 1.......

[자격증] 1종 대형면허 기능시험 후기(+2종보통 , 오산, 동탄 삼성운전전문학원) [내부링크]

학교를 종강하고 난 뒤에집으로 가니아빠가 할 거 없으면면허가 2종 보통이니이번 방학 때 1종 대형 따라고 해서알겠다 하고 1종 대형 면허 준비했다.삼성운전전문학원#삼성운전전문학원정말 운이 좋게도집에서 걸어서 15~20분 거리에운전면허 학원이 있어서 거기로 갔다.진짜 집 앞에 운전면허 학원 있는 게 정말 좋다.접수 하는 곳에서 접수하면 됩니다.건물 2층가격은 사진 참고 하면 됩니다.준비물1. 돈2. 운전경력증명서(경찰서 or 민원 24시 홈페이지)3. 여권사진4. 1종신체검사서5. 운전면허증(1종보통 or 2종보통)2,3,4번은 접수하고 난 뒤에 시험 보기 전까지만 준비하면 됩니다.당연한 거지만 시험 보고 연습하려면 꽤 많은 돈이.......

비트마스크 [내부링크]

정수의 이진수 표현을 자료 구조로 쓰는 기법원소추가원소를 추가할 때는 OR(|)연산을 이용한다.비트연산자는 우선순위가 낮기에 꼭 괄호를 이용한다.이미 원소가 있다면 그 값은 변하지 않고원소가 없다면 그 값은 0에서 1로 변한다.원소 포함 여부 확인원소의 포함여부는 AND(&#38;)연산자를 이용한다.&#38; 연산의 결과값은 0 또는 1 &#60;&#60; p이다.1, true가 반환되는게 아니다.원소 삭제~연산자는 NOT 연산을 수행~(1&#60;&#60;p)는 해당 비트만 꺼지고 나머지는 다 켜진 숫자 즉 11101111 이런 느낌0과 &#38;연산을 수행하니 있으면 꺼지고 없으면 0 그대로 있게 된다.원소의 토글원소의 토글은 해당 비트가 켜져 있으면 끄고 꺼져.......

비트마스크 에라토스테네스의 체 [내부링크]

에라토스테네스의 체종만북에 비트마스크를 이용한 에라토스테네스의 체 내용이 있는데조금 이해하기 힘들어서 많이 찾아봤다.먼저 비트마스크를 이용한 에라토스테네스의 체 코드이다.보통 에라토스테네스의 체는 bool 값 배열 이용해서 사용한다.비트마스크를 이용하면 메모리 사용량을 8분의 1로 줄일 수 있다.먼저 MAX_N 개의 원소를 갖는 불린 값 배열을 위에 코드로 대체. sieve는 &#x27;체&#x27;라는 뜻이다.이 배열은 약 MAX_N / 8 bytes만 써서 MAX_N 개의 원소를 갖는 불린 값 배열 구현배열의 크기를 8로 나눠주는 이유는 unsigned char 배열이 8비트이기에 나눠줘야 한다.즉 한 개의 수가 8개의 수를 check 할 수 있다.이 말.......

부분 합(partial sum) [내부링크]

부분 합부분 합 : 배열의 각 위치에 대해 배열의 시작부터 현재 위치까지의 원소의 합을 구해 둔 배열scores[] : N 명의 시험 성적을 내림차순으로 정렬해 둔 배열psum[] : scores[]의 부분 합psum을 미리 계산해 놓으면 scores[]의 특정 구간의 합을 O(1)에 구할 수 있다.즉 scores[a]부터 scores[b]까지의 합은 psum[b] - psum[a-1]이다.중요한 게 psum[a-1]이다.간혹 psum[a]로 착각하는 경우가 많다.구현 코드위에 있는 걸 그대로 만들었을 때 나오는 코드부분 합을 구하는 함수까지 추가하면int rangesum 함수를 보면 if(a&#x3D;&#x3D;0)이 있다.기본적으로 psum[a-1]이기에 a가 0 일 때 psum[-1]이 되므로음수를 처리하지 않기 위.......

[백준] 2941번 크로아티아 알파벳 c++ [내부링크]

크로아티아 알파벳을 변환시킨 문자에 대해서 하나하나씩 봐주면 된다.

[유럽] 마지막 여행지 영국 런던 [내부링크]

첫째 날나의 오랜 숙원이었던 유럽 포스팅 마지막나의 마지막 유럽 여행지는 런던이다.원래는 런던에서 시작해서 이탈리아에서 끝내려다가크로아티아 빨리 가고 싶어서 이탈리아부터 시작해서영국으로 끝냈다.지금 생각해 보면 정말 좋은 선택이탈리아에서의 기억이 너무 좋았다.만약 영국부터 시작했으면 많이 후회했을 듯근데 보통 영국부터 많이 시작하더라.그래서 여행지에서 마음 맞는 사람 있으면 같이 내려(?) 가기도 하고.하튼 영국은 나랑 좀 안 맞았다.이 안 맞는 곳에서 4박 5일있어야 돼서 좀 힘들었다프랑스 파리에서 영국 런던으로 유로 스타 타고 넘어갔다.해저터널 지나서.. 와이파이나 데이터가 안 터져서 좀 힘들었다.할.......

새해에는 [내부링크]

운동도 하고코드포스는 퍼플까지 찍어보고4.5 찍어보고원하는 대외활동 합격하고코로나 안 걸리고솔로탈출 하고

[백준] 1976번 여행 가자 c++ [내부링크]

2021년의 첫 번째 문제!약간의 실수로 한 번 틀리긴 했으나 바로 AC유니온 파인드 이용해서 풀면 된다.인접 행렬을 입력 할 때 1이면 거기에 해당하는 인덱스들을merge 하면 되고이동경로들을 입력받고이 이동경로들의 find 값이 다 같은 지 보면 된다.

[백준] 16562번 친구비 c++ [내부링크]

유니온 파인드를 활용해서 최솟값을 구하는 문제다 풀고 풀이 좀 찾아보니 루트로 배열 만들어서 하는 것 같은데 잘 모르겠네먼저 입력받을 때 check 배열을 이용해서 사용한 숫자 인지 안 사용한 숫자 인지를 판별cehck 배열은 여기서 사용이 된다. 문제를 보면 &#34;모든 친구와의 관계를 구해야 되니&#34; 모든 숫자를 다 봐야 된다.그렇기에 사용하지 않는 숫자도 비용을 계산해야 된다.5명의 사람이 있고 위와 같이 관계가 있으면 5번에 대한 비용도 처리해 줘야 됨그래서 check 배열이용해서 안 사용했으면 바로 sum에 더해주는 형식으로사용했으면 여기에 담아줌 1번의 find 값은 4 2도 4 3도 4이니 다 연결(?) 시켜준다.즉 vec[4]에는.......

[맛집] 오산 북극해 고등어 [내부링크]

#오산맛집세마와 병점사이에 있는 북극해 고등어점심에 가면 사람 엄청 많음 진짜우리도 사람 너무 많아 보...

[맛집] 오산 오르새피자 [내부링크]

진짜 여기 리얼 맛집피자스쿨 밖에 안 먹는 나인데여기는 2일 연속으로 먹음가격도 피자가 저정도면 괜찮...

[맛집] 동탄 킨지 사케동, 카이센동, 치킨가라아게, 스테키동, 대창덮밥 [내부링크]

#다만악에서구하소서보러 가기 전에 들린 일식집 킨지킨지 동탄점동탄 맛집이 되고 싶은 킨지중앙에 나무도...

[리뷰] 갤럭시탭 S6 Lite 블루 64GB WIFI [내부링크]

8월 18일에 인터파크에서 3만 원 추가 할인하길래 바로 산 갤럭시 S6 lite여기서 샀다.용량은 64GB이...

[리뷰] 코드플러스 강의 후기 (알고리즘 기초1 강의) [내부링크]

#백준 사이트로 유명한 최백준씨가 강의하는코드플러스이다.알고리즘 공부를 어떻게 할지 많이 고민하다...

2019.07.29 동탄 쿠팡 알바 허브B팀 후기 [내부링크]

+추가 2019.12.28많은 분들이 제 글을 읽어주시는데 일단 매우 감사합니다.한 가지 알아두셔야 될게 이...

2019.08.06 쿠팡 직영 C팀 알바 동탄 OB 후기! [내부링크]

+추가 2019.12.28많은 분들이 제 글을 읽어주시는데 일단 매우 감사합니다.한 가지 알아두셔야 될게 이 ...

[유럽] 프랑스 파리 루브르, 오르세 박물관, 에펠탑 [내부링크]

세 번째 날세 번째 날에는루브르 박물관부터 시작했다.늦게 가면 엄청 오래 기다려야 된다고 해서빨리 일어...

[유럽] 융프라우 올라간 스위스 세 번째 날 [내부링크]

3일차Youth hostel에서 주는 조식뷔페 형식으로 자기가 원하는 만큼 퍼가면 된다.진짜 해외여행할 때조식 ...

[유럽] 날씨가 정말 좋았던 스위스 [내부링크]

유럽 포스팅은 정말..맨날 해야지 해야지하는데 정말 하기 귀찮은 포스팅생각보다 시간도 오래 걸리고기...

[유럽] 술에 찌든 독일 뮌헨 [내부링크]

체코에서 독일로독일은 별로 끌리지 않았지만어차피 가는 길에 있어가지고 넣었음뮌헨이 그나마 가는 길이...

[유럽] 체코 프라하 [내부링크]

내가 유럽 가기 전에 &quot;너는 유럽을 한곳만 갈 수 있다면 어디를 갈 거냐&quot;나는 망설임 없이 체코...

[유럽] 술과 함께한 마지막 체코의 하루 [내부링크]

체코 3박 4일 일정에서 3번째 날원래는 #체스키크롬로프가려고 했는데.. 어이구유럽 여행하면서 보통 일찍 ...

[유럽] 오스트리아 빈 자연사 박물관 오페라 하우스 성 슈테판 대성당 [내부링크]

아니 사진이 너무 없네헝가리에서 오스트리아로 넘어갈 때 사진을 하나도 안 찍은 건가어떻게 하나도 없을 ...

[유럽] 오스트리아 빈 쇤브룬 궁전 벨베데레 궁전 [내부링크]

진짜 오스트리아는 뽕 제대로 뽑았음.여행 스타일이 비슷한 형을 만나가지고 진짜 열심히 돌아다님보통 쇤...

[유럽] 오스트리아 잘츠부르크 미라벨 게트라이데거리 호엔잘츠부르크 요새 프라터 놀이공원 [내부링크]

오스트리아 3일째 되는 날정말 오스트리아는 열심히 돌아 다닌 듯#잘츠부르크가는 기차에서오늘은 뭐 할...

[유럽] 2019 헝가리 부다페스트 겔레스트 언덕 [내부링크]

아 역시 밤에는 블로그 하는 게 제일 재밌어!이거 할 시간에 사강 들었으면 벌써 3~4개 들었을 듯아무튼 ...

[유럽] 헝가리 부다페스트 (어부의 요새, 국회의사당) [내부링크]

#부다페스트크로아티아 다음으로는 헝가리를 갔다.최고의 선택이었지.헝가리가 세계 3대 야경이라고 하는...

[유럽] 2019.05.27 크로아티아 두브로브니크 (2) 시내구경 부자카페 스르지산 투어 레스토랑(아스널) [내부링크]

2019.5.21~2019.6.202019.05.27#두브로브니크 두 번째 날두 번째 날 첫 번째 관광지올드타운 성벽 ...

[유럽] 2019 크로아티아 두브로브니크에서 자그레브 [내부링크]

원래는 유럽 갔다 와서 블로그에 기록하려고 했는데생각보다 오래 걸리기도 하고 때마침 학교 복학도 해서 ...

[유럽] 2019 크로아티아 플리트비체 [내부링크]

원래 귀찮아서 안 쓸려다가오늘 그냥 안 좋은 일이 있어서기분전환할 겸 써봄2019년 크로아티아의 마지막...

[유럽] 2019.05.21 이탈리아 로마 여행 (1) [내부링크]

2019.05.21~ 2019.6.20 한달 유럽 여행기1일차 2019. 05 .21 김포공항에서 로마로유럽에서 블로그 보면...

[유럽] 2019.05.22 이탈리아 로마 여행 (2) [내부링크]

2019.05.21~2019.06.20로마 2일차한달 여행 동안 제일 많이 걷고 제일 힘들었던 하루41598걸음 35.98...

[유럽] 2019.05.23 이탈리 로마 여행 (3) 바티칸투어 야경투어 [내부링크]

2019.05.21~2019.06.20로마 여행 3일차 #바티칸투어 및 #로마야경투어!구xx(승윤짱)가 이탈리아 가면 ...

[유럽] 2019.05.24 이탈리아 나폴리 여행 [내부링크]

2019.05.21~2019.06.202019.05.24로마에서 #나폴리7시쯤 기상.. 유럽 오면 알아서 일찍 일어나짐ㅋㅋ...

2020년 끝 [내부링크]

할 거 없어서 써보는 2020년 회고록2020년 새해 인사한 게 엊그제 같은데벌써 2020년 마지막 날이네시간이 정말 빠르다.위기의식을 느낄 만큼 빠르네2020년을 한 단어로 표현하면아마 대부분의 사람들이 &#x27;코로나&#x27;로대답하겠지?나 또한 코로나이다.코로나로 인해서정말 많은 게 바뀐 것 같다.원래 1학기에는 국제학생회도 하고보안동아리도 들어가서사람들도 많이 사귀고 보안 공부도 해보고열심히 살려고 했는데국제학생회는 들어갔으나 코로나로 인해서활동을 못 하고 보안동아리도 모집을 안 하게 돼서보안에 흥미가 떨어져서결국 1학기 끝나고 네트워크 관련 랩실에 들어갔다.진로가 바껴버리셈ㅋㅋㅋ사실 아직까지도 이 네트.......

[백준] 1717번 집합의 표현 c++ [내부링크]

2020년 12월 31일에도문제 풀어야지!유니온 파인드에 관한 기초적인 문제이다.유니온 파인드에 대해서 알고 있다면 쉽게 풀 수 있고모른다면 어려운 문제먼저 find 함수가 의미하는 건트리 구조에서 n에 대한 root 노드를 찾아주는함수이다.이때 p[n] &#x3D; find(p[n])은 모든 노드들을root 노드와 연결해 주는 것이다.p[n] &#60; 0 이면 루트 노드라는 의미이기에 n 자기 자신을 리턴한다.그다음은 merge 함수union-find는 disjoint-set 자료구조로즉 두 개의 트리가 있을 때 공통된 원소가 없으며모든 합집합이 전체 원소인 구조이다.즉 그냥 따로따로인 트리이다.merge는 이 두 개의 트리를 합쳐준다.먼저 합치려는 트리의 노드들을 먼저.......

[자격증] 컴퓨터활용능력 2급 컴활 2급 필기 독학 합격 및 후기! [내부링크]

안녕하세요! 2월에 군대 전역하고 9월 복학 전까지 열심히 자격증을 따고 있는 평범한 대학생입니다.지금까...

[자격증] ERP 정보관리사 생산 1급 독학 합격 및 후기! (+공부방법) [내부링크]

안녕하세요! 복학하기전까지 자격증을 열심히 따고 있는 대학생입니다. 개강하기전까지 딸 자격증을 알아보...

[자격증] MOS 2010 EXCEL EXPERT 독학 합격 및 후기 [내부링크]

2020.02.29 추가MOS 2010은 2020년 1월에 폐지 됐다고 합니다.앞으로는 MOS 2013과 2016만으로 시험...

[자격증] 워드프로세서 필기 독학 후기 및 준비 [내부링크]

안녕하세요! 오늘은 저의 3번째 자격증인 워드 프로세서 필기에 대해서 포스팅 해볼려고 합니다.1.시험접...

[자격증] 워드프로세서 실기 독학 및 후기 [내부링크]

안녕하세요!! 오늘은 워드프로세서 실기에 대해 포스팅 해보려고 합니다.1.시험소개 및 접수시험접수는...

[자격증] 지게차운전기능사 필기 독학 합격 및 후기 [내부링크]

안녕하세요! 5월에 딴 국가기술자격증인 지게차운전기능사에 대해서 포스팅 해보려고 합니다!1.시험...

[자격증] 지게차운전면허증/건설기계조종사면허증 발급방법 (+운전면허 2종보통) [내부링크]

안녕하세요! 오늘은 지게차 실기 합격후 조종사 면허증 발급 받는 방법에 대해서 포스팅 해볼게요!실기 ...

[자격증] ERP 정보관리사 물류 1급 독학 합격! [내부링크]

안녕하세요!오늘은 #ERP정보관리사물류 1급 포스팅 해보려고 합니다. 저는 무역쪽에 관심이 있는데 ...

[자격증] 컴활 1급, 컴퓨터활용능력 1급 필기 독학 합격! [내부링크]

안녕하세요!오늘은 #컴퓨터활용능력 1급 필기에 대해서 포스팅 하겠습니다!1.시험접수밑에 링크 들...

[자격증] 지게차운전기능사 실기 합격 후기 [내부링크]

약 1년 만에 다시 쓰는 실기 합격 후기원래 썼었다가 흠.. 삭제했음ㅋㅋㅋㅋ아무튼 일단 지게차운전기능...

[일상]류리의 추석일기 [내부링크]

2019.09.12~09.1511일 수업 다 마치고 헬스 하고 바로 집으로~~12일 누나 일 끝나고 바로 집으로 와서 ...