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
,

 

[1.기본설치 - mongoDB 5.0 기준]

 

MongoDB 저장소 추가하기

1. MongoDB는 CentOS의 기본 저장소에 포함되어 있지 않으므로, 별도의 저장소를 추가해야 합니다. 다음 명령어를 터미널에서 실행하여 MongoDB 저장소를 추가합니다

 

$ sudo vi /etc/yum.repos.d/mongodb-org-5.0.repo

아래내용 입력 저장.

[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/5.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc
 
2. 그 다음에 진짜 설치.
- $sudo yum install mongo-org

 

3. 설치 완료후 설정 수정.

- /etc/mongod.conf 에  bindIp를 0.0.0.0 으로 수정.

 

4. 시작 

- $sudo systemctl start mongod 
=> (start를  status로 고치거나, restart로 고치면, 상태조회, 재시작 가능.)

 

 

 

 

[2. replicaSet 설정 법]

https://docs.mongodb.com/manual/tutorial/deploy-replica-set/

  - /etc/mongod.conf 에 replication 추가 필요. [기본 3서버 설정 기준, =>  2서버 1가상 arbiter설정은 아래 참조]
replication:
   replSetName: "rs0" 

 

  • (sudo) service mongod start
  • 3대가 다 시작되면 그 중에 한대에 mongo 로 접속해서 아래명령 실행필요,
arbiter없을 경우:
  rs.initiate({
   _id : "rs0",
   members: [
      { _id: 0, host: "172.31.47.103:27017" },
      { _id: 1, host: "172.31.46.185:27017" },
      { _id: 2, host: "172.31.43.168:27017" }
   ]
})

arbiter있을 경우:
  rs.initiate({
   _id : "rs0",
   members: [
      { _id: 0, host: "172.31.47.103:27017" },
      { _id: 1, host: "172.31.46.185:27017" }
   ]
})

rs.conf() 및 rs.status()로 확인가능.

 

[2서버 1 아비터 설정시]

arbiter 세팅시에는, member2개로 rs.initiate하고 rs.addArb(“host:port”)를 수행.

https://thomassileo.name/blog/2012/03/08/how-to-mongodb-replica-sets/

그전에 arbiter 기동은 https://docs.mongodb.com/manual/tutorial/add-replica-set-arbiter/ 

1. $sudo mkdir -p /var/lib/mongodb/arb

2. $sudo mongod --dbpath /var/lib/mongodb/arb --replSet rs0 --bind_ip 0.0.0.0

 

 

priority변경 은: PRIMARY서버에 붙은 후

cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 1.0
cfg.members[2].priority = 0.5
rs.reconfig(cfg) 

 

Posted by yongary
,

1. aggregation시 조건부 sum을 하는 방법입니다.

https://stackoverflow.com/questions/41218321/grouping-and-sum-with-conditions

 

ConditionalOperators.Cond cond = when(Criteria.where("status").is("PRESENT")).then(1)
                .otherwise(when(Criteria.where("status").is("ABSENT")).then(2)
                .otherwise(100));
                
//ond operatorNbS = ConditionalOperators.when("scst").thenValueOf(1).otherwise(0);

Aggregation agg = newAggregation(
    match(Criteria.where("bid").is("build_1481711758"),
    project("bid") 
        .and("scst")                            
        .applyCondition(cond, field("nbE"))

 

2. aggregation시 substring을 이용한 조건부 sum을 하는 방법입니다.

https://recordsoflife.tistory.com/463

Posted by yongary
,

WebGL은 OpenGL기반으로 만들어진 javascript용 라이브러리이다.

react에서 활용가능한 webGL 라이브러리가 여러가지 있으나 three.js가 괜찮아 보인다.

지원 브라우저에 주의하여야 한다.

 

저장포맷으로는 JSON기반인 glTF 를 많이 사용한다. 


(webGL 관련 예제)
https://code-masterjung.tistory.com/m/101?category=928099 

 

React로 Threejs 예제 따라 구현하기

 css를 공부하다 보니 자연스레 WebGL에 관심이 생겨 기본 개념을 익힐 겸 공식 문서를 따라 만들어 보았다(openGL은 일단 조금 나중에 다시 보는 걸로..). 사실 문서가 너무 잘 돼있어 예제를 단순히

code-masterjung.tistory.com

 

Posted by yongary
,

//summaryStatistics 를 이용한 통계방식 적용.
DoubleSummaryStatistics tpStat = list.stream().mapToDouble( log -> log.getTemp()).summaryStatistics();

 

이렇게 하면 다음과 같은 값들을 한번에 구할 수 있다. 사용법은 tpStat.getCount(), getSum() 등등

private long count;
private double sum;
private double min;
private double max;

Posted by yongary
,

기본적인 서버구성이 끝났다면.. (여기서는 2대의 서버에, route53을 통해 도메인 하나 공급을 가정)
  - 기본서버설정(jdk설정) : www.liquidweb.com/kb/install-java-8-on-centos-7/ 

  - ulimit설정    : https://www.baluna.ro/increasing-file-descriptors-and-open-files-limit-in-centos-7/

  - 혹시 efs연동시에는 : docs.aws.amazon.com/efs/latest/ug/efs-onpremises.html 참조. 

  - 타임존 설정: $sudo timedatectl set-timezone Asia/Seoul

  - 로케일 설정: ma.ttias.be/warning-setlocale-lc_ctype-cannot-change-locale-utf-8-no-such-file-or-directory/ 

 

(zooKeeper서버 설정시에는 /root/zookeeper/conf/zoo.cfg 에 자기IP만 0.0.0.0 다른 2서버  IP기재 + /var/zookeeper/myid 를 각각 1,2,3으로 설정)

 

1.    AWS의 ACM을 통해 인증서를 발급 받는다.              (참고: jojoldu.tistory.com/434

 

AWS의 Certificate Manager 로 SSL 인증서 발급 받기

보통 서비스가 소규모라면 1대의 서버에 Nginx를 설치하고 Let's Encrypt 를 설치해서 SSL을 등록합니다. 다만 이럴 경우 트래픽이 늘어 로드밸런서 + 여러 서버 구성으로 확장하기가 쉽지 않습니다.

jojoldu.tistory.com

  - 진행 중, [Route53에서 레코드 생성]버튼이 안나올 경우. 

      =>1방법(잘안됨) :  도메인 구매한 사이트의, 도메인 구성에 가서 CNAME 레코드를 추가한다.
         CNAME :  _990122b262bc3ecxxxx.acm-domainname.com 형태로 key와 value를 추가한다. 
             (hostname은 _990122b262bc3ecxxxx 까지만, . TTL은 3600정도..)
      => 2방법: route53으로 직접가서 호스팅영역(mydomain.com)을 먼저추가하고, AWS에 알려주는 4개
              (예: ns-620.awsdns-1.net.
ns-222.awsdns-31.com.ns-333.awsdns-26.co.uk. ns-444.awsdns-50.org.)
          를 도메인 구매한 사이트의, 도메인 구성에 가서 네임서버 1차,2차,3차,4차 로 설정한다.
           ==> 2방법 이후에 [Route53에서 레코드 생성]버튼이 보이므로, 누르면 된다.

       
     (30분 가량 대기하면 인증서 발급이 된다)

2. 그 후, 로드밸런서를 생성한다.

   로드밸런서 설정에서 타겟그룹을 구성하고, 서버2대를 추가.

 

   로드밸런서의 인증서 선택은 1에서 생성한 인증서를 선택한다. 
   보안그룹은 하나 만들어서 넣거나, 미리 만들어 둔 후 고르면 되고(후자 권장)

 

   라우팅 구성, 대상그룹 선택에서 앞서만든 타겟그룹을 추가하면 된다.  프로토콜은 HTTP로 된다. 

 

3. 로드밸런서 stickiness

   - 로드밸런서로 서버 2대에 부하를 분산할 경우,  접속자가 동일한 서버로 계속 접속되는 게 세션관리나 log측면에서 편하다.

  - 이 기능을 stickiness라고 하는데, AWS에서는 stickiness 세팅을 로드밸런서에 하지 않고,  Target Group에서 한다.


  아래 그림과 같이 Attribute에서 stickiness와 stickiness duration을 세팅하면 된다.    

   

 

4. 마지막으로, route53에 가서 A.레코드 세트를 추가하면서, Alias사용을 선택하면 로드밸런서를 선택할 수 있다.
  이름은 안넣고 하나생성, www 넣고 하나생성 .. 이렇게 A레코드 2개 세트 권장.

Posted by yongary
,