전체 글

기록과 정리의 공간
· ETC
Querydsl를 사용하던 중 Expressions.stringTemplate을 이용해 MySQL에 DATE_FORAMT을 사용했는데, 실제 API는 잘 작동하지만 Test 코드에서는 DATE_FORMAT 함수가 없다고 오류가 발생했다. 실제 API 데이터베이스는 MySQL을 사용하고 테스트는 H2 Database를 사용했다. ... Expressions.stringTemplate( "date_format({0}, '%m')", user.createdDateTime ), ... 검색해보니 H2에는 DATE_FORMAT 함수가 없고 FORMATDATETIME을 사용해야 하는데 요것을 사용하면 실제 API에서 오류가 발생하고... 그래서 H2 Database에 사용자 정의 alias를 등록해 사용하기로 하였..
· 클린코드
의도를 분명히 밝혀라 의도가 분명하게 들어나있는 이름을 지어라. 좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다. 그러므로 이름을 주의 깊게 살펴 더 나은 이름이 떠오르면 개선하기 바란다. 변수나 함수 그리고 클래스 이름은 존재의 이유, 수행기능, 사용 방법을 주석으로 설명하지 않아도 알 수 있어야 한다. public Set getNumbers() { Set numbers = new HashSet(); while (numbers.size() < 7) { Integer number = (int) (Math.random() * 45) + 1; numbers.add(number); } return numbers; } 위 함수는 1부터 45까지 중복이 없는 랜덤한 7개의 숫자를..
· 클린코드
코드는 언제나 존재한다. 여러 개발자들은 코드는 더 이상 문제가 아니라고, 새로운 기술이나 비지니스 모델의 요구사항에 집중해야 한다고 생각하는 사람도 있다. 실제로 코드의 종말이 코앞에 닥쳤다고 주장하는 사람이 없지 않다. 코드를 자동으로 생성하는 시대가 다가온다는 말이다. 그때가 되면 프로그래머는 필요가 없다. 하지만 이것은 절대로 불가능한 기대다. 인간 조차도 고객의 막연한 감정만 갖고는 성공적인 시스템을 구현하지 못한다. 궁극적으로 코드는 요구사항을 표현하는 언어라는 사실을 명심한다. 요구사항에 더욱 가까운 언어를 만들 수도 있고, 요구사항에 정형 구조를 뽑아내는 도구를 만들 수도 있다. 하지만 어느 순간에는 정밀한 표현이 필요하다. 그 필요성을 없앨 방법은 없다. 그러므로 코드도 항상 존재하리라...
· Java
스트림에서는 한 번만 연산을 수행할 수 있으므로 결과도 한 번만 얻을 수 있다는 것이 Java8 스트림의 가장 큰 단점이다. 스트림을 두 번 탐색하려면 IllegalStateException이 발생한다. 하지만 한 스트림에서 여러 결과를 얻어야 하는 상황이 있을 수 있다. 그러려면 한 번에 한 개 이상의 람다를 스트림으로 적용해야 한다. 즉, fork 같은 메서드를 이용해서 스트림을 포크(분기) 시키고 포크된 스트림에 다양한 함수를 적용해야 한다. 심지어 여러 연산을 각각의 스레드에서 병렬로 실행할 수 있다면 더 좋을 것이다. 하지만 Java8의 스트림에서는 이 기능을 제공하지 않는다. Spliterator(특히 늦은 바인딩 기능을 활용), BlockingQueue, Future를 이용해서 Java8에서..
· Java
Java8의 라이브러리와 언어의 업데이트된 부분을 알아보자. 어노테이션(annotation) Java의 어노테이션은 부가 정보를 프로그램에 장식할 수 있는 기능이다. 즉, 어노테이션은 문법적 메타데이터(syntactic metadata)다. Java8의 어노테이션은 두 가지가 개선되었다. 1. 어노테이션 반복 이전 자바에서는 선언에서 지정한 하나의 어노테이션만 허용했다. @interface Author { Stirng name(); } @Auth(name="a") @Auth(name="b") @Auth(name="c") // 에러 발생 : 중복된 어노테이션 이제 반복 조건만 만족한다면 선언을 할 때 하나의 어노테이션 형식에 여러 어노테이션을 지정할 수 있다. 어노테이션 반복은 기본으로 제공되는 기능이 아..
· Java
패턴 매칭 일반적으로 함수형 프로그래밍을 구분하는 중요한 특징으로 구조적인 패턴 매칭(pattern matching)을 들 수 있다. 예를 들어 자동차 연료를 주입하는 로직이 있다고 가정했을때 가솔린, 디젤, 전기 차량에 따라 다른 연료를 주입해야 한다. 이럴때 자바에서는 if-then-else나 switch문을 사용해서 구현하곤 한다. public class Car { } public class GasolineCar extends Car { } public class DieselCar extends Car { } public class ElectricCar extends Car { } // 연료 주입 public Car fuel(Car car) { if (car instanceof GasolineCar..
· Java
스트림과 게으른 평가 스트림은 데이터 컬렉션을 처리하는 편리한 도구다. 효율적인 구현 및 여러 이유로 Java8 설계자들은 스트림을 조금 특별한 방법으로 java8에 추가했다. 그중 하나로 스트림은 단 한 번만 소비할 수 있다는 제약이 있어서 스트림은 재귀적으로 정의할 수 없다. 자기 정의 스트림 다음 코드처럼 소수 스트림을 계산할 수 있다. public boolean isPrime(int candidate) { int candidateRoot = (int) Math.sqrt((double) candidate); return IntStream.rangeClosed(2, candidateRoot) .noneMatch(i -> candidate % i == 0); } public Stream primes(i..
· Java
함수는 모든 곳에 존재한다. 함수형 프로그래밍이란 함수나 메서드가 수학의 함수처럼 부작용 없이 동작함을 의미한다. 함수형 언어 프로그래머는 함수형 프로그래밍이라는 용어를 좀 더 폭넓게 사용한다. 즉, 함수를 마치 일반 값처럼 사용해서 인수로 전달하거나, 결과로 반환받거나, 자료구조에 저장할 수 있음을 의미한다. 일반 값처럼 취급할 수 있는 함수를 일급 함수(first-class function)라고 한다. 자바 8에서는 :: 연산자로 메서드 참조를 만들거나 람다 표현식으로 직접 함숫값을 표현해서 메서드를 함수값으로 사용할 수 있다. 고차원 함수 함수형 프로그래밍 커뮤니티에 따르면 다음 중 하나 이상의 동작을 수행하는 함수를 고차원 함수(higher-order functions)라 부른다. 하나 이상의 함..
· Java
재귀와 반복 순수 함수형 프로그래밍 언어에서는 while, for 같은 반복문을 표함하지 않는다. 이러한 반복문 때문에 변화가 자연스럽게 코드에 스며들 수 있기 때문이다. 예를 들어 while 루프의 조건문을 갱신해야 할 때가 있다. 그렇지 않으면 루프가 아예 실행되지 않거나 무한으로 반복할 수 있다. 이외의 일반적인 상황에서는 루프를 안전하게 사용할 수 있다. 함수형 스타일에서는 다른 누군가가 변화를 알아차리지만 못한다면 아무 상관이 없다고 설명했다. 즉, 지역변수는 자유롭게 갱신할 수 있다. Iterator it = names.iterator(); while (it.hasNext()) { String name = it.next(); } 위 코드에서 호출자는 변화를 확인할 수 없으므로 아무 문제가 없다..
· Java
시스템 구현과 유지보수 대부분의 대규모 소프트웨어 시스템에서 실질적으로 많은 프로그래머가 유지보수 중 코드 크래시 디버깅 문제를 가장 많이 겪게 된다. 쉽게 유지보수할 수 있으려면 프로그램이 어떤 모습이어야 할까? 프로그램이 시스템의 구조를 이해하기 쉽게 클래스 계층으로 반영한다면 좋을 것이다. 시스템의 각 부분의 상호 의존성을 가리키는 결합성(coupoing)과 시스템의 다양한 부분이 서로 어떤 관계를 갖는지 가리키는 응집성(cohesion)이라는 소프트웨어 엔지니어링 도구로 프로그램 구조를 평가할 수 있다. 이러한 문제들을 함수형 프로그래밍이 제공하는 부작용 없음(no side effect)과 불변성(immutablility)이라는 개념으로 해결하는데 도움을 준다. 공유된 가변 데이터 코드 크래시는 ..
beekei
Bonglog - 기록과 정리의 공간