Java - native method With System.arraycopy() (Feat. ArrayList)

이미지
요즘, 그동안 기본기를 너무 챙기지 않고 프레임 워크와 아키텍쳐에 빠졌나 싶어서, 자료구조와 알고리즘을 다시 보고 있다가, 실질적으로 jdk 의 List 구현체인 ArrayList 를 까서 보았다. 그러다가 흥미로운 것을 보게되었고, 실질적으로 jdk 를 까보는 것도 재미가 있어서 블로깅을 해본다. 다들 알겠지만, ArrayList 는 말 그대로 내부적으로 data 를 저장하는 배열(array) 을 가지고 있다. 자료구조와 알고리즘 공부를 하게되면, 기본중의 기본인 ArrayList 와 LinkedList 의 비교를 하게 된다. ArrayList 의 add() 메서드는 끝에 집어 넣을 때 O(1) 상수 시간이고, 처음에 집어 넣을 때와 일반적인 상황에서 O(n) 으로 선형 시간이 된다.  remove() 메서드도 배열의   제일 마지막을 지울 경우 O(1) 상수 시간이고, 처음을 지울 때와 일반적인 상황에서는 O(n) 으로 선형 시간이 된다. 배열을 내부적으로 가지고 있기 때문에, 당연하게 시작 혹은 중간에 data 를 삽입하게 되면 삽입 지점 index 에 있던 원래 있던 data 부터 배열의 끝까지의 모든 데이터들을 다음 index 공간( 오른쪽 )으로 Shift 연산을 해야 한다. 즉 해당 index 지점부터 배열의 끝까지 순회 하면서 오른쪽으로 한 칸 씩 밀어주게 된다. 반대로 remove 삭제의 경우에도, 시작 혹은 중간에 data 를 지우려고 하면 해당 지점 index 한칸 뒤에 있는 지점부터 배열의 끝까지의 data 들을 한칸 씩 모두 왼쪽으로 Shift 연산을 해야 한다. 즉 해당 index 다음 지점부터 배열의 끝까지 순회 하면서 왼쪽으로 한 칸 씩 밀어주게 된다. 이미지 제작의 귀찮음으로 아래 사이트의 이미지를 사용했다. https://cloudstudying.kr/lectures/138 그래서 Shift 연산이 필요하기 때문에 선형 시간 O(n) 의 시간 복잡도를 가진다. 자, 그렇다면 이제 JDK 를 까보자....

Spring Boot Admin with Spring Boot Actuator

이미지
이번 글에서는 spring boot admin 에 대해 다루어 보겠다. spring boot admin 은 spring boot 어플리케이션들을 모니터링하고 관리하기 위한 웹 어플리케이션이다. 각각의 어플리케이션은 client 로 간주되고 admin server 에 등록된다. spring boot actuator endpoints 만 열어두면 알아서 설정이 된다. 정말 쉽고 간편하다. https://github.com/codecentric/spring-boot-admin https://www.baeldung.com/spring-boot-admin 정리해볼 내용은 아래와 같다. 1. spring boot admin client 1개 구현 (with spring boot actuator) 2. spring boot admin server 1개 구현 https://github.com/ndgndg91/actuator-boot-admin spring boot admin client 는 임의로 api 하나를 가진 api server application 이다. 이 application 은 spring boot actuator 설정을 통해서 여러가지 endpoint 를 열어둔다. 또한 다른 하나의 application 은 spring boot admin server 이다.  필수 dependency 는 actuator 와 admin-client 이다. data-jpa 와 web 그리고 h2 임의의 api endpoint 를 만들기 위해 추가했다. 다음으로 yaml 파일을 보자.  여기서 must 는 admin.client.url 이다. 1. spring.boot.admin.client.url 이다. admin.server url 을 설정하는 것이다. 2. management.endpoints.web.exposure.include 는 내맘으로 "*" 모든 end points 를 열어주었다. clinet application 의 마지막 임의로 만든 api 를...

Spring Boot Application Blue/Green Deploy to AWS Elastic Beanstalk Using Jenkins

이미지
바로 이전 글  스프링 부트 앱 EB 배포  에서 Spring Boot App 을 AWS console 을 이용해서 Elastic Beanstalk 에 단일 인스턴스 환경으로 배포했다. 하지만, 이전에 올렸던 소스는 local mariaDB 를 바라보고 있다. 따라서 회원가입 및 로그인 기능이 전혀 동작하지 않을 것이다.  이번 글에서 정리할 내용은 local MariaDB 를 AWS RDS MariaDB 를 바라보도록 변경하고, Blue/Green Deploy 를 Jenkins 를 이용해서 진행해볼 예정이다. 아래 포스트들에서 EC2 에 Jenkins 를 설치하고, Gradle 과 Git 을 이용하여 jar 로 Build 하고 S3 versioning 을 통해서 jar 를 관리하는 방법을 정리했었다. EC2에 젠킨스 설치 젠킨스로 Build 하고 S3 로 jar 관리하기 또한 Blue/Green Deploy 를 하기 위해서 기존에 Blue Environment 에 대한 설정을 그대로 따르기 위해, option-settings.json 란 파일을 생성하며 새로운 Environment 생성 시 동일한 구성을 사용할 수 있도록 하겠다. 마지막으로 Jenkins 가 설치된 EC2 에 Elastic Beanstalk Full Access Role 을 부여한다. 기존에 배포된 EB 환경에서는 DB connection 이 이루어지지 않아서 기능이 전혀 동작하고 있지 않은것을 확인할 수 있다. 먼저, local MariaDB 를 바라보고 있는 설정을 AWS RDS MariaDB 로 변경해보겠다. url 을 AWS RDS 로 변경했다. username 과 password 는 보안상의 이유로 적지 않았다. 그럼 이제 변경사항을 push 하고 Jenkins 를 이용하여 Build 하겠다. 젠킨스로 Build 하고 S3 로 jar 관리하기  글에서 작성한 방법으로 Build 를 했다. 다음은 기존 Environment 와 동일한 Environme...

