Life Developer
인생 개발자
분류 전체보기 (141)
javascript curry함수, 커링이란?

커링이란 무엇일까?

 

쉽게 말해서 함수 안의 모든 인자가 들어올때까지 기다리는 기법이다.

 

function _curry(fn) {
            return function(a) {
                        return function(b) {
                                    return fn(a, b);
                       }
            }
}

var add = _curry(function(a, b) {
                        return a + b;

            }

);

var add10 = add(10);

console.log(add10(5);

 

여기서 curry함수를 선언하는데 이 함수는 함수를 받는다.

받은 함수는 맨 마지막에 실행된다. 아껴두었다가 인자를 모두 받고 실행한다.

굉장히 인정없는 놈?이다.

 

일단  var add = _curry(function(a, b) { 
                        return a + b;

            }

); 

여기서 add함수는 결국 var add=function(a) { 
                        return function(b) { 
                                    return fn(a, b); 
                       } 
            } ;

가 된다.

함수도 값이니까 변수에 값으로 담는것이다.

add(10)을 해서 콘솔로 띄우면

 

function(a) { 
                        return function(b) { 
                                    return fn(a, b); 
                       } 
            } 

이게 나온다. 함수가 담긴것이다.

그리고 중요한 것은 마지막 a에 10이 들어가고 기다린다는 것이다.

마지막 fn(a,b)가 fn(10,b)가 될것이고 fn을 풀면 또다시 이렇게 될것이다.

 

function(10, b) { 
                        return 10 + b;

            }

 

그럼 이제 b만 더 받으면 된다.

여기까지 add(10); 이었으니 add(10)(5)를 해주던 add(10)을 변수에 넣고 add10(5)를 해주던 같은 결과가 나온다.

 

커링을 이해하려면 시간이 걸린다.

 

최소 5번은 코드를 생각하면서 고뇌하면서 짜야된다.

 

10번은 쳐야지 조금 이해가 가고 20번을 쳐봐야 아...이런거였군  한다.

 

다음은 reduce를 배워보자.

 

'Developer' 카테고리의 다른 글

Controller와 RestController 차이  (0) 2020.09.09
자바스크립트 TDZ (Temporal Dead Zone) 임시사망지역  (0) 2020.09.04
Spring JDBC란?  (0) 2020.08.03
DataSource  (0) 2020.08.03
프로젝트 아키텍쳐  (0) 2020.08.03
  Comments,     Trackbacks
Spring JDBC란?

JDBC란?
모든 자바의 데이터 액세스 기술의 근간이 된다.
최신 ORM기술도 내부적으로는 DB와의 연동을 위해 JDBC를 이용한다.
안정적이고 유연한 기술이지만, 로우 레벨 기술로 인식되고 있다. (중복된 코드가 반복적으로 사용)

Spring JDBC란?
기존 JDBC의 장점과 단순성을 그대로 유지하면서도 단점을 극복할수 있게 해주고, 간결한 형태의 API
사용법을 제공하며, JDBC API에서 지원되지 않는 편리한 기능을 제공한다.
반복적인 작업들을 대신 해줌.(내부적으로)
실행할 SQL이 뭔지 정의하고 그것이 실행될때 결과를 어떤 객체에 넘겨받을지만 지정하면 된다.
사용하려면 먼저 DB

Spring JDBC가 해주는 작업?
Connection과 관련된 모든 작업을 알아서 진행한다. (커넥션 열고닫기)
진행중에 예외가 발생했을때도 모든 Connection 객체를 닫아준다.
Statement 준비와 닫기 - SQL 정보가 담긴 Statement 또는 PreparedStatement를 생성하고
필요한 준비작업을 해준다.
Statement도 Connection과 마찬가지로 사용이 끝나고 나면 알아서 객체를 닫아준다.
Statement를 실행하는것도 해준다.
Statement실행 결과는 다양한 평태로 가져올수 있다.
ResultSet(쿼리를 실행한 결과가 담겨있는 객체) Loop 처리 - ResultSet의 실행결과가 한건 이상이면
ResultSet 루프를 만들어서 반복해준다.
Exception 처리와 반환 - 모든 예외는 Spring JDBC 예외 변환기가 처리한다.
체크 예외(Checked Exception:try-catch를 사용하여 개발자가 예외처리하는것)인 SQLException을
런타임 예외(Runtime Exception:반드시 try-catch를 사용하지 않아도 된다)인 DataAccessException타입으로 변환한다.
Tracsaction처리 - 개발자는 transaction과 관련된 모든 작업에 관해서 신경을 안써도된다.


JdbcTemplate 클래스
Spring JDBC가 제공하는 클래스 중 JdbcTemplate은 JDBC의 모든 기능을 최대한 활용할수
있는 유연성을 제공하는 클래스다.

제공 기능 - 실행, 조회, 배치
실행-insert나 update같이 데이터변경이 일어나는 작업
조회-select를 이용해 데이터를 조회하는 작업
배치-여러개의 쿼리를 한번에 수행해야하는 작업

JdbcTemplate 클래스생성
JdbcTemplate template = new JdbcTemplate(dataSource);

DataSource는 보통 Bean으로 등록해서 사용하므로 JdbcTemplate이 필요한 DAO클래스에서 DataSource Bean을
DI받아서 JdbcTemplate을 생성할때 인자로 넘겨주면 된다.

'Developer' 카테고리의 다른 글

자바스크립트 TDZ (Temporal Dead Zone) 임시사망지역  (0) 2020.09.04
javascript curry함수, 커링이란?  (0) 2020.08.05
DataSource  (0) 2020.08.03
프로젝트 아키텍쳐  (0) 2020.08.03
함수형 프로그래밍  (0) 2020.08.03
  Comments,     Trackbacks
DataSource

순수 jdbc로 데이터베이스에 접근을 하면, 데이터베이스에 접근할 때마다 connection을 맺고 끊는 작업을 한다. 이 connection을 맺고 끊는 작업을 줄이기 위해 미리 connection을 생성해 두고, 데이터베이스에 접근하고자 하는 사용자에게 미리 생성된 connection을 제공하고 돌려받는다. 이 connection들을 모아두는 장소를 connection pool이라 하며, Datasource는 java 에서 connection pool을 지원하기 위한 인터페이스이다.

 

 

컨넥션 풀링을 지원하는 DataSource
컨넥션풀링-미리 정해진 개수만큼의 db 컨넥션, 미리 pool에 준비해놓고 app이 필요할때 빌려줬다가 받는기법.
웹앱에서는 반드시 컨넥션풀링을 지원하는 DataSource 사용해야함.
Spring에서는 DataSource를 공유가능한 Spring Bean으로 등록해주어 사용할수 있도록 해준다.

DataSource 구현 클래스 종류
SimpleDriverDataSource - 가장 단순한 DataSOurce 구현 클래스
단순한 테스트용.

SingleConnectionDriverDataSource - 순차적으로 진행되는 통합 테스트에서는 사용 가능하다.
매번 DB 커넥션을 생성하지 않기 때문에 SimpleDriver보다는 조금 더 빠르다.

오픈소스 DataSource
Apache Commons DBCP - 가장 유명한 오픈소스 DB 커넥션 풀 라이브러리
c3p0 DataSource Resource Pool
두 가지 모두 수정자(setter) 메서드를 제공하므로 Spring Bean으로 등록해서 사용하기 편리하다.


'Developer' 카테고리의 다른 글

javascript curry함수, 커링이란?  (0) 2020.08.05
Spring JDBC란?  (0) 2020.08.03
프로젝트 아키텍쳐  (0) 2020.08.03
함수형 프로그래밍  (0) 2020.08.03
고차함수란?  (0) 2020.07.31
  Comments,     Trackbacks
프로젝트 아키텍쳐

프로젝트 아키텍쳐는 계층화하여 개발하는것이 일반적이다.

presentation 계층
servie 계층
data access 계층
그리고 모든계층에서 사용되는 도메인 모델 클래스

로 구성되어있다.

독립적으로 분리하여 구현하는 것이 가능해야한다.


presentation
브라우저상의 웹클라이언트의 요청 및 응답을 처리
상위계층에서 방생하는 exception에 대한 처리
UI에서 표현해야 할 도메인 모델을 사용
UI에서 입력한 데이터에 대한 유효성 검증 기능을 제공
컨트롤러 기능 제공 - @Controller 어노테이션을 사용하여 작성된 Controller 클래스가 이 계층에 속함

service
비즈니즈(복잡한 로직) 로직 처리와 비즈니스와 관련된 도메인 모델의 접합성 검증
DB와 연동할때 정확성을 위한 트랜잭션 처리
presentation과 data access 계층 사이를 연결하는 역할
다른 계층들과 통신하기 위한 인터페이스 제공
service인터페이스와 @Service 어노테이션을 사용하여 작성된 Service 구현 클래스가 이 게층에 속함

data-access
DBMS와 연동해서 데이터를 조작한다.(데이타 CRUD 작업)
ORM 프레임워크(maybatis 등)를 주로 사용하는 계층
DAO 인터페이스와 @Repository 어노테이션을 사용하여 작성된 DAO 구현 클래스가 이 게층에 속함

도메인 모델 클래스(공통사용)
VO(Value Object) 혹은 DTO(Data Transfer Object) 객체에 해당
private로 선언된 멤버변수가 있고 그 변수에 대한 getter 와 setter 메서드를 가진다.
Spring JDBC를 사용하려면 먼저, DB 커넥션을 가져오는 DataSource Bean으로 등록해야 한다.

'Developer' 카테고리의 다른 글

Spring JDBC란?  (0) 2020.08.03
DataSource  (0) 2020.08.03
함수형 프로그래밍  (0) 2020.08.03
고차함수란?  (0) 2020.07.31
인코딩이 무엇인가? 유니코드는 또 뭐야  (0) 2020.07.31
  Comments,     Trackbacks
함수형 프로그래밍

모든것을 함수로 만드는것이 효율적이고 유동적이며, 코드도 깔끔하다.

 

예시를 들어보겠다.

 

모든 배열은 .map메서드와 .filter메서드가 있다.

이것을 사용할때 에러가 나면 배열이 아닌것이다.

 

filter와 map메서드를 직접 작성해보자.

 

일단 users 배열을 만든다.

 

var users = [ {
name : '김기범',
age : 32
}, {
name : '정성아',
age : 30
}, {
name : '박지성',
age : 40
}, {
name : '손흥민',
age : 27
}, {
name : '킹스톤',
age : 17
}, {
name : '파이리',
age : 56
}, {
name : '도깨비',
age : 7
} ];

 

출력해보면 잘 나온다.

 

그리고 함수를 만들어 새로운 배열에 값들을 넣어보자. (나이가 30초과 인 객체들만)

 

function fn1(list) {

       var new_list=[];

       for(var i=0; i<list.length;i++){

                  if(list[i].age>30){

                          new_list.push(list[i].age);

                  }

       }

       return new_list;

}

 

 

함수형 프로그래밍을 모르고 적응이 안된 사람들은 이렇게 작성할 것이다.

 

이것을 함수를 사용하여 깔끔하게 해보자.

 

일단 for문 안에 if문을 함수로 만들어보자.

 

function fn2(list, fn) {

                  var new_list = [];

                  for (var i = 0; i < list.length; i++) {

                                   if (fn(list[i])) {

                                               new_list.push(list[i]);

                                   }
                  }
                  return new_list;
}

 

 

이렇게 함수를 부를때 파라미터로 함수를 주면 된다.

 

함수는 자바스크립트에서 뭐다? 값이다. 잊지말자.

 

저렇게 되면 출력할때는 이렇게 함수를 주면된다.

 

console.log(fn2(users, function(val) {
                                    return val.age < 20;
                                    }

));

 

저기서 for문도 거슬린다.

 

저것조차 함수로 만들어서 호출을 해보자.

 

function fn3(list, fn) {
                var new_list = [];
                _each(list, function(val) {
                         if (fn(val)) {
                                 new_list.push(val);
                         }
                });
                return new_list;
}

 

for문을 _each(list, fn) 이라는 함수에 넣어버렸다.

 

이것을 위임이라고 한다.

 

function _each(list, fn) {
          for (var i = 0; i < list.length; i++) {
                  fn(list[i]);
          }
}

 

출력은 이렇게.

console.log(fn3(users, function(val) {
                                    return val.age < 18;
                             }

));

 

함수는 2개 나오지만 깔끔하고 실용적이다.

 

호출할때 함수를 만들어서 사용하기 때문에.

 

 

'Developer' 카테고리의 다른 글

DataSource  (0) 2020.08.03
프로젝트 아키텍쳐  (0) 2020.08.03
고차함수란?  (0) 2020.07.31
인코딩이 무엇인가? 유니코드는 또 뭐야  (0) 2020.07.31
replace와 translate 차이점  (0) 2020.07.31
  Comments,     Trackbacks
고차함수란?

겁나 어려운 개념이다.

 

자바스크립트를 배운다면 고차함수는 한번쯤 들어봤을 것이다.

 

안들어봤으면 뭐 그냥 소꿉장난 하신거라고 생각하시고 더 공부해라.

 

아무튼 자바스크립트를 함수형 프로그래밍에 알맞은 언어로 만들어주는 특성이 바로,

 

자바 스크립트가 고차함수개념을 받아들인다는 것이다.

 

고차함수는 자바스크립트에서 광범위 하게 사용된다.

 

이미 개념이뭔지 고차함수가 뭔지도 알기도 전에 계속 사용해왔을 것이다.

 

고차함수의 개념을 완전히 이해하기 위해서는 함수형 프로그래밍이 무엇인지, 퍼스트 클래스 함수가

 

무엇인지 이해를 해야한다.

 

 

함수형 프로그래밍이란 뭘까?

 

함수형 프로그래밍은 함수를 다른 함수의 파라미터로 넘길수도 있고 반환값으로 함수를 받을수도 있는

 

프로그래밍 형태를 말한다.

 

함수형 프로그래밍에서 우리는 함수라는 용어 하에서 모든것을 생각하고 코딩하게 된다.

'Developer' 카테고리의 다른 글

프로젝트 아키텍쳐  (0) 2020.08.03
함수형 프로그래밍  (0) 2020.08.03
인코딩이 무엇인가? 유니코드는 또 뭐야  (0) 2020.07.31
replace와 translate 차이점  (0) 2020.07.31
아스키코드란 무엇인가?  (0) 2020.07.31
  Comments,     Trackbacks
인코딩이 무엇인가? 유니코드는 또 뭐야

학원이나 학교에서 인코딩 인코딩 말만 들어본 사람 있을것이다.

 

뜻은 제대로 아는가?

 

나도 정확하게 몰랐다.

 

같이 정확히 알고 넘어가자.

 

인코딩이란 대충 뭘까?

 

인코딩을 검색하면 정보의 형태나 형식을 변환하는 처리 방식 이라고 나온다.

 

그리고 인코딩 종류도 많은것을 알수 있다.

 

생각해보면 mp3나 동영상파일도 가끔 인코딩 해야합니다. 라는 문구를 본적 있는것 같다.

 

옛날에 PMP 쓸때 mp4로 인코딩해서 넣거나 mkv인가 먼가 그걸로 한 기억이 있다.

 

뭔가 대충 감이온다. 무언가 모를 형식? 같은것을 바꾸는 것이라는 것을...

 

인코딩의 시초는 바로 ASCII라고 볼수있다.

 

ASCII 는 라틴 알파벳과 숫자, 특수문자를 7비트 이진수로 대응한 인코딩 기법을 사용했는데, 이름해서도 알수 있듯이

 

ASCII는 미국 표준 문자코드기 때문에 라틴 알파벳을 제외한, 한중일 언어와 그밨의 수많은 언어들에는 전혀 사용을

 

할수 없다. 그래서 ASCII를 사용할 수 없는 산업이나 국가에서는 저마다 고유한 인코딩 기법을 사용했고, 결국 다른

 

인코딩 기법을 사용하는 곳에서는 정보를 교류할수 없는 문제가 생겼다.

 

이 문제를 해결하기 위해 표준 문자 전송 처리방식인 유니코드가 개발되었다.

 

유니코드는 이 세상의 모든 문자 인코딩을 통일하기 위한 목적으로 개발되었는데 이런 원대한 꿈을 위해 대부분의

 

나라의 문자 뿐아니라, 기호, 이모티콘, 심지어는 마작 기호들 까지 포함하고 있다.

 

이런 유니코드 기법으로 개발된 인코딩도 많지만 그 중에서도 UTF-8이 가장 널리 사용되고 있으며, 오늘날 유니코드에

 

대한 인코딩을 말한다면 거진 UTF-8로 인식해도 큰 문제가 없다.

'Developer' 카테고리의 다른 글

함수형 프로그래밍  (0) 2020.08.03
고차함수란?  (0) 2020.07.31
replace와 translate 차이점  (0) 2020.07.31
아스키코드란 무엇인가?  (0) 2020.07.31
데이터베이스와 빅데이터의 차이점  (0) 2020.07.31
  Comments,     Trackbacks
replace와 translate 차이점

replace와 translate는 개발하다보면 아주 많이 쓴다.

 

replace나 translate 둘다 문자를 대체할때 사용을 하는데 예시를 보자.

 

이처럼 해당하는 문자를 모두 찾아 바꿔주는것이 replace이다.

 

그럼 translate는 뭘까?

 

 

translate('원래문자열','찾고싶은 문자들','찾고싶은 문자들의 순서와 바꾸고싶은 문자') 

 

이렇게 쓸수있다.

 

어렵다.

 

차근차근 보면 abcdefg라는 문자열에서 c, e, 1, 2, 3 문자를 하나하나 검색을한다.

 

처음은 c여서 봤는데 c가 포함되어있다. 그럼 이 c를 뭘로바꾸느냐? c 와 1 이 같은 위치니까 1로바꾼다.

 

그럼 ab1defg가 된다. 

 

그다음 e는 2로 변경되어 ab1d2fg가 된다.

 

그다음 1과 2와 3은 포함된게 없으니 생략된다. 여기서 포함되는게 있다면 1,2,3 이 3,4,5로 바뀌게된다!

 

그리고 그다음 중요한 포인트가 나온다. f와 g는 분명히 본래문자열에 포함되어있다.

 

그런데 세번째 파라미터에 대응할수 있는 문자가 없다.

 

그럼 무조건 삭제된다!!! 그래서 결과는 ab1d2fg가 아니라 ab1d2이다!!!

 

이것을 이용하여 주민등록번호 검사로직을 만들어보았다.

 

replace대신 사용해보았는데 유용한것 같다! (replace 몇번 쓸것을 한번으로 처리할수 있었다!!)

 

 

 

--입력할 때 '-'를 입력해도 되고 스페이스를 쳐도됨
select decode(substr(translate(:personnum,'1234567890- ','1234567890'),13,1), --:마지막으로 끝번호와 비교하여 검증결과 출력
                 decode(length(11-mod(sum(substr(translate(:personnum,'1234567890- ','1234567890'),rownum,1)-- '-'와 공백이 있을 시 없애고 각자리에 
                                                                    *decode((rownum+1),10,2,11,3,12,4,13,5,rownum+1)),11)),--곱셈처리(decode로 10초과시 숫자변경)하고 sum 후, 11로나눈 나머지를 11에서 뺌
                            2,  substr(11-mod(sum(substr(translate(:personnum,'1234567890- ','1234567890'),rownum,1)*decode((rownum+1),10,2,11,3,12,4,13,5,rownum+1)),11),2,1),
                            1,  11-mod(sum(substr(translate(:personnum,'1234567890- ','1234567890'),rownum,1)*decode((rownum+1),10,2,11,3,12,4,13,5,rownum+1)),11)),'검증완료','검증실패') result
from dual
connect by level<length(translate(:personnum,'1234567890- ','1234567890')); --11개

'Developer' 카테고리의 다른 글

고차함수란?  (0) 2020.07.31
인코딩이 무엇인가? 유니코드는 또 뭐야  (0) 2020.07.31
아스키코드란 무엇인가?  (0) 2020.07.31
데이터베이스와 빅데이터의 차이점  (0) 2020.07.31
Decode와 Case의 차이점  (0) 2020.07.29
  Comments,     Trackbacks