최신글
-
AWS
[발표자료] - CDK
새 창에서 열기
-
AWS
[강의리뷰]Amazone EKS를 위한 AWS CDK와 CKS8s 활용법
HansOn https://aws.amazon.com/ko/blogs/korea/using-cdk8s-for-kubernetes-applications/ CDK8s를 이용하여 쿠버네티스 애플리케이션을 정의하고 관리하기 | Amazon Web Services 이 글은 쿠버네티스 애플리케이션을 개발하면서 사용하는 쿠버네티스 매니페스트를 YAML 파일로 작성하고 관리할 때의 어려움을 해결하고 그것들을 효율적으로 쿠버네티스 클러스터에 지속적 aws.amazon.com https://catalog.us-east-1.prod.workshops.aws/workshops/c15012ac-d05d-46b1-8a4a-205e7c9d93c9/ko-KR Workshop Studio catalog.us-east-1.prod.w..
-
FrontEnd
Lighthouse
First Contentful Paint(FCP) - 페이지가 로드될 때 브라우저가 DOM 콘텐츠의 첫 번째 부분을 렌더링 하는데 걸리는 시간에 관한 지표 - FCP는 총점을 계산할때, 10%의 가중치를 갖습니다. Speed Index - 페이지 로드 중에 콘텐츠가 시각적으로 표시되는 속도를 나타내는 지표 Lagest Contentful Paint(LCP) - 페이지가 로드될 때 화면 내에 있는 가장 큰 이미지나 텍스트 요소가 랜더링 되기까지 걸리는 시간을 나타내는 지표 Time to Interactive(TTI) - 사용자가 페이지와 상호 작용이 가능한 시점까지 걸리는 시간을 측정한 지표 Total Blocking Time - 페이지가 클릭, 키보드 입력 등의 사용자 입력에 응답하지 않도록 차단된 시간..
-
spring
[코프링] coroutine 환경 Cache 적용
코프링 coroutine 환경에서 캐시 적용하기 위해 삽질을 하여 관련 내용을 기록 기존 spring web mvc와 동일한 방법으로 적용 캐시는 caffeine 적용하기로 하여 관련 종속 추가 implementation("org.springframework.boot:spring-boot-starter-cache") implementation("com.github.ben-manes.caffeine:caffeine") 설정 추가 @Configuration @EnableCaching class CacheConfig { @Bean fun cacheManager(): CacheManager { val caches: List = Arrays.stream(CacheType.values()) .map { cache ..
-
spring
[R2DBC] - Spring Data R2dbc Save Insert 이슈 해결
User.kt @Table("user") data class User ( @Id @Column("user_id") var userId: String = "" @Column("user_name") var userName: String = "" ) UserRepository.kt @Repository interface UserRepository : CoroutineCrudRepository { } userRepository.save(User(userId=“door”, userName=“ddori”)) 이슈 위처럼 spring data r2dbc를 이용하여 User를 insert 하려하면 기대와 다르게 update 쿼리가 발생한다. @Id 컬럼이 auto increment이면 이슈는 없지만 그렇지 않을경우 r..
-
spring
R2DBC Oracle driver 연결 처리
r2dbc로 mysql은 쉽게 연결이 되었는데 막상 오라클 연결 할일이 있어 연결하니 쉽게 처리가 되지 않고 구글링에서도 정보가 잘 나오지 않아 정리한다. mysql driver build.gradle.kts implementation("dev.miku:r2dbc-mysql") application.yml spring: r2dbc: url: r2dbc:mysql://localhost:3306/scoregame_dev?serverTimezone=Asia/Seoul&characterEncoding=UTF-8 username: username password: password pool: enabled: true initial-size: 1 max-size: 1 oracle driver build.gradle...
-
Docker
멀티 스테이지 빌드(프론트 + nginx)
프론트 niginx 로 멀티 스테이지 구성 프론트 빌드후 해당 빌드 파일 nginx에 복사후 웹서버 구동 FROM node:14-alpine as build WORKDIR /app COPY package.json . RUN npm install COPY . . RUN npm run build FROM nginx:stable-alpine COPY --from=build /app/build /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] 멀티 스테이지 빌드 특정 Target build docker build --target build -f frontend/Dockerfile.prod ./frontend alias한 build만 빌드하고 ..
-
Docker
Docker Volumes
개요 도커가 인식하는 호스트 머신의 폴더 컨테이너나 이미지에 있는것이 아니다. 즉 호스트 컴퓨터에 장착된 하드 드라이브에 존재하여 사용 가능 하거나 컨테이너로 매핑되는 것을 의미한다. 볼륨은 컨테이너가 종료된 경우에도 지속되며 계속 존재한다.(단 익명 볼륨 제외) 컨테이너가 제거되어도 해당 볼륨은 유지된다.(단 익명 볼륨 제외) Volumes는 크게 두가지 타입이 있다. Volumes , Bind Mounts 이다. Volumes는 다시 크게 두가지로 나눈다. Anonymous Volumes , Named Volumes 1. 익명 볼륨(Anonymous Volumes) - Volume Docker Host내 임의의 고유한 이름으로 볼륨을 부여 한다. 익명 볼륨은 컨테이너가 존재하는 동안 에만 실제로 존재..
-
카테고리 없음
Docker 활용 - 유틸리티 컨테이너(node)
사용목적 로컬에 node를 설치 하지 않고 아래와 같이 구성을 하여 node 명령어 실행 node는 간단한 예제 이며 프로젝트 진행시 복잡한 구성등을 Docker Compose로 구성하여 팀원등과 공유하여 쉽게 프로젝트 설정을 구성 할수 있다. 설정 Dockerfile로만 구성시 예제 From node:14-alpine WORKDIR /app ENTRYPOINT ["npm"] docker run -it -v /Users/ddori/docker-complete:/app mynpm install express --save 리팩토링 Docker Compose를 이용하여 실행 명령어를 단순화 시킨다. docker-compose.yaml version: "3.8" services: npm: build: ./ st..
-
Docker
Docker container간 통신 방법
1. docker inspect 명령어를 컨테이너의 세부 정보중 network의 ip를 알아내서 직접 ip 지정 단 ip는 수시로 변경될수 있음으로 비추천 docker container inspect 2. container 소스상 에서 host의 local host 접근 방법 - host.docker.internal ex) mongodb://host.docker.internal:2071/ddoridb 3. docker run 명령 option으로 동일 네트워크 지정 docker run 실행시 --network 로 네트워크 지정 docker run --name mongodb --network ddori-net mongodb docker run --name ddori-app --netwrok ddori-ne..
-
AWS
S3 정적 웹 사이트 호스팅
1. S3 버킷 생성 AWS Console에 로그인후 S3 메뉴로 이동후 우측 상단 버킷 만들기 버튼을 클릭한다. 버킷의 해당 정보를 입력한다. 버킷 이름, AWS 리전을 입력 선택후 최하단 버킷 만들기를 클릭 한다. 참고로 버킷 이름은 추후 호스팅 되는 도메인 이름으로 부여된다. Ex) ddori-dev -> http://ddori-dev.s3-website.ap-northeast-2.amazonaws.com 2. S3 버킷 정적 웹 호스팅 구성 생성된 버킷을 선택후 속성 탭으로 이동한다. 제일 하단의 정적 웹 사이트 호스팅의 편집을 클릭한다. 정적 웹 사이트 호스팅 활성화를 선택 호스팅 유형 정적 웹사이트 호스팅 선택 인덱스 문서는 호스팅할 메인 html 파일을 입력한다. 오류문서는 개발 방식에 따라..
-
spring
[Book] 인커밍 포트에 대한 의견
만들면서 배우는 클린 아키텍쳐 : 자바 코드로 구현하는 클린 웹 애플리케이션 내용 발췌 인커밍 포트는 애플리케이션 중심에 접근하는 진입점을 정의한다. 이를 제거하면 특정 유스케이스를 구현하기 위해 어떤 서비스 메소드를 호출해야할지 알아내기 위해 애플리케이션의 내부 동작에 대해 더 잘 알아야 한다. 전용 인커핑 포트를 유지하면 한눈에 진입점을 식별할수 있다. 이는 새로운 개발자가 코드를 파악할 때 특히 더 도움이 된다. 인커밍 포트를 유지해야 하는 또 다른 이유는 아키텍처를 쉽게 강제 할수 있게 때문이다. 인커밍 어댑터가 애플리케이션 서비스가 아닌 인커핑 포트만 호출하게 할수 있다. 그럼 어플리케이션 계층에 대한 모든 진입점을 정의하는 것이 아주 의식적인 결정이 된다. 인커밍 어댑터에서 호출할 의도가 없던..
-
spring
조회 전용 기능과 응용서비스와의 관계 논의
회사에서 개인적으로 CUD를 위한 조회가 아닌 화면에 보여주기 위한 조회 서비스는 사용자 또는 관리자의 요청으로 자주 항목들이 변경이 된다 그항목 하나 추가건으로 테이블 조인도 바끼고 많은 변화가 생길수 있다 대부분 도메인이 물리지 않고 여러 테이블을(다른 도메인의 테이블 포함) 조인해서 쿼리로 어떻게 보여주느냐로 결정 된다 위와 같은 조회 쿼리는 조회전용 DAO 만들어서 구현하였다 문제는 해당 DAO를 응용서비스에 종속관계를 두고 표현객체가 다시 응용서비스를 종속관계를 맺냐는 부분이다. 개인적으로 회사 및 토이 프로젝트에서는 표현객체에 바로 조회 전용 DAO를 사용하였다 해당 부분은 아직도 고민이 많은 부분으로 "도메인 주도 개발시작하기" 2022 재출간 본에 아래와 같은 이유로 표현객체에 조회전용 D..
-
spring
표현 영역 , 응용역역의 값 검증 논의
기본적으로 표현 영역에서 필수값과 값의 형식을 검사하고 실직적으로 응용 서비시는 ID 중복 여부와 같은 논리적 오류만 검사하면 된다. 즉 표현 영역과 응용 서비스가 값 검사를 나눠서 수행하는 것이다. 표현영역 : 필수값, 값의 형식, 범위등을 검증 응용서비스 : 데이타의 존재 유무와 같은 논리적 오류를 검증 논의 대상 응용 서비스에서 얼마나 엄격하게 값을 검증해야하는지 의견이 갈리수 있다 응용 서비스의 완성도를 높이기 위해서는 응용서비스에서 필수값 검증과 논리적인 검증을 모두 처리하면 표현영역에서 프레임워크가 제공하는 검증기능을 수행할때보다 작성할 코드가 늘어나는 불편함이 있지만 반대로 응용 서비스의 완성도가 높아지는 이점이 있다 이점이 더 크게 느껴진다고 생각하면 응용 서비스에서 값 오류를 검증하는 편..
-
spring
도메인 구현과 DIP
구현 기술에 대한 의존 없이 도메인을 순수하게 유지하려면 스프링 데이타 JPA의. Repository 인터페이스를 상속받지 않도록 해야하며 인터페이스를 도메인에 두고 구현한 클래스를 아래 그림과 같이 인프라에 위치 시켜야 한다. DIP를 적용하는 주된 이유는 저수준 구현이 변경되더라도 고수준이 영향을 받지 않도록 하기 위함이다. 하지만 리포지터리와 도메인 모델의 구현 기술은 거의 바뀌지 않는다. 저자는 JPA로 구현한 리포지터리 구현기술을 마이바티스나 다른기술로 변경한적이 없고, RDMS를 사용하다 몽고DB로 변경한 적도 없다고 한다. 이렇게 변경이 거의 없는 상황에 변경을 미리 대비하는것은 과하다고 생각한다. 그래서 저자는 에그리커트, 리포지터리등 도메인 모델을 구현할때 타협을 했다. JPA 전용 에너..
-
spring
[이슈 해결] JPA save 와 Stomp 메세지 처리 이슈
Case Stomp를 이용한 채팅 구현시 Spring Data Jpa의 save를 통해 데이터 저장후 SimpMessageSendingOperations convertAndSend 메소드를 통한 메세지 발행시 저장된 데이타를 Front에서 조회시 간헐적으로 못가져오는 이슈 FLOW 1. [Front] 채팅서버에 Join 메세지 전송 2. [채팅서버] Join 정보 저장 및 접속 유저에 Join 메세지 발행 3. [Front] Join 정보 구독 발생에 따른 join 정보 채팅창에 메세지 처리 4. [Front] Join 정보 Api 호출 을 통한 접속자 부가 정보 화면에 노출 소스 코드 @Transactional fun joinByRoom(@Payload message: ChatMessageDto) { ..
-
spring
Reactive Kafka in Spring Kafka
dependency implementation group: 'org.springframework.kafka', name: 'spring-kafka', version: '2.8.3' 메시지 중복 제거 처리 위경우에 따른 중복 제거 소스 브로커별 groupBy를 한후 구중 30초간 동일건 발생에 대해 첫번째를 추출한다. 브로커별 groupBy : groupBy 30초간 동일건 중 첫번째 추출 : sampleFirst(Duration.ofSeconds(30)) Flux Method : groupBy Flux Method : sampleFirst 중복 제거 Sample Code 데이터 모아서 처리하기 Flux Method : buffer 정해진 양만큼 처리하기 위한 CustomSybscriber 처리 처음 구독..
-
AWS
[TEST] AWS ALB 구성 테스트 케이스
구성 정보 ALB spring cloud gateway (port 9080) Internal ALB product product (port 9090) (rest.ddori service discovery) product : GetMapping server ip 정보 리턴 Test Case 1 - 사용자가 spring cloud gateway에서 internal alb로 라우팅 한다. Test Case 1 결과 - 200 정상 떨어지나 product instance server 정보 결과를 못받아옴 Test Case 1 조건 이슈 - Internal alb는 private sub 구성 되야하는데 public subnet 으로 구성 재조정 필요 Test Case 2 Route53을 통해 product far..
-
DB
[Mysql] RECURSIVE 를 이용한 A to B 날짜 구하기
Oracle의 경우 Connect By를 이용해서 A To B의 Range를 편하게 구할 수 있다. Mysql은 Connect By가 제공 되지 않아 아래 처럼 recursive를 이용하여 구할수 있다. WITH RECURSIVE dates as ( SELECT '2021-12-13' as dt UNION SELECT DATE_ADD(dates.dt, INTERVAL 1 DAY) FROM dates WHERE DATE_ADD(dates.dt, INTERVAL 1 DAY)
-
spring
[springbatch]-[Error] pxc_strict_mode = ENFORCING
테스트 개발 환경에서 잘 구동되었던 springbatch가 상용에 적용시 아래 오류가 발생 하엿다. Caused by: java.sql.SQLException: Percona-XtraDB-Cluster doesn't recommend using SERIALIZABLE isolation with pxc_strict_mode = ENFORCING 해당건으로 구글신 에게 문의시 생각보다 관련 내용이 없어 DBA와 상의후 ISOLATION_DEFAULT가 DB에 기본으로 적용되있다하여 관련 검색어로 구굴링 하니 결과가 나왔다 대부분의 원인은 여러개의 Spring Batch Job이 하나의 JobRepository를 가지고 동시에 실행이 될 때 발생할 수 있는 문제라고는 나오는데 우리 환경은 위 원인과는 다른 환..
-
AWS
AWS 인증서 생성 및 ALB 연결
ALB에 https 처리를 위한 작업을 기록 한다. 기존 http 80 포트로 대응하던 부분을 https도 지원이 필요했다 해당 내용을 공유한다. AWS Certificate Manager Console에서 인증서 요청을 클릭한다. 다음을 클릭한다. 도메인 이름을 입력한다. 외부 도메인에 미리 등록된 도메인을 입력한다. 또는 route53에 생성된 도메인을 입력한다. 예를들어 ddori-service.co.kr DNS 금증 -권장을 선택한다.(DNS를 직접 설정 가능한 사용자여야 한다. 추후 Validation 검증 작업 필요) 원하는 태그를 입력하고 요청을 클릭한다. 요청을 클릭한후 인증서 보기를 클릭한다. 아래 CNAME 이름과 , CNAME 값을 복사한후 외부 도메인 제공 사이트에서 또는 Route..
-
AWS
[Tool] AWS Colud Watch 로그 터미널로 보기
1. Mac OS 기준 설치 $ brew tap knqyf263/utern $ brew install knqyf263/utern/utern 2. AWS 인증 편하기 위한 direnv 설치(해당 폴더별 인증 다르게 하기 위한 용도) .bash_profile에 아래 항목 추가 eval "$(direnv hook bash)" 원하는 폴더를 만들고 .envenc 파일에 AWS 인증정보를 넣는다. export AWS_ACCESS_KEY_ID={IAM ACCESS KEY} export AWS_SECRET_ACCESS_KEY={IAM SECRET ACCESS KEY } export AWS_DEFAULT_REGION=ap-northeast-2 나는 utern/.envenc 파일에 해당 정보를 기입했다. cd utern..
-
AWS
멀티 채팅 서버 아키텍쳐
-
AWS
[serverless] : serverless error: eperm: operation not permitted, unlink
serverless + typescript 구성에서 아래 오류 발생시 This appears to be a known permissions issue with the TypeScriptPlugin. You may try following the advice of others here, and removing the .build and .serverless directories and re-running the command: 아래 항목 npm install 함 (최신 serverless 에서는 아래 항목을 사용할 필요가 없다고 나왔는데 제거시 위의 오류가 발생 추후 다시 검토 필요) "serverless-pseudo-parameters": "^2.6.0"
-
AWS
[serverless] - For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.
serverless 아래 오류 발생시 처리 For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable. mac 기준 export SLS_DEBUG=true
-
카테고리 없음
AWS step function parameter
아래 AWS 코드에서 Parameters에 필요한 정보를 추가한다. { "Comment": "ddori batch step function", "StartAt": "BatchSyncTime1", "States": { "BatchSyncTime1": { "Type": "Wait", "Seconds": 45, "Next": "BatchJobRunAttemp1" }, "BatchJobRunAttemp1": { "Type": "Task", "Resource": "람다 리소스", "Parameters": { "batchType": "daily" }, "Retry": [ { "ErrorEquals": [ "States.ALL" ], "IntervalSeconds": 1, "MaxAttempts": 2, "Backo..
-
AWS
AWS Step function retry
cloud event -> step function -> barch-crawler lambda function 으로 배치 스케줄 프로세스중 해당 람다함수에서 오류가 발생시 step function에서 retry 하는 설정이다. "ResultAttempt1": { "Type": "Task", "Resource": "arn:aws:lambda:ap-northeast-2:457618053666:function:batch-crawler", "Retry": [ { "ErrorEquals": [ "States.ALL" ], "IntervalSeconds": 1, "MaxAttempts": 2, "BackoffRate": 1 } ], "Next": "WaitSeconds2" 각 키값의 대한 설명은 아래를 참조한다. ..
-
AWS
AWS Community Day Online
개더타운에서 온라인으로 400여명이 함께한 AWS Community Day 2021 스케치 영상입니다 https://www.youtube.com/watch?v=BvuHY_68ChA 보안을 위한 AWS Network 구성 https://www.youtube.com/watch?v=bZZiWNFSPJk&t=4s IaC로 AWS인프라 관리하기 https://www.youtube.com/watch?v=w5F_tI3IjYE Athena & Step Function 으로 통계 파이프라인 구축하기 Amazing EKS로 간단한 웹 애플리케이션 구축하기 https://www.youtube.com/watch?v=kb6s0Tmp2CA&t=5s AWS와 함께하는 무중단 배포 파이프라인 개선기 https://www.youtub..
-
AWS
gather town
코로나로 인한 AWS COMMUNITY DAY 세미나 gather town 접속 모습
-
DevOps
Gihub Action을 통한 AWS Fargate 자동 배포 처리
아래 글은 Github Repository를 바탕으로 AWS 의 IAM , ECR , Fargate 아키텍쳐가 구성되있다는 전제로 글을 시작한다. AWS Fagate 아키텍쳐로 개발시 AWS Console을 통한 배포시 많은 시간을 소요하게 된다 Gihub Action을 이용한 배포 자동화 방법을 공유한다. 1. Github 레파지토리의 에서 AWS Secret 정보를 등록한다. 1.1 Github 해당 프로젝트 Repository 선택 > Settings 선택 > [1-1] 화면의 Secrets 선택 > New repository secret 선택후 AWS AmazonECS_FullAccess 권한이 있는 IAM 사용자의 Access 정보를 추가한다. AWS_ACCESS_KEY_ID , AWS_SCRE..