about.Programing

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

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

    [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을 사용하는 것은..

    [EasyValet.] #7. gitignore 적용하기

    깜빡 하고 gitignore 파일을 등록하지 않고 push했다. 아래는 내가 gitignore파일에 어떤 것들을 등록했는지와 reomote 리파지토리에 push가 먼저 되었을 경우 대처하는 방법에 대해서 알아보자. 우선 중요한건 이런 상황을 발생시키지 않게 프로젝트의 첫 push 전에 ignore파일을 확인해야한다. .gitignore 파일을 추가해서 remote git에 push 할 때 필요 없는 것들은 제외 시키려 한다. 여러가지 이야기를 하는 것 보다 .gitignore파일을 생성한 뒤 내용을 완성하고 보자. 우선 .gitignore파일을 만들고 아래 사항들을 등록한다. push를 하지 않을 파일들이나 디렉토리를 설정하는 것이다. 만약 추가하고 싶지 않은 파일들 혹은 설정이 있다면 여기에 추가 시키..

    [EasyValet.Trouble Shooting] #4. Cross Origin Resource Sharing(CORS)

    개요. 산초의 브라우저에서 api 서버로 회원가입 요청을 보내는 작업에서 CORS 설정하라는 에러가 발생했습니다. 어떻게 발생하게 되는 것이고 해결은 어떻게 하는지 기록으로 남기려합니다. 기록을 남기기전 기록을 위한 정보는 MDN에서 가져왔습니다. CORS란? 다른 출처에서 온 데이터가 신뢰할 수 있는지 확인하는 정책이다. 브라우저에는 두개의 데이터에 대해 두가지 정책이 존재합니다. SOP, CORS. sop는 same origin policy 이고 CORS는 Cross origin resource sharing 입니다. 공통점과 차이점을 보면 어떤 의미인지 알 수 있습니다. Same origin vs Cross origin 이 두가지는 같은 출처 와 교차 출처라고 해석됩니다. 전자는 같은 출처에서만 소..

    [EasyValet] #3. 서비스를 위한 DB Table 설계

    서비스를 제공하기 위해선 데이터베이스 설계가 필수적입니다. 데이터 베이스 설계에서 가장 중점적으로 생각했던 요소는 정규화 작업을 통한 도메인 분리였습니다. 아직도 결정하지 못한 문제는 자동차 도메인(테이블)을 만들 것인지 아닌지 입니다. 자동차 도메인을 만들려면 고유한 번호가 필요합니다. 테이블 행의 아이디로 고유성을 가져갈 수 있습니다. 고유번호는 다르지만 자동차 번호외의 모든 값이 같은 경우에는 어떻게 할 것인가 입니다. 그래서 해당 데이터들을 구분할 수 있는 자동차의 전체 번호를 고유번호로 사용해야합니다. 하지만 현재 사용자들이 실질적으로 사용하고 있는 데이터의 경우에는 자동차번호의 뒷 4자리입니다. 간단하게 다시 정리해보면. 자동차 도메인(테이블)을 만들기 위해서는 고유번호가 필요합니다. 하지만 ..

    람다에서 메서드 지역변수를 사용할 시 주의사항

    #1. 개요 하나의 메서드 내부에서 사용되는 람다에서 사양하고 있는 메서드의 지역변수의 상태를 변경이 불가능하다. 왜 그럴까? 이해를 더 돕기위해 아래에 코드를 첨부한다. 'Variable 'a' is accessed from within inner class, needs to be final or effectively final' 이라는 경고문이 나오면 컴파일이 불가능하다. 위의 문장을 해석해보면 아래와 같다. 변수 'a'는 내부 클래스 내에서 액세스되며 final이거나 final 처럼 사용되어야 합니다. 간단히 말하면 해당 변수 a는 변경되면 안된다는 말이다. 왜 그럴까? #2. 자유변수 이유는 자유변수 때문이다. 자유변수 : 익명함수에서 처럼 메서드 자신 말고 외부에서 정의된 변수 이와 같은 자유변..