Spring boot Quartz - cron trigger (feat. 사이드 프로젝트)

이미지
최근에 주기적으로 특정 시간에 특정 알람을 보내야하는 사이드 프로젝트를 진행하면서, Quartz 를 사용해 보았다. 그래서 개발하고 그에 따른 후기를 남겨본다. 먼저 알람 발송 시점은 아래와 같다. 그날 그날 휴일인지 평일인지에 따라서 또한 평일인 경우 주간인지 야간인지에 따라 담당자가 다르다. 따라서 해당 담당자에게 "너 이제 일해야됨!!" 이렇게 알람을 보내는 서비스를 개발했다. 알람 방법에 대해선 생략하고,  어떻게 Scheduler 를 활용 했는지에 초점을 두고 글을 쓰려고 한다. 먼저, 주간, 야간, 휴일 근무시간이 어떻게 되는지 정리해보겠다. - 주간 : working day (not holiday, not weekend) 09:00 ~ 18:00 - 야간 : working day (not holiday, not weekend) 18:00 ~ 23:00 - 휴일 : holiday ( including weekend ) 09:00 ~ 23:00 우선 공통점을 뽑아낸다면, 하루 전은 모두 공통되어 있다. 내일 담당자에게 전날에 22:00 에 "내일 너 일해야됨!" 을 보내야 한다. 따라서 주기적으로 22:00 에 발송을 보내야 한다. 그리고 나머지 시점은 각각 고유하게 시각을 가지고 있다. 시점과 해당 시점에서 해야하는 일을 정리해보면, 아래와 같다. 1. 22:00 - 오늘이 working day 인지 holiday 체크 후 working day -> 내일 주간 담당자와 야간담당자에게 알람을 보낸다. holiday -> 내일 휴일 담당자에게 알람을 보낸다. 2. 09:00 - 오늘이 working day 인지 holiday 체크 후 working day -> 오늘 주간 담당자에게 알람을 보낸다. holiday -> 아무것도 안한다. 3. 08:55 - 오늘이 working day 인지 holiday 체크 후 working day -...

AWS EC2 - timezone KST 변경

이미지
AWS 에서 EC2 를 처음 생성하면, Timezone 은 기본으로 UTC 로 설정되어, KST 기준 -9 시간이 된다. 따라서 KST 기준 시각으로 어떤 작업을 해야 될 경우 Timezone 을 KST 로 변경해야 한다. 아래 이미지를 참고하면 된다. 참 쉽죠잉~?

AWS Certified Developer - Associate 취득 및 후기

이미지
회사에서 AWS 를 사용하고 있고, APN 파트너가 되면 회사측에서도 여러가지 혜택이 있다. 사내에서 AWS 자격증을 취득한 사람이 없기 때문에, APN 파트너가 될 수 없다. 따라서 사내에서 AWS 자격증 취득자에게 보너스를 준다고 해서 도전했다. 물론 필자는 DevOps 에 관심이 있기도 했지만,, 향후에 쿠버네티스에 대해서 공부를 하고 EKS 에 대해서 공부하고, 프로페셔널에도 도전해 볼 생각이다. 아래는 AWS APM partner 혜택 및 요구사항이 나와있다. https://aws.amazon.com/ko/partners/technology/ 간략하게 AWS 자격증 종류에 대해서 알아 보자면, 기초 -> 어소시에이트 -> 프로페셔널 -> 전문 분야 순으로 난이도가 올라간다고 보면된다. 그중에 내가 취득한 단계는 어소시에이트중이고, 개발자이다. 향후에 프로페셔널인 DevOps 도 생각 중이다. https://aws.amazon.com/ko/certification/?nav=tc&loc=3 Associate Developer 에 디테일한 사항을 보겠다. 우선 객관식으로 총 65문제이며, 130분의 시간이 주어진다. 1000점 만점에 통과 기준 점수는 720 점이다. AWS 에서 제공하는 맛보기 문제. https://d1.awsstatic.com/training-and-certification/docs-dev-associate/AWS_Certified_Developer-Associate_Sample_Questions_v2.0_FINAL.pdf 시험은 한국어로 지원이 가능하다. 동시에 영어로 문제 및 보기를 볼 수도 있다. 영어로 지원을 하게 되면, 추가로 응시시간을 30분? 더 준다. 130분이면 상당히 긴 시간이기 때문에, 한국어로 지원해서 번역이 이상하다고 생각되면, 영어로 보기를 해서 풀면 된다. 개이득! 시험비는 170,000원이 들었다. https://aws.amaz...

