분류 전체보기: 2108개의 글
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/cIkohw/btrOwLGKuZB/HKRZOiBaBVTc7k5OJreyF0/img.png)
자바 8의 함수형을 이용하면 가독성 있는 한 줄의 코드로 그룹화를 구현할 수 있다. 예를 들어 고기를 포함하는 그룹, 생선을 포함하는 그룹, 나머지 그룹으로 메뉴를 그룹화할 수 있다. 팩토리 메서드 Collectors.groupingBy를 이용하자. Map dishesByType = menu.stream().collect(groupingBy(Dish::getType)); {FISH=[parawns, salmon], OTHER=[french fries, rice, season fruit, pizza], MEAT=[pork, beef, chicken]} Dish.Type과 일치하는 모든 요리를 추출하는 함수를 groupingBy 메서드로 전달. 이 함수를 기준으로 스트림이 그룹화되므로 이를 분류 함수(cla..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/GdyGd/btrOwkv9ryr/XkOcSmt5IXlP6IVTKO7DY0/img.png)
컬렉터란 무엇인가? Collector 인터페이스 구현은 스트림의 요소를 어떤 식으로 도출할지 지정한다. 명령형 코드에서는 문제 해결하는 과정에서 다중 루프와 조건문을 추가하며 가독성과 유지보수성이 크게 떨어진다. 반면 함수형 프로그래밍에서는 필요한 컬렉터를 쉽게 추가할 수 있다. 고급 리듀싱 기능을 수행하는 컬렉터 collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있다는 점이 컬렉터의 최대 장점이다. 스트림에 collect를 호출하면 스트림의 요소에 (컬렉터로 파라미터화된) 리듀싱 연산이 수행된다. 내부적으로 리듀싱 연산이 일어나는 모습 명령형 프로그래밍에서는 우리가 직접 구현해야 했던 작업이 자동으로 수행된다. collect에서는 리듀싱 연산을 이용해서 스트림의 각 요소를 ..
메뉴의 칼로리 합계를 reduce로 구할 수 있다. int calories = menu.stream() .map(Dish::getCalories) .reduce(0, Integer::sum); 사실 위 코드에는 박싱 비용이 숨어 있다. 내부적으로 합계를 계산하기 전에 Integer를 기본형으로 언박싱해야 한다. int calories = menu.stream() .map(Dish::getCalories) .sum(); 위와 같이 sum 메소드를 호출 할 수 없을까? map 메서드가 Stream를 생성하기 때문에 불가능 하다. 스트림의 요소 형식은 Integer 지만 (Stream) 인터페이스에는 sum 메서드가 없다. 다행히 스트리 API 숫자 스트림을 효율적으로 처리할 수 있도록 기본형 특화 스트림(p..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/b5TBUg/btrOwMMr9FR/F0KEq8IStKVv7sq2cKwit1/img.png)
메뉴에서 칼로리가 가장 높은 요리는? 같이 스트림 요소를 조합해서 더 복잡한 질의를 표현하는 방법에 대해 알아보자. 이러한 질의를 수행하려면 Integer 같은 결과가 나올 때까지 스트림의 모든 요소를 반복적으로 처리해야 한다. 이런 질의를 리듀싱 연산(모든 스트림 요소를 처리해서 값으로 도출하는)이라고 한다. 1. 요소의 합 // for-each 사용 int sum = 0; for (int x : numbers) { sum += x; } // stream 사용 int sum = numbers.stream().reduce(0, (a, b) -> a + b); int sum = numbers.stream().reduce(0, Integer::sum); reduce는 두 개의 인수를 갖는다. 초깃값 스트림의..
1. Predicate가 적어도 한 요소와 일치하는지 확인 - anyMatch if(menu.stream().anyMatch(Dish::isVegetarian)) { System.out.prinln("The menu is (somewhat) vegetarian friendly!!"); } anyMatch는 불리언을 반환하므로 최종 연산이다. 2. Predicate가 모든 요소와 일치하는지 검사 - allMatch, noneMatch allMatch메서드는 anyMatch와 달리 모든 요소가 Predicate와 일치하는지 검사한다. boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000); noneMatch는 allMatch와 반대 연..
다음은 일반적으로 인기있는 7가지 Unit Test 명명 규칙이다. 1. MethodName_StateUnderTest_ExpectedBehavior 예제: isAdult_AgeLessThan18_False withdrawMoney_InvalidAccount_ExceptionThrown admitStudent_MissingMandatoryFields_FailToAdmit 2. MethodName_ExpectedBehavior_StateUndertest 예제: isAdult_False_AgeLessThan18 withdrawMoney_ExceptionThrown_InvalidAccount admitStudent_FailToAdmit_MissingMandatoryFields 3. test[Feature be..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/bZf3iF/btrM6cMQJsq/39KJC0de7MFRzUAvteBbak/img.png)
폭포수(WATERFALL)방법론 폭포수(WATERFALL)방법론은 그림에서 알 수 있듯이 소프트웨어 개발 단계가 위에서 부터 아래로 폭포에서 물이 떨어지듯이 순차적으로 진행됩니다. 폭포수 방법론은 한단계씩 진행함에 따라 다시 이전 단계로 가지 않고 계속 진행하기에 다음 단계로 가기전에 완벽하게 요구사항을 반영하여 개발했다는 것을 전제로 합니다. 요구사항 분석 → 설계 → 구현 → 검증(테스트) → 유지보수 장점 수직적으로 진행되기에 각 과정에 대한 이해가 용이합니다. 단점 수직적으로 진행되기 때문에 개발 도중에 요구사항이 변경되었을 경우, 추가적인 비용과 시간이 들게 됩니다.(수정사항을 반영하여 처음부터 진행하게 됩니다. 😧) 애자일(AGILE)방법론 애자일(AGILE)방법론은 폭포수(WATERFALL)..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/wLUnC/btrM5O6g0EA/RcatkWSG7tpSXs6KLm0bwK/img.jpg)
어느 조직에서나 고민하며 개선하고자 하는 것이 커뮤니케이션에 대한 부분일 것이다. 특히나 빠른 의사결정이 필요한 스타트업이나 벤처의 경우엔 이 커뮤니케이션이 어떻게 이루어지느냐에 따라 회사의 운명이 좌우되는 경우도 있을 것이다. 해서 커뮤니케이션에 대한 재미난 법칙이 있어 함께 공유하고자 한다. 바로 아마존 제프 베조스의 "피자 두 판의 법칙"이 그것이다. 사람이 많을수록 더 많은 커뮤니케이션이 일어나고, 더 많은 혁신이 더 빨리 만들어질까? 그렇지는 않다. 사공이 많으면 배가 산으로 간다는 말이 많은 연구에서 입증되고 있다. 그래서 ‘팀(Team) 빌딩’과 조직운영을 좀 더 효율적으로 하고자 한다면 제프 베조스의 '피자 두 판의 법칙‘을 고려해보자. 출처 : http://www.ttimes.co.kr/..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/kTJUb/btrMJl36OfZ/GN6qx7qdATq96Oz7x5TT10/img.png)
트랜잭션의 전파 설정이란 Spring에서 사용하는 어노테이션 '@Transactional'은 해당 메서드를 하나의 트랜잭션 안에서 진행할 수 있도록 만들어주는 역할을 합니다. 이때 트랜잭션 내부에서 트랜잭션을 또 호출한다면 스프링에서는 어떻게 처리하고 있을까요? 새로운 트랜잭션이 생성될 수도 있고, 이미 트랜잭션이 있다면 부모 트랜잭션에 합류할 수도 있을 것입니다. 진행되고 있는 트랜잭션에서 다른 트랜잭션이 호출될 때 어떻게 처리할지 정하는 것을 '트랜잭션의 전파 설정'이라고 부릅니다. 전파 설정 옵션 트랜잭션의 전파 설정은 '@Transactional'의 옵션 'propagation'을 통해 설정할 수 있습니다. 각 옵션은 아래와 같습니다. REQUIRED (기본값) 부모 트랜잭션이 존재한다면 부모 트..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/kyiao/btrMrT1SwiU/ei5ipa8ygY2vammL7xYeJk/img.gif)
IntelliJ 단축키 - 윈도우 ▶ 프로젝트 창 포커스 : Alt+1 Alt+1키를 통해 프로젝트 창을 키고 끌 수 있다. 출처 : https://blog.jetbrains.com/ko/2020/03/11/top-15-intellij-idea-shortcuts_ko/ ▶ 에디터 창으로 돌아가기 : ESC 다시 코드를 쓰는 영역인 에디터 창으로 돌아가려면 ESC키를 눌러주면 된다. 출처 : https://blog.jetbrains.com/ko/2020/03/11/top-15-intellij-idea-shortcuts_ko/ ▶ 프로젝트 창 미리보기 : Space 프로젝트 창에 포커스가 위치한 상태에서 에디터 창에 열기 전에 미리 코드를 보고 싶다면 Space 키를 눌러주면 된다. 아래 사진의 빨간색 부분..