분류 전체보기
[Effective Java] 5장 제네릭
[Effective Java] 5장 제네릭
2019.12.11제네릭의 본질은, 런타임에 ClassCastException이 발생하는 것을 막아주어 타입 안전성을 높이는데 있다. 아이템 26. raw 타입은 사용하지 마라 (제네릭 쓸 때 를 빼먹지 않도록 주의해라) raw타입이란 ``java List``가 아니라 그냥 ``List``로, 제네릭을 타입 지정 없이 쓰는 것을 말한다. 이걸로 받으면 아무 타입이나 담을 수 있게 된다. 이는 타입 안전성을 해치게 된다. 예를 들어 List로 캐스팅해서 쓰면, List에 Integer를 넣을 수 있다! ```java List a = new ArrayList(); a.add("qwer"); List b = a; b.add(Integer.valueOf(333)); System.out.println(b.get(0)); Syste..
[Effective Java] 4장 클래스와 인터페이스
[Effective Java] 4장 클래스와 인터페이스
2019.12.05아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 잘 설계된 컴포넌트는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 완벽히 숨긴다. 필요한 것만 public으로 공개한다. 즉, 구현과 API를 깔끔히 분리하고 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 개의치 않는다. 정보 은닉(=캡슐화) 개념. 메서드를 public으로 한다는건, 다른 컴포넌트가 이 메서드를 사용할 여지가 있다는 것이다. 이는 즉, 바꾸고 싶을 때 의존성 때문에 바꾸지 못하는 경우가 생기고, 지속적으로 관리해줘야 된다는 의미가 된다. 그래서 접근성은 가능한 한 낮게 할당하는 것이 좋다. private이라면 내부에서 언제든 변경 가능하기 때문에. 아이템 16. public 클래스에서는 pu..
[Effective Java] 3장 모든 객체의 공통 메서드
[Effective Java] 3장 모든 객체의 공통 메서드
2019.12.04아이템 10. equals는 일반 규약을 지켜 재정의하라 자바에서는 `` ==``의 동작이 두 가지다. 원시 타입에 사용할 경우, 두 피연산자의 값이 같은지 비교 (동등성, equality) 참조 타입에 사용할 경우, 두 피연산자의 주소가 같은지 비교 (참조 비교, reference comparision) equals는 두 객체가 물리적으로 같은가가 아니라 논리적 동치성을 확인해야 할 때 재정의 한다. equals 메서드를 재정의 할 때는 반드시 일반 규약을 따라야 한다. equals 메서드는 동치관계(equivalence relation)를 구현하며, 다음을 만족한다. ```java // x, y, z는 null이 아닌 참조 값이어야 함. Objects.requireNonNull() 사용 권장. 반사성..
[Effective Java] 2장 객체 생성과 파괴
[Effective Java] 2장 객체 생성과 파괴
2019.12.02아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라 GoF에 나오는 팩터리 메서드와는 다르다. public 생성자에 `` new``를 써서 객체를 만드는게 아니라, 아래 처럼 팩터리 메서드를 사용하는 것을 말함. public 생성자와 static factory 메서드는 각자 장단이 있지만, 후자가 유리한 경우가 더 많다. public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 장점0. 같은 메서드 시그니처를 가진 목적이 다른 생성자를 만들 수 있다. 책에는 나와있지 않지만 실제로 이런 경우에도 유용하다. @Data public static class DataArea { private final Strin..
일단 다 가져와서 앱에서 필터링? vs 쿼리 WHERE에서 필터링?
일단 다 가져와서 앱에서 필터링? vs 쿼리 WHERE에서 필터링?
2019.11.28findAll로 다 가져와서 앱에서 필터링? 아니면 쿼리 WHERE절에서 필터링? 어디서 관리하는게 더 나은가? PagingItemReader 같이 offset 기반으로 분할해서 읽어오는 경우, 일단 다 가져와서 앱에서 필터링하게 되면 update로 인한 offset이 틀어짐이 발생 할 수 있다. 전제 작업 A1 read 대상 항목 : complete=n & type=A 작업 B1 read 대상 항목 : complete=n & type=B 작업 A1, B1에서는 read 대상 항목을 임시 테이블에 적재 작업 A2, B2에서는 임시 테이블에서 대상 가져와 complete=y로 update 작업 {}1, {}2는 다른 Step으로 되어 있음. (Chunk 단위 처리 아님) 같은 Step으로 구성하고 read..
[IntelliJ] 내장 Tomcat 사용하지 않고 직접 연결하기
[IntelliJ] 내장 Tomcat 사용하지 않고 직접 연결하기
2019.11.26tomcat 설치 ```bash # java 먼저 설치하고, JAVA_HOME 환경변수 설정. $ brew search tomcat $ brew install tomcat $ /usr/local/Cellar/tomcat@8/8.5.49/bin/catalina configtest # 확인 차 $ /usr/local/Cellar/tomcat@8/8.5.49/bin/catalina start # localhost:8080 접속해서 잘 뜨나 확인 $ /usr/local/Cellar/tomcat@8/8.5.49/bin/catalina stop ``` IntelliJ 연동 Run - Edit Configurations... Tomcat Server 항목 추가 Tomcat Home 경로는 `` /usr/local/C..
[리팩터링 2판] 1장, 2장 - 성능, 경제적인 효과
[리팩터링 2판] 1장, 2장 - 성능, 경제적인 효과
2019.11.18지엽적인 성능 개선에 집착하지 마라 리팩터링 하다 보면, 예를 들어 반복문을 분리면서 같은 인덱스로 반복을 2번 돌게되는 경우 같은, 성능 관점에서 비효율적인 코드를 종종 마주치게 된다. 그 때 읽어보면 좋은 글. 무엇보다도 반복문을 쪼개서 성능이 느려지지 않을까 걱정할 수 있다. 이처럼 반복문이 중복되는 것을 꺼리는 이들이 많지만, 이 정도 중복은 성능에 미치는 영향이 미미할 때가 많다. ... 경험 많은 프로그래머조차 코드의 실제 성능을 정확히 예측하지 못한다. 똑똑한 컴파일러들은 최신 캐싱 기법 등으로 무장하고 있어서 우리의 직관을 초월하는 결과를 내어주기 때문이다. 또한 소프트웨어 성능은 대체로 코드의 몇몇 작은 부분에 의해 결정되므로 그 외의 부분은 수정한다고 해도 성능 차이를 체감할 수 없다...
[JS] ArrayBuffer와 DataView : TypedArray
[JS] ArrayBuffer와 DataView : TypedArray
2019.10.31ArrayBuffer는 다음과 같은 상황에서 유용하다. 어떤 API가 커다란 사이즈의 Buffer를 통째로 받아야 해서, Buffer에 여러가지 정보를 담아서 넘겨야 한다. (예를 들어 WebGL. 여러가지 Instance의 정보를 한꺼번에 Buffer에 담아서 넘겨야 한 번에 Buffer를 보고 쭉 그릴 수 있다.) C/C++라면 memcpy를 사용해도 되고 포인터를 이용해서 직접 써도 되지만, JS는 그렇지 않다. 그래서 ArrayBuffer를 이용해서 커다란 Buffer를 할당한 다음, (malloc) Type, byteOffset, length를 지정해서 Buffer의 일부 영역을 Chunk로 반환 받을 수 있다. (포인터로 연결하는 것 같은 느낌) Buffer Chunk1 (Int32Array)..
피어슨 상관 계수 (Pearson Correlation Coefficient)
피어슨 상관 계수 (Pearson Correlation Coefficient)
2019.10.20상관계수(correlation coefficient)란 두 변수가 어떤 상관 관계를 가지는가?를 의미하는 수치다. +1은 완벽한 양의 선형 상관 관계, 0은 선형 상관 관계 없음, -1은 완벽한 음의 선형 상관 관계를 의미한다. X와 Y 사이의 피어슨 상관 계수를 구하는 식은 다음과 같다 \\[r_{XY} = \frac{ \sum^n_i (X_i - \bar{X})(Y_i - \bar{Y}) }{ \sqrt{\sum^n_i (X_i - \bar{X})^2} \sqrt{\sum^n_i (Y_i - \bar{Y})^2} } \\] 여기서 X, Y는 vector인데 식을 조금 들여다보면 결국 다음과 같은 과정이다. 1. 각 vector의 표본평균\\(\bar{A}\\)를 구해서 A의 0이 아닌 각 원소에 빼주..
지급결제란?
지급결제란?
2019.10.09참고1. https://www.bok.or.kr/portal/main/contents.do?menuNo=200347 참고2. 지급결제/송금 프로세스 및 시스템 구성 - PART I (ver 4.0) 참고3. 금융결제원, 한국은행, 은행의 지급결제 망 구조 프로세스 등등 지급결제제도 개요 쉽게 말하면 어떤 경제활동으로 인해 돈을 지급하는 것을 지급결제라고 한다. 물건을 구매한다거나, 서비스를 이용한다거나, 핸드폰 요금을 낸다거나, 월급을 준다거나 하는 모든 것이 지급결제다. 우리나라의 지급결제제도 우리나라의 주요 지급결제시스템 개요 한국은행의 거액결제시스템 건수가 많지 않고 금액이 크기 때문에 요청 즉시 결제 금융결제원의 소액결제시스템 건수가 많고 개별 금액은 작기 때문에 일정기간(1일) 동안 발생한 모든..
[Spring] Controller에서 사용하는 애너테이션
[Spring] Controller에서 사용하는 애너테이션
2019.09.25@ModelAttribute / @RequestBody 애너테이션은 웬만하면 붙여주는 편이 명확하다. @ModelAttribute를 명시하지 않아도 자동으로 URL 파라미터를 객체로 매핑해주고, GET은 관례적으로 URL 파라미터로 데이터를 전달하기 때문에, 굳이 @ModelAttribute를 사용해야 하느냐 라고 생각할 수 있는데 Controller에서 GetMapping 메서드는 사실 (URL 파라미터/HTTP 바디) 양 쪽 모두 데이터를 받을 수 있다. https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Summary_table 보면, GET의 경우 Request has Body가 No가 아니라 Optional로 되어 있다. POST, PUT도 마..
PG / VAN 이란?
PG / VAN 이란?
2019.09.23PG (Payment Gateway) PG == 전자결제를 대행하는 업체 전자결제 대행 서비스란, 인터넷 쇼핑몰에서 상품 및 서비스를 구매하는 고객들의 결제(신용카드 및 기타 결제수단)를 중계하는 서비스를 의미한다. PG는 왜 필요한가? 무슨 일을 하나? 온라인 카드 결제를 처리할 때, PG가 하는 일은 다음과 같다. (e.g., mpi 일반결제) VAN과 계약 하고 ㅇㅇ카드, ㅁㅁ카드, ... 선택 페이지 만들고 ㅇㅇ카드 선택 시 VAN에서 요구하는 파라미터들과 함께 팝업으로 VAN을 호출 VAN은 VAN 페이지 -> 카드사 페이지로 포워딩 카드사 페이지에 카드 번호 입력해서 카드사 측에서 인증이 완료되면, 카드사는 인증 완료되었다는 키값을 돌려주고 이 키 값을 이용해서 VAN에 승인 요청 TCP 전문..