headless CMS란

 - https://business.adobe.com/kr/glossary/headless-cms.html

 

best-headless-cms-2022

 - https://www.izooto.com/blog/best-headless-cms-2022

 

Site Generators(비교)
 - https://jamstack.org/generators/


Publii - Static-Site CMS (데스크탑 설치형 CMS 오픈소스)

 - https://news.hada.io/topic?id=7068
 - https://github.com/GetPublii/Publii

서비스를 보호하기 위한 요청 양을 제한하는 몇가지 방법이 있습니다.

그 중 bucket4j를 이용한 방법 몇가지를 간략히 메모해두겠습니다.

 

우선 참고 링크들

 

POC 테스트 목적의 간단히 개발한 코드

 - https://github.com/oshnew/spring-boot-ver2-study/blob/master/src/main/java/com/biz/app/ratelimit/RateLimitTestController.java

 

주의: 러프하게 정리 중인 자료인데 마무리가 안 되어 있어서 잘못된 내용이 있을 수 있습니다.

 

 

----

개발 중에 대기열 시스템이 필요한 경우가 종종 있습니다.

관련 내용을 간략하게 메모 목적으로 정리해둡니다.

 

1. 만들려고 하는 대기열 시스템의 개략적인 내용

  - 좀 된 자료로서 몇가지는 변경이 필요(예. vert.x대신 armeira등)

대기열 시스템 개발 설계 요약

2. 기타 참고할만한 내용들 메모

 - https://fr.slideshare.net/devcatpublications/ndc2019-142692683

 - 내용 중 조금 수정/고려해야할 부분이 있어보임(ex. 대기번호를 매번 보내서 비교를 안해도 되는 방법 고민? 등)

 

 - https://www.cloudflare.com/ko-kr/application-services/products/waiting-room/

Windows환경에서 Rust빌드시 아래와 같은 에러가 발생

the msvc targets depend on the msvc linker but `link.exe` was not found

 

아래의 명령어로 GNU방식으로 변경해준다.(실제 Windows환경이지만 리눅스 GNU개발하는 환경으로 셋팅)

rustup default stable-x86_64-pc-windows-gnu

Java에서 Optional이라는 기능이 존재합니다.

그런데 제대로, 문제없이, 읽기 좋은 소스로 작성하려면 생각보다 조금 신경 써야할 부분들이 있습니다.

 - 실제 프로덕트 코드에서 개발자들이 실수하는 경우를 많이 봤음 << 중요, 실수가 잦다면 코드 퀄리티를 관리해야하는 관리자 입장에서는 프로젝트 컨벤션으로 사용 금지로 해야할 수도 있음

 

그리고 개인적으로는 fast-fail형태가 맞다고 생각하기에 파라미터 검사(데이터 검사)를 앞쪽에서 잘 해야한다고 생각합니다. 

이후 코드는 최대한 읽기 좋게 작성하고, 성능을 생각하면 불필요하게 컴퓨팅 파워를 쓰는 코드 자체를 없애는게 맞다고 생각합니다.(임베디드 개발했던 경험을 떠올려봐도.... 컴퓨터에게 불필요한 일 자체를 시키면 안됨)

 

 

검색해서 메모 목적으로 몇가지 참고 내용을 작성해둡니다.


Java Optional의 API Note를 보면 Optional을 개발한 Brian Goetz도 의도한 형태로 사용하지 않는 경우가 많아서인지 Note까지 작성해뒀습니다.(사실 언어 설계자가 의도한데로만 사용하도록 개발/설계해뒀으면 하는 아쉬움이..)

 

1. Java Optional API Note

2. 기타 참고 링크들

twitch drops 서비스를 개발하기 위한 내용을 간단히 정리합니다.(메모 목적이라서 생략된 부분이 많습니다.)

 

이미 원신(링크) 등에서 사용하고 있어서 참고하였습니다.

 

  1. 준비 필요 사항
    1. 트위치 개발자 사이트에서 개발자 설정 및 어플리케이션 추가
      1. 2차인증 등 보안 관련 꽤 설정할게 많았음

