관련 react JSX코드:

   <div className="App">
      <h2> CSS Sample </h2>
      <div className="MyDiv">
         <div className="Child"></div> * 5개
         
      </div>
      <div className="MyDiv" style={{display:'flex', justifyContent:'spaceBetween'}}>
        <div className="Child" > </div>
        <div className="Child" > </div>
      </div>
      <div className="MyDiv">c</div>
    </div>

 

<POSITON 4가지 - 기본 static은 제외 >  - 4개 포지션은 left,top,right, bottom 제공.

  • relative -  기본static과 거의 동일하지만 left/top 등을 쓰면  dom흐름에서 좀 벋어난다. 
  • absolute -  (sticky가 아닌 다른 포지션에 대해, 없을경우는 전체 window에 대해)  left, top을 고정한다. 
                      =>  그래서 부모를 relative로 하면 제일 좋고,  부모를 absolute로 해도 좋음.
  • fixed - absolute와 비슷하나, fixed는 스크롤도 되지 않고 그자리 고정된다(absolute는 parent에 고정되므로 스크롤이 따라서 됨)
  • sticky = (relative+fixed) : 보통은 relative처럼 동작하지만, 스크롤시 fixed 처럼 동작한다. 

 

<grid >  display:flex와 함께 display:grid 가 유연한 레이아웃을 제공.  flex에서도 flex-wrap: wrap; 으로 어느정도 구현가능.

Posted by yongary
,

 

혹시 TreeMap TreeSet에서 element가 primitive일때 reverseOrder로 간단히 하려면.

TreeMap<Integer,Integer> tm = new TreeMap<>(Collections.reverseOrder());

 

  public static int[] mergeSortedArrays(int[] arr1, int[] arr2) {
        int[] result = new int[arr1.length + arr2.length];
        int i = 0, j = 0, k = 0;

        while (i < arr1.length && j < arr2.length) {
            if (arr1[i] < arr2[j]) {
                result[k++] = arr1[i++];
            } else {
                result[k++] = arr2[j++];
            }
        }

        while (i < arr1.length) {
            result[k++] = arr1[i++];
        }

        while (j < arr2.length) {
            result[k++] = arr2[j++];
        }

        return result;
    }
}
Posted by yongary
,

dynamic 프로그래밍은  로직만으로 계산이 어려워서
컴퓨터에게 반복적으로 계산도 시키고, 캐싱도 시키면서  캐싱된걸 이용해 나가면서 답을 구하는 방법이다.

 

문제 예제 1 . 숫자 n 만 주고, 가능한 모든 BST 개수 구하기.

   - BST(binary search tree: child는 max 2개이고, left child는 작은값, right child는 큰값) 

Posted by yongary
,

소프트웨어 아키텍처 패턴

정의

소프트웨어 아키텍처 패턴은 시스템의 전반적인 구조를 설명합니다. 아키텍처 패턴은 시스템의 핵심 구조와 그 구조의 특징을 묘사하며, 대규모 설계 문제를 해결하기 위한 고수준의 템플릿입니다.

