2021-12-16

  • [[deleted-text-inside-double-brackets-in-jekyll-markdown-code-block]]

2021-10-03

  • [[web3j-v4_8_7-okhttp3-runtime-error]]{web3j 4.8.7 버전 okhttp3 관련 런타임 에러}

2021-09-30

  • AES128, 192, 256
  • 포트폴리오 작성 방법
    • 사진 넣기(빠른 시간 안에 라뽀를 만든다)
    • 희망 직무와 연관지어 나의 가치관과 나의 지향점 등을 간략히 작성
    • 희망 직무는 되도록 하나만 작성해주세요
    • 희망 직무에 따른 포트폴리오를 각각 만드는 게 낫다
    • 프로젝트의 version(alpha, beta 등)을 정직하게 써서 해당 수준에 맞게 검증을 받는게 좋다(그래서 많은 프로젝트를 쓰는게 좋다)
      • 서버 준비중, 기획중(으로 써서 프로젝트의 개수를 채울 수도 있다)
      • 프로젝트는 5개 정도 작성하는 것을 추천
    • 긍정적 단어 사용

2021-09-28

  • [[vim-ansi-color-colorizer]]{vim에서 ANSI color 보이도록 하는 방법}

2021-09-27

  • github actions workflow의 job 사이에 빌드된 도커 이미지 공유 방법 : 링크

2021-09-26

  • [[openjdk]]

