이번 글에서는 RabbitMQ에서 사용하는 JSON Message Format을 Customize 해보도록 하겠습니다. 1. Customize JSON Format 앞선 글에선 Jackson의 ObjectMapper를 사용해 Employee Entity를 JSON String 형식으로 변경할 수 있었습니다. Employee @Getter @Setter @AllArgsConstructor @NoArgsConstructor public class Employee { private String employeeId; private String name; private LocalDate birthDate; } 기본적으로 Jackson은 Default로 구현되어있는 serialize() 메서드를 참고해 아래와 같이..
이번 글에서는 RabbitMQ에서 사용하는 메세지 포맷인 JSON에 대해 알아보도록 하겠습니다. 0. 왜 JSON을 사용하는가? RabbitMQ는 메세지 Format으로 어떠한 String 형식도 허용합니다. 하지만 이러한 자유도 때문에 오히려 Publisher와 Consumer 사이에 불필요한 자원을 낭비하게 됩니다. 만약 특정 Publihser가 본인만 사용하는 Format으로 Message를 발행할 경우, Consumer는 해당 Message Format을 해석해 사용하기 위한 비용을 소모해야 합니다. 따라서 이러한 낭비를 막고, 비즈니스 로직에 더욱 집중하기 위해 가장 보편적이로 널리 쓰이는 JSON Format으로 메시지 규격을 통일하는 것 입니다. JSON은 대부분의 언어에서 Create 및 ..
이번 글에서는 하나의 이상의 Consumer를 등록해 Queue에 발행된 메세지를 소비해보도록 하겠습니다. 1. 언제 Multiple Consumer를 사용하는가? Multiple Consumer는 Producer의 메시지 발행속도가 Subscriber의 Consume 속도보다 빠를 때 빠른 메세지의 처리를 위해 사용합니다. 예를 들어 아래 그림과 같이 Producer는 0.5s 마다 메세지를 발행하고, Consumer는 1.5s마다 하나씩 메시지를 처리한다면 시간이 지날 수록 Queue에는 처리되지 못한 메세지가 점점 쌓이게 됩니다. 따라서 1개 이상의 Consumer를 사용해 메세지를 보다 빠른속도로 처리함으로써 이와 같은 문제점을 개선할 수 있습니다. 쌓여있는 숙제를 여러명이서 나눠 빨리빨리 처리한..
이번 글에서는 Spring boot의 Scheduling 기능을 사용해보도록 하겠습니다. 1. Fixed Rate 주기적로 메세지를 생성하기 위해선 Fixed Rate를 사용합니다. 1-1) Producer @Service public class RabbitmqProducer { @Autowired private RabbitTemplate rabbitTemplate; private Logger log = LoggerFactory.getLogger(RabbitmqProducer.class) ; private int i = 0; @Scheduled(fixedRate = 1000) public void sendMessage(){ i++; rabbitTemplate.convertAndSend("q.minho",..
이번 글에서는 Spring boot에서 RabbitMQ를 사용하는 기본적인 방법에 대해 알아보겠습니다. 0. RabbitMQ 설치하기 먼저 아래 링크를 참고해 각자의 서버에 RabbitMQ 서버와 RabbitMQ-Management를 설치합니다. 저는 AWS EC2 서버에 Docker를 사용해 RabbitMQ를 설치했습니다. ✔ EC2에 Docker 설치법 https://hackernoon.com/running-docker-on-aws-ec2-83a14b780c56 ✔ RabbitMQ Docker 설치법 https://psychoria.tistory.com/541 RabbitMQ Instance 작명규칙은 아래와 같습니다. ✔ Naming Rule • lowercase • Exchange : "x.[na..
이번 글에서는 RabbitMQ, Kafka 같은 메세지 시스템을 사용하는 이유에 대해 알아보겠습니다. 0. Message System이란? Application간 메세지를 주고받는 Communication Mechanism을 의미합니다. 주로 사용되는 메세징 시스템에는 RabbitMQ와 Kafka 등이 있습니다. 1. Message System이 없다면? 대규모 Enterprise 환경에서 만약 메시지 시스템을 사용하지 않고 구현한다면 아래와 같은 문제점이 발생하게됩니다. ✔ Real-Time 어플리케이션 구현이 어렵습니다. 만약 아래와 같이 3개의 독립된 어플리케이션(HR, Marketing, Directory) 이 존재할 때, 메시지 시스템이 없다면 각 시스템의 정보를 가져오기위해선 특정 시간별 Pu..
이전글에 이어서 jenkins와 codedeploy를 사용해 ec2 server에 무중단 배포를 진행하겠습니다. 3. CodeDeploy 이번에는 codedeploy application을 생성해보겠습니다. 물론 jenkins만 사용해도 원격 server에 deploy를 할 수 있지만, codedeply를 사용하면 좀더 효율적으로 deploy를 수행할 수 있습니다. 특히 elb와 같이 aws에서 제공해주는 서비스를 사용하는 경우에는 codedeply를 사용해 deploy를 수행하는 것이 좋습니다. 만약 codedeploy를 사용하지 않는다면 복잡한 deploy 과정을 거치게 됩니다. 3-1) create application Codedeploy service로 이동해 create applicatoin을 ..
이번글에서는 jenkins와 codedeploy를 사용해 ec2 server에 무중단 배포를 해보도록 하겠습니다. 첫 성공까지의 history.. 😂 0. Proejct Structure 전체적인 구조는 아래와 같습니다. • local에서 spring boot application을 작성합니다. • github에 code를 push 합니다. • github에 code가 push되면 webhook이 작동해 해당 code가 jenkins server로 이동합니다. • jenkins server에서 application을 build를 합니다. • build한 파일 중 deploy 필요한 파일들을 S3에 zip해서 upload 합니다. • upload가 완료되면 codedeploy가 해당 파일을 사용해 depl..
이번글에서는 jenkins에서 gradle build를 하는 방법에 대해 알아보도록 하겠습니다. 1. Download Gradle Plugin 먼저 gradle plugin을 다운받아야 합니다. manage plugin으로 이동합니다. gradle plugin을 다운받습니다. 2. Job 다음으로 build를 실행할 job을 생성하겠습니다. SCM은 github를 사용하도록 하며, webhook을 사용하도록 하겠습니다. github과 jenkins를 webhook으로 연결하는 방법은 https://velog.io/@minholee_93/Jenkins-Integrate-with-GitHub-b2k5q9b61o 를 참고하시면 됩니다. freestyle project를 아래와 같이 생성합니다. webhook으..
이번글에서는 jenkins에서 delivery pipeline을 사용하는 방법에 대해 알아보도록 하겠습니다. 1. Build / Deploy / Test 먼저 이번 실습에서 사용할 3개의 job을 생성하고 chain으로 연결해보겠습니다. 각 job은 단순히 pwd만 수행하는 의미없는 job을 사용하겠습니다. deploy job에서 build trigger로 build job을 선택하고, post build는 test job을 선택해 3개의 job을 연결합니다. build trigger post build 이제 build job을 수행하면 아래와 같이 deploy job과 test job이 순서대로 수행됩니다. 2. Delivery Pipeline 이제 delivery pipeline을 사용해보도록 하겠습..
이번글에서는 jenkins job을 사용해 tomcat에 deploy 하는 방법에 대해 알아보도록 하겠습니다. 1. Sample.war 이번 실습에선 deploy에 war 파일을 사용하며, 구동중인 tomcat 서버가 있다고 가정하겠습니다. war 파일은 https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/ 에서 제공해주는 sample.war 파일을 사용하도록 하겠습니다. 저의 jenkins server는 linux이므로 wget을 사용해 위의 sample.war 파일을 다운받았습니다. 각자 본인들의 jenkins workspace에 위에서 다운받은 war파일을 옮겨 놓아주시면 됩니다. jenkins workspace는 jenkins home director..
이번글에서는 java file을 jenkins job을 사용해 compile 해보도록 하겠습니다. 1. Create Java file 먼저 compile에 사용할 java file이 필요합니다. 저는 jenkins가 설치된 server에서 vi를 사용해 아래와 같이 간단히 작성했습니다. Hello.java public class Hello { public static void main(String[] args){ for(int i=0; i
이번글에서는 Jenkins의 jobs에 대해 알아보도록 하겠습니다. 1. Job job이란 jenkins에서 실행되는 각각의 작업을 의미합니다. 사용자는 job을 생성하고, 해당 job에서 수행할 작업을 정의할 수 있습니다. 1-1) create job job을 생성하기위해 New item으로 이동해 생성할 job의 이름을 입력합니다. job의 종류는 freestyle project를 선택하고 OK를 누릅니다. pipline 등의 복잡한 작업들은 다음에 다뤄보도록 하겠습니다. 이번엔 가장 기본적인 freestyle project을 사용합니다. OK 버튼을 누르면 아래와 같이 작업을 정의하는 화면이 나타나게 됩니다. 간단히 살펴보겠습니다. 1-2) general job의 기본적인 설정을 정의합니다. 1-3..
이번글에서는 Jenkins의 기본적인 Configurations에 대해 알아보도록 하겠습니다. 0. Configure System system configuration 설정을 통해 jenkins의 config를 손쉽게 변경할 수 있습니다. 먼저 Manage Jenkins의 Configure System으로 이동합니다. 위에서 부터 중요한 것들만 하나하나 살펴보도록 하겠습니다. 1. Home directory jenkins의 root인 home directory를 확인할 수 있습니다. jenkins server에서 위의 경로로 이동하면 아래와 같은 파일들이 저장되어 있는 것을 확인할 수 있습니다. Github 등에서 webhook으로 pull 해오는 sorce code는 home directory의 wor..
이번글에서는 Jenkins에서 user를 등록하고 user별로 role을 부여하는 방법에대해 알아보도록 하겠습니다. 1. Create User 먼저 신규 user를 생성 해보도록 하겠습니다. jenkins server를 실행하고 admin 계정으로 로그인합니다. 저는 따로 minho 라는 admin 계정을 생성해 사용하도록 하겠습니다. 신규 계정을 생성하기 위해 Manage Jenkins로 이동합니다. 다음으로 Manage Users로 이동합니다. Create User를 클릭합니다. 마지막으로 user 정보와 password 정보를 입력해 user를 생성하면 됩니다. 저는 user1과 user2 두개의 계정을 생성했습니다. 만약 user가 login 후 자신의 계정정보를 변경하고 싶다면 화면 우측상단의 ..
이번글에서는 Jenkins의 CLI 사용법에대해 알아보도록 하겠습니다. 1. Jenkins CLI CLI를 사용하면 쉽고 빠르게, Jenkins server를 조작할 수 있습니다. 먼저 Jenkins server에서 /cli를 입력해 이동합니다. 다음으로 아래의 경로를 클릭해 jenkins-cli.jar 파일을 다운받습니다. 다운 받은 경로로 이동해 아래의 명령어를 통해 간단히 jenkins cli를 사용할 수 있습니다. 저는 C:\jenkins에 다운받았습니다. 모든 available command는 화면에 잘 작성되어 있습니다. jenkins cli java -jar jenkins-cli.jar -s http://:/ 각자 jenkins server와 port를 입력해 사용하면 됩니다. jenkins..
이번글에서는 Jenkins Project에 Github Repository를 연결해보도록 하겠습니다. 1. Jenkins Setting 1-1) download plugin Github와 Jenkins를 연결하기위해선, Github Integeration Plugin이 필요합니다. Jenkins dashboard에서 Manage Jenkins을 클릭합니다. 다음으로 Manage Plugins를 클릭합니다. Available 탭에서 Github Integration을 선택해 download 합니다. 1-2) create jenkins job 다음으로 Github repo와 연결할 job을 간단히 생성해보도록 하겠습니다. Jenkins 메인화면에서 New Item을 클릭합니다. FreeStyle Projec..
이번글에서는 AWS EC2에 Jenkins를 download 하고 tomcat 위에 올려보도록 하겠습니다. 0. EC2 이번글에서는 Amazon Linux EC2 인스턴스를 사용하도록 하겠습니다. 저는 windows 환경이므로 putty를 사용해 ec2 인스턴스에 접속했습니다. 최종적으로 EC2에 설치한 Tomcat은 8080 port로 접근할 것 이므로, 아래와 같이 Security Group에서 8080 port를 열어줍니다. 1. Download Java 먼저, Amazon Linux EC2의 default java version은 1.7이므로 이를 제거하고 1.8 version의 java를 다운로드 해줍니다. 아래와 같이 순서대로 명령어를 입력합니다. download openjdk sudo yum..
이번 글에서는 spring boot에서 redis를 활용한 cache를 구현해보겠습니다. 0. Cache란? "오랜시간이 걸리는 작업" 혹은 "반복적으로 요청하는 작업"의 결과를 메모리에 저장해서 데이터 접근의 시간과 비용을 줄이는 기법을 의미합니다. 예를 들어 아래 그림에서, 어플리케이션은 필요한 데이터에 접근할 때 먼저 Cache에 접근해 확인합니다. 이후 Cache에 데이터가 없는경우에만 직접 Database에 접근하게 됩니다. Cache는 일반적으로 Redis와 같은 인 메모리 DB를 사용하기 때문에, Databse보다 빠른속도로 데이터를 가져올 수 있습니다. 또한 Cache에는 Key-Value 형식으로 데이터를 저장하기 때문에, 동일한 key값의 데이터는 중복 저장되지 않습니다. 1. appl..
이번 글에서는 spring boot의 CRUD Repository를 활용해서 CRUD를 구현해보겠습니다. 1. Redis Server 이번 실습을 위해선 redis server가 하나 필요합니다. 저는 AWS EC2에 redis server를 구동시켰습니다. 2. application.yml application.yml 파일에 아래와 같이 redis properties 정보를 입력합니다. redis의 default port는 6379입니다. spring: redis: host: "hostname" port: 6379 3. build.gradle build.gradle 파일을 열고 아래와 같이 redis dependency를 추가합니다. spring-boot 2에서 redis dependecy는 기본 cl..