라이믹스 2.1 버전을 릴리즈합니다.
작년 말에 공지한 대로 라이믹스 2.1은 PHP 7.2 이상에서만 사용할 수 있으며, PHP 7.4 이상을 권장합니다. 구 버전이나 XE 1.x에서 업그레이드하실 경우 PHP 버전 차이에 주의하시기 바랍니다. 구 버전에서 정상 작동하던 모듈, 애드온, 위젯 등이 PHP 7.2 이상에서 오류를 일으킨다면 BaseObject 문제일 가능성이 높습니다. 오래 전 XE 1.9에서 변경된 사항이므로 대다수의 정상적인 자료는 이미 수정되었거나, 수정 방법이 커뮤니티에 알려져 있을 것입니다.
라이믹스 2.1의 새 기능과 개선점
- 여러 도메인을 사용하는 사이트에서, 특정 게시판이나 페이지는 특정 도메인에서만 사용할 수 있도록 제한하는 기능
- 지정하지 않은 도메인으로 접근하면 마치 존재하지 않는 것처럼 404 에러를 표시합니다.
- 구 버전의 코어에서 배포하였으나 파일명 변경, 통폐합, 폐지 등으로 더이상 필요하지 않은 파일과 폴더를 자동으로 파악하여 정리하는 기능
- 오래된 파일이 필요한지 아닌지 헷갈릴 때, 이 기능을 사용하면 자신있게 삭제할 수 있습니다.
- 최신 모바일 기기나 이미지 편집 프로그램이 생성하는 AVIF 및 HEIC 이미지를 JPG로 변환하여 저장하는 기능
- ImageMagick 7 이상의 "magick" 명령이 서버에 설치되어 있어야 합니다.
- PHP의 GD 라이브러리로 다루기 너무 큰 이미지는 ImageMagick을 사용해서 크기 제한을 적용하는 기능
- 위와 마찬가지로 "magick" 명령이 필요합니다.
- 크기 조절이나 변환하는 데 시간이 많이 걸릴 수 있습니다.
- 동영상 첨부파일을 제한하거나 최적화하여 서버 용량과 트래픽을 절약하기 위한 다양한 옵션
- 가로x세로 크기 및 재생 시간 제한
- mp4 이외의 포맷을 업로드한 경우 mp4로 변환하는 기능
- mp4 포맷이라도 일정한 화질로 무조건 재인코딩하여 용량을 줄이는 기능
- ffmpeg 연동이 필요합니다.
- 쪽지함 검색 기능 추가 (#911, #1112)
- 커뮤니케이션 모듈 기본 스킨에는 검색창이 추가되었으나, 다른 스킨 사용시 검색창을 직접 만들어 주어야 합니다.
- 회원 모듈에 URL(mid)를 고정적으로 부여하여 레이아웃, URL 구조 등을 일관성있게 유지할 수 있도록 지원 (#1806, #1896, #2122)
- 기존 사이트는 회원 모듈 설정에서 URL을 확인하고 "강제 적용"을 체크해야 적용됩니다.
- 해당 기능 사용시 커뮤니케이션 모듈(쪽지함, 친구 기능) 및 알림센터 설정 화면도 회원 모듈의 URL(mid)를 사용합니다.
- 수정하여 업로드한 템플릿을 즉시 변환하지 않고 1~3초 기다리는 옵션 제공
- 해외 서버 등 업로드가 느린 환경에서 업로드 도중 방문자가 있을 경우, 반쪽짜리 템플릿을 변환하려다 오류를 뿜는 불편을 줄일 수 있습니다.
- reCAPTCHA를 대신할 수 있는 Cloudflare Turnstile 스팸방지 API 지원 @Lastorder-DC (#2008, #2112)
- 스팸필터 모듈이 확장변수 내용도 검사하도록 변경 (#2051)
- 회원가입 추가 항목(확장변수)으로 국가, 언어, 표준 시간대 입력란을 생성할 수 있도록 지원 @dewekk (#2089)
- 게시물이 많은 사이트에서 RSS 발행시 count(*) 쿼리와 관련된 서버 부하 대폭 감소
- 헤더 스크립트나 푸터 스크립트에 <html>, <head>, <body> 등 불필요한 태그 입력시 자동 삭제
- 타 사이트의 예제를 복붙하다가 사이트의 태그 구조가 깨지는 것을 막아 줍니다.
- 신고 기능과 관련된 베트남어 번역 추가 (제공: EOHQ)
- argon2id 비밀번호 암호화(해싱) 알고리즘 지원
- 쪽지함에 짧은주소 지원
개발자를 위한 새 기능 및 변경사항 안내
- 모듈 네임스페이스 내에 있는 클래스 파일명은 대소문자를 구분하는 것을 기본으로 결정
- 폴더명은 하위호환성을 위해 소문자 그대로 유지합니다.
- 예) Rhymix\Modules\Example\Controllers\HelloWorld 클래스는 modules/example/controllers/HelloWorld.php 파일에 작성합니다.
- admin 모듈이 네임스페이스 방식으로 전면 개편되었고, Rhymix Framework의 파일명도 대소문자를 구분하도록 바뀌었으니 참고하세요.
- 라이믹스 2.0.x 과도기 방식처럼 소문자만으로 이루어진 파일명도 계속 지원하나, autoload할 때 조금 비효율적입니다.
- 최상위 폴더에 있던 composer.json과 vendor를 common 폴더 안으로 이동
- 모듈이나 애드온 등을 개발할 때 composer를 사용하더라도, 코어의 composer.json이나 vendor 폴더를 본의 아니게 수정하는 일을 피할 수 있습니다. (common 폴더는 서드파티 자료가 들어가지 않는 위치이므로)
- 각각의 모듈이나 애드온은 자신의 경로 아래에서 composer를 사용하는 것을 권장합니다.
- 외부 요청을 위한 Rhymix\Framework\HTTP 클래스 추가
- 개발이 중단된 Requests 대신 Guzzle 라이브러리를 사용하고, 기존의 FileHandler::getRemoteResource()와 FileHandler::getRemoteFile()도 내부적으로 HTTP::request()를 사용하도록 바뀌었습니다.
- Guzzle의 API를 거의 그대로 사용하므로 다양한 옵션을 지원하고, 요청이 실패한 경우에도 응답 코드 등 자세한 정보를 얻을 수 있습니다.
- 비동기(async) 요청, 여러 URL 동시 요청을 지원하므로 외부 API와 연동할 때 시간을 절약할 수 있습니다.
- 일반적인 HTTP/HTTPS 프록시뿐 아니라 SOCKS5 프록시도 지원합니다. 외부 요청시 서버 IP를 숨기는 데 도움이 됩니다.
- SCSS 컴파일러를 최신 버전으로 업데이트
- 코어에 포함하여 배포하던 cacert.pem을 composer/ca-bundle 패키지로 대체하여 업데이트 편의 도모
- 디버그 패널에서 동일한 쿼리나 오류는 한 번만 표시하고, 발생한 횟수를 보여주는 편의 기능 추가
- XML 쿼리에서 SQL date 타입의 포맷(YYYY-MM-DD hh:mm:ss)으로 기본값을 입력할 수 있는 default="timestamp()" 문법 지원
- XML 스키마에서 SQL date 타입을 사용하려면 type="\date"로 선언하면 됩니다. type="date"는 XE용 자료와 호환되도록 char(14)로 생성됩니다.
- zdate(), ztime() 등 시간을 처리하는 함수에서 SQL date 타입의 포맷(YYYY-MM-DD hh:mm:ss) 및 ISO 8601 포맷(표준 시간대 정보 포함)도 기존의 14자 포맷과 동일하게 지원하여, 표준 포맷을 편리하게 사용할 수 있도록 지원
- 실험적으로 jQuery 3.x를 선택할 수 있도록 지원
- 관리자 화면에서도 아직 오류가 많아서, 실사용은 권장하지 않습니다.
- 모듈에서 $this->copyResponseFrom($다른모듈)을 사용하여 다른 모듈, 다른 액션의 실행 결과를 그대로 가져올 수 있도록 지원
- 자동 로그인시 member.doAutoLogin (after) 트리거 추가 @Waterticket (#2076, #2087)
- 파일 업로드시 file.insertFile (before) 트리거에서 포맷을 변환하거나 최종 저장 위치(save_path = uploaded_filename)를 지정할 수 있도록 지원
- getUrl() 및 관련 함수에 2차원 이상의 배열을 넘길 수 있도록 지원 (#2123)
- getUrl(['foo' => 'bar']) → index.php?foo=bar
- getUrl(['foo' => ['bar', 'bazz']]) → index.php?foo[0]=bar&foo[1]=bazz
- getUrl('foo', 'bar', 'baz', 'rhymix') → 키/값 구분 없이 나열하는 이런 문법은 더이상 권장하지 않습니다.
- 승인, 거부, 미인증(메일 인증 미완료) 등 회원 상태를 구체적으로 표시하는 status 컬럼 추가 (#2124)
- 지금 크게 달라지는 것은 없으나, 확장성을 고려하여 스키마를 변경했습니다.
- 로그인 허용 여부는 여전히 denied 컬럼으로 판단할 수 있습니다.
- AJAX 기능 강화
- 서버단에서 Exception이 발생할 경우 항상 -2를 반환하도록 일관성 강화 (일반 오류는 -1)
- exec_json()에서 네트워크 오류 발생시 무조건 표시되던 AJAX communication error 팝업을 막을 수 있도록 지원 (#2108)
- callback_error로 지정된 함수에서 false를 반환하면 됩니다.
- exec_xml()은 더이상 권장하지 않습니다.
- DB 클래스 개선
- begin()에 대한 alias로 beginTransaction()을 추가
- connect() 및 disconnect() 메소드를 추가하여 DB 커넥션 상태를 직접 관리할 수 있도록 지원
- 라이믹스 2.0에서 지원하지 않았던 prefix, use_prepared_statement 등 몇몇 DB 속성들을 읽기 전용으로 제공
- 사용을 권장하지는 않습니다. 정식 지원하는 방식으로 커스텀 쿼리를 사용한다면 prefix를 알 필요가 없습니다.
- config.php에서 session.lifetime 설정에 0보다 큰 값을 입력한 경우, 기본값인 8시간(28800)을 적용하지 않고 설정값 그대로 사용하도록 변경
- DocumentModel::getDocumentList() 호출시 페이징이 필요하지 않으면 page를 0으로 지정하고 offset을 사용하여 count(*) 쿼리를 피하는 방법 제공
- 로그인하지 않은 상태에서도 <meta> 태그에 항상 CSRF 토큰을 넣도록 변경
- E_DEPRECATED 오류를 숨기지 않도록 변경
- SVG 파일 업로드시 보안상 문제가 될 수 있는 태그 필터링 강화
- X-Frame-Options 및 X-Content-Type-Options 헤더를 전송하는 보안 설정 추가
버그 수정
- 아이디, 이메일 주소 등 여러 가지 로그인 방법을 제공하더라도 일부 로그인 폼에서는 이메일 주소만 인식하는 문제 수정 (#2044, #2074)
- 스크립트 합치기 기능 사용시 중간에 낀 CSS @import가 동작하지 않는 문제 수정 (#2052)
- 알림센터의 수신 거부 팝업에 레이아웃이 잘못 적용되는 문제 수정 (#2058)
- 모듈 복사시 mid가 규칙에 맞지 않으면 적절하지 않은 에러 메시지가 표시되는 문제 수정 (#2067)
- 전체공지로 설정된 글에 mid 없이 접근할 경우, 소속된 게시판의 mid를 찾아가지 못하는 문제 수정 (#2072)
- 일부 정상적인 hwpx 파일을 업로드하면 보안정책상 허락되지 않는다고 표시되는 문제 수정 (#2077)
- 디버그 패널 설정과 무관하게 항상 에러 내용이 표시되는 문제 수정 @dewekk (#2078)
- 캐시 파일 손상시 회원 포인트가 0으로 초기화되는 문제 수정
- 댓글 신고 취소시 트리거에서 document_srl이 잘못 전달되는 문제 수정 (#2080)
- 설문조사 항목 추가 후 트랜잭션 커밋이 되지 않는 문제 수정 @BOBODDO @nemorize (#2081, #2090)
- SMS 발송 중 일어난 오류를 기록하는 과정에서 protected 속성에 접근하는 문제 수정
- SCSS 컴파일시 전달한 변수에 false, null, 빈 문자열 등이 포함되어 있으면 컴파일되지 않는 문제 수정 (#2085)
- 스팸 키워드 때문에 임시저장이 실패하더라도 사용자에게 알려주지 않아 데이터가 유실될 수 있는 문제 수정 (#2088)
- 설문조사 항목을 입력하지 않고 폼을 제출하면 PHP count() 오류 수정 (#2093)
- 커뮤니케이션 모듈의 page 파라미터가 다른 메뉴 링크에도 붙는 문제 수정 (#2094)
- 모든 형태의 짧은주소 사용시 로그인 후 무한 리다이렉트가 발생할 수 있는 문제 수정 @dewekk (#2095)
- 그룹을 선택하지 않고 회원 일괄 수정시 PHP count() 오류 수정 (#2097)
- 오류 표시(message) 모듈에서 설정한 모바일 스킨이 적용되지 않는 문제 수정 (#2098)
- 권한이 없는 메뉴에 하위 메뉴가 있을 경우 빈 항목이 표시되는 문제 수정 (#2099)
- 설문조사 종료 후에도 항목을 추가할 수 있는 문제 수정 (#2103)
- 비회원 글쓴이의 닉네임, 홈페이지 등이 이중으로 인코딩되는 문제 수정
- 회원정보의 홈페이지 항목에 한글 도메인 등 IDN을 입력할 수 없는 문제 수정 (#2111)
- 메일 발신자 주소에 기본값을 사용하려고 해도 Reply-To 주소로 덮어씌워지는 문제 수정 (#2115)
- 문서나 댓글 요약을 추출할 때, 일부 에디터에서 작성한 내용이 빈 칸 없이 붙어버리는 문제 수정 (#2116)
- 비밀글, 비밀댓글 등 열람 권한이 없는 곳 아래에 댓글을 작성할 수 있는 문제 수정 (#2117)
- escape되는 특수문자가 많은 글을 휴지통으로 이동할 수 없는 문제 수정
- CLI 환경에서 일부 Context 변수가 세팅되어 있지 않은 문제 수정
- 페이지 모듈에서 페이지 타입이 항상 영문으로 표시되는 문제 수정
- 60자를 초과하는 비밀번호 암호화(해싱) 알고리즘 사용시, 비회원이 작성한 글이나 댓글의 비밀번호가 잘못 저장되는 문제 수정
- 동일한 회원의 포인트를 동시에 여러 곳에서 변경할 경우 오차가 발생하는 문제 수정
- 분류가 필수인 게시판에서 category_srl을 0으로 지정할 수 있는 문제 수정 (#2119)
- XEDITION 레이아웃의 회원 메뉴에서 불필요한 변수 제거
- 모든 형태의 짧은주소 사용시 게시판 글읽기 화면에서 comment, page 등의 변수를 자동 삭제하는 타이밍을 앞당겨 깜빡임 감소
- 회원가입 후 이전 화면으로 돌아가지 않고 무조건 회원정보 화면으로 가는 문제 수정
- 설치 직후 일부 코어 모듈은 여전히 업데이트가 필요한 상태인 문제 수정
- PHP 8.2 환경에서 발생하는 Warning 및 Deprecated 오류 다수 수정 @Waterticket (#2064, #2066, #2068)
정리
- Object 클래스 완전 제거 (라이믹스가 지원하는 모든 PHP 버전에서 사용 불가)
- 라이믹스 프레임워크와 주요 모듈의 빈 줄 공백문자 처리 방법을 통일 (.editorconfig 이용을 적극 권장합니다.)
- 관리자 대시보드의 알림 표시 순서 정리
- 중복되는 XE 저작권 표기와 클래스 하단 주석 제거
- 설문조시 위젯 스킨에서 불필요한 분기 제거 (#2107)
- 파일 모듈의 이름을 일관성있게 통일 (#2120)
- 주요 모듈의 클래스명이 모두 대문자로 시작하도록 통일 (예: memberModel → MemberModel)
- 사용을 권장하지 않는 기능 deprecated 처리
- IE를 위한 특별한 조건들 삭제
- CSS/JS 로딩시 targetie 속성 지원 중단
- 구 버전의 플래시 업로더 지원과 관련된 코드 삭제
- jQuery 1.x 삭제
- 기타 불필요한 기능 삭제
- 파일 캐시, wincache, xcache 삭제
- XE 구 버전의 mobileXE 애드온을 블랙리스트에 추가하고, 게시판 및 페이지 모듈의 WAP 클래스 삭제
- DisplayHandler의 gzip 기능 삭제
https://rhymix.org/news/356