2021-09-25

  • docker system prune -f로 다음 항목을 제거한다
    • all stopped containers
    • all networks not used by at least one container
    • all dangling images
    • all dangling build cache
  • [[hibernate-db-sql-options]]
  • shell에 .env file 적용 방법 (참고 : https://stackoverflow.com/a/43267603)
set -a # automatically export all variables
source .env
set +a
  • openjdk docker timezone 설정
FROM openjdk:8-alpine

# Timezone 보정
RUN apk add tzdata
RUN cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime
RUN echo "Asia/Seoul" > /etc/timezone

ENV LANG=ko_KR.UTF-8

2021-09-24

  • tzdata 설치 시 사용자가 직접 timezone 설정을 할 수 있도록 입력할 수 있는 부분이 나오는데, 도커 이미지를 생성할 때는 입력을 할 수 없으므로 사용자의 입력 없이 넘어가기 위해 설정
    ARG DEBIAN_FRONTEND=noninteractive
    

2021-09-19

  • [[mysql-user-grant]]

2021-09-16

  • [[ngrok]]

2021-09-10

  • [[github-actions]]
  • [[db-index]]
  • [[database-table]]

2021-09-09

2021-09-08

  • healthcheck
      HEALTHCHECK --interval=10s CMD wget -qO- localhost:8080
    

2021-09-05

2021-09-02

2021-08-31

2021-08-30

  • CI에 sonatype/nexus3를 docker container로 설치해서 실행했는데, 메모리가 충분하지 않다고 에러가 발생했다. reference를 찾아보니 최소 8GB 이상이어야 하는 듯 하다..
  • OCI에 harbor를 docker container로 설치해서 실행했는데 잘 안 된다..

2021-08-29

  • [[deploying-openvidu-on-premises]]

2021-08-28

  • [[using-environment-variables-in-nginx-configuration]]
  • [[docker-buildkit-failed-to-build]]
  • root permission이 필요한 파일에 echo로 특정 내용을 넣고 싶은 경우

      echo "{ \"features\": { \"buildkit\": true } }" | sudo tee -a /etc/docker/daemon.json 
    

2021-08-27

2021-08-26

  • jira의 이슈 생성 윈도우에서 우선 순위가 안 보이는데 프로젝트 설정 > 이슈 유형에서 각 이슈에 우선 순위 필드를 추가할 수 있다.
  • [[import-jira-issue-to-another-jira]]
  • [[go-ethereum]]

2021-08-25

2021-08-24

  • docker-compose에서 --env-file option을 통해 yml에 적용되는 env 파일을 지정할 수 있다(default 파일 이름은 .env)
  • docker-compose에서 -f option을 통해 실행할 yml 파일을 지정할 수 있다.
  • docker commit 명령어를 통해 종료된 컨테이너의 상태를 그대로 이미지로 저장할 수 있다.

      docker commit [CONTAINER_ID] [IMAGE_NAME]
    
  • OSX 기본 app인 pages의 이미지를 text 뒤로 보내는 방법 : https://www.youtube.com/watch?v=C0cNHYfToFc (자필 서명 필요할 때)

  • STOMP exception 처리할 때, @MessageExceptionHandlder가 있다(https://stackoverflow.com/a/33745107)

2021-08-18

  • secure coding
getWord().equals(""); // getWord()가 null을 리턴하는 경우 NPE이 발생한다
"".equals(getWord()); // getWord()가 null을 리턴하더라고 equals는 false를 잘 반환한다.
  • sha256 vs sha512
    • 속도 측면 등을 고려해봤을 때 현업에서 sha256을 사용한다고 한다

2021-08-13

  • redisOperations.keys(key)redisOperations.multi() 호출 전 후로 차이가 존재한다.

  • StringRedisTemplate과 RedisTemplate<String, Object> 차이 ```java private final RedisTemplate<String, Object> redisTemplate; private final StringRedisTemplate stringRedisTemplate;

redisTemplate.opsForHash().put("GameSession:" + roomId, "hostId", playerId); // "hihi" 이렇게 저장됨 stringRedisTemplate.opsForHash().put("GameSession:" + roomId, "hostId", playerId); // "hihi" 이렇게 저장됨


- [[openvidu-streamplaying-4000ms-timeout-issue]]
- [[jenkins-container]]


## 2021-08-12
- redisson lock
```java
RLock lock = redissonClient.getLock(name); // name에는 redis 저장할 때 사용되는 key와 동일한 값이 사용되면 안 된다.

boolean isLocked = false;
try {
/*
lock.tryLock() method는 wait time과 lease time을 각각 첫 번째, 두 번째 파라미터로 전달 받는다. wait time 동안 lock의 획득을 시도하며, 이 시간이 초과되면 lock의 획득에 실패하고 tryLock 함수는 false를 리턴한다. lock의 획득에 성공한 이후엔 lease time이 지나면 자동으로 lock을 해제한다.
*/
	isLocked = lock.tryLock(2, 3, TimeUnit.SECONDS);
} catch (InterruptedException e) {
	e.printStackTrace();
}
if (isLocked) {
	// do something 
}

2021-08-11

  • [[spring-data-redis-localdatetime-serialize-error]]

2021-08-09

2021-08-09

2021-08-07

  • [[self-signed-certificate-err-cert-invalid]]

2021-08-06

  • redis 사용 중에 수정 전에 저장된 class 객체를 다시 꺼내려 할 때 수정 후 형태로 담으려니 에러가 발생한다

2021-08-05

  • STOMP endpoint 설정하는데, 마지막에 '/'(slash)를 추가하지 않아 오류가 발생하는 듯 하다

2021-08-02

  • spring-data-redis의 pub/sub 모델을 통해 메시지 시스템을 사용할 수 있다

2021-08-01

  • docker-compose에 사용되는 .env 파일에서 value값에 쌍따옴표를 주었는데, AWS EC2 VM에서는 쌍따옴표가 제거되어 있는데, OCI VM에서는 쌍따옴표도 포함되어 들어가 있었다.

2021-07-31

  • openvidu tutorial과 openvidu를 docker로 VM에 올렸는데, 세션 입장하는 과정에서 계속 실패했다
    • 맨 처음에 openvidu에 STUN 및 TURN 서버 설정에 대해 검색하다가 reference 페이지를 보게 되었다.
    • reference 페이지에 나와 있는 docker 명령어를 그대로 사용했다.
    • openvidu 2.12.0 버전에 최신(2.19.0) openvidu tutorial을 실행했다.
    • 계속 세션 입장하는 데 오류가 발생했다.
    • openvidu 2.12.0 버전을 2.19.0 버전으로 변경했다.
    • 그래도 계속 안 됐다
    • docker 실행 시 전달해줘야 하는 environment가 2.12.0 버전과 2.19.0 버전이 다른데, 2.19.0 버전에 2.12.0에 맞는 environment를 건네줘서 안 됐던 것이다
    • 최신 tutorial에 최신 openvidu 버전(2.19.0)과 최신 버전에 맞는 설정을 하니 잘 되었다.
    • reference를 볼 때에도 버전을 잘 체크하자!
    • STUN 및 TURN 서버 관련 설정에 대한 설명이 2.12.0 버전 reference에는 있는데, 2.19.0 버전에는 없다.
    • 근데, 내가 설치하고 실행한 docker 이미지는 openvidu/openvidu-server-kms라서 kms가 같이 설치되어 있는 이미지인데, kms에서 사용하는 STUN 및 TURN 서버 관련 설정으로 environment를 건네주면 될 것 같다
    • 또한, TURN 서버는 모르겠지만 STUN의 경우는 google에서 제공하는 서버가 default로 설정되어 있어서 STUN 서버 관련 설정을 해주지 않아도 큰 문제는 없을 듯 하다
  • kurento 테스트를 해본 결과 TURN 서버가 없어도 된다.

2021-07-30

  • @RequestBody로 오는 class의 경우 @Setter는 없어도 되지만, NoArgsConstructor가 필요한 것 같다

    Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of s05.p12a104.mafia.api.requset.GameSessionJoinReq (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of s05.p12a104.mafia.api.requset.GameSessionJoinReq (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (PushbackInputStream); line: 1, column: 2]]

    • 안되는 코드
        @Getter
        @RequiredArgsConstructor
        public class GameSessionJoinReq {
            private final String nickname;
        }
      
    • 되는 코드
        @Getter
        @NoArgsConstructor
        public class GameSessionJoinReq {
            private String nickname;
        }
      
  • builder와 final을 적절히 사용하는 방법에 대한 고민
  • openvidu docker 실행
      docker run -d --name openvidu -p 4443:4443 -e OPENVIDU_SECRET=MY_SECRET openvidu/openvidu-server-kms:2.19.0 
    
  • openvidu dashboard로 접속하면 로그인 모달이 뜨는데, id에 OPENVIDUAPP password에 openvidu.secret 입력하면 된다.

2021-07-29

  • MapStruct : DTO를 entity로, 또는 그 반대로 mapping시키는 코드를 자동으로 생성해주는 라이브러리

2021-07-28

2021-07-27

2021-07-27 11:10:42.742 ERROR 38075 — [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.StackOverflowError] with root cause

java.lang.StackOverflowError: null at org.springframework.core.convert.TypeDescriptor.hashCode(TypeDescriptor.java:509) ~[spring-core-5.3.8.jar:5.3.8] at org.springframework.core.convert.support.GenericConversionService$ConverterCacheKey.hashCode(GenericConversionService.java:476) ~[spring-core-5.3.8.jar:5.3.8] at org.springframework.util.ConcurrentReferenceHashMap.getHash(ConcurrentReferenceHashMap.java:222) ~[spring-core-5.3.8.jar:5.3.8] at org.springframework.util.ConcurrentReferenceHashMap.getReference(ConcurrentReferenceHashMap.java:264) ~[spring-core-5.3.8.jar:5.3.8] at org.springframework.util.ConcurrentReferenceHashMap.get(ConcurrentReferenceHashMap.java:235) ~[spring-core-5.3.8.jar:5.3.8] at org.springframework.core.convert.support.GenericConversionService.getConverter(GenericConversionService.java:256) ~[spring-core-5.3.8.jar:5.3.8]

2021-07-26

  • WebSocket은 단지 통신프로토콜, 특정 토픽의 subscriber에게만, 특정 user에게만 메시지를 보내는 방법을 담당하는 프로토콜이 STOMP

2021-07-25

  • spring boot dockerfile 작성 관련 reference : https://spring.io/guides/topicals/spring-boot-docker/#a-better-dockerfile
  • @Data annotation 컴파일 warning

    warning: Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type. @Data

  • docker-compose에 환경변수를 쓰고자 했는데, 적용이 안돼서 다른 방법을 찾다가 env_file를 알게 되었다

2021-07-21

  • mysql의 경우 timezone을 설정해놨는데, jdbc url에 timezone을 포함하지 않으면 연결이 안될 수 있다
  • mysql container를 아무 옵션 없이 생성한 후, host와 volume을 계속 연결하여 유지하도록 했더니 docker-compose에서 아무리 mysql cmd에 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 옵션으로 실행시켜도 utf8mb4가 적용되지 않았다… (처음 만들 때 그렇게 생성하지 않았던 파일로 계속 유지하게 되니 될리가 있나…)

2021-07-20

  • docker-compose를 실행했더니 다음과 같은 에러가 발생했다.

    ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the services key, or omit the version key and place your service definitions at the root of the file to use version 1. For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/

    • docker-compose.yml 버전이 3.8이었는데, 설치된 docker-compose 버전 입장에서 yml의 3.8 버전이 너무 높은 버전이라서 에러가 발생하였다. 3.4로 낮췄더니 정상 동작하였다.

2021-07-19

  • 팀원에게 project repo를 공유해줬는데, lombok 에러가 발생하였다

    java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment

  • [[kurento-tutorial-java-compile-error]]

2021-07-18

  • docker-compose
    docker-compose build --no-cache
    docker-compose up -d
    docker-compose logs -f backend
    

2021-07-17

  • gitlab과 jenkins를 연동하는 과정에서 추천하는 방식을 하는데, jenkins id와 password를 잘 입력했음에도 연결이 안돼서 webhook 사용 (https가 아니라 그런가..)

2021-07-16

  • [[whiteship-java-live-study-1]]{1주차 - JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가}
  • [[kurento-coturn-docker]]
  • [[checkstyle]]

      docker run --rm -p 8888:8888/tcp -p 5000-5050:5000-5050/udp -e KMS_MIN_PORT=5000 -e KMS_MAX_PORT=5050 --name kms -d kurento/kurento-media-server:latest
    
  • jwt
    • jwt는 메모리 올라와 있는 secret 키만을 활용하여 jwt 복호화를 통해 유효성을 확인할 수 있는 이점을 가지고 있다.
    • RSA 비대칭키(public, private)를 통한 암호화 및 복호화가 이뤄진다
    • public key로 암호화를 하게 되면 private key를 가진 사람만 복호화가 가능하다
    • private key로 암호화를 하게 되면 public key를 가진 사람이 복호화가 가능하고, 해당 위치에서 암호화가 되었다는 것이 확실하다는 의미이다.
  • access token and refresh token
    • 일반적으로, access token의 유효 기간을 30분으로 두고, refresh token을 2주 정도로 둔다.
    • access token을 사용하다 만료되어 401 http status code를 응답으로 받게 되면 refresh token을 활용하여 access token을 재발급 받는 형태이다.
    • 서버측에서 refresh token에 대한 정보를 저장하고 있어야 한다.(탈취 시 무효화시킬 수 있게)
    • 사실상 client 측에서 access token과 refresh token이 동일한 위치에 저장되어 있을텐데 refresh token이 탈취되면 어차피 똑같은 게 아닌가 싶었는데, refresh token은 access token을 재발급 받기 위해 30분에 한 번 전달이 되고, access token은 요청마다 계속 전달이 되기 때문에 access token이 탈취에 더 취약하기 때문에 access token과 refresh token을 같이 사용하는 것이 아닌가 한다

2021-07-15

  • configuration class에서 method로 빈을 등록할 떄 method 이름이 해당 빈의 id이다. ```java @Configuration @EnableWebSecurity // security 활성화 @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder pwdEncoder() { // pwdEncoder 라는 id를 가지는 빈 return new BCryptPasswordEncoder(); }

- 빈을 주입할 때, 해당 type으로 주입을 하는데, 동일한 type의 빈이 여러 개면 error가 발생한다. 이를 처리하기 위해서 @Qualifer("빈id") 어노테이션을 통해 주입해주면 된다

## 2021-07-14
- git-flow
	```sh
	git flow init
	git flow feature start issue-1
	```

- git subtree
	- study-demo-code 하위 directory에 다른 git repo를 history 유지하면서 들여오고 싶어서 사용하였다.(local repo를 적용했는데, 당연히 url을 통한 remote repository도 가능하다)
	```sh
	git subtree add --prefix=spring-react-google-login ../spring-react-login master
	```

```sh
docker run -d --name kms --network host kurento/kurento-media-server:latest

2021-07-13

  • redis docker 실행 (참고로, spring-boot-starter-data-redis에서 default port가 6379이다)
      docker run -p 6379:6379 --name redis -d redis:6.2.4-alpine
      docker exec -it redis redis-cli
    
  • redis cli
    • keys *
    • get {key}
    • hgetall {key} : hash get all
    • hget {key} {column} : hash get (key = hash_id / column = 엔티티에서 조회할 key)
    • del {key}
  • [A-Za-z0-9] 범위에서 랜덤 String을 만들 수 있는 코드
      String str = RandomStringUtils.randomAlphanumeric(7);
    
  • 랜덤 UUID
      UUID.randomUUID().toString();
    

2021-07-12

  • jwt
  • rsa
  • algular와 spring boot에 google, facebook social login 연동에 대한 유튜브 : https://www.youtube.com/watch?v=fhoVrKGxyIs
  • docker-wireshark를 통해 GUI를 web browser로 볼 수 있다
    • mac은 host network를 못 써서 사용성이 있을지 모르겠다
  • mysql 특정 유저에게 모든 권한 부여
      grant all privileges on *.* to 'username'@'%';
    

2021-07-11

  • docker의 --net host은 mac, windows에서 사용할 수 없다(출처 : https://docs.docker.com/network/host/)

    The host networking driver only works on Linux hosts, and is not supported on Docker Desktop for Mac, Docker Desktop for Windows, or Docker EE for Windows Server.The host networking driver only works on Linux hosts, and is not supported on Docker Desktop for Mac, Docker Desktop for Windows, or Docker EE for Windows Server.

  • 컨테이너에서 macOS 호스트 포트에 접근하는 방법(참고 : https://docs.docker.com/docker-for-mac/networking/)
    • host.docker.internal

2021-07-10

2021-07-09

  • [[swap-memory]]

2021-07-07

  • Container Orchestration : 복잡한 컨테이너 환경을 효과적으로 관리
    • master에 요청하면 cluster에 알아서 수행
    • 상태 관리
      • 안되는 게 있으면 알아서 하나를 더 띄운다
    • 배포 관리
    • 배포 버전 관리
    • 볼륨 스토리지
  • kubernetes(a.k.a k8s)
    • 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼
  • docker의 경우 host kernel 버전에 영향을 받게 된다. 하지만, 대부분 잘 동작한다
  • gitops
    • Argo CD

2021-07-06

  • [[virtual-memory]]

2021-07-05

  • 비대면으로 프로젝트할 때 힘든 점
    • 같이 얘기하면 말이 겹쳐서 잘 안 들림
    • 그림을 그려 설명을 할 필요가 있을 때

2021-07-02

  • [[jmeter]]

2021-06-28

  • 새로운 반 사람들과 만났다

2021-06-22

  • 면접 어떡하지…

2021-06-20

  • OSX에서 device 연결이 안될 때
  • flutter 명령어
      $ flutter doctor
      $ flutter devices
      $ flutter run
    
  • 크롬 확장 프로그램 개발자 모드 : chrome://extensions에서 우측에 개발자 모드가 있다

  • flutter에서 gradle로 build 시 build/app/outputs/flutter-apk/app-release.apk가 생성된다.

  • 재현이 형 chrome extensions : https://www.autocontrol.app/

2021-06-19

  • 엄마 생신
  • [[boj-2629]]{BOJ 2629. 양팔저울}

2021-06-18

2021-06-17

  • [[github-profile-to-pdf]]

2021-06-16

  • [[jekyll-pandoc-smart-quotes]]
  • [[jekyll-spaceship]]
  • plantuml의 background를 투명하게 하려면 다음 코드를 포함하면 된다
      skinparam backgroundcolor transparent
    
  • 현재 plantuml에서 지원하는 ditaa는 background를 투명화할 수 없다

  • 생각하고 있는 1인 project
    • ditaa server
    • review147
    • jekyll-pandoc-converter
      • 현재 있는 jekyll-pandoc은 업데이트된지 너무 오래 되었고, 많이 달라진 2.0 이상의 pandoc을 커버할 수 없다
    • jekyll-ditaa
      • 현재 있는 jekyll-ditaa는 gem으로 등록이 안 되어 있는 상태

2021-06-15

  • [[change-github-pages-to-gitlab-pages]]
  • [[jekyll-pandoc]]
  • [[jekyll-pandoc-rouge]]
  • [[jekyll-pandoc-mermaid]]

2021-06-14

  • [[delete-file-from-all-commit]]{모든 커밋에서 파일을 삭제하는 방법}

2021-06-13

  • [[jekyll-spaceship-mermaid-svg-font-size-issue]]{jekyll-spaceship mermaid svg의 글자가 짤리는 이슈}
  • [[installed-jekyll-spaceship-latest-version-in-gitlab-ci-is-different-from-in-local]]{Gitlab CI에서 jekyll-spaceship의 최신 버전이 local과 다르게 설치된 이슈}

2021-06-12

  • 야호 생일이다!

2021-06-11

  • wiki(blog) 글이 jekyll-spaceship의 MathJax가 먹히지 않을 때
    • 이유는 모르겠지만, 글 사이에 MathJax 문법이 섞여 있으면 인식을 잘 못하는 것 같다.
    • 글 맨 위에 $~$을 입력해주면 된다. (참고 : [[swea-12090]])

2021-06-10

  • 알고리즘 꿀팁
    • 메서드의 리턴값은 임시 변수로 받아야 디버깅이 편하다
    • 디버깅할 때에는 정말 최대한 input을 줄여가면서 에러나 오답이 나오는 경우를 찾아라
      • 이렇게 하고 디버깅을 하는 것이 더 시간을 줄이는 방법
    • 20이하는 bitmasking을 고려해라
  • [[swea-12090]]{SWEA 12090. 칩 생산}
    • 정말 어려운 문제이고, 많은 걸 고려해야 한다.

2021-06-09

  • [[jekyll-spaceship-cpp-code-block-issue]]{jekyll-spaceship cpp code block 이슈}

2021-06-08

  • [[trie]]

2021-06-07

  • [[java-orm-standard-jpa-programming-basic]]{자바 ORM 표준 JPA 프로그래밍 - 기본편}

2021-06-06

  • [[spring-beans-circular-dependencies]]
  • [[choose-constructor-injection]]{생성자 주입을 선택해라}

2021-06-05

  • [[my-first-contribute]]{첫 contribute 해보기}
    • 드디어 첫 contribute 성공!

2021-06-04

  • 포천 아크 밸리에 다녀왔다
    • 날씨가 맑고, 사람이 없어서 좋았다

2021-06-03

  • [[mybatis-type-exception]]
  • [[try-to-apply-google-java-format]]
  • [[apply-jekyll-to-google-analytics]]

2021-06-02

  • happy-6house
    • sql format 예쁘게 출력
      • application.yml
          properties:
              hibernate:
                  format_sql: true
        
    • comments의 parent에 LAZY 달리지 않은 것
  • [[mybatis-xml-in-intellij]]
  • [[getter-setter-compile-error]]
  • [[my-first-contribute]]{첫 contribute 해보기}
    • E2E test 로컬에 구성 완료하여 실행까지 성공 그리고 test code 추가 수정

2021-06-01

  • [[push-mirroring-from-gitlab-to-github]]{gitlab의 repo를 github repo로 미러링하기}
  • [[apply-git-pre-commit]]{git pre-commit 적용해보기}
  • git commit 취소 : git reset HEAD^
  • [[happy-6house]]
  • REST API vs HTTP API

2021-05-31

  • [[my-first-contribute]]{첫 contribute 해보기}
    • test code 수정

2021-05-29

  • list, map, set

2021-05-28

  • 오늘 ssafy 5기 1학기 종강식이다.
    • final 프로젝트 발표했는데, 또 긴장했다
    • 1학기가 끝났다는 게 사실 실감이 안 난다
    • 반 우수 프로젝트에 선정되었다 야호!

2021-05-27

  • final cut pro 어렵다..

2021-05-26

  • project-checklist
  • Google map Direction API를 통해 대중교통, 차량, 도보 경로 탐색이 가능할 것 같다(월 $200 무료 사용 가능)
    • happy-6house에 맛집 가는 경로 기능으로 적용이 가능할 수도 있곘다 싶다.
  • [[my-first-contribute]]{첫 contribute 해보기}
    • pull request 요청
  • GCP와 Oracle Cloud 모두 사양이 낮은 H/W를 사용하면 무료로 사용 가능하다

2021-05-25

  • T-Map API의 길 찾기의 경우 무료로 사용하게 되면 초당 2건 호출 가능하도록 제한되어 있다.(유료는 제한 없음)
  • Minor GC에서 빈 다른 survivor 영역으로 언제 이동하는지 궁금했다.
    • '현재 채워지고 있는 survivor 영역이 꽉 찼을 때' vs 'eden 영역이 꽉 찼을 때'
    • 아무래도 oracle 페이지에서 제공하는 글에서 eden 영역이 꽉 찼을 때 survivor 영역을 이동한다고 설명하니 이 방식이 맞는 것으로 보인다.
    • 하지만 핵심은 '왜 survivor 영역을 두는지' 이다
      • 우선, 오래된 객체와 젊은 객체를 구분하기 위해 old 영역과 young 영역을 나누었다. '대부분의 객체는 금방 unreachable된다' 전제를 두고 GC를 만들었기 때문이다. 젊은 객체가 있는 young 영역을 굳이 또 eden 영역과 2개의 survivor 영역으로 나눈 이유는 당연히 쉽게 관리하기 위해서다. 전제의 상황에서 그 와중에서도 단 한 번이라도 참조된 객체는 오래 살아남을 가능성이 크기 때문이라는 것이다. 다시 말하면, 새로 생성된 객체와 한 번이라도 참조된 객체를 구분하기 위해서라고 할 수 있다. 한 번이라도 참조된 객체는 오래 살아남을 가능성이 크기 때문에 2개의 survivor를 두어 양쪽을 번갈아 이동시키면서 age를 증가시키고, limit에 도달하게 되면 old 영역으로 이동(promotion)하게 된다.
      • 요지만 다시 말하자면, survivor 영역을 두는 이유는 한 번 참조된 객체와 새로 생성된 객체를 구분지어 GC를 좀 더 쉽게 하기 위함이다.
    • 또 다른 핵심은 gc root로부터 reachable/unreachable한 객체, weak referencde 등과 관련된 개념이다. 이 개념에는 GC 탄생의 2 번째 전제인 '오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다'와 연관되어 있는 부분도 있다.

2021-05-24

2021-05-23

  • REST API 설계 시 kakao REST API 참고

  • gradlew build 시 오류
    • 다음과 같은 cmd로 shell에서 build를 실행
        ./gradlew clean build 
      
    • 오류 발생
        > Task :compileJava FAILED
      
        FAILURE: Build failed with an exception.
      
        * What went wrong:
        Execution failed for task ':compileJava'.
        > Could not target platform: 'Java SE 11' using tool chain: 'JDK 8 (1.8)'
      
    • 오류 발생 원인
      • build하려는 project는 Java11로 되어 있고, OS에 설정되어 있는 default JDK 버전은 1.8로 되어 있있다. Java11로 되어있는 project를 아무 옵션 없이 JDK1.8로 compile하게 됐고, 그 결과로 오류가 발생했다.
    • 해결 방법
      • 다음과 같이 JAVA_HOME을 JDK11로 지정해준다.
          ./gradlew clean build -Dorg.gradle.java.home=/Library/Java/JavaVirtualmachines/adoptopenjdk-11.jdk/Contents/Home
        
  • DB 관련 unit test
    • @DataJpaTest : 내부적으로 @transactional 선언
    • @AutoConfigureTestDatabase
      • DB 테스트 자동 설정 anotation
      • 'replace' property를 AutoConfigureTestDatabase.Replace.ANY로 설정하면 in-memory embedded DB가 설정된다.
        • embedded DB는 H2를 사용하기 때문에 ANY로 설정하여 테스트를 하기 위해서는 H2 의존성을 추가해주어야 한다.
      • 'replace' property를 AutoConfigureTestDatabase.Replace.NONE로 설정하면 application.properties에 설정된 DB가 설정된다.
  • DB unit test 에러

    org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

      @ExtendWith(SpringExtension.class)
      @DataJpaTest
      @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
      class SpringDataJpaPostRepositoryTest {
    
          @Autowired
          private PostRepository postRepository;
    
          @DisplayName("게시글을 저장하고 저장된 게시글의 id가 nulL이 아니면 성공")
          @Test
          public void 게시글_저장() {
              final User user = User.builder()
                              .email("hi@hi.com").name("hello")
                              .password("hi").auth(ROLE_USER.getText())
                              .build();
              ReflectionTestUtils.setField(user, "id", 10L);
    
              final Post post = Post.builder()
                              .title("This is title")
                              .content("This is content")
                              .category(PostCategory.GENERAL)
                              .user(user)
                              .build();
    
              final Post savePost = postRepository.save(post);
    
              assertThat(savePost.getId()).isNotNull();
          }
      }
    
    • @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)으로 설정을 하여 실제 DB와 연결이 되는 상태이다. 기존에는 id가 10인 user의 데이터가 실제 DB에 존재하여 test를 성공해 왔는데, 현재 id가 10인 user가 없어 test를 실패하게 되었다.
    • NONE에서 ANY로 바꾸어 실제 DB를 사용하지 않고, in-memory embedded DB를 사용하도록 했다.
    • 또한, user와 post의 관계가 foreign key로 연결되어 있어 user가 DB에 없으면 post도 삽입 불가능하여 에러가 발생한다.
      • org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [FK_POST_USER];
    • 미리 DB에 user를 삽입하는 코드를 추가했다
    • 코드를 다음과 같이 수정하였다
        @ExtendWith(SpringExtension.class)
        @DataJpaTest
        // ANY : in-memory embedded DB(H2), NONE : DB in application.properties
        @AutoConfigureTestDatabase(replace = ANY) 
        class SpringDataJpaPostRepositoryTest {
            @Autowired private PostRepository postRepository;
            @Autowired private UserRepository userRepository;
      
            @DisplayName("게시글을 저장하고 저장된 게시글의 id가 nulL이 아니면 성공")
            @Test
            public void 게시글_저장() {
                // given
                final User user = User.builder()
                    .email("hi@hi.com").name("hello")
                    .password("hi").auth(ROLE_USER.getText())
                    .build();
                User savedUser = userRepository.save(user);
      
                final Post post = Post.builder()
                    .title("This is title")
                    .content("This is content")
                    .category(PostCategory.GENERAL)
                    .user(savedUser)
                    .build();
      
                // when
                final Post savePost = postRepository.save(post);
      
                // then
                assertThat(savePost.getId()).isNotNull();
            }
        }
      
  • pull request 시 gradle build를 실행하는 github actions를 도입 과정
    • .github/workflows/gradle.yml를 작성하여 push했더니 테스트가 모두 실패됐다
    • [블로그]{https://enant.tistory.com/29} 를 동해 DB 연결에 실패해서 발생하는 에러임을 알았다. 내가 unit test라고 나름 만들어놓았고, unit test는 DB가 아예 없어도 돌아갈 줄 알았다.
      • 위 블로그에서 소개해주는 [mysql 관련 action]{https://github.com/marketplace/actions/start-mysql} 를 적용했다.
        • 해당 action은 workflows의 step으로 mysql DB를 docker로 실행해주는 것이다.
        • mysql action 적용 과정에서 yml 문법 오류, mysql 버전 오표기 등의 실수를 저지르기도 했다.
    • mysql을 적용했음에도 에러가 발생했다
    • 이것저것 알아보다가 내가 적용할 때는 무슨 의미인지도 모르고 적용했지만, AutoConfigureTestDatabase.Replace.NONE 상태로 설정해놓아서 unit test시에 실제 DB를 계속 연결하고 사용하고 있었던 것이다.
      • test를 돌리고 나면 user의 자동 증가하게 되어 있는 id column이 계속 jump되어 있던 이유가 뭔가 싶었는데, 이것 때문이었다.
    • mysql action을 제거하고, NONE으로 변경했더니 mysql을 추가하기 전 에러가 동일하게 발생했다
    • mysql action을 github action에 추가해서 build를 성공했다

2021-05-22

2021-05-21

  • [[mybatis-xml-in-intellij]]
    • maven 관련
  • browser에서 OPTIONS method를 통해 먼저 CORS 관련 사용 가능 여부를 확인하는데, 이때 WebSecurityConfigurerAdapter를 상속받은 config에서 request를 권한 처리해버리면 CORS 관련 에러가 발생한다
    • 권한이 없어 튕긴건데 browser 입장에서는 CORS가 되는지 확인하다가 에러가 발생했다고 생각하여 CORS 관련 에러가 나는 것이다.
        @Override
        protected void configure(HttpSecurity httpSecurity) throws Exception {
        // We don't need CSRF for this example
        httpSecurity.csrf().disable()
                // dont authenticate this particular request
                .authorizeRequests()
                .antMatchers(HttpMethod.POST, "/api/authenticate", "/api/users").permitAll().
                anyRequest().permitAll().and() // 기존에 anyRequest().authenticated().and() 으로 되어 있어서 권한이 없어 튕김
                .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
      
        // Add a filter to validate the tokens with every request
        httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
        }
      
  • sqldump 파일 적용
      mysql -uroot -padmin < sqldump.sql
    
  • required Integer parameter 'id' is not present
    • @RequestParam 파라미터 변수가 required = false가 아님에도 값이 안 들어와 발생하는 에러
  • from .xlsx to .sql
    • 서울시 CCTV 정보를 공공 데이터 포털에서 엑셀 파일로 다운
    • 불필요 column 삭제하고 .csv 파일로 저장했다.
    • https://www.convertcsv.com/csv-to-sql.htm를 통해 .csv 파일을 .sql로 변환

2021-05-20

  • 4개 테이블 join SQL query
      select *
      from user u
      left join interested_deal i on (u.id = i.userid)
      left join housedeal h on (h.no = i.housedeal_no)
      left join
      ( select AptName, dong, code, lat, lng from houseinfo) as hi
              on (hi.AptName = h.AptName and hi.dong = h.dong and hi.code = h.code)
      where u.id = 3
    
  • mybatis에서 xml parsing 오류를 많이 만날 수 있는데, 실수로 resultMap 대신 resultType을 써서 발생하는 오류이다.

2021-05-19

2021-05-18

  • DB에서 foreign key 설정을 할 때 테이블의 인코딩 방식이 서로 맞지 않으면 foreign key 설정이 안 된다.
    • 다음과 같은 에러 발생
      • [HY000][3780] Referencing column 'userid' and referenced column 'userid' in foreign key constraint 'post_user_userid_fk' are incompatible.

2021-05-17

2021-05-16

  • 면접 질문
    • TCP와 UDP의 공통점과 차이점
    • HTTP keep alive
    • 흐름제어와 혼잡 제어
    • DNS

2021-05-15

  • JAVA SE 8
    • Optional
    • Interface default method, static method
    • Time API
      • LocalDateTime, LocalDate, LocalTime
    • Stream API
    • Lambda
      • Functional Interface

2021-05-14

  • vue router
    • this.$router.push() : 이동
    • this.$route.params : parameter 받을 때
  • java sort

      // 두 줄의 코드는 동일하게 created date의 역순으로 정렬한다.
      Collections.sort(posts, (a, b)-> b.getCreatedDate().compareTo(a.getCreatedDate()));
      posts.sort(Comparator.comparing(Post::getCreatedDate).reversed());
    

2021-05-13

  • Spring Data JPA의 paging 처리
    • JpaRepository를 상속한 인터페이스의 method에 Pageable class를 parameter로 추가하여 paging 처리를 할 수 있다.
    • pageRequest.of() 메소드로 객체를 생성할 수 있는데, parameter로 page(zero-based page index)와 size(page size), sort(정렬 방법, not null)이 필요하다.
        Pageable pageable = PageRequest.of(pageIdx, size,
            Sort.by(Sort.Direction.DESC, "createdDate"));
      
    • offset, limit 방식은 https://stackoverflow.com/a/36365522 해당 글의 코드를 참고하면 되는데, 일부 수정해주어야 한다.
    • nooffset 방식은 https://jojoldu.tistory.com/528 해당 글을 참고하면 된다. offset 방식보다 속도가 더 빠르다
  • lambda와 익명 클래스
    • 익명 클래스는 컴파일 시 클래스 파일이 생성된다. lambda는 생성되지 않는다
      • 처음에 클래스 파일들을 로딩하는데 시간이 오래 걸릴 수 있다
    • invokedynamic

2021-05-12

  • CS 면접 대비
    • CS 질문에 대한 대답을 할 떄 자신의 경험을 같이 말해줘야 한다
  • 면접 질문
  • jira와 github 연동
  • github의 organization 안에서 team으로 더 나눌 수 있다.

2021-05-11

2021-05-10

  • @Autowired를 쓰지말고 변수에 final 선언과 @RequiredArgsContructor를 명시해주어 생성자 주입으로 사용하라
    • @Autowired를 쓰면 intellij가 화낸다 (not recommended라면서)
  • Entity
    • setter 사용 지양 => 의미있는 이름으로 여러 필드를 한 번에 변경하는 작업
    • getter도 사용하지 않는 것이 좋지만 어쩔 수 없는 경우가 많다
    • NoArgsConstructor는 access level을 protected로 주면 JPA가 다 할 수 있다(접근 범위를 최소화한다는 개념)
        @NoArgsConstructor(access = AccessLevel.PROTECTED)
      
  • Pageable
    • JPA에서 limit과 offset을 사용해야 할 때에는 Pageable을 활용한다
        @Override
        public List<PostDto> findByCategory(PostCategory category, int offset, int limit) {
        Pageable pageable = PageRequest.of(offset / limit, limit,
                Sort.by(Sort.Direction.ASC, "createdDate"));
      
        return postRepository.findByCategory(category, pageable).stream()
                .map(PostDto::of)
                .collect(Collectors.toList());
        }
      
  • @RequestParam enum
    • @RequestParam으로 enum을 받고 싶은데, enum에 없는 값이 오면 400(Bad Request) 발생한다. 대소문자에 sensitive하다
      • 일반적으로 enum은 대문자로 작성하게 되니까
    • https://stackoverflow.com/a/50231314 해당 방법으로 속성 설정을 하라고 하는데 안 된다
    • https://stackoverflow.com/a/50231668 해당 방법으로 했는데 이 방법도 안 된다
    • parameter를 enum으로 안 받고 String으로 받아 enum으로 변경하는 방법이 한 가지 있다.
    • https://vianneyfaivre.com/tech/spring-boot-enum-as-parameter-ignore-case 해당 방법으로 Converter 작성 및 @Component로 등록하는 방법이 성공했다 ```java import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component;

    @Component public class MyEnumConverter implements Converter<String, MyEnum> {

          @Override
          public MyEnum convert(String value) {
                  return MyEnum.valueOf(value.toUpperCase());
          }   }   ```
    
  • JPA에서 method명으로 하면 엄청 길어질 수 있어 차라리 @Query로 작성하는 게 오히려 더 가독성이 높을 수 있다

  • entity의 setter를 없애고 싶은데 setter가 없으면 unit test에서 id 설정을 할 수 없게 된다

2021-05-09

  • 오늘 13시부터 15시까지 programmers summer intern 코딩 테스트 시험 봄
    • 알고리즘 3문제, SQL 1문제
      • 첫 번째 문제는 정보를 담는 class 생성하여 해당 class를 담는 list를 조건에 맞게 정렬하면 됐다
      • 두 번째 문제는 첫 번째 문제와 비슷하지만 pq를 써야 했고 흘러가는 시간에 따라 pq에 데이터를 삽입하면 되었다
      • 세 번째 문제는 주어진 배열보다 더 큰 배열을 선언하는 게 관건이었다. 이 문제를 보고 카카오 '자물쇠와 열쇠' 문제가 떠올랐다.
      • 네 번째 문제 SQL문제로, left join과 right join을 각각한 후 union을 했다. 그리고 ifnull을 사용하였다
  • @JsonProperty
    • @RequestBody를 통해 http body의 json 형태의 데이터를 객체에 넣어 parameter로 받을 때 해당 Request Dto 클래스의 property명과 맞지 않는 경우 값이 제대로 설정되지 않는다.
    • 이때 Request DTO 클래스의 특정 변수에 @JsonProperty와 함께 http body로 얻고 싶은 데이터명을 명시해주면 된다.
    • Response DTO에도 마찬가지로 적용된다.
  • @InjectMocks
    • 보통 Service에서 주입 받는 Dao, repository를 Mock으로 주입받을 때 사용한다
    • 당연히 interface는 Mock으로 주입 받을 변수가 없기 때문에 concrete class의 변수에 적용해야 한다

2021-05-08

  • @WebMvcTest
    • 읽는 것: WebSecurityConfigurerAdapter, WebMvcConfigurer, @ControllerAdvice, @Controller
    • 읽지 않는 것: @Repository, @Service, @Component, …
    • WebMvcConfigurerAdapter를 상속 받은 SecurityConfig에서 사용되는 빈을 Test class에서 선언하지 않으면 에러가 발생한다
    • https://csy7792.tistory.com/334 여기서는 SecurityConfig에서 사용되는 빈을 모두 @MockBeanD으로 선언하라고 하는데, 다른 방법은 없을까..?

2021-05-07

  • GC에서 Young과 old로 영역을 나눈 이유
    • 객체의 생명 주기는 짧다(금방 생성된 객체가 금방 소멸된다). 오래된 객체는 계속 오래 살아 남는다.
    • minorGC를 자주 수행하여 young 영역의 객체들을 자주 지워준다.
    • Old 영역은 잘 삭제되지 않지만 많은 객체들이 있기 때문에 시각 절약에 대한 니즈가 크다
  • JVM class loader 중 extention-classloader가 수행되는 시점은?
  • mark-sweep-compation에서 stop-the-world가 수행되는 시점

2021-05-06

  • spring
    • 다형성만으로는 쉽게 부품을 갈아 끼우듯이 개발할 수 없다
      • 구현 객체를 변경할 때 클라이언트 코드도 함께 변경되어야 한다
      • 다형성만으로는 OCP, DIP를 지킬 수 없다
    • DI와 DI 컨테이너 제공을 통해 다형성 + OCP, DIP를 가능하게 지원
      • 클라이언트 코드의 변경 없이 기능 확장
      • 쉽게 부품 교체하듯이 개발
  • leetcode 문제 풀이 자동 커밋 & push

2021-05-04

  • OSX Console
    • open . : finder로 현재 directory 열기
    • oepn -e filename : text editor로 파일 열기
  • compare
      PriorityQueue<Node> minHeap = new PriorityQueue<>((a, b) -> Integer.compare(a.num, b.num));
      PriorityQueue<Node> maxHeap = new PriorityQueue<>((a, b) -> Integer.compare(b.num, a.num));
    

2021-05-03

  • [[spring-vs-spring-boot]]
  • spring rest 관련 annotation
    • @RestController : REST 방식 처리
    • @ResponseBody : view가 아닌 데이터 자체를 전달
    • @PathVariable : URL 경로에 있는 값을 파라미터로 추출
    • @CrossOrigin : Ajax의 크로스 도메인 문제 해결
    • @RequestBody : JSON 데이터를 원하는 타입으로 바인딩
  • CORS
  • 토스 컨퍼런스 세션 중 '테스트 커버리지 100%'에서 jackson보다 gson이 더 빠르다고 하셨다

2021-05-02

  • linux 관련 명령어 및 파일
    • blkid : 블럭 디바이스의 type 및 uuid 조회
    • /etc/fstab : file system table. 부팅시 자동 마운트 등의 설정 가능
    • fdisk -l : 현재 디스크 및 파티션 보기
    • nohup : 현재 session이 끊어져도 실행을 멈추지 않고 계속 진행하도록 해준다
  • 패킷의 유효기간
    • TTL(Time To Live) : IP 헤더의 필드. 패킷의 유효 기간
    • 라우터를 경유할 때마다 TTL 값을 하나씩 줄여 그것이 0이 되면 패킷의 기한이 다 된 것으로 하여 파기
    • hop count
    • default는 64 또는 128
      • 지구의 반대편까지 접근해도 경유하는 라우터의 수는 많아야 30개 정도
    • 참고 : 성공과 실패를 결정하는 1%의 네트워크 원리(5쇄)

2021-04-30

2021-04-29

2021-04-28

2021-04-27

2021-04-26

2021-04-24

  • response 방식을 어떻게 해야될지 모르곘다
    • exception, RestControllerAdvice

2021-04-23

2021-04-22

  • controller의 method의 파라미터에 존재하여 request body로부터 받아 오기 위해서는 해당 class에 getter가 있어야 받아 올 수 있다.
      // UserUpdate class에 멤버변수가 name과 picture가 있는데, getter가 존재해야 한다
      @PutMapping("/users/{id}")
      public ApiResponseDto<UserDto> update(@PathVariable("id") Long id,
                                                                                  @RequestBody UserUpdate update) {
              return ApiResponseDto.createOK(userService.update(id, update.toDto()));
      }
    
  • org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations
    • JPA에서 @query를 통해 변화를 주는 DML(NOT select)을 작성할 때, @Modifying과 @Transaction을 같이 선언해주고, 해당 method의 리턴값은 Int나 void여야 한다

2021-04-20

  • happy-6house master branch에 oauth2 적용 완료했다
    • 힘들었다
  • [[oauth2-google]]

2021-04-19

  • 카카오 메이커스 신입 백엔드 면접 (15:00 ~ 15:40)
    • 백엔드 개발자 한 분과 1대1 면접을 봤다
    • 나는 바보다
  • pull request 3가지 방식

2021-04-18

  • google oauth2 클라이언트 ID
    • OAuth2를 사용하기 위해서는 사용자 인증 정보에서 OAuth 클라이언트 ID를 생성해야 하는데, 그 전에 먼저 OAuth 동의 화면 설정을 먼저 해줘야 한다.
  • heroku 배포하고 google로 로그인했더니 DB에 이름이 ???로 들어가 있었다. UTF-8 문제로 보였다
    • DB를 UTF-8로 접속하도록 수정했다([[heroku]] 참고)

2021-04-18

2021-04-17

2021-04-16

  • [[spring-vs-spring-boot]]{spring vs spring boot}
  • '우아한Tech' 유튜브 채널을 참고해야겠다
    • 틀린 내용이 있을 수 있기 때문에 항상 내용을 의심하면서 바라보도록 하자
  • GC
  • OSI 7layers
  • SSAFY 내 프로젝트 팀원 모집 커뮤니티 플젝 vs 6반 웹 페이지 플젝
  • [[heroku]]
  • spring 통합 테스트를 추가했더니 heroku deploy 할 때 build 진행 중에 DB 연결이 안되어 테스트를 계속 실패했다
  • 알고리즘 스터디 진행 21:00 ~ 23:00

2021-04-15

  • 알고리즘 문제 풀이
    • [[swea-1953]]{SWEA 1953. 탈주범 검거}
    • [[boj-15961]]{BOJ 15961. 회전 초밥}
  • 프로그래머스 월간 챌린지2
    • 19:30 ~ 22:30
    • 3번 문제까지 풀었다
    • 1번 문제는 단순 if문 사용
    • 2번 문제는 단순한 greedy
    • 3번 문제는 위상정렬
      • 트리 형식으로 되어 있는 부분 이미지
  • bfs visit next 레벨 체크 vs current 레벨 체크

  • Web Server vs WAS

2021-04-14

  • 알고리즘 문제 풀이
  • 면접 질문
    • gc
    • DB 응답속도 높이기 위해서
      • indexing
      • 캐싱 : redis와 같은 메모리 기반 DB 활용
    • 본인 프로젝트의 URI가 REST한지

2021-04-13

2021-04-12

  • 알고리즘 문제 풀이
    • [[swea-5644]]{SWEA 5644. 무선 충전}
    • [[swea-1249]]{SWEA 1249. 보급로(D4)}
  • 스프링 입문 강의 듣기
    • 컴포넌트 스캔과 자동 의존관계 설정
    • 자바 코드로 직접 스프링 빈 등록하기

2021-04-11

  • REST에 대해서 정리중인데, 쉽지 않다…
  • 카카오 메이커스 이력서 제출했다
    • 잘 됐으면…

2021-04-10

  • spring boot main application 위치가 기본 패키지(default package)이며, 해당 패키지 하위가 component scan 대상인데, 기본 패키지 상위에 controller 폴더와 @controller 어노테이션을 붙인 controller class를 생성해서 component 스캔을 못하고, application에 반영이 안되어 mapping되어 있는 url을 접속해도 controller가 호출되지 않는 문제가 발생했다. 그래서 해당 원인을 찾느라 몇 십분 날렸다.

2021-04-09

  • DB foreign key를 연결하려고 했는데, 연결하려는 primary key 컬럼이 T라서 연결이

2021-04-08

  • gitlab page 수정
    • footnote popup 수행하는 js 코드가 pandoc으로 converting 되는 HTML에 맞춰져 있어 해당 commit을 revert함
    • footnote id를 1이상 10미만의 숫자, 그리고 1은 반드시 포함되었어야 했는데, 문자열이 와도 popup되도록 수정
    • code-block.js를 추가하여 최대 크기를 넘는 code block에 mouseover되면 position을 absolute로 설정하여 확장되도록 수정
      • position을 absolute로 변경하게 되면 parent의 공간을 잡지 않게 되어 하위의 내용들이 올라오게 된다.

2021-03-27

  • 오후 2시부터 6시까지 scofe2021 2차 대회 진행
    • 첫 번째 문제는 max 시간이 주어지고 그 max 시간 안에 몇 개의 원소(시간)가 포함될 수 있는지
      • dp 문제 같은데.. 어떻게 접근해야 할지 모르겠다..
    • 두 번째 문제는 MST를 구하는 문제
      • prim으로 구현해서 맞혔다.
    • 세 번째 문제는 트리 구조에서 2개의 노드가 주어졌을 때, 노드가 조상-자손 관계인지 물어보는 문제
      • 모르겠다…
    • 네 번째 문제는 최대 10000 길이의 문자열(text)이 1000개 있고, 최대 20 길이의 pattern이 100개 있어서 각 pattern이 몇 개의 문자열에 포함되어 있는지를 묻는 문제
      • [[KMP-algorithm]]으로 접근했는데, 틀렸다..(틀린건지 시간초과인지 잘 모르겠다..)
  • 오전 10시 모의 테스트 진행
    • 참석자 : 김지훈, 박지현, 신지수, 최지우 (all 참석)
    • 모두 열심히 참석해주었다. 4명 모두 맞힌 문제는 두 번째 문제([[boj-16922]])
    • SSAFY 백준 특강 관련한 5 문제로 선정
      • 문제를 보지 않고 난이도와 맞은 사람 수 등으로만 선정
      • 유형을 모르고 푸니까 확실히 어려웠다.

2021-03-23

  • KMP 알고리즘을 드디어 배우게 되었다

2021-03-20

  • scofe2021(Startup Coding Festival) 1차 대회 오후 2시부터 오후 6시까지 진행
    • 강남에서 밥 먹고 집 오는 지하철에서 2시부터 진행함
      • 첫 번째 문제 제출했는데 틀림. 그 상태로 상현역 도착
    • 6문제 출제되었고, 난이도는 모든 문제가 쉬웠음
      • 2시부터 6시까지인데 4시 반에 다 accept 받아서 제출하고 종료함
    • 1 번째 문제는 HH:mm으로 들어오는 시간을 비교하는 문제였는데, HH:mm 문자열 상태 그대로 비교하면 됐는데, 그걸 굳이 숫자로 나눠서 하려다가 안 그래도 된다는 걸 나중에 깨닫게 됨. 그리고, 종료 시간보다 시작 시간이 더 큰 경우가 나중에 생각이 들었음
    • 2 번째 문제는 1차원 DP 문제로, 한 칸 또는 두 칸 선택하는 DP 문제였음
    • 3 번째 문제는 주어진 맵에 정사각형이 몇 개인지 구하는 문제로, 완전 탐색으로 accept 받았음
      • 문제를 끝까지 안 읽어서 처음에는 1x1, 2x2 정사각형 개수만 세는 줄 알았음
    • 4 번째 문제는 여러 항목이 주어지고 항목의 우선 순위를 따져가면서 정렬을 하면 됐던 문제
    • 5 번째 문제는 최상단에서 좌, 우, 하로 이동할 수 있는 상황에서 최하단에 도달했을 때의 좌우 최소 횟수를 구하는 문제로, bfs로 구현
    • 6 번째 문제는 (0, 0)에서 우, 하로만 움직일 수 있는 상황에서 최하단에 도달했을 때 지나온 좌표의 weight 총합의 최대를 구하는 문제로, 우측과 하단으로만 움직일 수 있고, row 최대 사이즈가 10,000이기 때문에 2차원 DP로 풀어야 했다.
  • multiple jdk 확인
    • /usr/libexec/java_home -V

2021-03-19

  • review147에 gradle로 rest-docs 적용 중
  • gradle.properties에 JAVA_HOME 버전을 지정할 수 있음
      // gradle.properties
      org.gradle.java.home=/Library/Java/JavaVirtualmachines/adoptopenjdk-11.jdk/Contents/Home
    
  • 동일한 docker 이미지를 썼음에도 docker container 안에서 bundler와 jekyll-Spaceship gem의 최신 버전이 local과 Gitlab CI server에서 각각 다르게 설치되었다.
    • jekyll-Spaceship 0.9.8 버전에 문제가 있는건지 Gitlab CI job 진행 과정에서 FAIL이 발생했다.
    • local
      • bundler : 2.1.2
      • jekyll-Spaceship : 0.9.7
    • Gitlab CI server
      • bundler : 2.2.14
      • jekyll-Spaceship : 0.9.8
    • 버전 차이가 나는 것은 kernel 버전의 차이에 의한 걸까?
    • 버전명을 명시하지 않아 최신 버전을 설치했었는데, local의 최신 버전이었던 버전으로 명시해주어 Gitlab CI server에서도 동일한 버전이 설치되도록 하였다.

2021-03-18

  • 새로운 프로젝트 : review147
    • github page 반복 학습 application 이름 정함
  • [[do-algorithm#2021-03-18]]

2021-02-19

  • 맥북의 QuickTime Player를 실행해서 '파일 > 새로운 동영상 녹화' 후 뜨는 창에서 카메라를 아이패드로 변경해주면 아이패드 화면을 맥북에 띄울 수 있다.

2021-01-08

  • To rename underscore(_) to hyphen(-) in linux
    // 현재 위치
    for ft in d f; do find . -type $ft -execdir sh -c 'mv "$0" "${0//_/-}"' {} \; ; done 2>/dev/null
    
    • https://stackoverflow.com/a/22894534
  • 오프닝
    • 이슈 사항, 문제 제기, 관심사, 유머
  • 솔루션
  • 근거
  • 발표 분량 5분 이내
    • 시나리오
      • 이슈 사항
        • 현재 요리를 하고 있는 과정에서 소금을 얼마나 넣었는지 못 보고 지나치게 되었습니다. 해당 요리 영상을 뒤로 돌리고 싶은데, 터치하여 유튜브를 손을 쓸 수가 없습니다.
        • 어떻게 하면 손을 쓰지 않고 요리 영상을 뒤로 돌리거나 하는 등 제어를 할 수 있을까요
        • 터치 외의
    • 솔루션
      • 빽빽이
        • 음성을 통해 영상 제어가 가능합니다.
    • 근거

2021-01-07

  • 1/7 아이디어톤
    • 팀빌딩
    • 비전 수립
    • 디자인씽킹
      • '디자이너가 생각하는 사고 방식'에서 시작
      • 공감 $~$$~$ 문제 정의 $~$$~$ 아이디어 도출 $~$$~$ 시제품 제작(prototype) $~$$~$ 테스트
  • 1/8 아이디어톤
    • 아이디어 시각화
    • 아이디어 현실화
    • 아이디어 경진대회
  • move fast
    • 완벽하기 보다는 먼저 실행하자
  • SSAFY 광고제 컨셉으로 팀원 모두를 영상에 담는

2021-01-06

  • 조용민, google, ideabroker(인스타 계정)
    • 한국 10대 하루 스마트폰 스크롤 양 90m $~$$~$ 이런 것도 데이터로 남기는구나
    • 핵심 요소 3가지
      • Find Right Why(정확한 목적을 찾자)
      • Master The Pivot(주변의 목소리에 귀 기울이자)
      • Be User-friendly(사용자 친화적이어야 한다)
        • 사용자 중심적 사고
    • 루이 14세 신체 데이터 등을 통한 루이 14세의 목소리 복원
    • 테슬라 우주복을 마블에 외주 줌
    • XX카드 vs 삼성카드
      • 즉시 결제는 결제 가능한 시간이 따로 존재하는데, 결제 불가능 시간에 접속을 하게 되면 삼성카드의 경우 그 다음 결제 가능 시간에 자동으로 즉시 결제가 되도록 예약이 가능하다
    • 도미노 피자
      • 65%가 저번에 주문했던 피자를 그대로 주문한다는 데이터를 통해 원 클릭 주문 버튼을 제공하게 됐다.
    • 시각 장애인을 위한 친구들 얼굴을 3D print로 만든 졸업 앨범
    • 알파고가 사진을 보고 '곰 인형을 안고 잠들어 있는 소녀' 라는 문장을 결과로 내는 것을 보고, 유튜브 개발자가 유튜브에 해당 기술을 접목시켰다.
      • 유튜브 동영상을 시간 축으로 미분하여 특정 장면에 대한 문장을 만들어 검색을 통해 해당 동영산을 찾을 수 있도록 했다.
        e.g) 동양 남자가 두 손을 모으고 깡총깡총 뛰는 장면 $~$$~$ 강남스타일