전체 글 83

정확한 계산이 필요할 땐 float와 double은 피하자

정확한 계산이 필요할 땐 float와 double은 피하자 float와 double 타입은 과학과 공학 계산용으로 설계되었다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 세심하게 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안되며, 특히 금융 관련 계산과는 맞지 않는다. 0.1 혹은 10의 음의 거듭 제곱수를 표현할 수 없기 때문이다. 예를 들어 주머니에 1.03 달러가 있는데 그중 42센트를 썼다고 해보자, 남은 돈을 얼마인가? 다음은 어설프게 작성한 코드다 System.out.println(1.03 - 0.42); 안타깝게도 이 코드는 0.6100000000000001을 출력한다. 이는 특수한 사례도 아니다. 이번에는 1달러가 있는데, 10센트짜..

Java 2021.01.18

지역변수의 범위는 최소화하자

지역변수의 범위를 최소화하라 제목의 내용은 '클래스와 멤버의 접근 권한을 최소화하라'와 비슷하다. 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. C와 같이 역사가 깊은 프로그래밍 언어 중에는 지역변수를 코드 블록의 첫머리에 선언하는 경우가 많고, 이 방식을 습관처럼 따르는 프로그래머도 있다. 하지만 자바에서는 문장을 선언할 수 있는 곳이면 어디서든지 선언할 수 있다.(C도 C99 표준부터는 변경되었다.) 지역변수의 범위를 줄이는 가장 강력한 기법은 가장 처음 쓰일 때 선언하기다. 미리 선언부터 해두면 변수를 실제로 사용하는 시점엔 타입과 초기값이 기억나지 않을 수도 있다. 그리고 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. 초기화에 필요한 정보..

Java 2021.01.05

Optional 반환은 신중히하자

옵셔널 반환은 신중히 하라 자바 8 전에는 메서드가 특정 조건에서 값을 반환할 수 없을 때의 선택지가 두 가지 있었다. 예외 - 스택 추적 전체를 캡처하므로 비용이 만만치 않다, 진짜 예외적인 상황에서만 사용해야 한다. null을 반환하면 별도의 null처리 코드를 추가해야 한다. 자바 8로 올라가면서 선택지가 생겼다. Optional이다. null이 아닌 T타입 참조를 하나 담거나, 혹은 아무것도 담지 않을 수 있다. 아무것도 담지 않은 옵셔널은 '비었다'라고 한다. 반대로 어떤 값을 담은 옵셔널은 '비지 않았다'고 한다. 옵셔널은 원소를 최대 1개 가질 수 있는 '불변' 컬렉션이다. Optional가 Collection를 구현하지는 않았지만, 원칙적으로는 그렇다. 보통은 T를 반환해야 하지만 특정 조..

Java 2020.12.31

Mysql Server Timezone 설정방법

Mysql Server Timezone 설정 방법 필자는 Mysql 5.7로 진행하였다.(5.7 이하의 버전이나 이후의 버전도 레퍼런스 확인 결과 비슷함) 아래의 명령어로 현재 타임존 확인가능 SELECT @@GLOBAL.time_zone, @@SESSION.time_zone; 위와 같이 출력되면 기본 세팅인 것(As the value 'SYSTEM', indicating that the server time zone is the same as the system time zone. - 시스템 시간대를 따라간다고 한다.) If set to SYSTEM, every MySQL function call that requires a time zone calculation makes a system librar..

프로그래밍 2020.11.16

SpringBoot Mysql Datasource 세팅

SpringBoot에서 Mysql Datasource 세팅하기. 필자는 JPA, Gradle로 진행했다.(Mybatis같은 환경도 아래 세팅으로 사용가능 할 듯) Gradle.build dependencies { ... implementation ("mysql:mysql-connector-java") implementation "org.springframework.boot:spring-boot-starter-data-jpa" ... } JPA 사용시에만 JPA 의존을 추가하자 DatabaseConfig.java @Slf4j @EnableJpaAuditing @Configuration public class DatabaseConfig { @Bean public PasswordEncoder passwordE..

Spring 2020.11.16

null을 반환하는 메서드는 자제하자.

// 컬렉션이 비었으면 null을 반환한다. - 하지말자 private final List cheesesInStock = ...; /** * @return 매장 안의 모든 치즈목록을 반환한다. 단 재고가 하나도 없으면 null을 반환한다. **/ public List getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList(chessesInStock); } 이 코드처럼 null을 반환한다면, 클라이언트는 이 null 상황을 처리하는 코드를 추가로 작성해야 한다. List cheeses = shop.getCheeses(); if (chesses != null && chesses.contains(Cheese.STILTON)) { System..

Java 2020.11.16

Spring Cloud Gateway - API Gateway 맛보기

1. 앞서 알고가기 Spring Cloud Gateway 로 API Gateway 구축에 앞서 필요한 개념을 먼저 간단하게 정리해봤다. 1-1. API Gateway 란? 인증 / 모니터링 / 오케스트레이션 등과 같은 기능을 포함한 향상된 Reverse Proxy다. Netflix zuul, Amazon API Gateway, Spring Cloud Gateway 같은 것들이 잘 알려진 Api Gateway 구현체들이다. 1-2. Spring Cloud Gateway (이하 SCG) 란? Spring Reactvie 생태계에 구현된 API Gateway이다. Gateway Handler Mapping으로 들어오는 요청들을 적절한 대상으로 라우팅하는 간단하고 효과적인 방법을 제공한다. 그리고 Spring ..

Spring 2020.10.19

Window 10 Redis 설치하기

microsoftarchive에서 window용 redis를 작업해놨는데 수 년전에 deprecated 상태로 변경됨. 커뮤니티를 확인해보니 github.com/tporadowski/redis 에서 꾸준히 관리중이니 이 버전을 활용해보기로 한다. redis는 window 환경에선 개발/테스트용으로만 사용하자 설치 1. https://github.com/tporadowski/redis/releases에서 설치형 버전과 portable 버전을 지원한다. 본인은 portable 버전으로 진행 2. 적당한 곳에 압축을 풀고 redis-server.exe를 실행한다. 테스트 1. 다른 프롬프트를 열고 redis-cli.exe를 실행한다. 해당 프로그램으로 redis client를 이용할 수 있다. 이후의 사용법이..

Infrastructure 2020.10.14

Spring Security OAuth2 - Authorization endpoint

AuthorizationServerEndpointsConfigurer에서 PathMapping 메소드를 제공한다. 이 메서드는 두 개의 변수를 받는다. 기본 경로 (프레임워크가 제공) 커스텀 경로 ("/"로 시작) public AuthorizationServerEndpointsConfigurer pathMapping(String defaultPath, String customPath) { this.patternMap.put(defaultPath, customPath); return this; } 프레임워크가 제공하는 경로는 다음과 같다 Authorization Endpoint: /oauth/authorize Token Endpoint: /oauth/token Approval Endpoint: /oauth..

Spring 2020.10.07