전체 글

전체 글

    [EasyValet. Refactorying] # 11. GlobalException에 @ExceptionHandler가 너무 많은데?

    프로젝트 코드를 작성하다가 새로운 예외가 필요했습니다. 예외 객체를 만들고 전역에서 발생하는 Exception을 처리하는 클래스에 예외를 추가하려하는데 스크롤을 한도 끝도 없이 내려야했습니다. 마지막 라인을 보는데 212라인? 이게 말이됩니까? '서비스가 커지고 예외가 더 많아지면 어떻게 처리하고 코드 가독성을 어떻게 할꺼며 와... 답이 없다.' 정말 답이 없었습니다. 리펙토링하면 분명 줄일 수 있는 코드였습니다. 우선 제가 가진 선택권은 두가지가 있었습니다. 기존에 사용하던 RuntimeException을 모두 확장하고 있으니 RuntimeException을 처리하는 ExceptionHandler을 만드는 작업을 진행할 것인가? 트리형식의 계층 구조를 만들고 조금 더 깔끔하게 코드를 만들 것인가? 조..

    [백준 4949] 균형잡힌 세상

    문제 세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다. 정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다. 문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다. 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다. 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다. 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다. 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다. 짝을 이루는 두 괄호가 있을 때, 그 사이에 있..

    [백준 4949] 균형잡힌 세상

    문제 세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다. 정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다. 문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다. 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다. 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다. 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다. 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다. 짝을 이루는 두 괄호가 있을 때, 그 사이에 있..

    [백준 1436] 영화감독 숀

    문제 666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워즈를 만들 때, 스타워즈 1, 스타워즈 2, 스타워즈 3, 스타워즈 4, 스타워즈 5, 스타워즈 6과 같이 이름을 지었고, 피터 잭슨은 반지의 제왕을 만들 때, 반지의 제왕 1, 반지의 제왕 2, 반지의 제왕 3과 같이 영화 제목을 지었다. 하지만 숌은 자신이 조지 루카스와 피터 잭슨을 뛰어넘는다는 것을 보여주기 위해서 영화 제목을 좀 다르게 만들기로 했다. 종말의 숫자란 어떤 수에 6이 적어도 3개이상 연속으로 들어가는 수를 말한다. 제일 작은 종말의 숫자는 666이고, 그 다음으로 큰 수는 1666, 2..

    [백준 3474] 교수가된 현우

    문제 알고리즘의 킹갓제너럴엠퍼러마제스티충무공알고리즘마스터 현우가 교수로 취임하였다! 그러나 학생들에게 크나큰 기대를 품고 첫 수업에 들어갔던 현우는 아무도 외판원 순회 문제(Traveling Salesman Problem, TSP)를 풀지 못하는 것을 보고 낙심하였다. 그 와중에 학생 남규는 TSP를 완전탐색으로 풀려고 하였고, 현우는 그걸 보고 경악을 금치 못한다. 왜냐면 TSP를 완전탐색으로 풀려면 O(N!)의 시간이 소모되는데, 이는 경악을 금치 못할 시간이기 때문이다. 그러나 남규는 O(N!)이 왜 큰지도 잘 모른다. 그래서 현우는 더더욱 경악을 금치 못하고, N!이 얼마나 큰지 대략적으로나마 알려주기 위해, 자연수 N이 주어지면 N!의 오른쪽 끝에 있는 0의 개수를 알려주기로 하였다. 그러나 현..

    [EasyValet.] #10. 현재 프로젝트 비밀번호 저장 방법은 안전할까?

    현재 단방향 해싱 기법을 사용해서 비밀번호를 암호화하여 저장하고 있는데 문득 의문이 생겼습니다. "안전할까?" 단방향 Hashing은 같은 값을 해쉬 함수에 넣으면 매번 같은 값을 반환합니다. 뭔가 안전하지 않은데? 생각이 들었습니다. 찾아보니 레인보우 테이블을 이용한 레인보우 어택으로 충분히 시도가 가능하다는 것을 알 수 있었습니다. 즉 단방향 해싱 기법은 안전하지 않다는 말입니다. 레인보우 테이블이란 매번 해싱하는 것은 많이 시간이 필요하기 때문에 비밀번호의 경우의 수들을 모두 특정 해싱 알고리즘에 따라 미리 계산해서 테이블에 저장하고 해킹한 해싱된 패스워드를 테이블에서 찾는 방식입니다. 이를 개선할 수 있는 암호화 방식이 없나 찾아봤습니다. 솔팅과 키스트레칭을 활용하여 같은 비밀번호를 변환하더라도 ..

    [EasyValet.] #9. Github Action으로 CI/CD 적용하기 - gitflow편

    이전 편에서 gitflow에 ssh 접속을 적용하기 위한 ssh key를 만드는 방법을 알아 봤습니다. 이번에는 ssh key들을 가지고 gitflow에 적용하는 법을 알아보겠습니다. gitflow를 만들고 사용하는 방법은 제 포스팅을 보시면 될 것 같습니다. https://beinghonest.tistory.com/145?category=936275 우선 사용할 환경변수와 키가 외부로 노출되지 않아야하기 때문에 github secrets에 private를 설정하겠습니다. repository > setting tab > secrets(왼쪽 메뉴 탭) 위의 경로를 따라가면 아래와 같은 화면을 볼 수 있습니다. new repository secret을 통해 [key: value]로 작성합니다. 작성을 하실 ..

    [EasyValet.] #8. Github Action으로 CI/CD 적용하기 - SSH 편

    프로젝트를 build하고 클라우드 서버에 옮겨 실행시키는 과정을 수동으로 진행했었고 매번 같은 작업을 하는게 비효율적이었습니다. 처음에는 직접 타이핑했던 명령어들을 묶어 shell 실행파일을 만들었고 shell파일을 실행을 위해 alias를 등록해서 사용했습니다. 문제는 원격 리파지토리의 main 브랜치의 머지와 build하여 배포하는 것을 매번 다르게 했습니다. 둘다 Production 코드이고 협업을 한다는 관점에서 main 브랜치의 상태는 언제나 운영서버에 배포되는 코드의 상태와 같아야했기 때문입니다. 그래서 CI/CD를 적용하기로 했습니다. 많은 분들이 jenkins을 사용하고 있어서 저는 github action으로 구성해보기로 했습니다. jenkins말고 gihub action을 사용하는 것은..