종류

  1. 계층형 패턴 (Layered Pattern): 시스템을 독립된 계층으로 나누고 각 계층간의 상호작용을 정의합니다.
     Presentation Layer, Application Layer,  Domain Layer(비즈니스 로직), Infra Layer(데이터베이스 상호작용)

  2. 클라이언트-서버 패턴: 클라이언트와 서버의 역할 분리로 서비스 요청과 처리를 관리합니다.
  3. MVC (Model-View-Controller) 패턴: 사용자 인터페이스와 비즈니스 로직을 분리하여 관리합니다.
     View(사용자 상호작용) -> Controller에서 Model(비지니스 로직)과  View사이의 중계자 역할을 하게 됨. 
  4. 이벤트 버스 패턴: 컴포넌트 간 메시지를 중앙 이벤트 버스를 통해 전달합니다.
  5. 마이크로서비스 패턴: 작은 서비스로 분할하여 독립적으로 운영 및 개발할 수 있게 합니다.
    그 외 6~10번   더 나열하자면...  
    (Master-slave pattern 
    . Pipe-filter pattern  - 파이프를 통해 흐르는 데이터를 중간중간 필터 모듈이 처리하는 패턴. 
    . Broker pattern 
    . Peer-to-peer pattern 
    . Blackboard pattern  - "블랙보드"에 비유되는 중앙 저장소에 데이터를 공유 . 
     (interpreter패턴도 여기 들어갈 수 있는데, 아래꺼랑 헤깔려서 일단 제외)

 

 

SW 디자인 패턴

정의

디자인 패턴은 소프트웨어 설계 단계에서 특정 문제를 해결하는 일반적인 해법을 제공합니다. 디자인 패턴은 보다 구체적이며, 작은 범위의 설계 문제에 적용됩니다.

종류

  1. 생성 패턴: 객체 생성과 관련된 패턴으로, 싱글턴, 팩토리 메서드, 추상 팩토리, 빌더, 프로토타입 등이 있습니다.
  2. 구조 패턴: 객체 간의 구조화된 관계를 설명하는 패턴으로, 어댑터, 브리지, 컴퍼지트, 데코레이터, 퍼사드, 플라이웨이트, 프록시 등이 있습니다.
  3. 행동 패턴: 객체 간의 상호작용과 책임을 다루는 패턴으로, 책임 연쇄, 명령, 해석자, 반복자, 중재자, 메멘토, 옵저버, 상태, 전략, 템플릿 메서드, 방문자 등이 있습니다.

Posted by yongary
,

Redis 의 영속성(persistency):

 - default로 스냅샷(.rdb)파일 옵션이 켜져 있으며, 주기적으로 스냅샷을 찍고, 복구시 이를 이용한다. => 끌 수도있고 설정변경 가능.
       (기본값: 15분, 5분, 1분/key  1개, 10개, 1만개)

- AOF(append only file) 을 설정하면 용량이 크지만 모든 기록을 aof파일에 기록을 하고, 복구시에 사용한다.
   => 데이터 유실 확률이 더 적어지지만, 로딩속도가 늦고,  100%복구는 장담할 수 없다.  (매우 critical한데서는 사용 비추)

 

Rate Limiter: (http 429: too many request 에러 리턴)

- 직접 구현시에는 요청을 Intercepter해서 ConcurrentHashMap 같은데   클라이언트IP+시간키 / 개수 등으로 관리.
   (서버가 여러대일때는 1/n이 되고 약간 부정확)

- 보통은 라우터 단에서 더 많이 하게되는데, 예를 들면 AWS의 API Gateway에서는 api별로 Throttle 옵션을 설정하면 된다.  

  => Stage설정을 통해 전체 API에 대한 요청 제한 관리.

 

- cloudFlair와 같이 전문적으로 제공해 주는 서비스 존재.  AWS의 WAF는 미세설정이 좀 부족했음. 

 

 

서킷 브레이크:

서킷 브레이커(Circuit Breaker) 패턴은 분산된 마이크로서비스 아키텍처에서 일반적으로 사용되는 패턴 중 하나입니다. 이 패턴은 서킷 브레이커가 전기 회로에서 과부하로부터 회로를 보호하는 것과 유사한 방식으로 작동합니다.

온라인 서비스 시스템에서, 한 서비스가 다른 서비스에 의존할 때, 호출되는 서비스가 실패하거나 지연될 경우 전체 시스템에 문제가 생길 수 있습니다. 서킷 브레이커 패턴은 이러한 문제를 방지하기 위해 사용됩니다.

서킷 브레이커는 특정 서비스에 대한 요청이 일정 임계치를 초과하여 실패할 경우, 추가 요청을 차단하고 즉시 실패 응답을 반환합니다. 이렇게 하면 실패한 서비스에 대한 의존성이 전체 시스템에 미치는 영향을 최소화하며, 실패한 서비스가 회복될 시간을 제공합니다.

 

 

 

 

MSA migration:

 

 

 

용어

  - AWS의 CDN = cloudFront : 에지서버(가까운 서버)에서 컨텐츠를 직접 제공.  

  - C.A.P 이론 : CAP 이론은 분산 시스템에서 세 가지 핵심 C.A.P 중 어느 두 가지만을 선택할 수 있다는 개념을 나타내는 이론입니다. 이런 선택은 분산 시스템의 설계와 운영에서 중요한 결정을 내리는 데 영향을 미칩니다.

  1. 일관성(Consistency): 모든 노드가 동시에 같은 데이터를 보는 것입니다. 즉, 어떤 노드가 데이터를 변경하면, 다른 모든 노드도 동일한 데이터를 볼 수 있어야 합니다.
  2. 가용성(Availability): 모든 요청은 성공하거나 실패해야 합니다. 시스템은 항상 요청에 대한 응답을 주어야 합니다. 실패한 노드에 대한 요청도 응답을 반환해야 합니다.
  3. 분할 내성(Partition Tolerance): 네트워크 지역이 분할되고 지역간 통신 실패 같은 상황에서도 시스템이 정상적으로 작동하거나 복구할 수 있어야 함 => Consistency와 바로 상반 됨.

CAP 이론은 "일관성", "가용성", "분할 내성"을 모두 동시에 만족시키는 것은 불가능하다고 주장합니다. 이를 그림으로 나타내면 CAP 이론의 유명한 "CAP 삼각형"이 나옵니다. 이 삼각형에서는 세 속성이 모두 연결되어 있는데, 그 중에서 두 개를 선택할 수 있다는 것을 의미합니다.

CAP 이론은 분산 시스템의 설계와 구축 시 어떤 속성을 우선시할 것인지 결정해야 한다는 중요한 이론

 

- SDLC (S/w Development LIFE Cycle) :  개발을 위한 단계별 접근방식 - Waterfall, agile, V-Model 등이 있다. REF
- SRS (Service Requirement Specification) - 요구사항 정의 느낌.

- SLE (Service Level ObjEctive)의 약자로, 서비스 수준 목표를 나타내는 개념입니다. SLE는 서비스의 성능 및 가용성과 같은 품질 지표를 정의하고 측정하기 위해 사용.    즉:  응답시간, 가용성, 에러비율, 처리량 등. 

 

Posted by yongary
,

1. 백엔드 Cache 적용하기 => 보통 redis나 memCached 를 많이 이용하지만, 당연히 mongoDB casandra등 다른 방법을 이용할 수 있다

    - 이를 통해 DB query를 하지않고 바로 리턴하게 된다. 가끔씩 db를 조회해서 최신정보를 가져오는 step은 readThrough라고 부름.   
2.  (SQL구조 개선) query tunning + index추가 작업 .

                          (+N+1 Query 문제 해결. -> 게시글하나+댓글N개인 경우  N+1조회 등)

 

3. 데이타가 클때 : Payload Compresion 적용. (예: brotli 솔루션)

 

4. 프론트 엔드 개선:  데이터 많은 곳에 paging 적용 등 UI 개선을

                                프론트에서 Cache 적용하기 (react-cache 등 적용해서 API호출 회수 자체를 감소 가능) 

 

5.    비동기 logging :  로그 때문에 시스템이 느려질 수도 있으므로 loggiin에 비동기 방식 적용. 

        및  Connection Pool 을 유지/관리 (계속 새로 오픈하는 것 보다 속도가 좋으므로)

    

    

Posted by yongary
,

oracle DDL 예제

mongoDB, redis 2023. 8. 4. 10:31

*TABLESPACE 생성

CREATE TABLESPACE TS_BIZHOME
DATAFILE '저장위치' SIZE 500M
AUTOEXTEND ON NEXT 100M;
저장위치: '/app/ora19c/oradata/ORCL/ts_bizhome01.dbf'   ora19c와 ORCL은 변경가능성있음.유저생성, 테이블스페이스 권한 주기:
create user [id] identified by [pw] default tablespace 테이블스페이스명;
grant connect, resource (,dba) to [id];
(alter user [유저명] default tablespace [테이블스페이스이름] quota unlimited on users;)
commit;
참고 View:  GRANT CREATE VIEW TO userId; 

 

* DDL 예제. (TB_C_GRPCODE, TB_C_DTLCODE)
CREATE TABLE TB_C_DTLCODE
(
GRP_CD CHAR(2) NOT NULL ,
DTL_CD VARCHAR2(2) NOT NULL ,
DTL_NM VARCHAR2(30) NOT NULL ,
BIGO VARCHAR2(100) NULL
);
CREATE UNIQUE INDEX TB_C_DTLCODE_PK ON TB_C_DTLCODE
(GRP_CD ASC,DTL_CD ASC);ALTER TABLE TB_C_DTLCODE
ADD CONSTRAINT TB_C_DTLCODE_PK PRIMARY KEY (GRP_CD,DTL_CD);CREATE TABLE TB_C_GRPCODE
(
GRP_CD CHAR(2) NOT NULL ,
GRP_NM VARCHAR2(30) NOT NULL
);CREATE UNIQUE INDEX TB_C_GRPCODE_PK ON TB_C_GRPCODE
(GRP_CD ASC);ALTER TABLE TB_C_GRPCODE
ADD CONSTRAINT TB_C_GRPCODE_PK PRIMARY KEY (GRP_CD);ALTER TABLE TB_C_DTLCODE
ADD (CONSTRAINT R_309 FOREIGN KEY (GRP_CD) REFERENCES TB_C_GRPCODE (GRP_CD));

Posted by yongary
,

시스템 디자인 + MSA

BACK-END 2023. 7. 28. 13:07

1. 요구사항 명확화 : 핵심기능 , 트래픽이나 유저수 등 확인.  (1초에 1000요청, 유저 100만명에 서버 기본2대+1씩,  1명당 하루 86.4건 요청)


(High Level Design)

2.1 API - High Level Design (Rest API)   

2.2 Component - High Level Design : 로드 밸런스 + VM 몇대(x 오토스케일링) + DB 단
      - 프론트를 SPA방식으로, 웹서버 없이 대신에
          글로벌서비스의 경우 CDN이나,   로컬서비스면 S3같은 object storage로 미디어 부하분리.
      (VM이냐 컨테이너 기반이냐는  조직이 크고 여러 팀으로 나누어 개발한다면 독립배포가 중요해져서 컨테이너 기반이 좋을 것 같고..
                                                      조직이 작으면 VM기반이 좋을 것 같음)                                                 

2.3 DB선택 : 복제냐 샤딩이냐,   A:카산드라/실리아.  B. dynamoDB. C. mongoDB/documentDB. 4. RDB
       => 옵션중에  트래픽이 많거나 많아질 확률이 있고  필드간의 관계도 좀 필요하다면 B/C 중에 선택!
            (전반적으로 B/C가  샤딩등 분산환경에 유리하다. RDB보다는 개발리소스도 좀 적게 들고..)
            B/C의 차이는 C가 좀 더 index등의 튜징여지가 있으므로  엔지니어 구성에 따라 선택가능)
       => 향후 MSA를 대비해 foreign키 없게 하고, Join을 최소화해서 분리가 용이하도록!

 

