분류 전체보기
ubuntu gradle version up
docker로 띄운 ubuntu에서 maven to gradle 전환도중 gradle이 필요해서, apt-get install gradle apt-get 으로 gradle을 설치했지만 4.4.1 버전이 설치되었다. gradle로 migration을 하기위해서는 7 버전대가 필요했다. sdkman을 활용해서 gradle을 설치해보겠다. // sdkman을 설치하기위해 zip 선행 다운 apt-get install zip curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" // sdk version 체크 sdk version sdk install gradle 7.1 sdk로 원하는 gradle 버전을 명시하고 다운로..
Spring DataSource 두개 사용하기(Abstract)
한번의 request 요청시, spring에서 두 개의 db에서 각각 값을 조회해야하는 경우가 생겼다. datasource routing이 제대로 설정안돼, 오래동안 삽질한 결과를 적도로 하겠다. 보통은 한 개의 datasource를 사용할 경우, application.properties(yml) 에 db정보를 입력해주면, 자동으로 spring이 datasource정보를 등록을 해준다. 하지만, 멀티 datasource를 사용해야 할 경우, 수동으로 등록을 해주어야한다. /resources/application.properties // application.properties datasource.main.driver-class-name=com.mysql.cj.jdbc.Driver datasource.ma..
사설 docker registry 서버 인증서 갈아끼우기
systemctl restart docker cd /usr/local/share/ca-certificates/ mkdir corp cp -rf ~/cacert.pem ./corp/ 접근하고자 하는 서버에서, openssl x509 -inform PEM -in cacert.crt > cacert.pem echo subjectAltName=IP:[서버 ip] > exfile.cnf openssl req -new -key ./certs/domain.key -subj /CN=[REGISTRY서버 IP] -out ./certs/domain.csr 회사 사무실을 옮김으로 인해, registry 서버의 ip변화로, docker registry의 인증서 교체가 필요했다. 사내용으로, 공식 ssl이 아닌, sel..
Aop
1. Aspect : 비즈니스 로직을 제외한 부가 기능에 대한, 코드들을 응집시켜 컴포넌트로 만든 것. 2. Target : Aspect를 적용한 대상을 의미한다. (class,method) 3. Advice : 어느 시점에 Aspect를 적용 할지 결정하는 것을 의미한다. 4. JointPoint : Advice가 적용될 수 있는 위치들, 즉 Method 진입 지점, 생성자 호출 시점, 객체 동작 시점이나 필드에서 값을 꺼낼때 등 적용 가능한 다양한 상황을 의미한다. 5. PointCut : 실제 advice가 적용될 지점을 설정한다.
자바 파일(하위파일 전부) 삭제 코드
try { File rootDir = new File("/home/mjs/test/myfolder"); Files.walk(rootDir.toPath()) .sorted(Comparator.reverseOrder()) .map(Path::toFile) .forEach((file)->{ System.out.println("Remove file: " + file.getPath()); file.delete(); }); } catch (IOException e) { e.printStackTrace(); }

Jenkins 로 bitbucket 연동(with gradle)
환경 -linux -gradle -jenkins -docker -bitbucket 1. bitbucket에 repository를 생성후 , web hook을 설정합니다. url은 jenkins 도메인에 /bitbucket-hook/ 을 달아줍니다. 이유는 모르겠지만 다른 하위 도메인을 넣고 jenkins에 넣어줘도 hook이 인식이 되지 않았습니다. Freestyle project 선택하기전, gradle과 bitbucket plugin을 설치해야합니다. repository url을 입력후 credential생성은 bitbuckte 계정 이메일과 App password를 발급받아서 넣어야합니다. 기존 계정 비밀번호는 ,bitbucket의 정책에 의해서 사용이 안됩니다. 그리고 빌드유발에, bitbucke..
Docker 자주 사용하는 명령어 모음집
//Dockerfile //Dockefile 네이밍을 정확히 해줘야 나중에 에러가 발생하지 않는다. FROM hirokimatsumoto/alpine-openjdk-11 EXPOSE 8080 ARG JAR_FILE=build/libs/backend-external-0.1.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","backend-external-0.1.jar"] Dockerfile build 명령어 docker build -t [네이밍태그] . docker cp 명령어 호스트 -> 컨테이너 docker cp [host 파일경로] [container name]:[container 내부 경로] 컨테이너 -> 호스트 docker cp [container ..
docker 볼륨마운트,바인드마운트
앞서서 볼륨이란! 스토리지의 한 영역을 분할한것을 말한다. ssd를 분할한것이라고 생각하면 쉽다. 마운트란 -> 연결한다 라는 의미 그대로 대상을 연결해 운영체제 또는 소프트웨어의 관리하에 두는 일을 말한다. 마운트를 해야하는 이유??. 실제로 컨테이너를 사용하려면 스토리지 영역을 마운트해야한다. 왜냐하면 데이터가 이 스토리지에 있기 때문이다 컨테이너가 종료되거나 삭제된다면, 컨테이너 속의 데이터가 같이 소멸한다. 그렇기 때문에, 컨테이너의 데이터를 외부로 대피시켜야한다. 단, 컨테이너는 생성 및 폐기가 매우 빈번하기 때문에, 매번 데이터를 옮기는 대신 처음부터 컨테이너 외부에 둔 데이터에 접근해 사용하는것이 일반적이다. 이를 데이터 퍼시스턴시 라고 한다. 이 때 데이터를 두는 장소가 마운트된 스토리지 ..