트위치 개발자 사이트에서 응용 프로그램을 등록하는 메뉴(위 캡쳐는 테스트용 어플리케이션이 이미 등록된 후 화면)
응용프로그램 상세 설정 화면. 시크릿은 서비키로 사용하기에 보안 주의하여 관리


  1. 트위치 웹 로그인을 위한 URL확인
    1. 트위치가 OIDC방식을 지원함(참고 링크)
      1. OIDC 여러 response_type(적용방법?)이 존재하는데 'OIDC authorization code grant flow' 사용
    2. 원신 예
      1.  원신은 아래와 같은 URL을 사용하고 있고 URL디코딩을 하면 어떤 파라미터로 트위치에 요청하는지 알 수 있었음
        1. https://id.twitch.tv/oauth2/authorize?claims=%7B%22id_token%22%3A%7B%22iss%22%3A%22%22%2C%22sub%22%3A%22%22%2C%22aud%22%3A%22%22%2C%22exp%22%3A0%2C%22iat%22%3A0%2C%22nonce%22%3A%22%22%2C%22picture%22%3A%22%22%2C%22preferred_username%22%3A%22%22%7D%2C%22userinfo%22%3A%7B%22picture%22%3A%22%22%2C%22preferred_username%22%3A%22%22%7D%7D&client_id=qb4j308hke6jw76fzou0taq6jfzgjz&force_verify=true&redirect_uri=https%3A%2F%2Fsg-hk4e-api.hoyoverse.com%2Fevent%2Fring%2Fhk4e_global%2Ftwitch%2Fexchange&response_type=code&scope=openid&state=1657158098
          1. URL 디코딩 결과 내용
            1. https://id.twitch.tv/oauth2/authorize?claims={"id_token":{"iss":"","sub":"","aud":"","exp":0,"iat":0,"nonce":"","picture":"","preferred_username":""},"userinfo":{"picture":"","preferred_username":""}}&client_id=qb4j308hke6jw76fzou0taq6jfzgjz&force_verify=true&redirect_uri=https://sg-hk4e-api.hoyoverse.com/event/ring/hk4e_global/twitch/exchange&response_type=code&scope=openid&state=1657158098
      2. 위 URL 내용을 참고하여 만들려고 하는 본인의 어플리케이션에 맞게 파라미터를 변경함. 이때 파라미터의 내용은 트위치 개발자 사이트를 참고
        1.  redirect_uri에 본인의 서버쪽에서 검증
    3. 트위치 드랍스 기능 구현
      1. twitch drops guide
    4. 기타 사항 추가로 작성 예정

 

아직 Jsp를 쓰는 프로젝트에서 Maven multi module 프로젝트를 셋팅했는데, JSP를 못 찾는 문제가 발생했습니다.

IntelliJ Working directory에 $MODULE_WORKING_DIR$ 를 셋팅해주면 문제가 해결됩니다.
- 참고 링크

샘플

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.util.Locale;

/**
 * 월 달력 생성기
 *
 * @author
 */
public class Test {

	public static void main(String[] args) {

		final int addMonth = 2; //2개월 후 데이터 생성

		DateTimeFormatter fmtMonth = DateTimeFormat.forPattern("yyyyMM");
		DateTimeFormatter fmtDay = DateTimeFormat.forPattern("yyyyMMdd");

		//대상 월
		DateTime now = DateTime.now();
		String strTargetMonth = now.plus(Period.months(addMonth)).toString(fmtMonth);

		DateTime dt = DateTime.parse(strTargetMonth, fmtMonth);

		int startDay = dt.dayOfMonth().getMinimumValue();
		int endDay = dt.dayOfMonth().getMaximumValue();

		String strDay;
		String dayOfWeek;
		//boolean isHoliDay = false;
		for (int i = startDay; i <= endDay; i++) {
			strDay = strTargetMonth + StringUtils.leftPad(Integer.toString(i), 2, "0");
			dayOfWeek = DateTime.parse(strDay, fmtDay).dayOfWeek().getAsShortText(Locale.KOREA);

			System.out.println(String.format("%s | %s", strDay, dayOfWeek));

		}

	}
}

+ Recent posts