분류 전체보기 52

스프링에서 빌더 패턴 사용 시 주의사항 feat. 마이바티스에서 빌더 객체 오류

들어가며 빌더 패턴은 개인적으로 좋아하는 방식이다. 생성자는 필드 값이 길어지면 순서에 의존하는 경향이 강하고 자바 빈 방식은 데이터가 명확하게 세팅되지만 변경 가능하다는 단점이 있다. 빌더 패턴은 불변성 때문에 귀찮은 경우가 발생하지만, 위 두 가지 단점을 한 번에 해결할 수 있다. 그래서 이제는 다들 적극적으로 사용하고 있는 것 같다. 그럼 스프링 + Mybatis 환경에서 빌더를 적용하는 중 발생했던 오류를 보면서 무엇을 조심해야 하는지 살펴보자. 여기에는 Lombok 라이브러리를 사용했다. 문제 발생 상황 책의 제목을 변경하는 API를 개발한 BookRestController가 있다. 변경할 책의 ID와 변경하고자 하는 제목을 title 필드에 담아서 전달받는다. 기존에 잘 사용하던 기능이었으나 ..

Springboot에서 BCrypt 암호화(해시화) 구현하기 feat. 시큐리티 인증 없이 BCrypt 사용하기

들어가며 스프링 시큐리티를 공부하다가 만나게 된 BCrypt 알고리즘은 어떤 특징이 있나 살펴보기 위해 포스팅을 작성했다. 또한 예전에 기술면접에서 BCrypt에 대해 잘못된 대답을 했던 부끄러운 기억이 생각나서 '언젠가는 잘못 대답했던 내용을 만회하기 위해 정리해서 글을 써야지' 했던 다짐을 실천하는 이유도 있다. 그럼 BCrypt 방식에 대해 알아보고 어떻게 코드를 작성할 수 있는지 확인해보자. BCrypt 암호화란? 암호화 방식은 아래와 같이 구분할 수 있다. 먼저 복호화가 가능한지에 따라 양방향 / 단방향으로 구분되고, 복호화할 때 사용하는 비밀키가 암호화할 때 그대로 사용되면 대칭키, 서로 다른 키를 사용하면 비대칭키가 된다. BCrypt 알고리즘은 SHA 알고리즘과 마찬가지로 복호화 불가능하기..

JDK8에서 SHA512 암호화/해시화 구현하기

들어가며 외부 API 통신 중 검증 데이터를 해시화하여 비교하는 유효성 로직이 있었다. 대부분 SHA방식은 단방향 암호화 방식이기에 민감정보를 DB에 저장할 때 사용하거나, API 간 데이터 검증에서 사용된다. 본인은 후자의 방법으로 사용하였다. 예를 들면 A사의 이름, 연락처, 이메일 정보를 B사에 전달하여 해당 데이터에 맞는 고객정보가 있는지 조회하는 API가 있다고 하자. 별도의 VPN을 통해 데이터를 주고받을 수도 있지만 비용과 시간의 제약 안에서 현실적인 해결 방법은 데이터의 암호화 및 유효한 통신 주체인지 확인할 수 있는 검증 데이터를 사용하는 선택을 한다. 그래서 API 필드 중 "이름+연락처+이메일” 정보를 묶어 SHA로 해시화하고 비밀키로 AES 방식으로 한번 더 암호화하였다. 이를 ch..

Development/Java 2022.04.22

Invalid character found in method name 오류 해결하기

들어가며 토이 프로젝트에 SSL 작업을 더해 HTTPS 프로토콜을 적용하고 테스트하는 과정에서 발생했다. 오류 발생 환경 [ 오류 발생 환경설정 ] Synology - Docker - Ubuntu JDK 8 keytool 명령어를 통해 생성한 Keystore application.yarml에 server.ssl 관련된 속성 설정 [ 변경한 환경설정 ] Synology - Docker - Ubuntu JDK 8 keytool 명령어를 통해 생성한 Keystore application.yarml에 server.ssl 관련된 속성 주석 오류 내용 및 원인 결론은 HTTPS 프로토콜이 준비가 안된 서버에 HTTPS 요청을 보낸 경우 java.lang.IllegalArgumentException: Invalid ..

Javascript에서 성능을 측정하는 방법(실행속도 측정)

들어가며 프로젝트를 진행하는 중에 브라우저 화면을 그대로 PDF로 만들어야 하는 업무가 생겼다. 'html2pdf'라는 오픈소스를 통해 구현은 간단히 끝났지만 속도가 느리다는 새로운 문제가 발생했다. 그러다 문득 'JS에서는 속도를 어떻게 측정하지?'라는 생각이 들어 이 포스팅을 작성하게 되었다.(PDF 생성의 속도 문제를 해결하는 방법은 여기서는 생략한다) JS에서 성능 측정 방법 console.time(id: string) console.timeEnd(id: string) 두 함수는 짝을 이뤄 사용한다. 측정을 시작할 때는 console.time() 함수에 고유한 값을 문자열로 넣어주면 된다. 마찬가지로 측정을 끝낼 때는 console.timeEnd() 함수에 동일한 고유값을 문자열로 넣어준다. co..