도커 허브와 이미지, 그리고 컨테이너
이미지와 컨테이너 컨테이너를 생성하기 위해서는 이미지가 필요하다. 이미지를 설계도,빵틀, 금형 정도로 생가하면 좋겠다. 이미 많은 분들이 이미지와 같은 형태를 경험하셨을 것이다. aws rds를 만들때 여러 운영체제중 하나를 골라서 생성했다. 그때 그것이 AMI 이고 , 도커의 이미지와 유사하다. 우리가 실제 사용하는것은 컨테이너이다. 컨테이너로도 이미지를 만들 수있다. 생선된 컨테이너를 다시 이미지로 변환 할수있다. 조금더 개조하거나, 수정해서 이미지로 만들 수있다. 매우 편리한 기능이다. 이 기능이 없다면, 처음부터 다시 이미지를 만들어야 하기때문이다. 도커 엔진 간의 이동이 가능하다 동일한 컨테이너를 여러개 만들지 않더라도, 다른 물리 서버에 설치된 도커엔진으로 컨테이너를 이동 시킬수있다. 그럼 동..

도커의 동작 원리
도커의 구조 도커의 동작원리를 이해하기 위해, 구조를 확인해보자. 서버컴퓨터 -> 리눅스 운영체제 -> 도커엔진 -> 컨테이너 순으로 그러면 컨테이너 안의 구조는 어떻게 되어있을까요? 컨테이너 안에도, 리눅스 운영체제와 비슷한 것 이 존재합니다. 네 애매합니다. 대체 비슷한 무엇가는 무엇일까요? 운영체제가 하는 일은?? 소프트웨어나 프로그램의 명령을 하드웨어에 전달하는 역할을 한다. 쉽게 애기하자면, 소프트웨어에서 명령하는 A문을 하드웨어에서는 이해를 하지 못하기때문에, 운영체제가 A문을 다시 변환을해서 하드웨어에게 알려주게 된다. 이런한 연락을 전달하는 부분을 커널이라고 합니다. 그래서 다시 돌아오면, 컨테이너는 docker engine 위에서 독립된 존재이기때문에, 서버의 리눅스 커널에 닿지 못한다...
트랜잭션 ACID
트랜잭션 ACID 1) 원자성(Atomicity): 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 하거나 모두 실패해야 한다. ->> 쿼리중 하나가 성공하고, 하나가 실패되면 rollback이 되야한다. 2)일관성(Consistency): 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다. 3)격리성(isolation) : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준 (Isolation level)을 선택할 수 있다. ->> 한 세션에서 db를 수정..
SSH Key 생성과 접속 간편화
jenkins, aws를 사용할때 ssh key라는것을 많이 사용했다. 그냥 간단하게 사용만 했지 구체적으로 어떤 것인지 몰라서 공부를 진행해 봤다. ssh key를 사용하는 경우) - 비밀 번호 보다 높은 수준의 보안을 필요로 할때 - 로그인 없이 자동으로 서버에 접속 할때 ssh key는 공개키(public key)와 비공개키 (private key)로 이루어져 있다. 비공개키는 로컬머신 공개키는 리모트 머신에 위치해야한다. ssh 접속을 시도하면 ssh client가 로컬 머신의 비공개키와 원격머신의 비공개키를 비교해서 둘이 일치하는지를 확인한다. ssh key를 생성하기위해서는 리눅스,맥 터미널에서 ssh-keygen 명령어를 사용하면 된다.(맥 굳굳) ssh-keygen -t rsa ->> rs..