3. DB 테이블 설계

 

4.(여유가 되면) Fault tolerance 고려

 

DB - 용량에서  1. master/slave구조,  2. 샤딩/ Table파티셔닝  고민필요.      (index 는 application영역이라 보고 일단 제외)
                                                             =>샤드키는 Cardinality가 높은 값으로 선정. 
        ( RDB - postgreSQL만 슈평분할(샤딩과 유사)지원,  mySQL/oracle은 테이블파티셔닝만 지원
          NoSQL - mongoDB, cansandra 등이 샤딩 지원 : 샤딩시 DB가 빨라지지만 aggregation등에선 늦어질 수도 있음)

         master/slave구조:  오라클에선 replication이라고 부르며 transaction replication 방식이 일반적) 

 

 

////// MSA로 전환 전 고려사항//////

1. API Gateway 는 수직 방향    서비스 메시는 수평 방향으로  라우팅/로드밸런싱 등을 수행한다.

2. DB 트랜잭션을 
      A. 동기화 형태로 홀딩하면서 API호출 완료 후 트랜잭션 수행 : 초기에 일반적 방식. 
      B. 분산트랜잭션(즉 2단계 커밋, 표시나 lock을 하고  API호출 후  완료.)으로 할것인지,
      C. 이벤트 기반으로 LLT(long live Transaction)이용하는 사가패턴을 적용하고 실패시 보상트랜잭션을 개발할 건지 고민필요.   

          => 사가패턴도 2가지가 있는데 중앙관리형과  서비스별 자체 관리형이 있다.

 

 

 

//////////// MSA 장단점

MSA의 핵심은  1. 데이터 분리와  2. API Gateway 라고 생각한다.
  (단, 1. 데이터 분리가 난이도가 높기 때문에,
         운영중인 모노리스를 MSA로 변환해야하는 실상황에서는 서비스만 먼저 분리하고 나중에 데이터를 분리하는 방법이 현실적이다) 

 

 

모노리스 장단점:

  • (장점) 배포 및 테스트도 하나의 애플리케이션만 수행하면 되기 때문에
     개발 및 환경설정이 간단, 운영 관리가 용이, 
  • (단점들 : 시스템이 커지기 시작하면 등장)
    - 빌드/테스트 시간이 길어진다.
    작은 수정에도 시스템 전체를 빌드해야 하며, 테스트 시간도 길어진다. 요즘처럼 CI/CD가 강조되는 시점에서는 큰 문제가 될 수 있다.
    - 하나의 서비스가 모든 서비스에 영향을 준다.  이벤트 서비스에 트래픽이 몰려 해당 서버가 죽게 된다면 다른 모든 서비스 역시 마비 되는 상황이 오게 됩니다
    선택적 확장이 불가능
    이벤트로 인해 서비스 접속 량이 폭증할 경우 프로젝트 전체를 확장해야만 한다.

MSA 장단점:  

  • (장점) 1. 서비스별 독립된 배포,  2. 해당 서비스별 확정.   
  • (단점들)
      모노리틱 아키텍처는 서비스간의 호출이 하나의 프로세스 내에서 이루어지기 때문에 속도가 빠르지만, MSA의 경우 서비스간 호출을 API통신을 이용하기 때문에 속도가 느리다.
  • 통신에 사용하기 위해 값을 데이터 모델로 변환시켜주는 오버헤드가 발생 

 

Posted by yongary
,

docker

BACK-END 2023. 7. 11. 09:03

<docker demon 실행>

sudo systemctl start docker (or stop)

sudo systemctl restart docker : 재시작

 

<image들 모두 삭제>

(sudo) docker rmi -f $(docker images -aq)

 

 

<docker 컨테이너 재시작>

sudo docker stop 7e1bc0fdb606

sudo docker start 7e1bc0fdb606

 

 

<docker oracle 11g>

sudo docker run -d -p 1521:1521 jaspeen/oracle-xe-11g

한글설정

docker exec -it <컨테이너 이름> bash

     export NLS_LANG=KOREAN_KOREA.AL32UTF8

 

sqlplus / as sysdba

SELECT * FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET';

(결과로 나타나는 NLS_CHARACTERSET 값이 "AL32UTF8"로 표시되어야 합니다.)

그후, 재시작.

docker stop <컨테이너 이름>

docker start <컨테이너 이름>

 

 

<그 외>

$docker pull image명(jenkins, centos등)
$docker images : 이미지 목록조회
  - hub.docker.com 에서 검색 가능