Github Actions 로 AWS ECS deployment

이미지
Github Actions 을 이용해서 spring boot 프로젝트를 Docker , ECR, ECS 를 이용해서 배포하는 과정을 블로깅 하려고 한다. Github repository 랑 AWS 계정은 다 있다는 전제하에 진행 한다. aws cli 를 사용해도 되는데 제일 쉽게 console 을 이용한 가내수공업을 해보려고 한다. 우선 ECS cluster 를 먼저 생성한다. 파란색 버튼 눌러! 깜빡하고 언급 안했는데, fargate 를 사용할 것이다. fargate 에 대한 설명은 aws 들어가서 참고 하세요. https://aws.amazon.com/ko/fargate/ 클러스터 이름은 알아서 기입해주고, VPC 는 체크해주면 알아서 생성 해준다. 혹은 체크하지 않고 AWS default VPC 를 사용해도 된다. 혹은 VPC 를 스스로 생성해서 사용해도 된다. 그리고 CloudWatch 컨테이너 인사이트 활성화는 꼭 체크해주자, CloudWatch 를 이용해서 로그를 볼 수 있어서 유용하다. 다음에 해주어야 할 것이! 바로 작업 정의 ! task-definition 생성이다. 시퍼런 버튼 눌러서 생성해 주면 된다. 역시 또한 fargate 를 사용할 것이다. 작업 정의 이름은 알아서 기입해주고, 작업 역할과 작업 실행 IAM 역할이 가장 중요하다. AmazonECSTaskExecutionRolePolicy 와 관련된 내용인데, 이 정도만 언급하고 생략하겠다. 컨테이너 정의에서 컨테이너 추가 버튼을 눌러서, 사전에 ECR 에 등록된 이미지를 세팅 해 준다. 작업 메모리 및 작업 CPU 도 알맞게 설정 한다. 컨테이너 이름은 알아서 기입해주고, 이미지는 ECR 이미지 URL 을 넣어준다. 그 다음은 처음에 생성한 클러스터에 들어가서 서비스를 생성 해 준다. 역시 fargate를 이용할 것이다. 배포는 롤링 업데이트로 설정한다. 블루 그린 배...

Hibernate - Composite Identifiers @EmbeddedId @IdClass With @GeneratedValue is impossible

이미지
요즘에, MSA 꽂혀서 이거저거 공부를 여전히 하고 있다. 그러다가 DDD 에 대해서 관심이 가게 되고, DDD 를 공부하다가 또한 JPA 에 꽂혀서 이거저거 건드리고 있다. 그러다가 좀 fucking 한 걸 발견해서 포스팅 해보려고 한다. DDD 에서는    Ubiquitous Language  라는 개념이 있다. 도메인 전문가와 개발자 간에 같이 공유하며, 해당 프로젝트에 참여하는 모든 사람 간에 공유되는 언어이다. 도메인 주도 설계 구현 이라는 책에서 적절한 예시를 주고 있다. 1. patient.setShotType(ShotTypes.TYPE_FLU); patient.setDoes(dose); patient.setNurse(nurse); 2. patient.giveFluShot(); 3. Vaccine vaccine = vaccines.standardAdultFluDose(); nurse.administerFluVaccine(patient, vaccine); 3가지 예시 중 어느 것이 유비쿼터스 언어를 잘 반영하고 있다고 할까? 유비쿼터스 언어에 대한 대략적인 감은 잡았을 것이라고 생각한다. 도메인 관점에서 어떻게 하면 유비쿼터스 언어를 반영하는 설계를 할 수 있을까? 라는 고민을 항상 한다. DDD start 라는 책에서는 엔티티와 밸류 오브젝트라는 개념을 다룬다. (두 개념에 대한 설명은 하지 않겠다.) 아래 링크 참조 http://getoutsidedoor.com/2018/08/06/ddd-entities-value-objects-aggregates/ 여기서, 밸류 오브젝트를 통한 식별자를 사용하는 개념이 나온다. 단순히, 어떤 엔티티를 설계할 때 단순히 식별자를 Long 혹은 String 으로 type 선언을 하게 되면, 유비쿼터스 언어를 잘 반영했다고 보기 어렵게 된다. 좀 더 도메인 관점에서 해당 도메인을 잘 나타내기 위해서는 단순히 식별자를 L...