Development/Etc 2022.03.31

JDK8에서 AES 암/복호화 구현하기

들어가며 이번 프로젝트에서 A사이트의 암호화된 사용자 정보를 바탕으로 로그인을 연동시키는 기능을 구현했다. 이때 AES, SHA 방식 모두 사용하게 되었고 이참에 자세히 기록하기 위해 글을 적는다. AES 암호화란? 암호화 방식은 아래와 같이 구분할 수 있다. 먼저 복호화가 가능한지에 따라 양방향 / 단방향으로 구분되고, 복호화할 때 사용하는 비밀키가 암호화할 때 그대로 사용되면 대칭키, 서로 다른 키를 사용하면 비대칭키가 된다. AES 알고리즘은 복호화가 가능하며, 동일한 비밀키로 암/복호화를 하기 때문에 대칭키 알고리즘이 된다. 코드로 만들어보기 JDK8을 이용해서 개발했고 별도의 라이브러리는 없이 내장된 클래스만 사용하였다. 이렇게 자바 버전을 강조하는 이유는 JDK 11 버전부터는 Datatype..

Development/Java 2022.03.30

[GCP] Google Cloud Platform 시작하기 - 계정 등록

들어가며 GCP는 이름에서 알 수 있듯 구글에서 제공하는 클라우드 플랫폼 서비스이다. AWS, Azure와 함께 전 세계에서 대표적으로 사용되고 있다. 제공되는 제품 혹은 서비스는 아래와 같다. 100개 이상의 제품이 제공되고 있어 내가 원하는 서비스 대부분이 가능하다고 생각하면 된다. 가입하기 1. GCP 홈페이지로 이동하기 위 링크를 클릭하면 아래와 같은 화면이 뜬다. 구글 로그인 후 우측 상단의 '무료로 시작하기' 버튼을 누른다. 2. 가입하기 위한 정보를 입력한다. 국가는 기본적으로 '대한민국'으로 설정되지만 한번 더 확인하고, 가입목적을 본인에게 맞게 선택해주면 된다. 약관에 동의하지 않으면 진행이 안되니 체크하고 진행하자. 3. 연락처를 통한 본인인증을 한다. 아무래도 비용이 청구되는 서비스이..

Development/GCP 2021.08.25

[Intelli J] Tab 간격 변경하는 방법(feat. 코딩 스타일 추천)

들어가며 웹 개발을 하다 보면 코드 블록의 깊이가 깊어지는 경우가 발생한다. 특히 퍼블리싱된 HTML 파일은 탭 간격만으로 모니터의 절반을 차지하기도 한다. 이런 경우 탭 간격을 기본값으로 사용한다면, 세로로 길어지는 코드로 인해 가독성이 떨어지게 된다. 그때 탭 간격의 변경이 필요해진다. 설정하는 방법 먼저 아래와 같이 1) Preferences로 이동하고 (Window는 'settings'로 이동) 2) 검색창에 "tab size"라고 검색한다. 3) Code Style 영역에서 원하는 언어에 대한 Tab size를 수정할 수 있다. 기본값은 4칸이다. 마치며 좋은 개발자가 되기 위해 좋은 습관을 몸에 익혀두자. 코딩 스타일은 그런 의미에서 항상 나은 방법을 찾아야 하고 이를 실천하는 노력이 필요하다..

Development/Etc 2021.08.24

[google-java-format] Google이 작성하는 자바 코드는 어떨까?

들어가며 코드 스타일은 개인마다 다르다. 개인이 선호하는 스타일도 있지만 보통 본인이 속한 팀의 스타일을 따라가게 된다. 그렇다면 개발자 누구나 한 번쯤 꿈꾸는 회사, 구글의 자바 코드 스타일은 어떨까? 이들의 코드 스타일이 무조건 정답은 아니지만 한번 구경해볼 수 있는 좋은 오픈소스가 있다. "google-java-format" 설치 방법 이곳에 자세한 설치 및 사용방법이 있지만, 이번 글에서는 인텔리제이에서 플러그인을 통해 사용한다. 먼저 아래와 같이 1) Preferences로 이동하고 2) Plugins를 누른 후 3) Marketplace에서 "google"을 검색하면 맨 위에 있는 "google-java-format"을 설치하고 restart를 한다. 이렇게 간단하게 사용할 준비가 끝났다. 이..

Development/Etc 2021.08.15

Collection살펴보기 - Set

컬랙션의 구현체로는 크게 4가지가 있다. 이 중 용도가 다른 EnumSet을 논외로 하고 HashSet과 LinkedHashSet, TreeSet을 중심으로 성능을 비교해보자. 성능 측정을 위한 클래스 시간 단위는 밀리세컨드를 기준으로 삼고 더 정밀한 측정이 필요할 수 있으니 나노 세컨드로 반환하는 메서드도 구현했다. 구현 코드를 보자. public class Timer { public static long checkNanoTime(CodeBlock codeBlock) { long startTime = System.nanoTime(); codeBlock.doSomething(); long endTime = System.nanoTime(); return (endTime - startTime); } publ..

Development/Java 2021.01.14