$docker run image명 :이미지 실행.  (--name 컨테이너명 지정가능)
  옵션 -p 내포트:docker포트 -v 내디스크:docker디스크경로(:ro) ro는 ReadOnly     
  옵션 -d (데몬으로 실행)
실행하면서 shell 접속: $docker run -it centos /bin/bash 
$docker exec -it containerName /bin/bash 잘됨(docker run하고난 상태에서 접속)
$docker ps  :컨테이너 조회  (-q 옵션 주면 container ID만 조회됨, -a는 all)
$docker history imageID  :해당 이미지에 관련해 실행된 명령어들
$docker rmi imageID : 이미지 삭제

containerID 관련 명령

$docker rm -f containerID or $(docker ps -aq) : 확실히 죽이는 방법.
$docker top containerID :해당 컨테이너 안에서 top을 돌리는 기능
$docker stop containerID : 해당 컨테이너 중단 (종료시그널로 중단)
$docker kill cotainerID : 완전죽임 (kill시그널로 중단)
$docker rm containerID : 컨테이너를 docker ps 목록에서 삭제, 죽지 않을수도 있음.

Dockerfile

FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY .htpasswd /etc/nginx
COPY default.conf /etc/nginx/conf.d/

$docker build -t mynginx . - 자기만의 이미지 생성

$docker run -p 8500:80 -d mynginx -자기 이미지 실행

Posted by yongary
,

OAuth2 + OpenID

BACK-END 2023. 7. 6. 14:25

OpenID Connect (OIDC)는 OAuth 2.0을 기반으로 한 인증 프로토콜로, JWT (JSON Web Tokens)를 사용하여 사용자 정보를 안전하게 전달합니다. OIDC에서 생성되는 JWT는 특히 'ID 토큰'이라고 불립니다.

ID 토큰에는 아래와 같은 클레임들이 포함될 수 있습니다:

  • iss: 토큰을 발행한 주체(Issuer)를 나타냅니다.
  • sub: 주체(Subject)를 나타냅니다. 이는 고유한 식별자로, 토큰 발행자가 관리하는 사용자의 ID입니다.
  • aud: 수신자(Audience)를 나타냅니다. 이 클레임은 이 토큰이 의도된 수신자 또는 수신자들의 목록입니다.
  • exp: 만료 시간(Expiration Time)을 나타냅니다. 이 시간 이후에는 토큰이 더 이상 유효하지 않습니다.
  • iat: 토큰이 발행된 시간(Issued At Time)을 나타냅니다.

 

FACEBOOK 을 이용한 로그인시. 

  • iss: 이 클레임은 토큰을 발행한 주체(Issuer)를 나타냅니다. 이 경우에는 Facebook이 될 것입니다. 일반적으로, Facebook에서 발행한 토큰의 'iss' 값은 'https://facebook.com'과 같은 형태로 되어있습니다.
  • sub: 이 클레임은 주체(Subject)를 나타냅니다. 이는 토큰 발행자가 관리하는 사용자의 고유 식별자입니다. Facebook을 통해 인증을 받은 경우, 'sub' 클레임은 Facebook에서 사용자에게 할당한 고유 ID입니다.
  • aud: 이 클레임은 수신자(Audience)를 나타냅니다. 이는 해당 토큰이 의도된 수신자입니다. 즉, 특정 e-commerce 서비스의 식별자가 될 것입니다. 이 서비스가 Facebook에 등록되었다면, Facebook은 이 서비스의 'client_id'를 'aud' 클레임에 넣어 ID 토큰을 생성합니다. 그런 다음, 이 토큰이 e-commerce 서비스에 전달되어, 이 서비스는 'aud' 클레임을 검사하여 토큰이 자신에게 보내진 것임을 확인할 수 있습니다.
Posted by yongary
,

Object oriented 디자인 패턴


객체 지향 디자인 패턴(Object-Oriented Design Patterns)은 소프트웨어 개발에서 반복적으로 발생하는 문제들을 해결하기 위해 공통된 설계 방법을 제공하는 패턴들의 집합입니다. 이러한 패턴들은 객체 지향 프로그래밍에서 유용하게 사용될 수 있으며, 코드의 재사용성, 유지보수성, 확장성 등을 향상시킬 수 있습니다. 여기서는 몇 가지 대표적인 객체 지향 디자인 패턴에 대해 설명하겠습니다.

Singleton Pattern (싱글턴 패턴): 이 패턴은 오직 하나의 인스턴스만 생성하고, 그 인스턴스에 접근할 수 있는 전역적인 접근점을 제공합니다. 주로 리소스를 공유하거나 설정 정보와 같은 단일 객체를 공유해야 할 때 사용됩니다.

Factory Pattern (팩토리 패턴): 객체의 생성을 처리하는 패턴으로, 객체를 생성하기 위한 인터페이스를 정의하고, 서브 클래스에서 어떤 클래스의 인스턴스를 생성할지를 결정합니다. 이를 통해 객체 생성 코드를 클라이언트로부터 분리시킬 수 있습니다.

Observer Pattern (옵저버 패턴): 이벤트 발생 시 관찰자(옵저버)들에게 자동으로 알림을 보내는 패턴입니다. 주로 한 객체의 상태 변화에 따라 다른 객체들이 업데이트되어야 하는 상황에서 사용됩니다.

Strategy Pattern (전략 패턴): 알고리즘을 정의하고, 이를 사용하는 클라이언트와 분리시키는 패턴입니다. 각각의 알고리즘을 캡슐화하고, 런타임 시에 알고리즘을 변경할 수 있습니다.

Decorator Pattern (데코레이터 패턴): 객체의 기능을 동적으로 확장하기 위해 사용되는 패턴입니다. 기존 객체를 감싸는 데코레이터 클래스를 생성하여, 새로운 동작을 추가하거나 변경된 동작을 제공합니다.

Proxy Pattern (프록시 패턴): 실제 객체에 대한 대리자(Proxy)를 제공하는 패턴으로, 클라이언트와 실제 객체 사이에 중간 계층을 두어 추가적인 기능을 제공하거나 접근을 제어할 수 있습니다.

Template Method Pattern (템플릿 메서드 패턴): 알고리즘의 구조

 

Posted by yongary
,

System.in 리딩.

java core 2023. 6. 23. 16:56
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();


첫번재 n을 숫자로 읽고 라인 쭉 읽는 방법.
int n=sc.nextInt();
String []s=new String[n+2];

for(int i=0;i<n;i++){
   s[i]=sc.next();
}
      