Spring Boot Application Deploy to AWS Elastic Beanstalk

이미지
aws console 을 이용해서 spring boot application 을 aws Elastic Beanstalk 에 배포하는 것을 정리해보겠다. EB 를 들어가면 어떤 애플리케이션도 없을 경우 아래와 같은 화면을 확인할 수 있다. Create Application 을 눌러서 배포를 진행해보자. 어플리케이션 이름은 임의로 배포하려는 앱에 따라 지어주면된다. 플랫폼은 spring boot app 을 jar 로 올릴경우 Java 로 선택하면 된다. 코드 업로드는 로컬에서 업로드해도 되고 S3 에 jar 가 있다면, S3 URL 을 넣어주면 된다. 이제 구성쪽으로 넘어가자. 우선 단순한 예제를 진행함으로 단일 인스턴스 구성을 해주었다. 따라서 로드 밸런서에 대한 신경은 꺼버리면 된다. 보안 그룹의 경우, 기본적으로 inbound 에서 80 port 를 열어줘야 된다.  outbound 는 모든 통신을 허용해주면 된다. 제일 중요한 부분이다. EB 는 기본적으로 reverse proxy 용도로 nginx 를 사용하고 있다. default port 는 5000 번이다. 반면에, spring boot 는 default port 8080 을 사용한다. 따라서 그냥 배포를 할 경우, 배포 완료되고 environment url 을 들어가게되면 달콤한 502 error 를 마주할 수 있다. https://aws.amazon.com/ko/blogs/devops/deploying-a-spring-boot-application-on-aws-using-aws-elastic-beanstalk/ 따라서 EB 의 nginx port 설정을 spring boot port 에 맞추거나, spring boot port 를 nginx port 에 맞춰줘야 한다. 나는 EB 기본 port 5000 에 맞추었다. 아래와 같이 application.yaml 의 port 를 5000 으로 변경했다. 그리고 EB 환경 속성에 SERVER_PORT 라 하여 5000 으로 싱크를 맞추었다. 정상적...

Spring Boot App Build With Gradle Using Jenkins In AWS EC2

이미지
지난글  Install Jenkins In AWS EC2  에서 EC2 를 생성하고 Jenkins 를 설치하는 것을 정리해보았다. 이번에는 설치한 Jenkins 를 이용해서 Spring Boot App 을 Build 하고 S3 에서 jar 를 관리하는 것을 정리해보겠다. 먼저, Spring Boot 프로젝트는 Git Repository 가 있다는 전제하에 진행하겠다. 필자의 경우 최근에 공부한 spring-security 프로젝트를 build 해 볼 예정이다. https://github.com/ndgndg91/security 그리고 Build Tool 은 Gradle 을 이용할 것이다. 또한, S3 에 build 한 jar 를 올릴거니까, S3 가 있어야 되며, EC2 안에서 AWS CLI 를 이용할 것이다. Jenkins 로 Build 하려면 Jenkins 에게 권한을 줘야한다. 따라서, 정리하자면 아래의 순서대로 진행하겠다. Generate S3 for jar EC2 에 S3 FullAccess Role 부여 Install Git Install Gradle Grant SU to Jenkins Jenkins JAVA_HOME, GRADLE_HOME, GIT PATH 설정 Build Script 작성 먼저, jar 용 S3 를 aws console 을 이용해서 만든다. Bucket 이름은 자유롭게 알아서 해준다. 나의 경우 spring-boot-app-jars 라는 이름을 정했고, region 은 서울로 했다. 여기서 중요한 포인트는 버전 관리를 하는 것이다. 동일한 이름으로 jar 를 S3에 저장할 것이다. 따라서 S3 에 jar Object 를 올릴 때 마다 S3가 해당 jar 파일의 버전을 관리해 줄것이다. 필자는 해당 S3에 대한 모든 퍼블릭 액세스를 허용했다. 아래의 이미지에서도 보이겠지만, 경고 메세지를 띄워주고 체크해줘야 한다. 실제 운영에서는 ACL 이나 Bucket Policy 를 통해서 접근제한을 해야한다. 자 이제 S3 Bu...