전체 글

.
Tools/git

Git 명령어 정리

다른 깃 명령어들도 많지만, 기본적인 것을 제외한 내가 자주 쓰는 명령어 위주로 정리했다. stash git에 의해 추적되고 있는 파일들을 임시로 보관한다. 나같은 경우에는 작업 중에 우선순위가 높은 작업(오류)이 생겨서 급하게 처리해야할 때 자주 쓴다. $ git stash save 명시적인기록 $ git stash --keep-index $ git stash -u stash 스택 조회 $ git stash list stash 적용, 부분이 생략되면 스택 가장 윗부분이 적용됨 $ git stash apply stash 제거, 부분이 생략되면 스택 가장 윗부분이 제거됨 $ git stash drop stash 스택 적용 및 삭제, 부분이 생략되면 스택 가장 윗부분이 제거됨 $ git stash pop 브..

Backend/Java

UUID, 정말 안전할까?

서론 파일을 서버에 보관할 때, 파일명 변환하는 걸 java UUID를 사용해서 변환했었다. 코드 리뷰를 받던 중에 선임분이 UUID에 대한 의심을 보이셨다. 하나의 OS에 여러 앱이 가동되는 환경, 그리고 멀티스레드에서도 충돌 가능성이 없나? 단순하게 그냥 유니크한 값이라고 믿고 사용해왔던 터라 대답하지 못했다. 이번 기회에 UUID가 어떻게 유니크한 값을 생성하는지 알아보고 정리해보려 한다. 본론 고유성을 완벽하게 보장하려면 중앙관리시스템이 있어서 일련번호를 부여해 주면 간단하지만 동시다발적이고 독립적으로 개발되고 있는 시스템들의 경우 중앙관리시스템은 불가능하다. 개발주체가 스스로 이름을 짓도록 하되 고유성을 충족할 수 있는 방법이 필요하다. 이를 위하여 탄생한 것이 범용고유식별자(UUID)이며 국제..

Backend/Java

Tika로 파일 MIME 타입 검사

서론 최근에 코로나 밀접접촉자 판정을 받으면서 약 일주일 동안 재택근무했다. 좋긴 좋은데 집에서 하니 뭔가 집중도 안되고 카페를 못 가니 답답했다. 암튼, 소스코드 외부 반출이 안돼서 집에 있는 동안 확장자 체크 라이브러리 tika 좀 알아보라는 업무를 받았다. 업무를 하면서 알게된 내용을 정리해보려 한다. 본론 MIME(Multipurpose Internet Mail Extensions) tika는 MIME를 이용해서 파일 타입을 체크한다. MIME이 뭘까? MIME는 SMTP 프로토콜에서 이메일을 보낼때 파일을 확인하기 위해 생성된 표준인데, 이제는 많은 프로토콜에서 같은 목적으로 MIME를 사용하기 시작했다. 그래서 "Internet Media Type"이라고 부르기도 한다. 대부분의 프로토콜에서 ..

Backend/Java

YAML) @PropertySource에서 EnvironmentPostProcessor까지

서론 application.yml은 yaml 사용하는데, 왜 @PropertySource는 properties를 사용하나요? 시작은 이렇다. 프로젝트 내에서 업무 외적인 환경변수는 application.yml에, 업무 내적인 환경변수는 별도의 @PropertySource로 biz.properties를 사용하는 구조였다. 그래서 아무래도 가독성이 좋은 yaml로 통일하는 게 좋은 것 같은데, property를 사용하는 특별한 이유가 있냐고 물어봤었다. 특별한 이유는 없었고 yaml을 쓰려면 추가적으로 설정해줘야 하는 게 있는데 그걸 한번 알아보라는 업무를 받았다.😂 property로 했던 기능들을 yaml로 별 이상 없이 쓸 수 있으면 yaml로 통일하자고 하셨다. 단순히 그냥 확장자만 바꾸면 될 줄 알았..

Backend/Java

SpringBoot profile logback

서론 스프링 부트 환경에서 profile별로 로깅 방식과 레벨을 설정해야 했다. 이전에 쓰던 프로젝트의 logback.xml 소스를 받아 그대로 사용해도 됐지만, logback.xml에서 profile마다 로그 레벨과 appender를 지정하는 게 내 눈에는 복잡해 보였고 좀 더 좋은 방법이 없을까 찾아보게 되었다. SpringBoot Logback spring-boot-starter에는 기본적으로 slf4j 인터페이스를 구현한 logback을 사용한다. 사용자는 slf4j를 인터페이스를 사용하는 덕분에, log 구현 라이브러리를 손쉽게 교체할 수 있다. log4j, logback, log4j2가 있고 후자일수록 성능이 더 좋다고 하지만 스프링 부트가 기본적으로 사용하는 logback을 사용하기로 했다...

일상

TIL 시작

Today What I Did, 오늘 퇴근 후에 뭐 했나? 취업 전에는 퇴근하고 카페 가서 자기 계발하면서 열심히 해야지~ 했는데 막상 해보니 쉽지 않다😑 야근하고 집 와서 저녁 먹으면서 유튜브 하나 보면 9시 10시 되니까 아무것도 못하겠다. 퇴근하고 카페로 공부하러 바로 간다는 친구 이야기 듣고, '오 대단하네' 생각했는데, 생각보다 더 대단한 놈이었다; 아무튼 자기계발할 시간이 생각보다 많이 부족해서(체력이 안돼서ㅠ), 계획을 바꿨다. 추가적으로 공부하는 건 주말에 하고, 평일에는 배운 거 정리하는 거에 목표를 두자! 이런 식으로 약간 합리화해버렸다. 그래서 이 카테고리에 회사에서 배운 내용을 간단하게나마 기록해보려 한다. 그냥 이렇게 기록이라도 안 하면 다 기억에서 날아갈 거 같은 느낌? 좀 불안..

Backend/Java

Java Stream과 Multi Thread

서론 코딩 테스트를 했을 때, Stream을 사용했는데 사용한 이유에 대해서 면접관이 물어본 적이 있다. 나는 대충 "사람의 언어에 가까운 함수형 프로그래밍으로 가독성이 좋다" 이런 식으로 대답했었다. 면접관은 원하는 대답이 아니었는지, 멀티스레드 환경에서 Stream 장점을 설명해보라 했는데 자세히 알지 못해서 그냥 "하드웨어와 애플리케이션이 멀티스레드 환경이라면 병렬 처리를 지원해줘서 더 좋다"라고 대답했었다. 그러고는 질문이 끊겼는데... 좋은 인상을 준 건 아닌 느낌😰 이번 기회에 Stream과 멀티스레드가 무슨 관계가 있는지 좀 더 자세히 알아보려 한다. Stream 탄생 이유 Collection을 가공하고 처리하는 Java8 API다. 기존의 Collection으로도 요구사항을 다 처리할 수 ..

Backend/Java

JDBC query vs queryForObject

서론 Spring JDBC를 연습하던 중에 단일 행을 조회하는 데 query를 사용하는 예시를 봤다. query는 List 객체를 반환해 굳이 단일 행을 조회하는 데 query를 쓸 필요가 있나? 하고 queryForObject를 써서 바로 단일 객체로 받아왔다. 정상적으로 작동했고 나름 뿌듯해하면서 예외상황에 대한 테스트 코드를 작성했다. 서비스에서 email를 찾지 못할 시 NotFoundException(404)를 던지게 코드를 작성했다. @Transactional public User login(Email email, String password) { checkNotNull(password, "password must be provided."); User user = findByEmail(emai..

비비빅B
어제의 최선