기존 방식. 
try {
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            int k = 5;
            
            List<Integer> ret = new ArrayList<>();
            while ( k-- > 0) {
                String st = br.readLine();
           }
Posted by yongary
,

java~17

java8~ 2023. 6. 8. 13:07

java8이후 17까지 업데이트된 기능들.

 

 

jshell

immutable Factory

 

var (추론 type)

javac+java -> java

 

람다형 switch  (--enable-preview -source 12 필요?)

 

다중문자열

 

record ( Lombok없이 setter getter자동 추가..)

casting없는 instanceof

 

sealed (class, interface ) : 상속 범위제한

 

Stream.toList() 직접변환 추가. (java 16)

 

람다형 switch : (break도 없어도 됨)

        String typeOfDay = switch (day) {
            case "MON", "TUE", "WED", "THU", "FRI" -> "Weekday";
            case "SAT", "SUN" -> "Weekend";
            default -> "Invalid day";
        };

 

Text Block 추가

String json = """
              {"name": "ChatGPT",
               "type": "AI"
              }
              """;



 

그 외 

java9의 모듈시스템  ( Project Jigsaw 의 결과물로 JPMS 탄생)   참고: https://limdevbasic.tistory.com/21 

 

 

참고: https://www.devkuma.com/docs/java/version/

 

Posted by yongary
,
students.stream()
                .sorted(Comparator.comparing(Student::getCgpa).reversed()
                        .thenComparing(Student::getFirstName)
                        .thenComparing(Student::getId))
                .map(Student::getFirstName)
                .collect(Collectors.toList());

Double을 Checker(Comparator)에서 비교시에는 *100 이런거 하면 안됨. (미세 소수 오류발생)

class Checker implements Comparator<Student> {

    @Override
    public int compare(Student p1, Student p2) { 
        return Double.compare(p2.getScore(),p1.getScore()); //DESC
    }    
}

 

anonymous Comparator 클래스 생성으로 비교하는 법. 1. => compare(int 아니고=> Integer인 부분 주의 필요)

int[] intArr = new int[] {1,2,6, 4, 9, 7};

        List<Integer> sortedInt = Arrays.stream(intArr).boxed()
                .sorted(new Comparator<Integer>() {
                    @Override
                    public int compare(Integer a, Integer b) {
                        return Integer.compare(a,b);
                    }
                 })
                .collect(Collectors.toList());


        log.info(""+sortedInt);

 

 

anonymous Comparator 클래스 생성으로 비교하는 법. 2

        int[] intArr = new int[] {1,2,6, 4, 9, 7};

        int maxInt = Arrays.stream(intArr).boxed()
//                .max(Integer::compare)
                .max(new Comparator<Integer>() {
                    @Override
                    public int compare(Integer a, Integer b) {
                        return Integer.compare(a,b);
                    }
                 })
                .orElse(-1);

 

Posted by yongary
,

List <-> array <-> stream

java8~ 2023. 5. 19. 08:58

1. array <-> stream

int array -> Arrays.stream(.. )으로 바꾸면 intStream()이 되므로 Integer stream으로 바꾸려면 .boxed()를 써야한다. 


    //cards {1,2,2, 7, 9, 9, 8} 중에 pair들 빼고 최대 값구하기
    public static int solutions(int[] cards) {


        Map<Integer, Long> counting = Arrays.stream(cards).boxed()  //intStream()을  stream()으로 바꿔야함
                .collect(Collectors.groupingBy( i->i, Collectors.counting()))  //<Integer, Long>
                ;

        Integer ret = counting.entrySet().stream()
                .filter( e -> e.getValue() == 1)
                .map( e -> e.getKey())
                .max( Integer::compare ) //need STUDY max(Comparator 임)
                .orElse(-1); //.intValue();

        //TEST code: 둘다 오류임 : study필요
//        Integer ret = Arrays.stream(cards).boxed()
//                .max(Comparator.comparingInt());
//                .max(Integer.compare());

        return ret;
    }

ERROR FIX:  Inreger.compare() => Integer::compare     & add.   .orElse(-1) 

Integer::compare 대신에 Comparator.comparing(e -> e) 도 됨. 

Posted by yongary
,

React관련 질문들

React.js 2023. 4. 29. 12:05

1. Modal을 Dom외부에서 렌더링 하려면 ?  ReactDom.createPortal 을 사용한다.

 

2. 하위컴포넌트이 click이벤트가 상위 컴포넌트로 전달되는걸 방지 하려면?  e.stopPropagation() 을 사용.

 

3. redux의 mapDispatchToProps란 ?  redux의 액션을 dispatch하는 함수들을 React컴포넌트의 props로 매핑한다.
    redeux는 보통 store.dispatch()로 디스패치하지만, mapDispatchToProps를 사용하면 props로 바로 받아서 사용가능.

 

4. React.PureComponent의 용도는?  shouldComponentUpdate()를 내장해, props/state 가 바뀔때만 render호출. 

 

5. (React V16.8~) useEffect의 로 window resizing이 가능하다.  : 음, 당연히 되는거 아닌지 study필요.

 

6. Redux container란?  간단하게는 connect()함수를 사용해서 생성 가능하고, 상태를 구독하여 강태각 변경될때마다 Component다시 렌더링 하는 역할.  dispatch함수들을 props로 전달.

 

7. setState의 두번째 파라미터 용도는? default callback 지정.  => state가 업데이트 완료된 후에 수행 됨. 

Posted by yongary
,

react 기본 hooks

React.js 2023. 4. 29. 10:38

1. useState 

2. useEffect      userEffect (()=> {},[])일때 초기화  ,[abc] )일때는 abc의 state가 변할때마다 호출.

3. useContext : props로 여러번 여러군데 넘기는게 불편할때 약간 global 변수의 개념.

=>  Provider 파일을 따로 만들고 children props를 이용하면 특정 컴포넌트만  reload하는 구조로 발전가능하다. (1번방식)
          2번 방식도 동작은 하는데  여러개의 childComponent를 사용할때 문제가 될 수 있다.  모두 다 reload 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2번 방식;
export const MyContext = useContext({a:1, b:2, 함수});

<MyContext.Privider value = 옵셔널 지정> 예: {value, setValue}
  <ChildComponent>
</MyContext.Provider>

===ChildComponent
const [value,setValue] = useContext(MyContext)

 

========== Additional Hooks =============

4. useRef  input같은 것의 반복적인 state호출 방지용.

const inputRef = useRef(null);
const someFunction = () => {
	console.log(inputRef.current.value) //값이 찍힘. inputRef.current.focus()도 많이 씀.
}

