목록전체 글 (548)
똑같은 삽질은 2번 하지 말자
Stream sequence of elements supporting sequential and parallel aggregate operations 데이터를 담고 있는 저장소 (컬렉션)이 아니다. Funtional in nature, 스트림이 처리하는 데이터 소스를 변경하지 않는다. 스트림으로 처리하는 데이터는 오직 한번만 처리한다. 무제한일 수도 있다. (Short Circuit 메소드를 사용해서 제한할 수 있다.) 중개 오퍼레이션은 근본적으로 lazy 하다.(종료 오퍼레이션 없으면 동작 안함) 손쉽게 병렬 처리할 수 있다.(parallelStream 덕분) 스트림 파이프라인 중개 오퍼레이션 (intermediate operation)과 한개의 종료 오퍼레이션 (terminal operation)으로..
한 인터페이스를 여러 클래스에서 구현을 하고 있다고 한다면, 인터페이스에 기능 추가를 위해 메소드를 선언하면 구현하고 있는 모든 클래스들도 구현을 해야한다. 그 말은 그 클래스들 중에 나는 이 기능이 필요없음에도 구현을 해야하는 불필요한 코드들이 추가해야 한다. 그럼 어떻게 해야 불필요한 코드들을 작성하지 않고 인터페이스에 기능추가를 할 수 있을까? 기본 메소드 (Default Methods) 인터페이스에 메소드 선언이 아니라 구현체를 제공하는 방법 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새 기능을 추가할 수 있다. 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다. 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다. 반드시 문서화 할 것. (@implSpec..
@FunctionalInterface (함수형 인터페이스) 추상 메소드 한개만을 가지고 있는 인터페이스 SAM (Single Abstract Method) 인터페이스 @FuncationInterface 애노테이션을 가지고 있는 인터페이스 람다 표현식 (Lambda Expressions) 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다. 코드를 줄일 수 있다. 메소드 매개변수, 리턴 타입, 변수로 만들어 사용가능 @FunctionalInterface // 자바(standard)가 지원해주는 어노테이션 public interface RunSomething { /* 추상 메소드가 하나만 있으면 함수형 인터페이스 abstract는 생략 가능 (@FunctionalInterface가 있으면) */ a..
map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환합니다. var results = [ { name:"Gwak", age: 28 }, { name:"Hee", age: 29 }, { name:"Won", age: 30 }, ] results.map(result => console.log(result)); 실행결과 Object.assign() 메소드는 열거할 수 있는 하나 이상의 출처 객체로부터 대상 객체로 속성을 복사할 때 사용합니다. 대상 객체를 반환합니다. var results = [ { name:"Gwak", age: 28 }, { name:"Hee", age: 29 }, { name:"Won", age: 30 }, ] // Object.as..
리플렉션 이란? 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법 자바의 리플렉션(Reflection)은 클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경할 수 있고 메소드를 호출할 수도 있습니다. Reflection은 자바에서 기본적으로 제공하는 API입니다. 사용 방법만 알면 라이브러리를 추가할 필요 없이 사용할 수 있습니다. 리플렉션의 시작은 Class https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html Class에 접근하는 방법 모든 클래스를 로딩 한 다음 Class의 인스턴스가 생긴다. “타입.class”로 접근할 수 있다. 모든 인스턴스는 getClass() 메소드를 가지고 있다. “인스턴스.getC..
Lombok(롬복)을 사용하는 이유 ? 밑의 사진을 보면 코드가 상당히 짧고 읽기 쉽지만, 롬복을 사용 안하고 직접 코드로 구현하려고 한다 하면? 이렇게 애노테이션들을 코드로 다 구현한 것도 아닌데, 이미 코드가 상당히 길어지고 있다. 여기서 이 클래스에 비지니스 로직이라도 들어있으면 점점 코드는 길어져서 가독성이 떨어진다. 그러므로 우리는 롬복이라는 친구를 사용하고 있다. 그럼, Lombok은 어떻게 동작하는 걸까? Lombok은 컴파일 시점에 애노테이션 프로세서를 사용하여 소스코드의 AST(abstract syntax tree)를 조작한다. 애노테이션 프로세서 문서 https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Proces..
개요 매번 코드분석하다 보면 삼천포로 새버리고 1시간 2시간을 의미없이 버리는 경우가 너무 싫어서 도움되는 방법을 찾아보았다. 어떻게 하면 복잡한 업무코드를 빨리 파악할 수 있을까? 가장 좋은 방법은 업무를 잘 아는 사람(업무 전문가)이 하나하나 설명해 주는 것일 테지만 만나기 어려울 뿐만 아니라 만나더라도 매우 바쁠 가능성이 농후하다. 또한 업무 설명을 들어도 막상 개발하기 어려운데 그 이유는 업무와 코드를 연결할 수 있어야 개발이 가능한데 복잡한 업무만큼이나 코드 역시 복잡하고 대부분 코드에 도메인이 잘 드러나 있지 않아 연결하기 쉽지 않다. 필자가 처음 복잡한 업무를 맡았을 때 옆에 업무 전문가가 있었지만 그 역시 매우 바빴다. 즉, 그가 나에게 사용할 시간이 적었다. 시간이라는 제한된 자원에서 복..
사진의 Prevuious 와 Next를 font-awesome의 아이콘으로 하고 싶은데, 이미지를 넣을수도 없고 태그를 직접적으로 만질 수 도 없는 상황이다. (slick 플러그인을 쓰고 있기때문에) 그래서 가상요소를 사용한다. 가상 요소(Pseudo-Element)란? 1. 가상클래스(Pseudo-Class) 별도의 class를 지정하지 않아도 지정한 것 처럼요소를 선택할 수 있습니다. 2. 가상요소(Pseudo-Element) 가상클래스처럼 선택자(selector)에 추가되며, 존재하지 않는 요소를 존재하는 것처럼 부여하여 문서의 특정 부분 선택이 가능합니다. before요소를 이용해서 기존의 Previous Next를 완전히 없애고 fontawesome을 사용해준다. .slider .slick-pr..
@ControllerAdvice, @RestControllerAdvice 둘다 @Component이기 때문에 자동으로 빈으로 등록되며, 기본적인 차이는 @Controller @RestController 의 차이와 비슷하다고 생각한다. ArrayIndexOutOfBoundsException이 발생하면 내가 만든 커스텀 핸들러로 처리를 한다. AppError 객체는 에러내용을 담기위해 임시로 만들어준 클래스 @RestControllerAdvice public class GlobalExceptionController { @ExceptionHandler(ArrayIndexOutOfBoundsException.class) public ResponseEntity AIOOBHandler(ArrayIndexOutOfB..
tabindex 속성 - tab키를 통하여 브라우저를 탐색시, 순서를 임의로 조정 할 수 있다. - a, area, button, input, object, select, textarea 태그에 적용 가능하다. - -32767 ~ 32767 까지의 값을 입력할 수 있다. tabindex = "1" - 문서 안에서 가장 먼저 초점을 받게 한다. autofocus="autofocus"와 기능이 같다. 자연스런 Markup 순서를 거스른다. tabindex = "0" - 키보드 초점을 받지 못하는 div, span 등에 초점을 줄 수 있으며, tabindex=0은 Markup 순서대로 인식한다. tabindex = "-1" - 키보드 초점을 받을 수 있는 요소도 초점을 받을 수 없도록 만들어 준다. 초점을 받..