<input type="text" ref={inputRef} />

    => 기존방식 대비 value와, onChange 없어도 된다. (값이 바뀔때 마다 뭘 하진 않고, 필요시 전체값만 읽는 경우에 최적)

 

5. useMemo  : cache기능 함수의 return값을 cache해 놓고, state가 바뀔때만 다시 계산함.

const [first, setFirst] = useState('Y ')
const [last, setLast] = useState('K ')
//이 방식은 페이지 로드시마다 매번생성   const name = `${last} ${first}`

const name = useMemo(()=> {
  return first + last
}, [first, last])

 

6. useCallback: useMemo와 거의 같은데 함수 자체를 cache함.
 참고: react-native에서는 useFocusEvent와 결합하여 goBack()으로 이동시에 자동 화면 새로고침에 사용가능.

   useEffect(() => {
        console.log("ConsignDetail consigneeCd", consigneeCd);
        search();

        //아래 H/W키처리 코드 => useCallback으로 대체
        // const backHandler = BackHandler.addEventListener('hardwareBackPress', handleBackPress);
        // return () => backHandler.remove(); // 컴포넌트 언마운트 시 이벤트 핸들러 제거

    }, [consigneeCd, refreshTime]);


    useFocusEffect(
        useCallback(() => {
            // 화면으로 돌아올 때의 처리
            setRefreshTime(Date.now().toString());
            console.log("ConsignDetail화면 진입")
            return () => {
                // 화면이 벗어날 때의 처리
            };
        }, [])
    );

 

7. useReducer : 몇가지 state를 모아서 한꺼번에 반영. => setState 여러번하는거 보다 효과적.



 

8. useLayoutEffect :  useEffect와 비슷한데, UI를 blocking함,  UI용 좌표계산 같은 걸 할때 효과적.

 

9.  useImperativeHandle  : forwardRef()와 함께사용해서 자식Component가 부모Component에 메소드 노출. 
예제

부모 컴포넌트

    const setPreviewPageNo = (pageNo) => {
        if (refPdfViewer.current) {
            refPdfViewer.current.setPageNo(pageNo);
        }
    };
    
    <PdfViewer file={docGen.previewUrl}
               onLoadSuccess={(count) => {setPreviewPageCount(count)}}
               ref={refPdfViewer}
    />
    
    
 자식 컴포넌트 : setPageNo를 부모에 전달. 
 const PdfViewer = forwardRef(({file, onLoadSuccess, showPagination}, _ref) => {
 
    const [currentPageNo, setCurrentPageNo] = useState(0);
 
    useImperativeHandle(_ref, () => ({
        setPageNo: (pageNo) => {setCurrentPageNo(pageNo)},
    }));
 
 }

 

 

10. useDebugValue: 리액트 devTool에 state컴포넌트 같은걸 출력. 주로 customHook 안에서 사용. 

 

 

Posted by yongary
,

React내 <div style={{

React.js 2023. 4. 16. 00:31

React내의 <div 나 <image에 style을 주는 예제.

<div style={{
	display: "flex",
    flexDirection: "column",
    padding:10,
    border: "1px solid grey",
    widht: "30%",
    marginTop: 10,
    gap: 10,
    justifyContent:"space-between"
    }}
>
 <img
 	src = {product.thumbnail}
    alt = {product.title}
    style = {{ height: 200, objectFit: "cover" }} 
                        //cover는-꽉차게(비율유지), contain-안에포함, fill-꽉차게 비율깨짐)
    />
</div>
Posted by yongary
,

CSS 기본

FRONT-END 2023. 4. 8. 21:21

CSS specicificity:  인라인 style1순위, ID 2순위, class 3순위, 요소 4순위 => 1,0,0,0 혹은 1000 형태로 표현됨. 0010 은 class임.

 =>  p { color:red;]  .p1 { color:green; } 이면  p는 0.0.0.2 이고  .p1은 0.0.1.0 이라서  .p1이 힘이 우선 적용된다...

   (p가 0.0.0.1이 아니고 0.0.0.2인 이유는 아직 잘 모르겠음) => 암기: Inline + ICA(id,class, attribute)

 

CSS Selectors: 

  • Universal Selector:   * {  padding: 10px; }
  • Element Type Selector:    ul {border: solid 1px #ccc;}
  • ID selector:   #myContainer { width: 90px; margin: 0 auto; }  =>  <div id="myClass"/>
  • Class selector:  .box {width: 20px;}  => <div class="box">
  • Descendant 결합:   #container .box{ float:left; }   =>  <div id="container">   <div class = "box">   HI  </div>  </div>
  • 1단계 Child만 결합:  #container> .box{ float:left; }    위예제는 모든 자손들 box 다 포함이지만, > 사용시 딱 1단계 child만 적용
  • 동일레벨(sibiling) 결합: h2 ~ p {font-weight: bold;} =>   <h2> A </h2>   <p> B </p>  도  굵게 됨.
    #container ~ .box  라고 동일 레벨선상의 두 요소에 전체적으로 적용이 됨.
  • 요소(attribute) selector:    input [type="text"]  {background-color:#fff;}    =>  <input type="text"> 에 적용됨.

Internal Style Sheet VS. External  :    (external:  <link rel="stylesheet" href="blabla.css">  )

    html 안에서 직접 CSS사용하고 싶으면 <style> </style> 테그만 있으면 된다.

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Internal CSS Example</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      background-color: lightblue;
    }
    h1 {
      color: white;
      text-align: center;
    }
    p {
      font-size: 18px;
      color: darkblue;
    }
  </style>
</head>

 

Posted by yongary
,

함수

javascript 2023. 3. 27. 20:44

function a() { } 보다 ,    const a = () => {} 로 쓰는게 좋다.

==> 이유 1. function은 생성자인지 함수용도인지 헤깔리지만, const는 항상 함수 용도이다.  생성자가 필요하면 class로 쓰면 된다.

         이유 2. const의 우측 ()=>{} 이걸 변수에 대입하는 느낌으로 array안 이나, 함수 parameter등 동일한 방식으로 사용가능하단.

단,

let object= {

    name: 'kim'

    run : ()=> {}   까지는 굿인데, {}안에서 this는 못 쓰는 문제가 있어, 이때는 function써도 되지만 위 문제들 때문에 그냥
    run() {..}        쓰면 된다.

}

 

 

closure: 내부함수가 외부함수의 변수를 access할 수 있다. (상식수준임) =>  예제코드에선 function이 이너함수를 리턴하는 형태가 많음.

 

Javascript map과 forEach의 차이점.  map은 매번 뭔가를 리턴을 한다. 따라서 array를 map시 새 array가 생긴다.

 

[ CSS 로 이동예정]

CSS specicificity:  인라인 style1순위, ID 2순위, class 3순위, 요소 4순위 => 1,0,0,0 혹은 1000 형태로 표현됨. 0010 은 class임.

 =>  p { color:red;]  .p1 { color:green; } 이면  p는 0.0.0.2 이고  .p1은 0.0.1.0 이라서  .p1이 힘이 우선 적용된다...

   (p가 0.0.0.1이 아니고 0.0.0.2인 이유는 아직 잘 모르겠음)

 

 

 

Posted by yongary
,

spread ...

javascript 2023. 3. 21. 00:00

1. let arr = [ [1,2], [2,3] ]

...arr 은  [1,2], [2,3] 을 의미하지만 직접 사용하지는 못하고 [...arr]이나 {...arr} 등으로 사용가능하다.

 

2. let json = {a:1, b:2}

 ...json 은 a:1, b:2 를 의미하지만 위 예제와는 달리 iterable은 아니라서   {...json}형태로 쓰면 복사효과가 있다.

 

 

1에서 let spread = [].concat( ...arr)
  ==>  spread 는  [1, 2, 2, 3] 이 된다. concat이 여러개 array(iterable)를 수용가능.

 

 

Posted by yongary
,

75가지 질문들 :  REF

 

- clickJacking: 

ClickJacking is an attack which lets the developer fool the users into thinking that they are clicking one thing but actually they are clicking the other one.

- Coercion :  javascript 타입변환으로 자동변환과 강제변환(explict coercion)이 있다.   explict 예:) Number('1') 

 

- IIFE :  즉시 실행함수, 아래와 같이 정의즉시 실행됨.

(function(a, b) { return a + b })(1, 2) // 3

 

- srcset: @media css태그와 유사하게  html img 태그안에서, responsive한 image들 지정.

<img
  srcset="images/heropy_small.png 400w,
          images/heropy_medium.png 700w,
          images/heropy_large.png 1000w"
  src="images/heropy.png" />

 

- Mixin : A Mixin is a code block that lets the group of CSS declarations which we can reuse in our site. 

@mixin set-color {
  color: #fff;
  background-color: yellow;
}
 
h1 {
  @include set-color
}

 

- CSP : Content-Security-Policy : 웹 취약점 중 하나인 XSS등의 공격을 방지하기 위한 보안정책입니다.

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'none'">
;로 구분을 주어 사용하면 됩니다.

self : 현재도메인의 리소스만 만 사용하겠다는 뜻.
script-src 'none' : 모든 스크립트는 허용암함.
Posted by yongary
,

fail-fast vs fail-safe

java core 2023. 3. 7. 23:34

대부분의 iterator는 fail-fast이다.

작업중 데이터가 바뀐다면 ConcurrentModification Exception이 발생한다.

 

ConcurrentHashMap같은 몇몇 컬렉션타입은 fail-safe iterator를 지원하는데

이는 복제본을 가지고 작업을 하는 방식이라서

메모리 리소스 단점과 데이타가 부정확할 수 있다는 단점이 있다.

 

 

Posted by yongary
,

ERD 무료 툴 (draw.io)

BACK-END 2023. 2. 28. 19:18

erWin이 가격도 문제이고, 공유기능도 없어서 

초기에 스케치용으로 ERD를 그릴때는 draw.io 가 좋은것 같다. 여러명이서 구글드라이브에 공유해 동시에 그릴 수 있는 장점이 있다.

 

TIP: 

https://drawio-app.com/entity-relationship-diagrams-with-draw-io/ 

 

ERD외에도 다양한 diagram을 그릴 수 있는데,

- 어떤 형태의 Diagram이 좋을까는 여기참고: 

https://velog.io/@yooha9621/UML%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8UML%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8-%EC%A2%85%EB%A5%981

 

 

오라클에서 테이블목록, 엔터티정의서, 테이블정의서 추출 SQL: https://seodaeya.tistory.com/105 

 

# 테이블 목록 조회
SELECT A.TABLE_NAME AS 테이블명 , 
       B.COMMENTS AS 코멘트
  FROM USER_TABLES A
 INNER JOIN USER_TAB_COMMENTS B
    ON A.TABLE_NAME = B.TABLE_NAME
   -- AND A.TABLE_NAME LIKE 'TB_%' -- 네이밍룰 있을경우
   AND INSTR(A.TABLE_NAME,'TEST') = 0  -- TEST 테이블 있으면 제외
 ORDER BY A.TABLE_NAME
 

    
--  테이블 정의서

SELECT
    a.table_name     AS 테이블명,
    --a.tab_cmt        AS 테이블설명,
    a.column_name    AS 컬럼명,
    b.pos            AS PK,
    a.data_type      AS 데이터유형,
    a.DATA_LENGTH    AS 데이터길이,
    a.nullable       AS null여부,
    --,a.column_id      AS 컬럼순서,
    a.data_default   AS 기본값,
    a.col_cmt        AS 컬럼설명
FROM
    (
        SELECT
            s1.table_name,
            s3.comments   AS tab_cmt,
            s1.column_name,
            s2.comments   AS col_cmt,
            s1.data_type,
            CASE
                WHEN s1.data_precision IS NOT NULL THEN
                    data_precision
                    || ','
                    || data_scale
                ELSE
                    to_char(s1.data_length)
            END AS DATA_LENGTH,
            nullable,
            column_id,
            data_default
        FROM
            user_tab_columns    s1,
            user_col_comments   s2,
            user_tab_comments   s3
        WHERE
            s1.table_name = s2.table_name
            AND s1.column_name = s2.column_name
            AND s2.table_name = s3.table_name
            AND S1.TABLE_NAME in (
				SELECT TABLE_NAME from USER_TABLES
    )
    ) a,
    (
        SELECT
            t1.table_name,
            t2.column_name,
            'PK' || position AS pos
        FROM
            (
                SELECT
                    table_name,
                    constraint_name
                FROM
                    user_constraints
                WHERE
                    constraint_type = 'P'
            ) t1,
            (
                SELECT
                    table_name,
                    constraint_name,
                    column_name,
                    position
                FROM
                    user_cons_columns
            ) t2
        WHERE
            t1.table_name = t2.table_name
            AND t1.constraint_name = t2.constraint_name
    ) b
WHERE
    a.table_name = b.table_name (+)
    AND a.column_name = b.column_name (+)
ORDER BY
    a.table_name,
    a.column_id
Posted by yongary
,

react-router-dom

React.js 2023. 2. 25. 20:55

1. 설치는 npm install -save 로  react-router-dom@6 로 하면 6.0.2버전 등이 설치되며 기본사용법은 아래와 같이 <BrowserRouter> 밑에 <Routes>를 두고 그 밑에 여러개의 <Route>를 넣는 방식이다.

 

import {BrowserRouter, Routes, Route> from "react-router-dom"
import SubSystem1 from "./SubSystem1.js" 
import Admin from "./Admin.js"

export default cont HomePage = () => {

	return (
    	<>
        	<BrowserRouter>  //최상단
           		<Routes> //Router 여러개 포함
        			<Route path="/" element={<SubSystem1 />} />   //에전엔 component였는데 6부턴 element로 바뀜
        			<Route path="/admin" element={<Admin />} />
        
        		</Routes>
    		</BrowserRouter>
    	<>
    )

}

 

2. 혹시 첫 페이지에 간단한 링크를 넣고싶다면

<BrowserRouter>와 <Routes>사이에 아래 코드블락 같은걸 넣으면 된다.

Link도 react-route-dom에서 import하는건데,  <a href는 화면을 refresh하면서 가지만 Link는 refresh없이 변경되므로 뛰어나다.

 

 

    <nav>

          <Link to="/"> Home </ Link>

           <Link to="/admin"> admin </Link>   

    </nav>

 

3. <Link> 보다 조금 발전되어 active일 경우 style등을 넣는다던지 className을 넣는다던지 하고싶으면 <NavLink>를 사용하면 된다.  

<NavLink className="myclass" to="/"> Home </NavLink>

 

3.1  className을 좀더 발전시키면 className={({isActive}) => "myClass" + (isActive?"blue":""}

==> 이 경우 styles.scss 를 import를 하고 여기에 아래와 같이 css를 설정할 수 있다.

nav {
	a{
    	padding: 2em;
        font-size: 2em;
        &.blue{background-color: #00f;}
	}
}

3.2 위에서 &는 상위부모 (여기서는 a)를 치환한다고 보면되는데 자세한 설명은 REF참고. 

 

Posted by yongary
,

spring test에서 간단히 새로운 DB로 연결하는 방법.

 

@AutoConfigureMockMvc

class MyTest{
	
    @Container
    static MongoDbContainer mongoDBContainer = new MongoDBContainer("mongo:4.4.2"); //docker Image Name
    
    @DynamicPropertySource
    static void setProperties(DynamicPropertyRegistry dymDynamicPropertyRegistry) {
    	dymDynamicPropertyRegistry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl);
    }

		

}
Posted by yongary
,

마커 I/F, String(B...)

java core 2023. 2. 15. 21:23

대표적으로 Serializable, Clonable 등과 같이 실제로는 완전히 비어있는  마크전용 interface를 Mark interface라고 부른다.

목적은 type 체크를 위해서라고 보면 좋을것 같다.    Mark Annotation이라는 것도 있는데 -> REF

 

String <<< StringBuffer < StringBuilder 

StringBuffer와 StringBuilder의 차이는 synchronized 함수지원해서 Thread Safe인지,  아닌지 차이이다.  StringBuilder가 synchronized가 아닌만큼 더 빠르다.   Java 1.5부터는 간단한 String concat은  컴파일시에 StringBuilder로 대체해준다.   REF

 

 StringBuilder sb = new StringBuilder();
 sb.append("문자열 ").append("연결");
 String st = sb.toString();
Posted by yongary
,

좀 오래된 기술이고 요즘 잘 쓰진 않지만, 복습용으로 기록!

 

 

rmi (remote procedure call)의 layer구조:

rmi는 Object의 Serialize를 기반으로 이루어지므로,

client에서 refrerence해서 사용하는 object가 다 사용되면, server에서 client의 Object를 gc(garbage collection)하게 되는데 이를 분산GC = DGC라고 부른다.

 

 

Applet:  flash를 거쳐 html5 canvas등으로 대체되면서 잘 안쓰고 있는 것으로 보이지만 처음 나올 당시에는 획기적인 기술이었음.
=> Life cycle은   init -> start -> paint(g) -> stop -> destroy로 이루어져 이후 많은 플랫폼들의 기초가 되었다고 생각된다.
 stop과 start는 브라우저가 최소화, 최대화 될때마다 발생한다. 

Posted by yongary
,

aggregation중에 필드별  계산이 필요할 경우,  .andExpression을 통해 계산된 결과를 바로 받을 수 있고 이후에 조건/group도 가능핟.

// [select column]
ProjectionOperation projection = Aggregation.project()
        .and("gongsunGroup").as("gongsunGroup")
        .and("farmerNo").as("farmerNo")
        .and("pummokName").as("pummokName")
        .and("pumjongCode").as("pumjongCode")
        .and("rawReceivingDay").as("rawReceivingDay")
        .and("pboxCount").as("pboxCount")
        .andExpression("divide(floor(multiply(weight, 100)),100)").as("weight")
        ;

 

.andExpression과 비슷하지만 if 조건을 걸고 싶을 경우 (oracle에서 code였던가?)
.

ConditionalOperators 와
project에  .applyCondition(cond, field("nbE"))

을 사용하면 된다.  링크: https://yongary.tistory.com/420?category=539865 

Posted by yongary
,

ssh 터널링

network개발 2022. 9. 6. 16:07

1. 220서버에 들어간 후  100번서버를 localhost:30000으로 매핑. 

ssh -p 33331 ubuntu@220.83.x.x -L 30000:192.168.30.100:30000 

==> ssh -L 8080:원격서버주소:80 중간서버주소
의미:  중간서버에 접속해서  중간서버가 접속가능한 원격서버:80로 접속하는데,   이걸 localhost:8080으로 사용한다는 의미. 
(그외: -L 파라미터는 로컬 포트 포워딩 이외에도 다른 유형의 포트 포워딩을 설정하는 데에도 사용될 수 있습니다. -R 파라미터는 원격 포트 포워딩(remote port forwarding)을 설정하는 데에 사용되며, -D 파라미터는 다이나믹 포트 포워딩(dynamic port forwarding 또는 SOCKS 프록시)을 설정하는 데에 사용됩니다.)


 

2.특정서버의 27017포트를 현서버의 57017로 터널링.


ssh  (-i 등등) -L 57017:localhost:27017 -N centos@private서버.IP

 

3:

ssh -i ~/.ssh/my.pem -t -t -L 57017:localhost:57017 centos@54.xx.xx.xx ssh -i my.pem -L 57017:localhost:27017 -N centos@VPCIP

Posted by yongary
,